【書評】Web開発者のための大規模サービス技術入門

[［Web開発者のための］大規模サービス技術入門](https://gihyo.jp/book/2010/978-4-7741-4307-1)を読んだので，その書評を書きます．
読むのにかかった時間はおよそ6-8時間でした．

## 本書の概要
[公式サイト](https://gihyo.jp/book/2010/978-4-7741-4307-1)の紹介文を引用します。
> サーバを単に増やすだけでは解決しない（?!）。大規模サービスの難所は，サービスの成長に伴い巨大化するデータの処理です。データ量の変化は緩やかには推移せず，突然目の前に現れる大規模化の壁。そこで求められるのは，いかにして「データを小さく持つか」「複数サーバに分散させるか」「最小限の回数で読み取るか」といった地道な取り組みの積み上げです。
> 本書では Web開発における大規模サービスの一つの関門，数十～数百ギガバイトのテキストデータを想定し，データ構造，メモリ，OS，DB，サーバ/インフラと広範なレイヤに及ぶ攻略ポイントをまとめて解説します。はてなインターンシップの初書籍化。


## 前提
### 筆者について
- 大学4年生．
- 来年度から情報系（数理）の大学院に進学予定
- Djangoを用いたwebアプリケーションの開発経験あり
- コンピュータサイエンスについてはあまり詳しくない
  - プログラミングの経験，数理とその関連分野（グラフ理論，最適化，アルゴリズムなど）の知識はある
  - 一方，ネットワーク，データベース，OS, etc.については勉強中．
### 読書の背景，本書を選んだ理由
はじめは，友人におすすめされて興味を持ちました．その後，書評を読むなどして，自分でも調べたところ，今の自分にとって適切かつ興味深い内容であると判断したため，読むことを決めました．より具体的には，以下のような理由で読むことを決めました．
  - はてなインターンシップの講義内容を書籍化した本とのことで，大学生にも理解しやすい，かつタメになる内容だろうと考えた
  - 「データ構造、メモリ、OS、DB、サーバ/インフラ」というサブタイトルからも，幅広い分野について触れているようで，CSの基礎を概観できると考えた
  - それでいて，教科書的な硬い内容ではなく，むしろ実際の開発の現場で培った知見に重きをおく，というコンセプトに魅力を感じた
  - 2010年に出版された本とのことで，技術本にしては古い．しかし，本書は「ハウツー」本ではなく，”大規模データを扱うにあたっての課題、扱うための基本的な考え方とコツ”について説明しており，その内容は今でも有用であると考えた

私が参考にした書評は次のとおりです．
- [『Web開発者のための大規模サービス技術入門』がめっちゃ良かった](https://mogulla3.tech/articles/2017-01-01-01/)
- [「Web開発者のための大規模サービス技術入門」読書感想](https://zenn.dev/takahiro_f/articles/f1befa592f9d93)
- Amazonのレビュー（一部抜粋）
  > 月間1500万人のユーザーを1000台のサーバーでさばいている(当時)はてなの大規模システムの開発と運用の裏側について書かれています。この本は、はてなインターンシップ講義内容を収録したとこと書き下ろしの回とで構成されています。1,7,8回,と特別編は書き下ろしであとは講義ベースの回になります。10回までが当時はてなに在籍していた伊藤氏の執筆担当で11回以降は田中氏の執筆担当になります。
  > この本の良いところは、はてなの大規模システム運用の詳しい中身だけではなく、運用に関する技能ではなく技術の解説をしているがセオリーに偏らず実践も交えて書いてあるところだと思います。例えば、「セオリー的にはＸＸＸＸＸだけど、運用上はこうした方がうまく回っている。」というような話(e.x. DBのテーブルの正規化の話やJOIN排除の話)や、技術と運用面の問題だけではなくビジネス的な観点からの話もあり(e.x. サーバー台数と故障率 p.106、クラウド vs 自前インフラ p.235、その他いろいろ)、この本の内容を非常に濃厚なものにしています。一番お勧めは、第2回、その次は第3回、第12回と第13回です。
  >
  > 全体的に言えるのは、まずOSの仕組みと照らし合わせてデータをなるべくできる限りメモリに載せることが重要(逆にディスクにアクセスすることの不利さも分かりやすく説明)で、そのためにどう設計するかという視点でDBなどを設計しているのが印象的でした。あと、全体的に「トレードオフ」の重要性(ここでも絶対解ではなく最適解の重要性)が全編にわたって書かれているとこは、「やっぱわかってるな」感が出てて好印象です。運用しているシステムの性質にも当然よるんでしょうけど、日本人は全般的にそういう考え方苦手だから。エンジニアや経済学者はお金だけではなく費やすリソース全部がコストだという考え方ができるんですが、日本のIT業界の場合は過度な完全主義を目指しがちなテクニシャンの集まりだし営業・販売などビジネスサイドの力が圧倒的に強く、全体最適で物を考えるとかそういうのは浸透しません。「もう少し柔軟で包括的なものの考え方が出来る人が増えればいいな〜」なんてことをこの本とはあまり関係ないけどフト思いました。
  >

## 感想

### 良かった点
- 本書は大きさとページ数（350ページ程度）の割にはスラスラと読めました．また，対話形式で書かれているため，読み進めるのが楽しかったです．
- 「体系的な知識」に加えて，「実践的でリアルな技術と現場感」にも重きを置いてる点がやはり素晴らしいと感じました．例えば，各所で具体的な数値（ファイルサイズが何GBか，サーバーが一台何円か，など）が挙げられており，大規模なサービスへの具体的なイメージが湧きやすくなっています．また，当時のリアルな数値と，現在の状況とを比較することで，技術の進化を感じることもできました．
- 本書の目的はハウツーを教えることではなく，大規模データサービスの勘所を伝えることですが，それをまさしく達成することができました．
  - 例えばAPサーバーは比較的容易くスケールアウトできるが，DBサーバーはそうではないことがわかりました．
  - オンプレが主流だった当時に，大規模×オンプレならではの問題についても面白かったです．この話題は，クラウドが主流の現代の書籍ではあまり語られないだろうと思いました．
### イマイチだった点
- ところどころ，砕けた表現が多く，「この表現はどうなんだろう」と思うことがありました．
  - ただ，それが本書の特徴であり，そのおかげで読みやすくなっているとも言えます．私は読み進めるうちにあまり気にならなくなりました．
- 実装課題（第6，8，10回など）の説明と回答がPerlで書かれており，現代ではあまり使われない言語であるため，勿体無いと感じました．
  - ただ，課題自体はPerlに依存していないため，他の言語で解けば全く問題ないです．
  - 自分は実装課題には取り組みませんでした．

### 次に読みたい本
DBについてもう少し体系的に学びたいと感じました．今検討しているのは，[おうちで学べるデータベースのきほん 第2版](https://www.seshop.com/product/detail/26210)です．また，自分のwebアプリの開発経験が浅いと感じました．そのため，go言語の標準ライブラリでwebアプリを作る本である [Goプログラミング実践入門 標準ライブラリでゼロからWebアプリを作る - インプレスブックス](https://book.impress.co.jp/books/1115101145)が気になっています．

## こんな人におすすめ
学生・社会人問わず，ソフトウェアエンジニアなら一度は読んで損はないような本かと思いました．大規模サービスならではの問題や，スケーラビリティについて，リアルな現場の経験・知見から学ぶことができます．ただ，CSの基礎の説明箇所については，人によっては知っていることも多いかもしれません．