キュアセブン技術ブログ

考えたこと,学んだことを書きます

新卒1年目がISUCON9でやれたことやれなかったこと

isucon9に参加した

isuconに参加しました!!!!!!!!!!楽しかった!!!!!!!!

数年前からisuconですごい賑わってるTLをみて、いつか参加できるようなスペシャルエンジニアになりてえなあ、と思っていたところ、なんと新卒1年目から参加することができました。
@int_sorarinu さん、 @shuzoN__ さん、一緒に組んでくれてありがとうございました!!!

私たちは牡蠣で食中毒、というチーム名で土曜日に参加しました。私はもちろん、チームメンバーみんながisucon初参加だったので、今回の目標は「参加してみる」でした。

isucon9、今回のお題

詳しくはマニュアルを見ていただいて。 メルカリ出題の、簡単なメルカリみたいなイスカリってサービスで、イスコインを稼げ!というお題です。 半角カタカナのイスコインがジワった。 f:id:shiningcureseven:20190908173621p:plain

練習やったこと

チームメンバーの予定が合わなくて平日の業務終わり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で見ながらモデルを洗い出していった。テーブルから見た方がよかったかも f:id:shiningcureseven:20190907213916j:plain

そしてそれをもとにER図を書いた

  • テーブル
  • モデル

f:id:shiningcureseven:20190907212358j:plain お昼ご飯タイムにチームメンバーに確認してもらった。

クエリ洗い出し

GitHubにissueを切って、ひたすらクエリを貼っていった。 その時に、悲観ロックあるな〜*1とかこの関数何回も呼ばれてるしたくさん実行してそうだな〜って考えられた。

エンドポイント洗い出し

今回はソースコードの最初にまとまっていたので見ただけ

サービス仕様調査

一旦どんなサービスかいじってみながら見てみた。 issue立てて画面ごとにどんな機能があるか洗い出していった。 結局ちゃんとドキュメントにした効力は発揮されなかったかも。さらっと見ていくだけでよかったかもしれないと思った。 途中

  • 購入画面Failed to fetchで購入できなかった
  • Saving image failedで出品できなかった

ので諦めた。

リファクタポイント洗い出し

お昼すぎごろ、3人でリファクタするポイントを出していった。

f:id:shiningcureseven:20190907220129p:plain

私が気づけたこと

  • 漠然とモデルの設計が冗長そうだと思った
  • img_binaryがDBで保存されているようだ
  • N+1が存在してる箇所がありそうだ f:id:shiningcureseven:20190907220159p:plain

チームが気づけたこと

  • varcharなreserved_idいる?
  • categoriesテーブルの parent_idにindex貼ったら早くなる?->43レコードなので忘れる
  • transaction_evidencesテーブル、item joinでかなりカラムが削減できる
  • config テーブル 定数で良い

N+1解消ペアプロ

  • @shuzoN__さんとペアプロした。go書けなさすぎて無力だった。
    • forの外にクエリを出して、INでitemIdsを入れた。
    • error処理も外に出した

やってもらったこと

  • 本番環境構築してもらった@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スタートで最高記録の時のスクショしかないですが最後までこんな感じでした。 f:id:shiningcureseven:20190907214904p:plain 全然上がりませんでした。
これ上がるやろ!って思って開発していたのが全然効果を発揮してくれなかった感じで毎回渋い感じでした。

感想

あっという間の8時間でした。意外に早く終わった。

与えられた物を読むだけで、ソースコードにアウトプットできなかったので無力感ありました。 課題としては

  • 調査力をあげてもうちょっと早く洗い出せること
  • 実装力をつけて自分でリファクタできること

です。 今年は出られただけで、最初の一歩を踏み出せたのでとっても満足です。ところで1日目の優勝は学生1人のチームでした。まじすげえ。 来年は1箇所でもリファクタしていくのが目標です!

*1:昨日FOR UPDATEの話をチラ聞きしたから分かった