ISUCON史上初の学生チーム優勝! 勝利のカギは「チームワーク」と「失敗からの学び」
決められたレギュレーションの中で、お題となるWebサービスを限界まで高速化するチューニングバトル「ISUCON」。最大3名でチームを組み、アプリケーションに自由に手を加え、出題者が用意したベンチマークで最も優れたスコアを叩き出したチームが優勝となるコンテストだ。
2018年で8回目の開催となるISUCON8(予選参加チーム数528組(一般432、学生96)、参加者合計1392人。うち30チームが本選出場)に激震が走ったのは10月のこと。ISUCON史上初の学生チームが優勝をさらったのだ。本稿では、優勝チームのメンバーである中西 建登さん、市川 遼さん、薮 雅文さんにISUCON優勝までの軌跡を聞いた。インタビュアーはリードエンジニアの亀岡 亮太さんに務めていただいた。
個性的なメンバーでチームを結成
亀岡:自己紹介をお願いします。
- 中西:電気通信大学2年の中西です。もともとサーバー運用会社でアルバイトをしており、その後、広告事業を展開する会社でお世話になりました。今はインターネットの会社でIoT事業のアルバイトをしています。その一方で、個人事業主としていくつかの会社から受託開発の業務委託を受けています。株式会社HERPもそのうちの1社です。HERPの社長である庄田さんにお誘いいただいていて、Kubernetesを用いたインフラを触ったり業務全体の改善をお手伝いしています。
- 市川:市川です。今は東京農工大学のM2ですが、アメリカ留学をしたために休学中です。今年4月には復学して修士を取る予定です。職歴としては、ソーシャルゲームの会社でゲームのデバッグ業務に従事しました。その後、ベンチャー企業で開発系に携わったりセキュリティ会社でフォレンジック(デジタルデータの不正アクセスや情報漏えい等の証拠分析・調査)業務のアルバイトをしたりしました。アメリカの大学院ではセキュリティ系の研究をし、帰国後はとある研究所でセキュリティの研究を続けています。
- 薮:薮です。私も中西さんと同じで、電気通信大学のM2です。最初に働いたのはオンライン型のWebショップを開発する会社です。主にPHPでソーシャルゲームのデバッグなどをしていました。その後、Webアプリ開発や古いコードの移植などを経験しました。Ruby on RailsやGo、C++を使ったことがあります。
亀岡:大学での専攻を教えてください。
- 中西:ネットワーク系の研究をしています。具体的には、コンテナ技術を使ってネットワークの通信量を少なくする研究です。専攻としてはネットワークとかセキュリティになると思います。
- 市川:日本では「情報工学」というざっくりした分野を専攻しています。VMM(Virtual Machine Monitor)という仮想マシンを管理するためのソフトウェアがありますが、それをセキュリティ目的で使えるようにするということをやっています。米国ではファジング(ソフトウェアの脆弱性テスト)の研究をしました。その研究は日本でも継続しています。
- 薮:数学の計算をアルゴリズムとして実装する際にどうすれば速くなるかを研究しています。
亀岡:みなさんはどうやって出会ったのですか?
- 中西:「TokyoWesterns」というチームがあり、そのメンバーとして出会いました。TokyoWesternsは10数名程度のチームで、我々3人はそのメンバーの一部です。チームの活動としてはCTF(Capture The Frag)という競技に出場しています。セキュリティスキルを競う競技で、例えばアプリのバグや脆弱性を突いて、不正侵入等を行うことでフラッグを奪取(得点する)ゲームです。
- 市川:言うなれば擬似サイバー攻撃ですね。フラッグを機密データに見立てて、本来は読めないはずのものを読み、それを突破した証拠としてポイントを積み重ねていくことで勝敗を争う競技です。
- 薮:その年間のランキングがあるのですが、世界中のチームが参加する中で、去年はTokyoWesternsで世界4位になりました。
- 中西:ISUCON8にはTokyoWesternsではなく「最大の敵は時差」というチーム名で出場しましたが、予選開催時、市川がアメリカに居たことなど全員のタイムゾーンがバラバラだったことからこのチーム名になりました。
※編集部注:多くのチームや大会が利用している「CTFTime」 というCTFの情報まとめサイトがあり、大会の難易度ごとにスコアが自動計算され、順位によってチームにスコアが与えられる。このサイトの2018年の順位においてTokyoWesternsが4位になった。
ISUCONへ掛ける思い
亀岡:コンピュータやインフラに触れるようになったきっかけを教えてください。
- 中西:インフラを触り始めたのは大学2年生の頃です。電気通信大学は比較的コンピュータサイエンスに詳しい人が多い大学です。そんな環境の中で「アルバイトをしたいな」と思っていて、どうせアルバイトをするのなら興味があることをしたいと思いました。そこで先輩に相談してインフラを運用している会社を紹介してもらい、そこでインフラの運用を学び詳しくなっていきました。面白かったし自分の性格にも合っている気がします。
- 市川:そもそもプログラミングを始めたのは大学に入ってからなのですが、なぜこんなギークみたいなことをやっているかと言うと、きっかけはCTFでした。CTF以前から競技プログラミングをやっていて、そのおかげで「こういうコードを書くと遅くなる」「こういうコードは速くなる」といったアルゴリズムをある程度知れました。そこから個人でサーバーを借りてアプリの運用を始め、ある程度バックエンドにも詳しくなりました。ISUCONの出場となると急に話が飛ぶのですが、最初に「ISUCONというものがあるらしい」と聞いて「ちょっと出てみるか」とISUCON6から3回連続出場して、2回は予選でボロ負けしました。ただ、その時の経験を通じて「こういうチューニングが活きて来るのだな」というのを目の当たりにし、面白いなと思ったのです。言うなれば、ISUCON自体がISUCONにのめり込むきっかけになったということです。
- 薮:プログラミングを始めたのは小学4年生の時です。親からPC-98をもらってゲームなどを作っていました。当時はまだBASICでコードを書かないと何もできない世界です。「どうすれば速くなるのか」を意識したのは、高校3年生の頃に読んだ『プログラミングコンテストチャレンジブック』(マイナビ出版)がきっかけでした。それで競技プログラミングの存在を知り、のめり込んで行ったのです。そのおかげで「どういうコードを書けばどのくらいのスピードが出るか」「データベースはどういうアルゴリズムでどのぐらいの処理速度が出るか」などを何となく掴めるようになりました。それが今に活きていると思います。
- 市川:あとは「ICTトラブルシューティングコンテスト」という大会があって、我々3人はインフラのバックエンドをいじった経験があります。それでネットワークとかミドルウェアも含めて、自然とインフラに興味を持ったのだと思います。
亀岡:ISUCONにおけるお三方の役割分担についてお聞かせください。
- 中西:私がインフラ面、サーバーやミドルウェア周りを見ました。市川さんがアプリケーションを読んで怪しそうな部分の洗い出しを行い、薮さんはインフラとアプリの両方を見つつ、アプリの比較的簡単に修正できそうなコードを担当しました。
- 亀岡:Go言語の実装に手を加えていったのですか?
- 中西:そうです。
- 亀岡:Go言語を選んだのはなぜですか?
- 市川:デプロイの楽さですかね(笑)。
- 薮:Go言語に慣れていたというのも理由の1つです。
亀岡:先ほど予選でボロ負けしたお話しがありましたが、そこから傾向と対策を確立して優勝できたということはありますか?
- 市川:ベンチマークを回すことに関しては、過去の失敗から学んだ部分が大きいと思います。
- 中西:今回は1つの変更に対して3、4回くらいベンチマークを回して「この値でスコアが上がっているみたいだ」というのを繰り返した感じです。予選では最後の1時間ずっとベンチマークを回していました。予選の勝ち抜けにはベンチマークの一番最後の値が採用されるので、偶然でも高い値が出れば有利なのです。だから最後は変更を加えずにベンチマークをひたすら回しまくりました。
- 亀岡:途中で最高値を出してもダメなのですね。
- 中西:そうです。逆に言うと、残り10分余っていて放置しても、高いスコアが出ていれば勝てるということです。
- 亀岡:そこはある意味、賭けでもありますね。
- 中西:はい。一度、葛藤もありました。途中でそこそこのスコアが出たのですが、あと20分くらい時間が余っていて「まだ回す? どうする?」みたいな(笑)。
チームワークの勝利
亀岡:ISUCONの歴史で、学生チームの優勝は初めてだそうですね。並居る社会人チームが出場している中で、本当に快挙だと思います。学生チームだからこその勝因はありますか?
- 市川:強いて言うのなら、我々は普段からチームとしてCTFをやっているので、チームワークをそのまま活かせたというのはあると思います。
- 中西:CTFに理解のある会社なら良いのですが、そうではない会社も多いと思います。社会人になると、チームメンバーが集まるだけでも時間や仕事の制約がありますしね。
- 市川:それに、他の出場チームは毎日のように同じメンバーで問題解決に当たっているわけではないと思います。CTFの中ではそういう機会はたくさんあるので、我々はチームワークには自信を持っていました。
亀岡:過去に出場したISUCONで「業務知識がないと無理だな」と思ったことはありますか?
- 薮:ISUCON7の予選で出題された、CDN(Content Delivery Network)の問題ですかね。
- 中西:Webサイトへアクセスしようとする時に、一般的な構成としてCDNと言われるものがあります。通常、アクセスが集中した場合は安定した通信を保つためCDNにコンテンツをキャッシュしておきますが、アプリ側からCDNへ「コンテンツをキャッシュしてくれ」と命令しないとキャッシュしないような仕様が一部のCDNにあるらしく、それに気づかないと一生キャッシュされず、アクセスが増えて負荷が上がるのです。特定のヘッダーを付ければ良かったのですが、それに気付かずに負けました。去年の話です。
- 市川:過去には「業務知識を持っていないとお話にならない」という問題もありましたが、今回はマストではなかったということです。
亀岡:処理を速くする勘所は経験を積むことで身に付くものだと思いますが、学生であるみなさんはそれをどうやって学んだのですか?
- 中西:今回、我々のチームはひたすらベンチマークを繰り返しながら、アクセスログを元に「このアクセスに時間がかかっている」というのを見つけたり、MySQLのクエリログを元に「このクエリはめちゃくちゃ重そうだ、どこで発行されているのだろう」ということを考えたりしていました。ですから、謙遜ではなく、本当の意味での勘所は掴めていないのかなと思います。
- 市川:勘所と言うか、問題点を特定する方法を身に付けるのが初めに必要かなと思いますね。
- 中西:今回思ったのは、ベンチマーク待ちもほとんどなく、試行回数を多くできたことが良かったのではと。結局、我々には「絶対にこの処理が強みになる」ということは分からないので、それをいかに少ない試行回数で当てられるかは業務経験の成せる業だと思います。逆に試行回数を増やせれば、学生でも意外と行けるのかもしれません。
- 亀岡:とにかくベンチマークを繰り返して、問題のある部分を1つずつ解決していったというイメージですね。
- 中西:そうですね。自分が今加えた変更が正しいかは、ベンチマークをひたすら回せば分かってきます。しかし、時間が限られている中で、そこにブレがあったり試行まで時間がかかったりすると厳しくなります。その判断は自分の勘に頼らないと解けないのかなと思います。
- 亀岡:どれだけ時間をかけずに対処できるかがポイントになるのですね。「原因はわかったが直せない」となると問題解決になりません。「細かいものは残しても良いから、大きいものを片付けよう」といった戦略もあると思います。
- 中西:そうですね、それがスコアに反映されますから。
※編集部注:ISUCON優勝に関する詳細については、中西さんと市川さんのブログ記事を参照してほしい。
次に続くべき学生チームに向けて
亀岡:平成最後のISUCONが終わりましたが、次回に出場しようと考えている学生チームに向けて応援メッセージをお願いします。
※ ※ ※
インタビュー前は、社会人も数多く出場するコンテストで優勝した学生チームとは、どれだけスーパープログラマの集まりなのだろうか、と考えていたが、実際に話を聞いてみると、優勝要因はひたすらベンチマークを回して対症療法的に問題点を解決していったこと、チームワークの強さ、過去の失敗から得た学びを活かしたことなど、ある意味今風ではない(良い意味で)泥臭さを感じられたことが印象的だった。
なお、気になる賞金100万円の使い道だが、中西さんはちょっと良いディスプレイを購入し、市川さんは引っ越し費用に充て、薮さんに至ってはまだ使っていないとのこと。賞金だからと言ってパーッと使うのではなく、必要な分だけ使うという超現実的なところにも最近の若者の生き様が垣間見られたような気がした。
次回のISUCONは新元号となって初の記念すべき大会となる。元々学生チームの参加も多いという同コンテストだが、どのような結果となるのか。次回の開催情報等はISUCONの公式サイトやブログ、SNS等で随時公開されていくので、気になる方や参加を考えている方はぜひ注目してほしい。