何もわからないけどISUCON13に挑戦してみた

# これはなに？
初心者がはじめてISUCONに挑戦して、学びしかなかった話です。
（復習しながら少しずつ更新するかも）

## ISUCONとは？
ISUCONとは、LINEヤフー株式会社が運営窓口となって開催している「お題となるWebサービスを決められたレギュレーションの中で限界まで高速化を図るチューニングバトル」です。

https://isucon.net/

スポンサー企業も多い、WEB系をはじめとするITエンジニアに広く知られるコンテスト…らしいです。非ITエンジニアの私は昨年ISUCONの存在を知り、なんだか面白そうだと思って遠巻きに見てました。

## なぜ参加したのか

WEBアプリを作ってみたく、一人でしょぼいWEBアプリを作って遊んでたときに、@hide_take さんにお誘いいただいたので参加させていただきました。

https://qiita.com/hide_take/items/b0c7aa4b854a1fa82fab

# チーム共有で使用したツール（インフラ）

### discord

基本的なやり取りはすべてDiscord。[技術チャレンジ部（challenge_club）](https://challenge-club.connpass.com)のDiscord上で参加者を募り、その流れでISUCONチャネルを作って連絡しました。

### AWS

練習時点ではAWSのアカウントを持っていない人も多かったため、@hide_take さんのアカウントにIAM ユーザー登録してもらって、複数人で使用させていただきました。

### github organization

Meetingのメモや、当日使用するToolなどは、Github環境で共有しました。

### github アカウント(bot用)

下記ブログを参考に、bot用のアカウントを準備しました。
（ただ、私たちの使い方だと、普通に個人アカウントでプライベートレポジトリを使えばよかったので、不要だったかもしれません。環境ごとにスムーズにアカウント切り替えるノウハウが身に付きました。）

http://tatamo.81.la/blog/2018/09/16/isucon8-qual-2/

> 私たちのチームでは、専用のGitHubアカウントを作ってそこに公開鍵を登録するようにしました。 (※GitHubの利用規約に抵触しないようにするため、 「**-bot」のような名前にして予選終了後は消すことで、Machine userと言い張ることにします。実際自動化のために用いるので…)

### ISUCON本 

この本を手元に持ちながら、みんなで素振り会をしました。

https://gihyo.jp/book/2022/978-4-297-12846-3

### OneNote

SSHキー、アカウントの情報などはOneNoteでメンバーだけに共有しました。



# 準備の様子

## ISUCONの存在を知る

ISUCON12の時に存在を知り「来年は参加したい」と思いながら配信やTwitterを眺めていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599506/39035e7b-7ce4-891c-add2-392cd56749b8.png)

## チーム結成まで

昨年のISUCON12から、2023年の頭くらいまでは、興味ありそうなメンバーで不定期にワイガヤしてました。SQLの勉強会や、過去問の環境構築、趣味のWEBアプリ開発の話など、ちらっとでもISUCONに関わりそうな話をしてました。

個人的には、PythonやGo言語でのWEBアプリ開発にトライしてみたり、AWSのハンズオン参加してクラウドプラクティショナー等の試験受講してみたり、SQLかじってみたり、少しずつ周辺知識を集めようとしてました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599506/652fbe94-e400-2085-d58a-cc84d86d0865.png)

（しかし、やる気が長期間継続するはずもなく、ISUCON13の申込直前まで、ISUCONのことを忘れる日々もありました。）

## ISUCON13登録（0次試験）

いよいよ参加登録です。しかし、完全に甘く見てました。登録の時点でも、いい感じにスピードアップする必要があることを学びました…。

初回申込は忘れていたので参加できず。2回目は出張中の新幹線の中からスマホ参加。申込オープンから1分経たずに埋まっていしまい、登録失敗。

20時オープンでこれです。ISUCONすごい。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599506/61aeff75-ef3e-361f-dfd2-81c54211f02b.png" width=50%>

3回目は自宅から、満を持して登録バトルに参加。なんとか登録できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599506/ec052430-07e2-75aa-affe-0c81fdb4c1b4.png)

## チーム結成

Discordでオープンに参加者を募ったり、直接お声がけしたり、興味ありそうな人が7~8名集まり、その中で、当日参加できそうな6名が2チームに分かれて参加することになりました。

DB触れる人、ソフト開発得意な人、アプリ触りたい人など、参加者のスキルやモチベーションを考慮してチーム分けしました。

## 練習開始

週1~2くらいのペースで平日の21時頃に集まって素振り会をしました。直前の練習以外はチーム関係なく一つのボイスチャットに集まりました。

皆さん本格的なWEBアプリ開発未経験(?)、ISUCON初挑戦のメンバーだったので、過去問やルールの確認、当日準備すべきことのチェックや、素振りなどを行いました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599506/000b8d6c-c787-a067-d521-71d5ceb16e4c.png)

毎回2~4名程度参加してましたが、メイン作業するドライバー、指示するナビゲーターを毎回交代しながら、モブプロのように進めていきます。ドライバー、ナビゲータ以外の人は、類似環境で同様の作業したり、先回りして調査したりする形で参加していました。

みんなが毎回参加できるわけではないので、共用のgithubレポジトリにメモを残していきます。
（私は11月に2週間出張で全く作業できない期間があったため、非常に助かりました。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599506/a9b60049-5c31-b776-014c-46049f0c2a89.png)

本番環境でも行う初期設定、例えばモニタリングツールのインストールや、Githubの設定などは、シェルスクリプト化してtool用のgitレポジトリに登録しました。その他、当日環境に入れておきたいファイルもこちらに追加しておきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599506/c3b032ce-cc40-9b21-0eb7-4ded13746fc2.png)

基本的には、ISUCON本や過去門とその解説記事を見ながら進めていきます。私たちはISUCON12予選の環境を立ち上げていただき、この環境をいじりながら素振りしていきました。

参加者の皆様、経験してきた仕事内容も環境も違うので、それぞれ知見を持ち合いながら作業させていただけたのが、初心者の私としては非常にありがたかったです。いろんな方の"当たり前"を教えていただくだけで、とても勉強になりました。

（私はWEB開発やソフト（アプリ）開発の業務経験はないのでお役に立てないと思っていましたが、Githubの使い方やVSCode、AWSなど開発環境周りの経験の共有など、思わぬところで少しだけ貢献できたような気がします。）

ISUCON13の大会前日は、@hide_take さんが前日～当日にやることRunbookを作ってくださったので、それを見ながら準備をしました。

- 当日用のDiscordPrivateChannel/VoiceChannel用意
- AWS起動試験
- Team代表はAWSクーポン入手
- 本番用の空のPrivareリポジトリ用意
- お昼ごはん、おやつ、ドリンク
- よく寝る

# 本番の様子

明確に役割が決まっていたわけではありませんが、これまでの素振り会で会話しながら、チーム内の役割がなんとなく決まっていきました。

- Tさん：全体を網羅的に見てくださるチームリーダー的ポジション。NewRelicを中心としたモニタ、解析。
- Mさん：何でもできるけど、特にDBのチューニング（Mさんしかできない…）
- 私：開発インフラ構築。アプリのGo言語ソースを眺める人。

ベンチマークのモニタは全員で見ていきます。

## 午前

みんなでボイスチャットでワイワイしながら、開会式のYoutubeを視聴。とりあえず「こんいす～」と呟く。

開始直後、私は開発環境の構築を担当してました。AWS環境の立ち上げ、事前に用意したスクリプトも活用しながら必要なツールのインストール、Webappの必要な部分のGit追加、空のレポジトリへのpushなど、進めて、最初のベンチマークを回すところまで進めていきました。その間、他のメンバーはマニュアルの確認、Webapp内部の確認をしていただきました。

そして、初回ベンチマークを回し、スローログを見てボトルネックを探していきます。

時間がかかってる箇所を見ると、for文で毎回DBを叩いてる模様。これを書き換えて、DBアクセスを1回にしてみました。正しくかけてるかよくわかりませんが、とりあえずmakeが通ればいいでしょう、という考え方で適当に進めました。

しかし、何も改善せず。

ちょっとずつ変えながら、ベンチマーカーを回して、何も改善しないのを確認して、ランチブレイクに突入しました。

## 午後

午後イチ何か作業していたら、ベンチマークが通らなくなり。環境を壊してしまったのかと思って、再度Cloud formation のスタックを作成しました。
しかし、15時頃に気づいたのですが、DiscordのISUCONサーバーでベンチマーカーのデプロイ情報がちゃんとアナウンスされていた模様。環境作り直しは無駄だったらしい。当日は特に、Discordのアナウンスはしっかり見ておくべきだと学びました…。

午前弄ったところはかなり自信あったのですが、何も変わらなかったので、各自色々と試しながらベンチを回していきました。私はISUCON本に書いてある高速化手法を一つずつ試していきます。

しかし、改善せず。

残り1時間、DBやアプリを変えても改善しなさすぎるので「ビルドした実行ファイル、アプリにきちんと反映されてないんじゃないか？」という疑いを立てて、アプリケーションを再起動しました。
EC2サーバーが一つずつ壊れていき、ベンチマークが回らなくなっていきます。

残り15分くらいでやけくそになって、すべてのEC2の環境を壊してしまい、最終スコア0点という結果に。実際に変更が効いていたのかは謎のまま。

こうして、ISUCON初参加した結果、見事に散りました。

# おわりに

コンテストの結果こそ伴いませんでしたが、業務でも扱ったことがなく、全く知らなかったところから考えると、学んだことは多かったと思います。

アプリやDBの細かいところはわかりませんが、なんとなくの言葉を知ることができました。WEBだけでなく一般的な開発にも役に立つモニタリングツールを知ることができたのもの良かったです。
また、WEBサービスの最適化の本質とは異なるかもしれませんが、AWSでの環境構築、モニタリングツールの準備、Git管理などのインフラを整えるスキルが一番身についた気がします。
今回はDBを全く触らずに他の方にお任せしてしまいましたが、DBを触れるようになるとできることが広がるだろうな～と思いました。


8時間ぶっ通しでコンテスト、参加するまではかなり大変そうなイメージでしたが、参加してみると一瞬で、和気藹々と楽しく取り組むことができました。
これまで競プロは少しやってきましたが、ISUCONではコード自体のシンプルな高速化というより、かなり実運用に近いシナリオでの高速化を検討できたので、また違った楽しさがありました。

複数人で集まって対応している感じが、軽く炎上プロジェクトの対応をしている感があって、それも楽しかったです（仕事じゃないから）。

一緒に参加してくださった皆様、ISUCON運営の皆様にはリスペクトと感謝しかありません！ISUCON13の復讐（復習）をして、また次回もリベンジ参加してみたいと思いました！