「僕がISUCON予選落ちの立ち直り方を一番知っている」

曽根壮大氏(以下、曽根):おはようございます。みんな元気ないね。おはようございます!

会場:おはようございます

曽根:941さん(櫛井優介氏)だったらリトライさせられるよ。おはようございます!

会場:おはようございます!

曽根:元気出していきましょう。「失敗から学ぶISUCONの正しい歩き方」ということで、今日は「なにをしゃべろうかな?」と悩んでいて。

ISUCONで優勝したことがある人! その人たちは今日は対象外なので、好きにやってください。本選に行ったことある人! その人たちも対象外なので、好きにやってください(笑)。

参加したことがある人。(会場を見て)ありがとうございます。参加したことないよという人。(会場を見て)この2人に向けてしゃべっていこうと思っています。優勝したことがある人はX(旧Twitter)でワイワイしてもらえたらなと思っています。

今日のゲストスピーカーの中で残念ながら僕だけが優勝したことがないんですよ。なんで呼ばれたのか、いまだにわかっていないんですけれど(笑)。

『ガンダム』というやつがあって、その中の『機動武闘伝Gガンダム』で修行する先がギアナ高地なのですが……。(スライドを示して)これは2020年の時に予選落ちした直後ですね。飲み屋で「やっぱギアナ高地行くしかないな」とつぶやいていて。

2021年にも「ギアナ高地行くしかないな」って思っていました。

ちなみに2022年もギアナ高地に行っていて、3年連続ギアナ高地に行っているので、2023年はちゃんと予選を突破したいなと思っていたら、2023年は予選がないので、2023年はギアナ高地に行かなくてよさそうだなと思っています。

これだけ失敗していて、ほかのゲストよりも僕が一番予選落ちしています。僕が予選落ちの立ち直り方を一番知っているので、その話をしていこうかなと思っています。

曽根氏の自己紹介

最初に一応自己紹介をして、ISUCONの良さの話をしていこうかなと思っています。

30分しかないので自己紹介は軽くいこうと思います。僕は曽根壮大といいます。下の名前が「そうだい」と読めるので、インターネットでは「そーだい」さんと呼ばれています。ISUCONといえばMySQLなのですが、僕はポスグレユーザ会(日本PostgreSQLユーザ会)から来ました。

スライドには載せていませんが、僕はISUCON9の時に予選を1回抜けているぐらいで、あとはだいたい予選落ちです。ISUCONの話を『WEB+DB』で書いたりOSC(オープンソースカンファレンス)でしゃべったりしているので、それで呼ばれたのかなと思っています。

そーだいさんといえば『失敗から学ぶ RDBの正しい歩き方』という本を書いていて、僕はRDB担当だと思われているのですが、ISUCONを組む時はだいたい僕よりRDBが強い人と組むことになっているので、僕は最近はNginxとかをやったりしていました。

ということで自己紹介でした。「この人はDBの人なんだな」と思いながらこの話を聞いてくれればいいです。

ISUCONの良いところはWebを支える技術をひととおり学べること

ISUCONの良いところは、ISUCONを学べばWebを支える技術をひととおり学べるということです。これは(ほかでは)ないんですよ。最近の仕事をする中では、フロントエンドとバックエンドが分かれていたりとか、インフラとバックエンドが分かれていることはけっこう当たり前なんですよね。

若い最近のみなさまは、Nginx、なんならSSH(Secure Shell)とかをしたことはありますか? 若い人はマジでSSHをやったことがないんですよ。優勝した人たちは空気を吸うようにSSHをしていると思うのですが、そもそも「えっ、鍵の登録の仕方がわからない」とか、あると思います。ISUCONは総合格闘技なので、そういうところから学べるのがすごく良いです。

しかも、過去問が全部用意されているんですよ。一部の有識者のおかげですごく簡単に始められるようになっていて、環境構築をやってみるだけでも勉強になります。

ISUCONも10年もやっていて歴史があるので、Reactを使ったりVue.jsを使ったり、フロントエンドも最新の技術を使っていたり、GraphQLがいきなり出てきたり、gRPCを使ったりというところで、ふだん仕事では使っていないけれど、「この技術はどうやって使っているんだろう?」とか「学べるんだろう?」みたいなところがひととおり入っているのが、非常にすばらしいところかなと思っています。

基本がわかるようになるからこそ、応用ができるようになる

ほかにもいろいろあります。インフラの知識を学ぶ機会はあまりなくて。例えばMySQLのコンフィグファイルは、AWSを使っていたりAzureを使っていたりすると、勝手にやってくれるんですよね。

たまに大障害になって「いや、なんの設定をすれば良いのかがわからないけど、そもそもコンフィグのパラメーターもよくわからない」というようなことはよくあると思います。

そこにおじさんが現れて、「table_open_cacheの値を増やすんじゃ」とか言って、「なんか増やしたら解決したぞ、ラッキー」みたいなことを、実際に自分たちがISUCONを通じて学べて、それを業務に活かせます。

あとはログの出し方、見方、活用方法が学べます。アプリケーションが正しく動くかどうかのデバッグは、普通はふだん開発する時にやると思います。けれども、パフォーマンスが出るかどうか、どこにどういうログが出るか、どうやってログを見るかとかは、意外とやらないんですよね。

成熟したモダンな会社だと、DatadogやNew Relicを見たら、「このあたりのグラフが上がっているからこのへんかな?」みたいな話をしたり、AthenaやS3でログをgrepすると思いますが、そうじゃなくて、「そもそもNginxのログってどうやって出ているんだっけ?」「どうやってアクセスログって集計するんだっけ?」というところから学べる機会は実はあまりなくて。

そういうところから勉強ができると基本がわかってくるので、その上の応用ができるようになるのかなと思っています。

ISUCONはシステムがマジで壊れる

あと出た人にしかわからないと思うんですけど、ISUCONはシステムがマジで壊れるんですよ。テストがないしね(笑)。戻せなくなるんですよ。

ちなみに僕は2023年のチームメイトがもう決まっていて、今日どこかの席にいるであろう瀧澤(瀧澤哲氏)という新卒2年目のやつと、ISUCON11かな……。その時に優勝したことがある、カヤックのマコピー(谷脇真琴氏)と僕と3人で組みます。

この瀧澤っていうやつとは2022年にも組んだのですが、やはり新卒1年目なので、いきなりビッグバンリリースして、「請求書の処理のところが壊れて動かないんですよね」と言って。「じゃあ、ちょっと戻そうか」と言ったら、「いや、戻せないんですよね」となり、めちゃくちゃ僕に怒られたことがありました。

本当に仕事でそんなことがあったら、もう……。仕事じゃなくてもめちゃくちゃ怒ったんですけど(笑)。小さくリリースしていって、戻して、もう1回試してみたいなことはなかなか体験できません。

みんなはNaruseJunのコードを読んでみましたか? 戻す判断がめちゃくちゃ早いんですよ。リリースして「これ違いそう」ということで戻すみたいな。そういうこと、「あっ、こうやってやるんだ」みたいなことを実際に体験できたり経験できたりするのは稀有な機会かなと思います。

あとはデプロイの仕組みとかって、今はだいたいGitHub Actionsってやつが勝手にデプロイしてくれるような世界で育つじゃないですか。あれを自分で設定するとか、「そもそもデプロイはこうやってやればうまくいくんだ」みたいなことを学ぶ機会はなかなかなくて、そういうのを体験できるのも良いところかなと思っています。

別の言語を書かなければいけない時は過去問をやるのがおすすめ

僕はふだんPHPやPythonやGoを書きますが、例えば、宗教上の理由でふだん書かないRubyやPerlをどうしても書かなきゃいけない時とか、「転職先がRailsだからちょっとRubyを練習しなきゃな」ということがあると思います。

そういう時、「PHPならわかるけどRubyがわからない」という時に、過去問をやるのはすごくおすすめなんですよ。PHPは読める時に、「あっ、PHPの書き方をRubyに置き換えるとこうなんだ」とか「あっ、Goで置き換えるとこうなんだ」とか。

あとはPythonとか。「PythonってDBのアクセスってこうやって書くんだ」とか。こういうふうに「N+1はこうやって改善するんだ」みたいなことが、過去問にはいろいろな言語で書いてあるので、過去問で学ぶのは非常におすすめかなと思います。

ファイルのアップロードやDBの保存など、ひととおり必要なところが全部置いてあるので、そういうところでISUCONの過去問を使うのもおすすめかなと思っています。

ということで、ISUCONのいいところは環境構築するだけでも学べるので、ぜひ1回、1人でもいいので素振りをやってみて、問題を触ってみて、「クソ難しいな」と思ったらハンズオンに参加してもらって。ハンズオンは昼からやるので。午前中に1回素振りができると思うので、ぜひみなさん素振りをしてもらえたらなと思います。

「偉大な芸術家は盗む」

ということで「偉大な芸術家は盗む」という話をしていこうと思います。このあたりからは実はスライドがあまりないです。みんなに合わせてしゃべろうかなと思っています。

この「偉大な芸術家は盗む」という言葉は僕が考えた言葉じゃなくて、ピカソという人がいて……。ちなみにピカソと僕は誕生日が一緒です。今日は誕生日の話が盛り上がるっぽいので誕生日の話をするんですけど(笑)。

「優れた芸術家は模倣し、偉大な芸術家は盗む」という話で、まずは真似てみればいいんですよ。真似てみて自分のものにする。自分のものにして、オリジナルを作る。「守破離の守をやって破をやって離をやりましょう」みたいなことと一緒です。

これはオットー・フォン・ビスマルクという人が言っているのですが、「愚者は経験から学び、賢者は歴史から学ぶ」。模倣先はどこから取ってくるのかという話なんですよ。なんと今日は優勝した人がいっぱいいるので、パクり放題ですよ。

僕は優勝したことがないので、優勝の仕方は話しません(笑)。みんなは優勝の仕方を聞いて、「あっ、こうやって優勝するんだ」とか、「1人でもISUCON出られるんだ」と思ってください。1人でISUCONに出ることを真似するのはちょっと難しいとは思うんですけど。

いろいろな先輩方のやり方やテクニックが詰まっているんですよ。ISUCONの良いところは、GitHubのコードなどを、みんなそのまんま公開してるんですよね。自分たちがISUCONを解いた時の問題などを、優勝チームや本選出場チームはだいたい公開しています。

なので、ただただGitHubをコピペしながら、「ここはなんでこのインデックスを張っているんだろう?」とか「なんでこのコードはここを直しているんだ?」とか考えながらコピペするだけで学べます。学んだ上で、次は「自分でゼロから解き直してみよう」とかでやれば自分の身になって、実際にISUCON本選に出てみる。

2021年かな。僕が教えていた新卒の子に「それ、やってみたらめちゃくちゃ勉強になるからやってみたらいいよ」と言って、ISUCON6からISUCON10ぐらいまでの問題を全部やった子がいたんですよ。その子はyasuoというチームで、2022年の予選は3位でしたからね。

新卒2年目の子でも3位だったんですよ。まぁ、僕らは予選落ちでしたが(笑)。愚直にコピペして学ぶだけでもめちゃくちゃ学べるので、やってもらえたらいいなと思っています。

「いや、それどうやってググればいいの?」って思うでしょう? ISUCONさんはすごく優しくて、本選ブログのまとめサイトを作ってくれているんですよ。そこから上から順番にコピーしていきます。

あとは「ISUCON優勝しました」と言っている人がいるから、そのブログをクリックして、「予選落ちしている人たちよりも本選出場のほうが良さそうだな」などと思いながらブログを見ていけばだいたいGitHubのリンクがあるので、GitHubのリンクを見ながらいろいろ試してもらえればいいんじゃないかと思います。すごくおすすめです。

他人のコードが読めるのもISUCONの良いところ

ということで、ISUCONの良いところは他人のコードが読めるのがおもしろいところです。仕事の時につらいコードを読んだり……。まぁISUCONも「つらい仕様だな」と思う時がけっこうあるんですが……。つらいコードを読んだり。

「良いコードって言うけど、良いコードって何なん?」って気持ちが肌感としてみんなあると思うんですよね。ISUCONを読んでいると、「あっ、これ、めっちゃわかりやすいな」とか「あっ、こんなテクニックがあるんだ」とか「こういうところで、あっ、こういうことをするとこんなに速くなるんだ」と、(良いコードの)体験が身に染みてわかるんですよね。

それを自分の業務に活かす機会はたくさんあるし、パフォーマンスチューニングだけじゃなくて「あっ、この人のコード読みやすいな」とか、「あっ、この変数こうやって使い回すの良くないな」とかわかるわけですよね。

なので、他人のコード、生のものを読むのは勉強になって、同じ課題でいろいろな解き方やいろいろな書き方があることを学べるのは、ISUCONのすごく良いところかなと思っています。

実際に仕事でコードを読む時は、1つのドメインに対して複数の書き方をしていることはあまりなくて。みんなでガイドラインを書いてやったり、RubyだったらRuby、PythonはPythonでこういうふうに書きましょうとルールが決まっているから、違うアプローチはなかなかしにくいんですよね。

だけど、ISUCONの場合は1つの問題を数百人の人たちが解いているので、数百通りの書き方をしているわけですよ。そういうのを読んでいくと、「あっ、これがGoっぽい書き方で、みんなこうやっているから、これはGoの文化なんだな」とか、「あっ、これはRubyの文化なんだな」というのがわかってくるようになるので、いろいろな人のコードを読むのは非常に大事かなと思っています。

ということで、模範解答を愚直に真似るとか、優勝チームを愚直に真似るというのは非常に重要です。これは僕も2022年からやっていて、先ほども言いましたが、NaruseJunのコードも読みました。

それから、白金動物園というRubyのチームが優勝したことがあるのですが、僕はRubyで出ることが多かったから、白金動物園のコードとかも読んで、真似たりもよくやっています。

同じことをやっている人がいて、PHPerKaigiというイベントがあったのですが、PHPerKaigiでPHPでNaruseJunのコード……。2022年の優勝チームなので立てていきますが(笑)。NaruseJunのコードをひたすらPHPで書き直すことをやっている人がいるんですよ。

これはYouTubeでも動画になっていて。20分なのでここで動画を20分流せばいいかなと思ったんですが、さすがにそれは怒られそうなのでやりませんが。ぜひ見てもらえたらなと思います。

「PHPだとGoの書き方はこうやって置き換える」とか、「Goでこういうチューニングが、PHPだったらこうやってチューニングするよね」みたいな話もしているので、優勝者の人も見てもらって。すごく楽しめる作品というか、スライドかなと思っているので、ぜひ読んでもらえたらなと思っています。

「あっ、こうやってコピペしていくんだ」ということを学べるので、これを実際に自分たちもやってみるのは、非常におすすめです。最終的なオチもめちゃくちゃおもしろいのでおすすめです。

うまくやっている人たちのやり方を真似るだけでも楽しめる

ということで、最適な方法を身につけるというのが(必要なこととして)あるので、まずは難しいことを考えず、「よし、10万点を目指すか」「20万点を目指すか」とかじゃなくて、まずうまくやっている人たちのやり方を、よくわかっていなくても真似るだけでも十分楽しめるのかなと思っています。

その結果、「よくわからんな」となることはあると思うんですよ。「よくわからんな」ということをググっていけばよくて、「スロークエリログの出し方、よくわからんな」「スロークエリログは出したけど、そもそもスロークエリログってどうやって読むんや」とか、そういうのを順番にやっていけば、いろいろなことが身についていくのかなと思っています。

(次回に続く)