System Design Interviewを読んで学んだシステムデザインの4つのステップ
この記事の概要
自分のシステムデザイン力を高めたいと思い以下の本を読み直し、序盤で紹介されている4つの設計ポイントをまとめました!
日本語版
この本はシステムデザイン面接に対応するために書かれていますが、日々の業務にも役立つ内容が多く含まれていると感じました!
業務でシステムの設計をする機会がある、関わっているシステムの全容を把握したい、またこれからシステムデザインの面接を控えている人などにおすすめです!
システムデザインの4ステップフレームワーク
この本では、システムデザイン面接に取り組む際に以下の4つのステップを紹介しています。

Step1: Understand the problem and establish design scope
システムデザインの課題を理解し、設計対象のスコープを確立するステップ
- すぐに問題の答えを求めようとするのではなく、まず問題を理解しようとする
- 不明点や要件、仮説に対する質問をし、システムを構築するのに必要な情報を集める
Step2: Propose high-level design and get buy-in
集めた情報をもとに高レベルデザインを作成し、合意を取るステップ
- 重要なコンポーネントで大まかなデザイン設計図を考えてフィードバックを受ける
- Back-of-the-envelope 計算を行い、その設計図が対象システムのスケーラビリティやパフォーマンスにふさわしいかを確認する

Xu, Alex. System Design Interview – An insider's guide (English Edition) (p. 47). Kindle Edition.
Back-of-the-envelope 計算とは
Back-of-the-envelop 計算とは、一般的なパフォーマンス数値を使用してどのシステムが要件を達成するのに適しているかを判断するための大まかな計算です。
例えば、1KBなどの基礎的な数値やキャッシュヒット時の平均的なレイテンシーなどの数値を参考にQPSやそのピーク、ストレージ、キャッシュ、サーバー数を推定します。
High Scalability, Google Pro Tip: Use Back-of-the-envelope-calculations to Choose the Best Design
Step3: Design deep dive
コンポーネントの詳細な設計を行うステップ
- 面接官と共にアーキテクチャの中の特に重要なコンポーネントを特定し、優先的に詳細な設計を行う
- タイムマネージメントを意識し、不要な詳細に時間をかけすぎないようにする

Xu, Alex. System Design Interview – An insider's guide (English Edition) (p. 50). Kindle Edition.
Step4: Wrap up
設計を振り返り、発展的な議論を行うステップ
- 設計したシステムのボトルネックを特定し、改善方法を提案する
- 設計の振り返りを行う(特に複数のパターンがある場合比較なども行う)
- 以下について可能なら言及する
- エラーケースとハンドリング
- 監視とログ
- 次のスケール戦略
感想
まず設計を進めるためのフレームワークを理解することでどんなシステムを設計するかによらずどう考えて進めていけば良いかの方針を持つことができました!自分はまず詳細に目を向けてしまう癖があったので、要件を見極めてスコープを絞り、高レベル設計で全体を作ってから詳細に入るという流れを意識することが大事だと学びました!
またそのフレームワークを使いながら Rate Limiter や URL短縮サービス、 Youtube をどう設計するかなどのケースを通してシステムごとに意識するポイントを学ぶことができるので、とても勉強になりました!
これから新規サービスを設計する際や自分が担当しているシステムの構成に改善の余地がないかなど考える際に活用していきたいと思います!
参考
Xu, Alex. System Design Interview – An insider's guide (English Edition)
High Scalability, Google Pro Tip: Use Back-of-the-envelope-calculations to Choose the Best Design
Discussion