フロントエンドしかやったことないけどISUCONに出たい(出る)

日本CTO協会24卒Advent Calendar、2日目も日本CTO協会に所属していない私が担当します。どこかでちゃんと加入します、多分。ちなみに1日目の私の記事は[こちら](https://qiita.com/euryopa/private/1918a49ba5a37ddf5576)

# はじめに
今日はフロントエンドしかまだ業務で触ったことがない私が、来週12/8開催のISUCON14に出るために勉強したことをまとめていきます。「ISUCON出てから書けばよいのでは？」と思った方もいるでしょう。ISUCONが終わると誰もISUCONのことを調べなくなると思うので、今書いた方が記事見られるのではないかという私の戦略です。ということで書いていきます。

# 対象読者
- ISUCONに出てみたいけど、何を勉強すればよいのかわからない方
- フロントエンドしかやったことないけど、ISUCONに出てみたい方

この記事ではISUCONで使う知識がほとんどない状態から、[ISUCON本](https://www.amazon.co.jp/%E9%81%94%E4%BA%BA%E3%81%8C%E6%95%99%E3%81%88%E3%82%8BWeb%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%B3%E3%82%B9%E3%83%81%E3%83%A5%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0-%E3%80%9CISUCON%E3%81%8B%E3%82%89%E5%AD%A6%E3%81%B6%E9%AB%98%E9%80%9F%E5%8C%96%E3%81%AE%E5%AE%9F%E8%B7%B5-%E8%97%A4%E5%8E%9F-%E4%BF%8A%E4%B8%80%E9%83%8E/dp/4297128462)の内容や巻末にあるチューニングが何をやっているのか理解できる、そして自分でprivate-isuを進められるようになるまでに勉強したことを書いていきます。上記の対象読者の方も、この勉強をすればISUCONを楽しめるくらいにはできるようになると思います。


# ISUCONとは？
webアプリのパフォーマンスの改善度合いを競うコンペ。この記事を読んでいる方は知っていると思うので省略します。

# フロントエンドの知識ってISUCONで使えるの？
ほとんど使いません。諦めて1から勉強しましょう。

# ISUCONに必要な知識
フロントエンドの知識が使えないという諦めがついたところで、どういう知識があればISUCONに参加できるくらいのレベルになるのか見ていきましょう。

前提として、私は普段フロントエンド開発をやっており、ISUCONで使うような知識はほとんどありませんでした。DBやSQLについても殆ど勉強したことがなく、SELECT文ちょっとわかるくらいの無知エンジニアでした。

ISUCONではクライアントからのリクエストをサーバーが受け取ってから先の処理のパフォーマンスを改善していきます。例えば、リクエストをもとにDBからデータを取ってくるまでの処理や、レスポンスをキャッシュを利用して返す処理を改善していきます。それらの処理のパフォーマンスを上げられるようにするためには以下の知識が必要になります。

## DB・SQL
DBってどういうものですか？ということからまずは勉強しました。もちろんRDBやRDBMSといった超基本的なものは知っていましたが、それ以外はほとんど知りませんでした。そこで以下の本を読んで勉強しました。本選ぶのが面倒だったので、[ミックさんのロードマップ](https://x.com/copinemickmack/status/1842436235631243382)を見て勉強を進めました。
- [おうちで学べるデータベースのきほん 第2版 ](https://amzn.asia/d/bwT2H3G)
DBって何？RDBって何？ってところから始まるくらいの入門本。サクッと読めます。ここでRDBやRDBMSの基本的な概念を学びました。また、ISUCONでド定番ボトルネックのインデックスについても基礎を学べます。
- [SQL 第2版: ゼロからはじめるデータベース操作](https://amzn.asia/d/5HyVRZ1)
DBを扱う上でSQLは必須です。この本で基礎を身につけました。

上記の2冊を読めばひとまず十分ですが、下記の本もおすすめです。3分の1しか読んでないですが。
- [SQL緊急救命室──非効率なコードを改善せよ！](https://amzn.asia/d/hx2S3E6)
テーブルスキャンしまくってるような非効率なクエリを書き換える練習ができます。1つの問題に対してめっちゃ詳しく解説してくれる問題集みたいな感じで取り組めます。case式やwindow関数の勉強になります。

## カーネル, CPU
サーバーはリクエストを受け取って色々と処理を行うわけですが、それらの処理はCPUが行います。そしてそのCPUを司っているのはカーネルです。ISUCONではパフォーマンスの低下を招いている原因を調べるために、CPUがどれくらい使われているのかを調べます。このときにカーネルとCPUの基礎知識が必要になります。OSがどのような効率の悪いCPUの使い方をしているのか、というボトルネックを特定できるようになるからです。普段業務でこのあたりの知識を習得する機会はないと思うので、ISUCONはそのいい機会になります。
- [［試して理解］Linuxのしくみ　―実験と図解で学ぶOS、仮想マシン、コンテナの基礎知識](https://amzn.asia/d/8WJJAhJ)
ISUCONではサーバーにLinuxカーネルが使用されているので、この本が勉強になります。慣れない用語や概念が多く前半はなかなか読み進めるが大変なのですが、後半になると前半で学んだ内容が繰り返し出てくるので段々理解が進んでいきます。

## Go
ISUCONではサーバーサイドの実装がGo,Rubyなどの複数の言語で提供されており、参加者はその中から好きな言語を選ぶことができます。なんでも良いのですが、私は今後業務でも使っていきたい＆使用しているチームが最も多いGoを選んで勉強を始めました。Goに関する知識は0だったので、こちらも1から勉強しました。
- [初めてのGo言語](https://amzn.asia/d/haHrC7n)
Goの基礎文法と機能が網羅的に説明されています。全部読んだわけではないですが、並行処理の章まではそれなりに真面目に読みました。
- [APIを作りながら進むGo中級者への道](https://techbookfest.org/product/jXDAEU1dR53kbZkgtDm9zx?productVariantID=dvjtgpjw8VDTXNqKaanTVi)
1つ目の本で文法を学び、この本でどうやってGoでAPIの実装を進めていくのかを学びました。これも7割くらいハンズオンで進め、Goの基本的なコードは読み書きできるようになりました。

## キャッシュ
配信を高速化するためにキャッシュを使用することがあると思います。そのキャッシュについて知識を深めるために以下の本を読みました。
- [Web配信の技術―HTTPキャッシュ・リバースプロキシ・CDNを活用する](https://amzn.asia/d/e4SzppG)
ひたすらキャッシュについて書かれた本です。致死量の「キャッシュ」という言葉を摂取できます。この本を一通り読むと、httpヘッダーのキャッシュについてはかなり詳しくなれます。あと、しばらく「キャッシュ」という言葉を聞きたくなくなります。ISUCONに限らず、「ここのキャッシュの設定ちゃんとやっているのかな？」というようにフロントエンドの業務でも知識が活きます。この本の知識量はISUCONでオーバーキルな気がしなくもない？

## ISUCON本

ここまで勉強すると[ISUCON本](https://www.amazon.co.jp/%E9%81%94%E4%BA%BA%E3%81%8C%E6%95%99%E3%81%88%E3%82%8BWeb%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%B3%E3%82%B9%E3%83%81%E3%83%A5%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0-%E3%80%9CISUCON%E3%81%8B%E3%82%89%E5%AD%A6%E3%81%B6%E9%AB%98%E9%80%9F%E5%8C%96%E3%81%AE%E5%AE%9F%E8%B7%B5-%E8%97%A4%E5%8E%9F-%E4%BF%8A%E4%B8%80%E9%83%8E/dp/4297128462)の内容が理解できるようになりました。この本を一通り読めば、ISUCONでは何の知識を使ってどこをどのようにチューニングしていくのかがわかるようになります。巻末のprivate-isuの実践の章まで読むと、private-isuを一人で進められるようになります。

## nginx
nginxをプロキシとして使用するので、nginxがどういうものかくらいは本までいかなくてもネット記事等で勉強しておくと良いと思います。nginxに関する書籍もありますが、基本的には設定ファイル(nginx.conf)の説明が続くので、私は途中で飽きて諦めました。private-isuや過去問で実践を積む中で、「このフォルダにある静的ファイルはプロキシから配信したいな〜」というように必要になった時点で調べるでもよいかなと思います。

## private-isuで練習
基礎知識とISUCONの流れがわかったら、あとは実践です。まずはprivate-isuの環境構築を頑張りましょう。ISUCON本を読みながら自分でやってみて、見なくてもある程度できるようになったら本に書いてないチューニングを自分でやってみましょう。private-isuに関するネット記事はたくさんあるので、それを参考にしても良いと思います。
- https://blog.stenyan.jp/entry/2022/07/18/224212
- https://giarrium.hatenablog.com/entry/2023/12/17/130000

# 最後に
以上がフロントエンドしかやったことない私がISUCONに出るために勉強した(している)内容です。結果はどうなるかはさておき、ここまでやっておくと当日手も足も出ないという状態にはならず、楽しめると思います。2〜3ヶ月を目安に勉強すると良いです。
「ISUCONに出てみたいけど、難しそう…」と思った方も、この記事を読んで参加しよう！と思ってもらえると嬉しいです！