社内isuconに参加して惨敗した話

先日(12/10)社内でisucon8の問題を解くイベントが開催されたので参加してきました。

詳しい内容は

を参照してください。
今回は僕の振り返りをまとめてみます。

結果

惨敗でした。予選通過スコアが3万弱くらいだったので遠く及ばないスコアしか出すことができず、文字通り「なんの成果もあげられませんでした」状態で無事終了しました。

敗因

こんな感じかなと(若干言い訳じみた内容も含みます)

isucon慣れしてない

しょっぱなから言い訳です(笑

こういった競技プログラミング的なことを経験したことがなかったので、まずレギュレーションを確認したり、何から取り掛かるべきかってところであたふたしてしまいました。ダッシュボードの使い方とか最初よく分かってませんでしたし初動のここで時間がかかってしまいました。

また、チームとしての作業分担をあらかじめ決めておけませんでした。慣れてるチームはある程度役割分担を先に決めてしまってサクサク作業を進めていた印象でした。

Linux忘れてる問題 and インフラの知識不足

Linuxの使い方とリソース監視のところが丸っと忘れててなんの力にもなれませんでした。
普段の業務はほぼPaaSの運用作業なのでVMSSHするなんてめちゃくちゃ久しぶりでしたし、sysctl系のLinuxコマンドもほぼ忘れてたり、知らないもの多くてこの辺知ってる知らないで確実に差が出てしまったところだなと思いました。
特にサーバーのリソース監視のところさっぱり忘れてて、サーバーのリソース監視ってどうするんだっけ?とか初歩の初歩でどつまづいてました。 dstat コマンドとかそういえばありましたね。

計測方法の未整備

憶測するな、計測せよ という当たり前のことができてませんでした。
まずボトルネックになってるEPがどこでそこを高速化するって言う当たり前のことなんですけど、参加したチームでこの辺の計測の手法とかツールを先決め事としてやっておけなかったのがあとあとになって響きました。
パラレルで作業するに当たって誰がどこをするのか、なんでそれをするのか?をちゃんと根拠立てて進めるために、計測する仕組みを先に整えておけばよかったと思います。
高得点を出したチームはここが出来ていたように思います。
この辺もプロファイルするコマンド知っていたり、計測するプラクティスを知ってる知らないで差が出たなと思いました。

実装力不足

GetEvents地獄をさっさと取り除ければもっと色々出来たのかなと感じました。
ボトルネックを見つけた後、素早く修正する単純な実装力もないなと実感しました。後述する理由もあってオンタイムで参加できなかったので、解決にかける時間がそもそも少なかったというのはありますが、それでももっとサクサク実装できればよかったなと思いました。
使い慣れてないライブラリやツールであっても使えるように日頃から素振りとかしているとこういう時に役に立つんだなと思います。

そのほか

差し込み業務があって参加が遅れてしまいました...(これは仕事なので仕方なし)

まとめ

基本的なところでつまづいてしまった ってところが大きいです。
実力不足を痛感しました。

それに気づけたいい機会でした。
どうしても普段仕事をしていると、自分がどれくらいの実力なのかわからなくなる時があるのでこういった競技に参加してみるのも自分を客観視できるいい機会だなと思いました。

今回予選問題を作成した karupanerura sanが「isuconはweb開発の総合格闘技」と言う言葉を使ってますが、その意味が少しわかりました。

アプリケーションレイヤーだけでなく、インフラや、ボトルネックを見つける力、それに対して最短でアプローチし、かつ最速で実装するスキルを求められましたし、どれを取っても全く不足してました。。。
(もちろん業務で書かないようなコードの書き方もしたので、仕事においてはこれができればいい、ってわけでもないんですが...)

反省ばかり並べても悲しくなるのでよかったところを最後にまとめます。

よかったこと

  • isuconと言うイベントを体験することが出来たこと。
    • 知ってはいましたが参加するのにおよび腰だったのでこういった社内で開催される機会があってよかったです。イベントへの心理的なハードルを下げることが出来ました。
  • 速度アップという目的に特化したことで普段業務で意識しないところまで意識せざる得ず、よく言われる問題(N+1問題とか)を実際に体験出来たこと。
    • ベタなIaaSの構成だったのがとてもよかったです。リソースが限られている中で高速化について考える機会がクラウドを使っているとそんなに訪れるわけではないですが、無駄な実装をしているとそもそもいくらお金かけても意味がないので。
    • 無駄な実装を取り除くとスコアが上がる、単純なことですが定量的に評価されるとなぜやるのか?ということの意味がわかります。

余談

今回はGoで参戦しましたがこういったイベント(予選ではなく社内開催ではありましたが)に参加したことで、言語ごとに多少に有利不利はあれど、言語で差が出る以前の基本的なweb開発のスキルが大事であることを実感しました。
実際、講評にもある通り、Goは言語的には有利だったにも関わらず全くその良さを出すことは出来ませんでした。そのレベルに行く以前のところでつまづいたので全くスコアを出すことは出来ませんした。
問題解決に最適なツールを選択すること、そしてそれを使う自分の基本的なスキル上げる方が大事だなと思いました。

精進しよ....