System Design Interview – An insider's guide を読んだ

これ

以下のChapterは著者のサイト https://bytebytego.com/ で同じものがフリーで読める。

  • Chapter 1: Scale From Zero To Millions Of Users
  • Chapter 2: Back-of-the-envelope Estimation
  • Chapter 3: A Framework For System Design Interviews
  • Chapter 12: Design A Chat System
  • Chapter 14: Design Youtube

本の概要

有名なThe System Design Primerと似ている。

The System Design Primer: https://github.com/donnemartin/system-design-primer (※日本語翻訳版も同じリポジトリにある)

System Design Interview はタイトルの通り、技術面接寄りの観点とか、面接官とのコミュニケーション(質問とか深堀りとか)が入ってる量が多く感じた。

目次

amazonから引用

Chapter 1: Scale From Zero To Millions Of Users
Chapter 2: Back-of-the-envelope Estimation
Chapter 3: A Framework For System Design Interviews
Chapter 4: Design A Rate Limiter
Chapter 5: Design Consistent Hashing
Chapter 6: Design A Key-value Store
Chapter 7: Design A Unique Id Generator In Distributed Systems
Chapter 8: Design A Url Shortener
Chapter 9: Design A Web Crawler
Chapter 10: Design A Notification System
Chapter 11: Design A News Feed System
Chapter 12: Design A Chat System
Chapter 13: Design A Search Autocomplete System
Chapter 14: Design Youtube
Chapter 15: Design Google Drive
Chapter 16: The Learning Continues

Chapter1〜3: システム設計の基礎

Chapter 1: Scale From Zero To Millions Of Users

徐々にサーバーを増やしていったり、キャッシュを挟んだり、Queueを挟んだりしていく、「よくやるやつだね」という印象。

ただ一連の流れとしてまとまっているのを他であまり見たことがないので、経験の少ない人におすすめしたり、一緒に読んだりする時にとても良さそう。

Chapter 2: Back-of-the-envelope Estimation

レイテンシーSLAとダウンタイム、QPSやストレージの概算見積もりなど。

これもこのあとの議論のための基礎固めな印象。

Chapter 3: A Framework For System Design Interviews

インタビューを以下の4ステップで行うことを勧めている。

  • Step 1 - Understand the problem and establish design scope
    • 問題の把握と、デザインスコープを設定する
  • Step 2 - Propose high-level design and get buy-in
    • ハイレベルな(全体的な概要レベルの)設計をして、同意を得る
  • Step 3 - Design deep dive
  • Step 4 - Wrap up
    • 仕上げに振り返りをしたり、自由に議論をしたりする

実際にChapter4以降は、それぞれのChapterがこの4ステップの Subchapterで構成されている。

このステップは面接だけでなく、仕事で本当にシステム設計の議論やレビューをする際にも同じようにやってるなーと感じた。

なので、設計ドキュメントの章立てに取り入れるとか、レビュー会のアジェンダにも取り入れるとか、設計観点のエンジニア育成なんかにも良さそうに思った。

Chapter4〜7: プロダクトの設計ではなく、個別機能の設計ぽい感じ

  • Chapter 4: Design A Rate Limiter
  • Chapter 5: Design Consistent Hashing
  • Chapter 6: Design A Key-value Store
  • Chapter 7: Design A Unique Id Generator In Distributed Systems

この辺は実務だとライブラリとかクラウドサービスにおまかせしちゃうことが多い領域だと思う。

中身のアルゴリズムとか仕組みが分かると、どれにするか選ぶか考えるときにより深く考えられたり、設定項目の意図とか影響もよく分かるようになるので、知識としてたくさんストックしておくのが大事だなーと思う。(これはデータ指向アプリケーションデザインを読んだときにも思った)

Chapter 8〜15: プロダクトの設計

  • Chapter 8: Design A Url Shortener
  • Chapter 9: Design A Web Crawler
  • Chapter 10: Design A Notification System
  • Chapter 11: Design A News Feed System
  • Chapter 12: Design A Chat System
  • Chapter 13: Design A Search Autocomplete System
  • Chapter 14: Design Youtube
  • Chapter 15: Design Google Drive

いろんなシステムがあって、その裏にはいろんな工夫があるんだなー、とワクワクした。

特に News Feed System、Chat System、Autocomplete System あたりは、これまでの自分の開発経験の延長線上には無い感じがあって、とても面白かった。

(メインのChapterだけど、細かく書くと本の要約みたいになっちゃうので、気になる方はぜひ読んでください)

Chapter 16

  • Chapter 16: The Learning Continues

Facebook, Netflix, Googleなどの公開資料へのリンクがたくさん載っている。

(ちなみにhapter16に限らず、各Chapterにも参考リンクがたくさん載っていて、深堀りできるリソース紹介は全体的にかなり多い)

次に読むおすすめ本の紹介では下記2冊がおすすめされていて、分散システムを学ぶことが大事というメッセージを感じた(もう1冊おすすめされていたのはレジュメの本)

↑ 書籍で紹介されていたのは第一版だけど、2nd editionが出ていた

↑ 書籍で紹介されていたのは英語版

その他の感想

タイトルから、どのようなコンポーネント構成にするか(サーバーを分けたり、キャッシュや非同期の機構を入れたり)がメインだと思っていた。

実際に読んでみるともちろんそういう内容が多いけれど、アルゴリズムとかデータ構造とかの細かい話も多く出てきた。

かつ、それらが実システムでどこにどう役立つかとセットで説明されているので、単発で紹介されるよりも頭に入ってきやすいと思った。

具体的にはこういうのが出てきた

  • Rate Limitのアルゴリズム
    • Token bucket
    • Leaking bucket
    • Fixed window counter
    • Sliding window log
    • Sliding window counter
  • Consistent hashing(コンシステントハッシュ法)
  • Vector Clock
  • Merkle tree(ハッシュ木、マークル木)
  • Bloom filter(ブルームフィルタ)
  • trie(トライ、tree-like data structure)

まとめ

とてもおすすめ

Volume 2も出ているのでそのうち読みたい(現時点で無いみたいだけど、電子版が出てほしい)