読書メモ:SYSTEM DESIGN INTERVIEW Chapter1-3

システムデザインインタビュー(SYSTEM DESIGN INTERVIEW)とは

  • 外資系の転職面接の際に実施されるJob Interviewの一種のようです
  • 採用候補者は、面接試験用に用意された仮想システムについて、要件をヒアリング後、それを達成するためのアーキテクチャ案を提案することで設計能力をテストされます

  • 本書は、そのようなシステムデザインインタビューについて、ノウハウを提供する本という位置づけのようです。設計の方法論を語る前半パート+YoutubeやGoogleDriverなどの実在のWebサービスの設計をゼロから検討する事例集的な後半パートという構成になっています。

1章-3章までのサマリ

第1章

  • Webサービスをユーザー数0のスモールスタート構成から始めて、最終的に100万ユーザの同時アクセスに耐えうる構成まで進化させる」というお題で、Webシステムのアーキテクチャを段階的に改善していく仮想事例の説明

第2章: BACK-OF-THE-ENVELOPE ESTIMATION

第3章: A FRAMEWORK FOR SYSTEM DESIGN INTERVIEW

  • システムデザインインタビューの実際の進め方と、採用候補者が気を付けるべき点の解説

読書メモ

第3章

  • システムデザインインタビューは以下の4Stepで進む

    1. そのシステムが達成すべき事項/解決すべき問題の理解 + 設計スコープの設定
    2. high-level architeture の提案 + 顧客の承諾の取り付け
    3. より細部の設計の検討
    4. ラップアップ(まとめ)
  • 「そのシステムを設計する上で重要な課題は何か?」という問題の理解に時間をかけずに、拙速にアーキテクチャや採用すべき技術を提案することは百害あって一利なし。 [1]

    • 問題を理解するために、適切な質問を顧客に投げかけて、仮定・想定(assumptions)を少しずつ積み上げていくことが大事
  • どのような観点で質問をすべき?

    • 顧客がその質問に回答することで、言語化されていなかった要件/要求仕様が明確になるような質問が理想
  • 質問の具体例

    • 具体的にどのような機能が必要なのか?
    • 想定ユーザー数は?
    • システムに期待するスケール速度は?次の3か月/6か月/1年でどの程度スケールさせたい?
    • その企業では今、どんな技術スタックを採用している?既存のサービスを流用させることでシステムの新規作成範囲を縮小させることは検討する価値がある?
  • high-level architeture の提案に際しては

    • システム全体のコンセプト/構想(blueprint)を伝えることを心掛ける
    • この段階で、性能や収容性/スケーラビリティについても、荒く計算し最低限の実現性を担保しておく(BACK-OF-THE-ENVELOPE ESTIMATION)
  • ラップアップで時間が余るようなら、話せると有益なこと

    • コンポーネントの故障時の可用性について、どのように考えているのか?
    • 運用方法について。監視すべき重要なMetricsは何か?リリース方法はどのようなものになると想定している?
    • ユーザー数の増加に伴う、システムのスケーリングについて、「こうやったら上手くやれそう」とうアイディアはあるか?

感想

  • 第1章については、ざっと斜め読みのみのため読書メモを書きませんでしたが、Load Balancer/DBのScaling戦略/キャッシュ/Job Queueなど実践的な話題が多く基礎固めにすごくよさそうでした
  • 第3章で語られる内容は、普段設計をする際に活用できそうなTIPSが多く非常に有益です。学びが多く、この章だけでも十分読む価値はありました。
  • 第4章以降では、biyt.ly的なURL短縮サービス、Youtube検索エンジンGoogle Driveなどの実際のシステムを題材にシステムデザインインタビューする内容が語れるそうです。こちらも時間を見つけて読んでみたいと思います

脚注

[1] 以下資料の冒頭でも、同様の観点での指摘がなされています https://speakerdeck.com/hgsgtk/design-pattern-usage-inspired-by-pattern-language

/* https://sunrise033.com/entry/hatena-blog-how-to-hierarchicalize-categories */