完璧なシステムデザイン面接を行うための 4 つの主要ステップ#
-
ステップ 1: 問題を理解し、デザインの範囲を確立する#
- 問題を完全に理解するために必要なだけの質問をすることが私たちの仕事です。何を構築しているのかを理解せずに解決策に飛び込むのは赤信号です。目標は、なぜシステムを構築するのか、ユーザーは誰か、どの機能を構築する必要があるのかを理解することです。私たちが構築する機能を優先順位に従って理解することが重要です。構築するべき主要な機能に焦点を当てるべきです。面接官が機能リストに同意していることを確認してください。
- 非機能要件を明確にするために、一連の質問をすることも重要です。システムデザイン面接では、スケールとパフォーマンスに焦点を当てるのが良いでしょう。これらの非機能要件は、私たちのデザインをユニークで挑戦的なものにします。役割が上級であればあるほど、非機能要件を扱う能力を示すことが重要です。
- システムのスケールと潜在的な課題やボトルネックの感覚を得るために、ここで大まかな計算を行うことがあります。まだ何も設計していないことを念頭に置いておいてくださいので、ここでの計算は大まかな推定です。目標は、スケールの一般的な感覚を得ることです。オーダーオブマグニチュードを正しく把握したいです。
- このステップの終わりには、設計する機能の短いリストと、満たすべきいくつかの重要な非機能要件を持っているべきです。
-
ステップ 2: 高レベルのデザインを提案し、合意を得る#
- このステップでは、高レベルのデザインを開発し、面接官とデザインについて合意に達することを目指します。
- ほとんどのデザインでは、トップダウンアプローチを採用し、API から始めるのが良いでしょう。API はエンドユーザーとバックエンドシステムの間の契約を確立します。要件を収集した後、どの API が必要かは明確であるべきです。特に指定がない限り、RESTful の慣習に従うべきです。各 API の入力パラメータと出力レスポンスを慎重に定義してください。API を慎重にレビューする時間を取ってください。機能要件を満たしていることを確認してください。同様に重要なのは、機能要件に関係のない API を導入しないことを忘れないでください。
- API に関する追加の考慮事項。一部のデザインでは、クライアントとサーバー間の双方向通信が必要になる場合があります。このシナリオでは、ウェブソケットが一般的な解決策です。ウェブソケットのようなソケットサービスは通常、状態を持つことに注意してください。スケールで運用するのは非常に挑戦的です。スケールが高い場合は、深掘りセクションでウェブソケットのデプロイメントを管理する方法について議論する準備をしてください。
- クライアントとサーバー間の API を確立したら、次のステップは高レベルのデザイン図をレイアウトすることです。この図は、私たちが参照できる全体的なデザインの設計図です。これを使用して、デザインがすべての機能要件をエンドツーエンドで満たしていることを確認するべきです。多くのデザインでは、ロードバランサーまたは API ゲートウェイから始まります。その背後には、面接官と以前に確立した機能要件を満たすサービスがあります。
- 多くのサービスは何らかの形の永続性を必要とします。ここで、デザインをデータストレージ層を導入することで完成させます。この段階で使用する正確なデータベース技術を指定する必要は通常ありません。必要に応じて、データスキーマを設計した後に深掘りセクションに延期するべきです。
- 高レベルのデザインを開発する際には、後での議論ポイントのリストを維持してください。早すぎる段階で詳細に掘り下げる誘惑に抵抗してください。デザインの全体像を把握する前に、自分を穴に陥れないでください。
- 高レベルのデザインの最後のステップは、データモデルとスキーマを詰めることです。ここでは、データパターンと読み取り / 書き込み比率について議論するべきです。スケールで、データモデリングはデザインのパフォーマンスに大きな影響を与える可能性があります。シンプルな場合は、選択するデータベースについても議論し、インデックスオプションについても議論するかもしれません。
- ここではいくつかの判断を下すべきです。データモデリングが非機能要件を満たすためのデザインの重要な部分である場合、議論を深掘りセクションに延期することを検討するかもしれません。
- 高レベルのデザインが完了したら、一歩引いてデザインをレビューしてください。各機能がエンドツーエンドで完全であることを確認してください。
-
ステップ 3: デザインの深掘り#
- このステップの目標は、潜在的に問題がある領域を特定し、解決策を考え出し、トレードオフについて議論することを示すことです。
- 面接官と密接に協力して、深く議論する内容を決定するべきです。深掘りは、非機能要件が問題を興味深くする場所です。レベルが高いほど、このセクションは重要です。このセクションは本当にオープンエンドです。すべての問題に対する一律のアプローチはありません。ここでは、場の雰囲気を読む能力が役立ちます。時には、面接官のボディーランゲージがデザインの特定の側面に不満を持っていることを示す手がかりを与えることがあります。これらの手がかりを拾い上げ、すべての問題が解決されていることを確認することが重要です。アプローチの一つは、質問をすることです。特定の解決策を選択する理由をリストアップし、質問や懸念があるかどうかを尋ねることができます。
- 問題を一つか二つ選んで深掘りすることにしたら、複数の解決策を考え出し、それぞれのオプションのトレードオフについて議論するべきです。議論を構成する際に、以下のミニガイドラインを使用できます。
- まず、問題を明確に表現するべきです。
- 次に、少なくとも 2 つの解決策を考え出します。
- 第三に、解決策のトレードオフについて議論します。
- 最後に、解決策を選択し、面接官と議論します。
-
ステップ 4: まとめ#
- デザインを要約するために数分を費やす価値があります。ここでは、特定の状況に特有の部分に焦点を当てるべきです。短く簡潔に保ちます。面接の最後に、面接官に会社について質問するための十分な時間を残してください。
1 時間の面接の時間配分#
- 最初の 5 分:紹介
- 45 分:面接プロセス
- ステップ 1: 問題を理解し、デザインの範囲を確立するために 5 分
- ステップ 2: 高レベルのデザインを提案し、合意を得るために 20 分
- ステップ 3: デザインの深掘りのために 15 分
- ステップ 4: まとめのために 5 分
- 最後の 5 分: Q&A
この記事は Youtube 動画 System Design Interview: A Step-By-Step Guide の要約ノートです。