id:hakobe932とid:hatz48の3人で「C0-100%」というチームで出てきた.結果は予選敗退.
アプリケーションエンジニア3人で,テストを書いて安全に作ろうという作戦で進めていた.
準備
ISUCONだからといって乱暴にコードを書かず,普段通りの正しい安全なオペレーションをしよう,という話をして,ISUCON4と5で練習して,便利グッズを整えたり,デプロイの練習をしたりしていた.
- ローカルでセットアップするスクリプトを用意
- Mechanizeでテストを書けるように
- Devel::Coverでカバレッジを取れるように
- Devel::NYTProfでプロファイリングできるように
- CircleCIに乗せる
- CIが通ったらデプロイ
- デプロイされたらSlackに通知が来る
- mackerelで外形監視
ISUCON4の練習ではC0 100%を達成できて,順調な雰囲気だった.
前日に集まって,当日の朝はこういうフローでやろう,という話を決めて,チェックリストを作ったりした.
午前
朝は順調で,練習の通りに進んで,ひと通りのサーバーの設定をしたり,CIに載せたり,NYTProfの結果を見て議論したりしていた.
CIがあるので,Pull Requestを作って,レビューして,LGTMして,テストが通ればマージ,という手順で進められた.LGTMしたけどCIが落ちて,その後直したら通ったのでマージしたり.
htmlifyで毎回SELECTしてるのをやめたり,isutarとisudaを同居させて,スターの取得を単なるメソッドにしたり,Gazelleに変えたり,というのをひと通りやって17000点になって,同僚のチームを抜いたところで昼ご飯.
昼
昼ご飯食べて作戦相談して,htmlifyがボトルネックなので,以下の3つをやろうということになった.
- htmlifyした結果をキャッシュする
- 更新があったらFLUSHALLする
- htmlifyするための正規表現をキャッシュする
- 更新があったらFLUSHALLする
- htmlifyするための正規表現をRegexp::Assembleにする
ここからの流れが良くなかった.それぞれ実装はすんなりできたのだけど,ベンチマークがこけてしまう.同時に入れたり外したりしたので,結局どれが悪いのか分からなくなって,順番にrevertして再びベンチマーク回したり,warnしてみたり,というので2時間くらい使ってしまった.
Redisじゃなくてインスタンスキャッシュにして,23000点くらい.
Redisじゃなくてmemcachedにしてみよう,というのを試したら,ベンチマークは通るけど6000点くらいになってしまった.
夕方
キーワードの長さを別カラムに入れてみようということになって,10分くらいでペアプロして作ったら38000点くらいになった.
最後に一か八か,キャッシュも入れてみよう,と入れて試したらやっぱりだめで300点くらいになって終わり.
他のチームもオフィスで参加していたので,集まってコードを見せ合ったりした.
強い人がみんな出題側に回ったからか,我が社からは5チーム出たけど全員予選敗退.
よくなかった
いろいろよくなかったので反省.
同時にいろいろ入れてしまった
同時にいろいろマージして,それがバグっていたので,どれが悪いのか切り分けが難しかった.Regexp::Assembleにするのはどう考えてもよいけど,慌てて一緒にrevertしてしまった.
だらだらやってしまった
これができればきっとよいはず…という気持ちが先行して,1時間とか2時間とか,同じところを見てしまった.難しいことではなくて,スッとやれば10分とかで終わる規模の改修なので,30分とかで区切って,うまくいかなければ,その実装は捨てて別の人をアサインして再度やり直せばよかった.
計画が雑だった
「キーワードが更新されたらFLUSHALLすればいいでしょう」「なるほど」くらいで戦略を決めて,それに2時間くらい引きずられてしまった.1時間くらいやってもだめなところで手を引いて別の方法を考えればよかった.別の方法としては,キーワードが更新されるたび一覧をRedisに入れて,その場で正規表現を作っておく,とかも考えられた.
時間の使い方がだめだったけど,初参加なのでこんなものか,という感じもする.次また同じことやればもっとうまくできそう.普段コード書く仕事をしているけど,実際には実装力が全然足りなくて,コンテストでも勝てず,全然だめ,ということが分かったのがよかった.感覚的には2倍くらい正しく正確なコードを書けるようになりたい.
気になるカバレッジは?
55%でした.最後のほうはCIも落ち続けて,自動デプロイはやめて手でデプロイしたりしていた.