ISUCON14参加してみたら、学びにもなるし楽しかった

# はじめに
こんにちは、H×Hのセンリツ大好きエンジニアです。（同担OKです😉）

この度2024年12月8日（日）に開催されたISUCON14へ参加してきました！

https://isucon.net/

この記事は初参加した社会人2年目の奮闘記録になります！🫡

# ISUCONとは？
ISUCONの正式名称は、**Iikanjini Speed Up Contest**（いい感じにスピードアップコンテスト）といい、**お題となるWebサービスのパフォーマンスを向上させる大会**です！

パフォーマンス改善と言っても様々な分野で出来ることがありますが、ISUCONはレギュレーションさえ守れば後はどう改善しようが自由なので正解がありません！

そのため、自分で考えて実装する楽しさだけでなく自分とは違ったやり方を見て学ぶことでWebアプリ全般の知識力向上にも繋がる、エンジニアにとってはまさに**一石二鳥**の大会なんですね😎
（と言いつつ筆者は初参加🤫）

# 簡単なプロフィールと結果
### プロフィール
- **経歴**：　　学部卒からの社会人2年目
- **職業**：　　Webエンジニア
- **使用言語**：TypeScript、Go

今回は職場の同期と3人で参加しました。
### 結果
- **最高スコア**：<font color="Crimson">8505</font>点
- **最終スコア**：<font color="Crimson">8481</font>点
- **順位**：<font color="Crimson">199</font>/831位

![スクリーンショット 2024-12-09 5.53.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2653241/1cbbc5cd-df5b-8e4f-1f2a-dfca81dd3b01.png)

ちなみに、チーム名の`shadow_beast`はH×Hの陰獣のことで、「俺達に任せろ！」という気持ちを表しています😉

# 事前準備
### 週1での勉強会
著者のチームとは別でもう1チーム同期から参加予定だったため、6人で毎週定時後に集まって勉強会を開催してました（）
ここでは、主に下記の**ISUCON過去問一式まとめ**を使用してハンズオン形式の勉強会を行ってました。

https://github.com/matsuu/aws-isucon

### 過去問の解法調査
ISUCON13の解説記事や、参加した方の記事を読んで取り組み方や当日の動きなどを学びました。


https://isucon.net/archives/58001272.html

https://zenn.dev/tohutohu/articles/923bdf5dcd73af

### 書籍での勉強
システムのアーキテクチャに関する本とDBの設計に関する本を読んで、どのようにパフォーマンスを向上させるか勉強しました。

- [システム設計の面接試験](https://www.amazon.co.jp/%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E8%A8%AD%E8%A8%88%E3%81%AE%E9%9D%A2%E6%8E%A5%E8%A9%A6%E9%A8%93-%E3%82%A2%E3%83%AC%E3%83%83%E3%82%AF%E3%82%B9%E3%83%BB%E3%82%B7%E3%83%A5%E3%82%A6/dp/4802614063)
- [達人に学ぶDB設計徹底指南書 第2版](https://www.amazon.co.jp/%E9%81%94%E4%BA%BA%E3%81%AB%E5%AD%A6%E3%81%B6DB%E8%A8%AD%E8%A8%88%E5%BE%B9%E5%BA%95%E6%8C%87%E5%8D%97%E6%9B%B8-%E7%AC%AC2%E7%89%88-%E3%83%9F%E3%83%83%E3%82%AF/dp/4798186627)

# 当日のあたふた記録
### 10:00 ~ 11:00
まずは環境構築、残り2人はその間にアプリについての説明とソースコードを見る
構築完了後、著者だけ環境にSSHできずあたふた（1敗）
（SSHキーがGitHub以外にも複数あっただけなので、秘密鍵を指定して渡してあげるだけでした😇）

SSH先ではvi（Visual Editor）しか使えないため、VSCodeを入れようとして上手くいかず。。。😔（2敗）

この時点ではスコア800点くらい

### 11:00 ~ 13:00
DBのパフォーマンスチューニング。
逐一ベンチマークを走らせながらWhereで検索条件に使われているカラムに対してインデックスペタペタ。

ここでもインデックスによってスコアが落ちてあたふた😥（3敗）
最終的には3,000点くらいに落ち着く。

この間に、裏ではNewRelicの導入を進めてくれていた。

### 13:00 ~ 16:00
ここでようやくコードを弄り出す（今回はGo言語を選択）
N+1になっている箇所を発見したのと、NewRelicで重めのエンドポイントを特定したので改善。

N+1は改善したが、若干しかパフォーマンスが改善できずあたふた（4敗）

この時点でスコア4,000点くらい

### 16:00 ~ 17:00
ベンチマークのログを確認すると、明らかにアルゴリズムが悪い箇所を発見。
気付くのが遅かった😩

アルゴリズムをゴリゴリ書き換えると、スコアが急激に伸びた（1勝）
ただ、まだ改善の余地があったのでさらに書き換えていったが、そこからはあまり伸びずあたふた（5敗）

この時点でスコア8,500点くらい

### 17:00 ~ 18:00
引き続きアルゴリズムを改善すると同時に、NewRelicを導入してくれた同期がSSEなるものに挑戦してたが断念。（6敗）

後は、重めのエンドポイントを改善しようと頑張り、ちょっと早くなった（気持ち）

17:55分くらいにコードフリーズ。

# 感想
### お題が面白かった
車のライドシェアサービスは聞いたことがあったんですが、椅子をシェアする**ライドチェア**という発想が面白かったです😄

また、アルゴリズムが悪い箇所も椅子とユーザをマッチングする処理だったのですが、そこを全体最適問題のように解いていく必要があったっていうことも気付けた時にへえ〜ってなりました。

### ベンチマークでスコアが出るので楽しかった
エンジニアの仕事って営業の方と比べると数値に出にくい業務が多いと感じていましたが、パフォーマンスチューニングだとスコアが出るため、改善したな〜と気持ちよくなれる瞬間が度々ありました☺️

3人でDiscordを繋いでましたが、改善される度に皆で喜んでました🤭
アルゴリズムを改善した時にスコアが倍になった時が一番達成感がありました。

### 準備が足りなかった
当日に何するかや、あらかじめ開発環境を整えることをまとめておけば・・・と思いました。
また、過去問も前回分しか行えていなかったため、あらゆるパターンを考える意識が足りてなかったなと・・・😭

### インフラの方に手が回らなかった
アプリの方で改善することがあったことや、インフラのどこから手を付ければ良いか分からなかったこともあり、インフラを改善することが出来ませんでした。

前回のISUCONではインフラ改善によって大幅にスコアを伸ばしていたので、今回も１万点以上を狙うならすべきだったと感じました。

# おわりに
初参加でほとんど準備が出来てませんでしたが、当日は思ったより楽しめました！
また、休日にガッツリパフォーマンスチューニングの勉強をしてる感が出たので精神衛生上にも良いと思います！

次回に向けては、以下のことをやろうと考えています。
- ISUCON過去問を解いて理解を深める
- インフラの知識だけでなく、手を動かして改善できるようにする
- 事前準備として考えられるものをしっかり用意しておく
- アルゴリズムに関する知識を深める


今回参加してみて非常に楽しかったので、もしこの記事を読まれている方で参加経験が無い方は気軽に挑戦してみてください！
最後までご覧いただきありがとうございました🙇