はじめに
こんにちは、2024年4月に株式会社プレックスに新卒入社した佐藤祐飛です。現在は建設業界向けSaaSプロダクト「サクミル」の開発に携わっています。
2024年7月31日に、日本CTO協会主催の新卒合同研修でISUCON研修が開催され、50万点を超えるスコアで優勝することができました。
CTO協会様主催のISUCON研修優勝しました🏆
— yuhi (@yuhi_junior) 2024年7月31日
実はISUCON研修に勝つために2ヶ月間準備していたのですが、その成果が出てよかったです🔥
後日、「ISUCON 研修をガチった話」と題してテックブログを投稿する予定なのでそちらもチェックしていただけると嬉しいです‼️#ctoawakate https://t.co/fUr2hf8rkr pic.twitter.com/7FxYbmiIBu
ISUCONは若手エンジニアにとってハードルが高いコンテストです。私自身、エンジニアとしての経験がまだ1年に満たず、初めはISUCON関連の書籍やブログを読んでも理解が難しかったです。しかし、約2ヶ月間の準備を経て、なんとかISUCONに挑戦できるレベルに達することができました。
本ブログでは、私の体験を通じて「ISUCONに取り組むべき理由」「ISUCONに向けた対策」を共有したいと思います。
ISUCONとは?
ISUCON*1とは「いい感じにスピードアップコンテスト」の略で、LINEヤフー株式会社が運営するWebサービスのチューニングコンテストです。
ISUCONとはLINEヤフー株式会社が運営窓口となって開催している、お題となるWebサービスを決められたレギュレーションの中で限界まで高速化を図るチューニングバトルです。 引用: ISUCON公式Blog
3人以下のチームで8時間以内にチューニングを行い、スコアを競います。基本的にWebサービスがより多くのリクエストを処理するほどスコアが上がります。禁止事項でない限り、DBのスキーマ変更やミドルウェア導入によるキャッシュの利用など、自由にチューニングを行えます。実際のWebサービスと同様に様々なアプローチを取ることができるのがISUCONの魅力となっております。
ISUCONに取り組むべき理由
ISUCONはハードルが高いですが、若手エンジニアこそISUCONに挑戦するべきだと考えています。その理由は大きく3つあります。
ISUCONは意思決定の連続
ソフトウェア開発において、意思決定は大きな責任が伴い、最も成長に直結するプロセスです。ISUCONでは、限られた時間内で優先順位を決め、多くの選択肢から最適なものを選ぶ意思決定を何度も行います。このプロセスがスコアとしてフィードバックされるため、迅速な意思決定とフィードバックのサイクルを経験できます。意思決定とフィードバックのサイクルがここまで短いソフトウェア開発は、ISUCON以外ではなかなか経験できません。また、ISUCONは参加者のブログが数多く投稿されているので強いエンジニアの意志決定をトレースすることも容易です。
研修中、PR TIMESの金子さん(@catatsuy)やLayerXの松本さん(@y_matsuwitter)は「ISUCONと障害対応を通じてエンジニアとして成長した」と語っていました。障害対応もISUCONと同様に、プレッシャーの中で重要な意思決定を繰り返す必要があります。若いエンジニアが早いうちに意思決定の経験を積むことは、非常に重要だと思います。
普段の業務では味わえない経験
ISUCONは若手エンジニアが普段経験できないことに挑戦することができます。具体例として以下のような技術的課題に取り組むことができます。
- 枯渇するCPUリソース・メモリへの対応
- CPUプロファイリング
- スロークエリログの分析
- DBスキーマの変更
- 空間インデックスの利用
- SQLiteからMySQLへの移行
- 複数インスタンスを利用したアーキテクチャへの移行
- 並行処理による最適化
- N+1の解消
- Redisやmemcachedなどのキャッシュ利用
- NginxやVarnishなどのリバースプロキシ設定
- HTTPキャッシュ設定
実践を積まなければ身につかないスキルや、クラウド環境が主流となった現代では見過ごされがちな技術が多くあります。ISUCONでは、多くの選択肢を持って意思決定を行うことが重要であり、そのために日々の技術研鑽がまだまだ必要だと痛感させられます。
面白いアプリケーション
ISUCONで出題されるアプリケーションは毎年工夫が凝らされており、学習教材としても非常に有用です。特に普段業務で触れない技術やコードに触れる良い機会となります。私自身もGoの学習教材として利用しています。
以下にISUCONのイントロ動画を貼ってみます。めっちゃ面白いです。
ISUCONに向けた対策
ここからは私がISUCON研修に向けて行った具体的な準備を紹介します。
OS・CPU
OS・CPUの基礎知識がないと計測結果やMySQL・Nginxのパラメータなどの意味を理解することができません。「[試して理解]Linuxのしくみ」ではこれらの基礎知識をわかりやすく図解しています。スレッド、スケジューリング、メモリ、ファイルディスクリプタ、ディスクI/Oなどに不安がある方は一読してみることをお勧めします。
DB
ISUCONではスコアを上げるためにDBの理解が必須です。特に役に立った記事と書籍を紹介します。
MySQLのパフォーマンスについて解説されています。トランプの話はとてもわかりやすかったです。 www.slideshare.net
InnoDBのインデックスを詳しく図解しており、Bツリーインデックスやインデックスを張った際の振る舞いをイメージすることができるようになります。 techlife.cookpad.com
分散システムにおけるレプリケーション、パーティショニングなどについて詳しく書かれています。ISUCONでは複数台アーキテクチャを利用できるため、DB分割なども打ち手として持てるようになります。 www.oreilly.co.jp
Go
普段の実務ではRuby及びTypeScriptを扱っているのですが、ISUCONにおいてはGoの使用率が高いため、Goについて一からキャッチアップしました。
基本文法はお馴染みの「A Tour Of Go」で学習しました。 go-tour-jp.appspot.com
メモリを中心としたGoの低レイヤーについて詳しく書かれています。正直、ISUCONで低レイヤーまでチューニングをほとんどしませんが、読んで損はないと思います。 www.oreilly.co.jp
並行処理を扱ったことがあまりなく、ピンと来なかったので読んでみました。 www.oreilly.co.jp
リバースプロキシ・HTTPキャッシュ
Nginxを詳しく学びたい方におすすめです。 tatsu-zine.com
HTTPキャッシュはヘッダーやキャッシュ条件が複雑で奥が深いので一読してみることをお勧めします。 gihyo.jp
ISUCON本
ISUCON関連の本の中では一番有名な本で、private-isuという問題を題材にチューニングの基礎が解説されています。エンジニアになりたての昨年は、難しく読み進めるのが大変でしたが、上記のインプットを入れた後だとスッと頭に入ってきました。
私はprivate-isu関連のブログを読みこみ、最終的にprivate-isuの点数を約91万点まで伸ばすことができました。
Makefile
ISUCONでは計測と改善のサイクルを高速に回すことが大切です。そのために、Makefileやスクリプトを事前に作り込んでおくことが重要です。私は東京工業大学デジタル創作同好会traPの@_oribe1115さんのMakefileを参考にさせていただきました。
また、計測結果をチームメンバーと素早く共有するため、notify_slackを利用してSlackに通知を送るようにしました。
ISUCON過去問
ISUCON11予選は出題の意図にもある通り「教科書的な問題でありつつも、解きごたえのある問題」でprivate-isuの次に解く問題として丁度良い難易度だと思いました。 isucon.net
本番を想定した練習
時間制限がある中で解くISUCONは無制限で解くISUCONと全くの別物です。可能であれば、多くの人を巻き込み、本番と同じ条件で練習することを強くお勧めします。私はISUCON研修の週に上司に頼んで社内ISUCONを開催していただきました。また、社内ISUCONの翌日にはCTO協会の研修メンバー5人でチーム対抗戦を行いました。
それぞれ、ISUCON13とISUCON9予選の問題を解きました。
ISUCON研修本番
研修本番は二人一組でチームを組み、全31チームの対抗戦でした。ここまでは初見の問題を解く想定で準備をしていましたが、本番の問題はまさかのprivate-isuでした。private-isuは既に4回解いていたので、さくさく計測と改善を回して、15:30頃には目立ったボトルネックを潰すことができていました。
最後はhtmlファイルのExecuteが一番のボトルネックとなっていたのでhtmlを全てバイト列で持ち、レスポンスに直接書き込むという黒魔術を使って50万点越えを達成しました。
最後に
このような素晴らしい研修を開催していただいたCTO協会とその関係者の皆様、本当にありがとうございました。
私は弊社で初めての新卒エンジニアとして入社し、同じ立場で話せる同期エンジニアがいないことに寂しさを感じていました。そんな時に、松本さんの新卒研修を開催するというXの投稿を目にし、弊社のCTOに参加をお願いして実現に至りました。研修後の懇親会も毎回楽しみで、絶対に良い仲間をたくさん作ろうという気持ちで臨んでいました。
新卒研修終了後も継続的に交流するために勉強会のグループを立ち上げました。月一ペースで各メンバーのオフィスで輪読会を開催する予定です。僕の今の夢は10年経ってもこのメンバーで組織を語り合いながらお酒を飲むことです笑。24卒で参加したい方がいらっしゃればXのDMで是非連絡ください!
最後にプレックスではエンジニアとプロダクトデザイナーを募集しております。ご興味ある方はご連絡していただけると嬉しいです! dev.plex.co.jp