ISUCONで優勝する方法

草野翔氏(以下、草野):ということで、早速ですが「達人パネルディスカッション」ということで、著者陣で「こんな話をしたらおもしろいんじゃないですかね」といろいろ考えた結果、テーマがなんとなく決まっています。

その点についていろいろ話をしたり相談したり。「これはどうなんですか」と(いう話を)意外と話していないので(したいと思います)。この著者陣はISUCONでよく会うメンツですが、ISUCONのアフターの時はみんなISUCONの話をして、ISUCON周辺の話はしないんです。「今日の参考実装がどれだけクソだったか」という話しかみんなしていないので、今日は参考実装のない話をいろいろしていこうと思います。みなさんよろしくお願いします。

ということでまずは1個目のテーマです。これはみんな超聞きたいやつで「ISUCONで優勝する方法」です。ISUCONで優勝する方法を教えてください、藤原さん。

(一同笑)

藤原俊一郎氏(以下、藤原):いきなりだな(笑)。優勝する方法は何でしょうね。強いチームメイトと組む。

草野:ISUCON優勝経験があるのは? 僕と藤原さん、waitaさん、kazeburoさん。

藤原:そうですね。

草野:いやー、どうやったら優勝できるんですかね。

藤原:どうやったらできるんですかね。

中西建登氏(以下、中西):藤原さんが先ほどお話されていたのが完全に真理だと思っていますね。

藤原:チームメイト。

中西:1人で優勝する人もいるけど。

藤原:1人で優勝する時のことはおいておきましょう。常人の参考にはならないので(笑)。

草野:あれはバグキャラなので。

藤原:そうですね。チームメイトと組むことと、ほかには何でしょうね。チームメイトとやっている作業が被らないようにそれぞれの分野を全力でやった上で、それがちゃんと協調するというけっこう難しいことをしないといけなくて。同じことをやっても結局コンフリクトして無駄だし、やったことがぜんぜん違う方法を向いていてもダメじゃないですか。だから「俺はこれをやるけどお前はそっちをやってね」と。それぞれ効果的なことをそれぞれやることができると効率よく手が打てるので、そういうチームでやるのがいいんじゃないですかね。

草野:なるほど。kazeburoさんは何かあるんですか? 勝ち方の持論みたいな。

長野雅広氏(以下、長野):そうですね。8年前から勝っていないので、もう忘れちゃった感じですけど。

(一同笑)

長野:ISUCON4の時に勝ったのは、最後の最後まで、キャッシュの設定を見つけられるまで諦めなかったことです。見つけたのは終わる10分前ぐらいだったと思うんですけど(笑)。

(一同笑)

藤原:全員が「キャッシュコントロール!!」と叫んだやつですよね。

草野:ごめんって。もういいじゃないですか。LINEスタンプにもなったんだから。売り上げ作ったんだから。

藤原:その時の出題者がrosylillyですから。

草野:そうです。僕がベンチマーカーを書きました。waitaさんに優勝する方法を教えてほしいです。waitaさんの優勝するメソッド。

中西:いやー。でも先ほどの藤原さんの話は本当にそのとおりだと思っていて、それプラスで話すのであれば、その3人のコミュニケーションがどれぐらいうまくいくかはけっこうあると思っています。

例えば、私は普段参加しているチーム内でインフラ領域が一番強いというか、3人の中ではそういった役割分担になっています。「このタスクがあるよね」と認識した時に、「このタスクはこいつにやらせるべきだ」「これは俺がやるべきだ」みたいなのを一瞬で判断できるように、3人がお互いのコンテキストを共有しあっているとけっこう爆速で進むと思います。

その上で、3人それぞれで走っていることがきれいに協調してくると、初めてスコアが上がってくると思っているので、そのあたりの優先度付けじゃないですが、割り振りや動き方はうまくチームメイトで噛み合うと、点数が上がってくるかなとは思っています。

草野:なるほど。

チームメンバーを変えるか、変えないか

草野:catatsuyさんは出るたびにチームメンバーを変えている派ですか?

金子達哉氏(以下、金子):そうですね。だいたいバラバラですね。

草野:馬場さんはずっと一緒ですよね。

馬場俊彰氏(以下、馬場):ほとんど一緒ですね。

草野:僕も白金動物園の同じメンツなので、チームメンバーを変えられる人はすごいなと思っています。僕のチームはほとんどコミュニケーションがないんですよ。「あ」という鳴き声がするとつまりバグを見つけたとか、そういうコミュニケーションをしているんですが、チームメンバーを変えながら強い状態を維持するのはどうやるんですか? 練習をいっぱいするの?

藤原:練習はしたことないですね。

金子:僕は必ず練習しますね。

草野:ちょっと待って(笑)。

藤原:練習は前にcatatsuyさんのprivate-isuが出た時に、それを1人で1回素振りしたぐらいで、僕はチームで練習はしたことないですね。

草野:やばい。僕、散々事前講習で「練習をちゃんとしようね」と……。

(一同笑)

藤原:すみません(笑)。

草野:3回優勝者が練習したことない!? 勘弁してください、本当に(笑)。

藤原:一応作戦会議的なものはしますけど、本当にないんですよね。

草野:作戦会議はするんですね。

藤原:1日集まって、1時間ぐらいご飯を食べながら話すぐらいのことはします。実際に手を動かしての練習はしたことがないんだけど、僕はこれで12回やっていて、初動の動きはもう身についちゃっているので。いきなりやったことがない人が練習しないでやると、たぶん最初の3時間ぐらい何もできなくて時間だけ溶かすので、やったほうがいいと思います。

草野:なるほどね。

藤原:僕は会社のメンバーと出た時しか勝っていないんですよ。morisさん(※tagomoris氏)とjokerさん(joker1007氏)と組んだ時がダメで、その時はやはりお互いに遠慮があった感じがするんですよね。遠慮というか、一緒に仕事をしたことがないから、「この人はどこまでやってくれるのか」みたいなことはつかみづらいじゃないですか。

そうなるとやっぱりちょっとずつ遠慮している部分があって。やらないことができたりとか、やりすぎちゃったりとかがあるとやはりうまくいかないです。僕は今ふだん仕事で本当に密にやっている人と出ているので、相手の間合いがわかっているということですね。

草野:なるほどな。

事前の情報共有の重要性

草野:僕のチームでは、「Rubyインストールをした日は勝つ」みたいなのがちょっとあるんですよ。たいてい誰か1人がRubyを古いのしか持っていなくて。「たいてい1人は」って、要するにmirakuiか僕なんですけど、クックパッドのCTOかハンマーキットのCTOのどちらかが最新のRubyを持っていなくて、Rubyコミッターであるsorahに怒られながらRubyのインストールすることわりとあります。

それをすると勝つみたいなことがあって。たいてい「readlineをどうやったら入れられるのかわからない」みたいな、パソコンの初心者みたいなことを言っています。でもそれをやるということは、開戦前に「ちゃんと環境を揃えようぜ」というコミュニケーションをしたということなんですよ。

中西:それは間違いない。

草野:勝てないときはとかは「だいたい揃っているでしょ」みたいなことを言って(実際は)揃っていなかった時はなんですよね。お互いの環境がわかっていなかった時はあります。あと、ローカル環境で動かせるようにすることはたいてい僕の仕事ですが、そういう時は、手元にMySQLのバージョンが何が入っているかとかはわざわざ聞かないで済みます。

「お互いの手元がどうなっているか知っている」ぐらいに事前の情報共有がうまくいっている時は、わりと点が出る感じがします。あと、アルゴリズム系の問題が出ると僕のチームは刺さりがちで、「おっと?」と言って足踏みしがちな感じがあります。kazeburoさんが最後に優勝したのが8年前というのが、「8年か……」みたいな感じにちょっとなりつつあります。

(次回に続く)