先日(12/10)社内でisucon8の問題を解くイベントが開催されたので参加してきました。
詳しい内容は
- DeNA Techブログ
- イベント概要は後ほどUPされるっぽいのでそしたら更新します。
- ISUCON8予選問題においてPerl実装で25万点を突破する方法 - Technology of DeNA
- ISUCON8 予選問題の解説と講評 : ISUCON公式Blog
を参照してください。
今回は僕の振り返りをまとめてみます。
結果
惨敗でした。予選通過スコアが3万弱くらいだったので遠く及ばないスコアしか出すことができず、文字通り「なんの成果もあげられませんでした」状態で無事終了しました。
敗因
こんな感じかなと(若干言い訳じみた内容も含みます)
isucon慣れしてない
しょっぱなから言い訳です(笑
こういった競技プログラミング的なことを経験したことがなかったので、まずレギュレーションを確認したり、何から取り掛かるべきかってところであたふたしてしまいました。ダッシュボードの使い方とか最初よく分かってませんでしたし初動のここで時間がかかってしまいました。
また、チームとしての作業分担をあらかじめ決めておけませんでした。慣れてるチームはある程度役割分担を先に決めてしまってサクサク作業を進めていた印象でした。
Linux忘れてる問題 and インフラの知識不足
Linuxの使い方とリソース監視のところが丸っと忘れててなんの力にもなれませんでした。
普段の業務はほぼPaaSの運用作業なのでVMにSSHするなんてめちゃくちゃ久しぶりでしたし、sysctl系のLinuxコマンドもほぼ忘れてたり、知らないもの多くてこの辺知ってる知らないで確実に差が出てしまったところだなと思いました。
特にサーバーのリソース監視のところさっぱり忘れてて、サーバーのリソース監視ってどうするんだっけ?とか初歩の初歩でどつまづいてました。 dstat
コマンドとかそういえばありましたね。
計測方法の未整備
憶測するな、計測せよ という当たり前のことができてませんでした。
まずボトルネックになってるEPがどこでそこを高速化するって言う当たり前のことなんですけど、参加したチームでこの辺の計測の手法とかツールを先決め事としてやっておけなかったのがあとあとになって響きました。
パラレルで作業するに当たって誰がどこをするのか、なんでそれをするのか?をちゃんと根拠立てて進めるために、計測する仕組みを先に整えておけばよかったと思います。
高得点を出したチームはここが出来ていたように思います。
この辺もプロファイルするコマンド知っていたり、計測するプラクティスを知ってる知らないで差が出たなと思いました。
実装力不足
GetEvents地獄をさっさと取り除ければもっと色々出来たのかなと感じました。
ボトルネックを見つけた後、素早く修正する単純な実装力もないなと実感しました。後述する理由もあってオンタイムで参加できなかったので、解決にかける時間がそもそも少なかったというのはありますが、それでももっとサクサク実装できればよかったなと思いました。
使い慣れてないライブラリやツールであっても使えるように日頃から素振りとかしているとこういう時に役に立つんだなと思います。
そのほか
差し込み業務があって参加が遅れてしまいました...(これは仕事なので仕方なし)
まとめ
基本的なところでつまづいてしまった
ってところが大きいです。
実力不足を痛感しました。
それに気づけたいい機会でした。
どうしても普段仕事をしていると、自分がどれくらいの実力なのかわからなくなる時があるのでこういった競技に参加してみるのも自分を客観視できるいい機会だなと思いました。
今回予選問題を作成した karupanerura sanが「isuconはweb開発の総合格闘技」と言う言葉を使ってますが、その意味が少しわかりました。
アプリケーションレイヤーだけでなく、インフラや、ボトルネックを見つける力、それに対して最短でアプローチし、かつ最速で実装するスキルを求められましたし、どれを取っても全く不足してました。。。
(もちろん業務で書かないようなコードの書き方もしたので、仕事においてはこれができればいい、ってわけでもないんですが...)
反省ばかり並べても悲しくなるのでよかったところを最後にまとめます。
よかったこと
- isuconと言うイベントを体験することが出来たこと。
- 知ってはいましたが参加するのにおよび腰だったのでこういった社内で開催される機会があってよかったです。イベントへの心理的なハードルを下げることが出来ました。
- 速度アップという目的に特化したことで普段業務で意識しないところまで意識せざる得ず、よく言われる問題(N+1問題とか)を実際に体験出来たこと。
余談
今回はGoで参戦しましたがこういったイベント(予選ではなく社内開催ではありましたが)に参加したことで、言語ごとに多少に有利不利はあれど、言語で差が出る以前の基本的なweb開発のスキルが大事であることを実感しました。
実際、講評にもある通り、Goは言語的には有利だったにも関わらず全くその良さを出すことは出来ませんでした。そのレベルに行く以前のところでつまづいたので全くスコアを出すことは出来ませんした。
問題解決に最適なツールを選択すること、そしてそれを使う自分の基本的なスキル上げる方が大事だなと思いました。
精進しよ....