SystemDesign InterviewCatとは
SystemDesign InterviewCatは、テック企業で採用されるシステムデザイン面接対策を助ける学習教材です。基礎学習と応用問題の2部構成となっており、実践的なテクニックの習得を目指します。
システムデザイン基礎知識・パターンを理解する
まず、面接で実際に役立つシステムデザイン基礎知識・パターンを体系的に学びます。システムデザイン面接では、あらかじめ蓄えておいた「引き出しパターン」から適切な手法を選び出す判断力が評価の鍵となります。パターン化しておくことで、実際の面接では迷わずに提案することができるようになります。
またここで学ぶシステムデザイン基礎知識やパターンは基本的に特定の製品には依存しない普遍的な知識となります。あくまで例として、リアル世界において解説した内容がどこで使われているかは企業の技術ブログ、製品の具体的な機能などでリファレンスしますが、あくまでこれは普遍的な知識を理解するための補強コンテンツでしかありません。実際にシステムデザイン面接では特定の製品名を提案せずに抽象化した概念(例: MySQLではなくRDBと言う)で議論を進めていくことを本書ではオススメしています。そのために普遍的な知識やパターンの習得にフォーカスしましょう。
応用問題で習熟する
次に、システムデザイン基礎知識・パターンで学んだ知識を実際の面接問題に応用する実践演習を行います。基礎と連動した問題設定により、知識やパターンの理解が更に深まり自然と身につくよう設計されています。また複数の手法を比較することで何故その設計を選んだのかがより明確に分かるようにしています。これは、システムデザイン面接はそもそも一つの解法を求めるものではなく、システムデザインの議論を通して候補者の能力を評価していく面接だからです。
システムデザイン面接対策教材は英語版が多数存在しますが、日本語で提供される本教材は、希少かつ高品質なコンテンツであると自信を持っております。皆様のシステムデザイン面接突破に、ぜひ本教材をご活用ください。
システムデザイン面接とは
システムデザイン面接とは、ソフトウェアエンジニアリングの面接の一つでビックテックを中心に一般的な面接スタイルとなっています。日系テック企業でもメルカリ、マネーフォワード、SmartNews、LayerX、LegalOn Technologiesなどで導入されている実績があります。
システムデザイン面接ではリアル世界のソフトウェアシステムの設計を面接の場で議論していきます。ソフトウェアエンジニアとして業務でやっている内容に非常に近いものはあるため、強い方であれば特に対策せずとも通過できる可能性はありますが、面接の流れは必ず抑えておいた方が良いです。エントリーレベルのポジションでは目にする事は少ないかもしれませんが、ミドルレベル以上では出題される傾向にあります。
システムデザイン面接ではスケーラビリティ、可用性、パフォーマンスなどを意識した設計をトレードオフを説明しながら進めていかなればならないので、特に大規模な分散システムを構築した事がない人は注意してください。システムを設計する上で引き出しの多さが面接突破の重要な要素になってきます。問題の例としては
- URL短縮サービス(Bitly)
- ソーシャルメディア(Twitter/X)
- 動画サイト(YouTube)
- ファイル共有サービス(Dropbox)
がよく出題されます。MiroやExcalidrawなどのホワイトボードツールを活用して問題に取り組む場合が多いです。
また、面接の途中で軽くシステムのデザインについて質問されることも多いです。例えば、「現在担当しているシステムが、もし1,000万人規模のユーザーに拡張されるとしたら、どのような設計変更を行いますか?」といった質問がされることがあります。
こうした質問に対応するためには、スケーラビリティや可用性などの基本的な知識を整理し、どのような技術的アプローチが可能なのかを事前に考えておくとよいでしょう。実際にシステムデザイン面接を導入していない会社でも学習する価値の高く、非常にコスパはよいです
この本を読んだ後目指すべき姿
本書の目的は、代表的なサービスのシステム構成を丸暗記することではありません。目指すべきは、以下のようなシステムデザイン面接で必要な基礎的な設計思考力の習得です。
基礎設計パターンを理解し、課題ごとに適用可能なパターンを引き出せる力を養うこと
未知の問題にも、過去に学んだ設計パターンを即座に応用してアプローチできる柔軟性を身につけます。
各設計手法のトレードオフを理解し、状況に応じて最適な判断ができるようになること
パターンを覚えるだけでなく、それぞれの利点・欠点を踏まえた上で選択できる力を重視します。
特定のプロダクト名や実装に依存せず、普遍的な技術的観点から考察・提案ができること
技術の本質を理解し、プロダクトに縛られず適切な設計判断を下せるエンジニアを目指します。