新卒1年目がISUCON9でやれたことやれなかったこと
isucon9に参加した
isuconに参加しました!!!!!!!!!!楽しかった!!!!!!!!
起床成功してます
— キュアセブン (@cureseven) September 6, 2019
数年前からisuconですごい賑わってるTLをみて、いつか参加できるようなスペシャルエンジニアになりてえなあ、と思っていたところ、なんと新卒1年目から参加することができました。
@int_sorarinu さん、 @shuzoN__ さん、一緒に組んでくれてありがとうございました!!!
私たちは牡蠣で食中毒、というチーム名で土曜日に参加しました。私はもちろん、チームメンバーみんながisucon初参加だったので、今回の目標は「参加してみる」でした。
isucon9、今回のお題
詳しくはマニュアルを見ていただいて。 メルカリ出題の、簡単なメルカリみたいなイスカリってサービスで、イスコインを稼げ!というお題です。 半角カタカナのイスコインがジワった。
練習やったこと
チームメンバーの予定が合わなくて平日の業務終わり3日しか練習しませんでした。反省。
担当決め
@int_sorarinuさんが業務でもインフラをやっているし知識があるのでお願いした。私と@shuzoN__さんはアプリ開発をやっているしアプリ側をみる事にした。
言語選定
GOが読みやすいからそれだけでいいよね〜〜ってなって書いたことがなかったけどGOになりました。A tour of Go ちょっとだけやりました。 GOにするって決まった後に、上司にGOの思想語ってもらったのが結構デカかった。 アプリの2人はPHPerだけど、GOに挑戦してみる事にした。 練習の段階ではGOが全然読めなくて、PHPのソースコードと見比べながら読み進めていった。
ISUCON8を練習していった。
ISUCON8をお題に、色々決めていった。私は一旦sshしてサービス見た。
- どう管理するか考えた。GOはbuildが必要なので、ビルド成果物をgit管理する?って話とかした。
- インフラの@int_sorarinuさんは環境構築コマンドをまとめていた。
タイムテーブル作った
- 再起動試験の時間確保するとか、何時集合とか、そんなにきっちりは決まらなかった
本番やったこと
マニュアル読んだ
環境構築してくれている間にマニュアルを読んだ。還元率のこととかもなんとなく把握できた。
ER図書いた
環境構築していただいて、一旦sshできたら本番のソースコードをvimで見ながらモデルを洗い出していった。テーブルから見た方がよかったかも
そしてそれをもとにER図を書いた
- テーブル
- モデル
お昼ご飯タイムにチームメンバーに確認してもらった。
クエリ洗い出し
GitHubにissueを切って、ひたすらクエリを貼っていった。 その時に、悲観ロックあるな〜*1とかこの関数何回も呼ばれてるしたくさん実行してそうだな〜って考えられた。
エンドポイント洗い出し
今回はソースコードの最初にまとまっていたので見ただけ
サービス仕様調査
一旦どんなサービスかいじってみながら見てみた。 issue立てて画面ごとにどんな機能があるか洗い出していった。 結局ちゃんとドキュメントにした効力は発揮されなかったかも。さらっと見ていくだけでよかったかもしれないと思った。 途中
- 購入画面Failed to fetchで購入できなかった
- Saving image failedで出品できなかった
ので諦めた。
リファクタポイント洗い出し
お昼すぎごろ、3人でリファクタするポイントを出していった。
私が気づけたこと
- 漠然とモデルの設計が冗長そうだと思った
- img_binaryがDBで保存されているようだ
- N+1が存在してる箇所がありそうだ
チームが気づけたこと
- varcharなreserved_idいる?
- categoriesテーブルの
parent_id
にindex貼ったら早くなる?->43レコードなので忘れる transaction_evidences
テーブル、item joinでかなりカラムが削減できる- config テーブル 定数で良い
N+1解消ペアプロ
やってもらったこと
- 本番環境構築してもらった@int_sorarinu
- git導入してもらった@shuzoN__
- 私はクローンしてくるだけだった
- ローカル開発環境 + 自動化のmakefile作成@shuzoN__
- レコードの量見てもらった@int_sorarinu@shuzoN__
- kataribe入れてもらった@int_sorarinu
- N+1対象箇所のクエリexplain@shuzoN__
- index貼れそうなテーブル探し(見当たらなかった@みんな
- slow queryの出力
- 設定をデフォルトから変えられず断念@shuzoN__
- 静的ファイルのキャッシュ@int_sorarinu
- configテーブルを定数にする@int_sorarinu
SELECT * FROM transaction_evidences WHERE item_id = ?
をforから出してN+1の解消@shuzoN__- FOR UPDATE消した@shuzoN__
- git mergeからベンチ回してもらうまでやってもらった@int_sorarinu
やれなかったこと
- 静的ファイル呼び出してるところ洗い出して!って言われたの応えられなかった
- ソースコードに気になった事直接書き込んでプルリク投げるまでできたらよかったけどissueに投げただけだった
- リファクタ全般自走できなかった
結果
約2300スタートで最高記録の時のスクショしかないですが最後までこんな感じでした。
全然上がりませんでした。
これ上がるやろ!って思って開発していたのが全然効果を発揮してくれなかった感じで毎回渋い感じでした。
感想
ISUCON 敗北しました
— キュアセブン (@cureseven) September 7, 2019
あっという間の8時間でした。意外に早く終わった。
与えられた物を読むだけで、ソースコードにアウトプットできなかったので無力感ありました。 課題としては
- 調査力をあげてもうちょっと早く洗い出せること
- 実装力をつけて自分でリファクタできること
です。 今年は出られただけで、最初の一歩を踏み出せたのでとっても満足です。ところで1日目の優勝は学生1人のチームでした。まじすげえ。 来年は1箇所でもリファクタしていくのが目標です!
*1:昨日FOR UPDATEの話をチラ聞きしたから分かった