システムデザイン面接練習サイト2選 + 典型問題の考え方
練習サイト¶
bugfree.ai¶
https://bugfree.ai
「LeetcodeのシステムデザイN版」のコンセプト。URLShortener・Twitter・Netflix・通知システムなどの問題を用意。自分の設計を入力するとAIがスコアリングし、抜けている観点を指摘してくれる。Behavioral Interview(行動面接)の練習もできる。
codemia.io¶
https://codemia.io
同様に問題を用意。回答後にスコアと模範解答を表示。コミュニティの回答と比較して学べる。
なぜ練習ツールが必要か¶
一人でノートに書く練習には3つの限界がある: 1. 時間感覚がつかめない: 45分という制限の中でどこに時間を使うべきか分からない 2. 自分の抜け漏れに気づけない: 「DB設計を忘れていた」「スケールの話が浅い」が自己評価では見えにくい 3. 口頭説明の練習ができない: 面接は「設計する」だけでなく「設計を説明しながら議論する」行為
システムデザイン面接の進め方(45分)¶
0〜5分: 要件定義
→ 機能要件(何ができるか)と非機能要件(規模・可用性・レイテンシ)を面接官に確認
→ 「DAU(日次アクティブユーザー)は?」「リードが多いですか、ライトが多いですか?」
5〜10分: 容量見積もり
→ 1日のリクエスト数、ストレージ量、帯域幅を計算
→ 数字が合っているかより「スケールを考えている」姿勢を見せる
10〜25分: 概略設計(High-Level Design)
→ クライアント → LB → APIサーバー → DB の基本構成を書く
→ 主要なコンポーネントとデータフローを説明
25〜40分: 詳細設計(Deep Dive)
→ ボトルネックはどこか、どうスケールするか
→ DBスキーマ、キャッシュ戦略、非同期処理の設計
40〜45分: トレードオフとまとめ
→ 「今回の設計で妥協した点は〜で、改善するには〜が考えられます」
典型問題: URL Shortener を例に¶
問題: bit.ly のようなURL短縮サービスを設計せよ。
要件定義¶
- 機能: 長いURLを短いURLに変換、短いURLでリダイレクト
- 規模: DAU 1億、読み書き比 = 100:1(リダイレクトが圧倒的に多い)
容量見積もり¶
- 書き込み: 1億 × 0.01(新規URL作成は少ない)= 100万/日 ≈ 12 writes/sec
- 読み込み: 100万 × 100(リダイレクト) = 1億/日 ≈ 1,200 reads/sec
- ストレージ: 1URLあたり500バイトとして、5年で = 100万/日 × 365 × 5 × 500byte ≈ 900GB
概略設計¶
クライアント
↓
Load Balancer
↓
API Server(ステートレス、水平スケール可)
├── POST /shorten → 短いIDを生成してDBに保存
└── GET /{id} → DBからURLを引いて302リダイレクト
↓ キャッシュなければ
DB (PostgreSQL)
↑
Cache (Redis) ← 読み込みの99%はキャッシュから返す
短いIDの生成方法¶
- ランダム文字列(base62): 7文字で62^7 ≈ 3.5兆通り。衝突チェックが必要
- カウンター + base62変換: IDをbase62エンコードする。衝突なし。単一DBがSPOFになるリスク
- ハッシュ(MD5の先頭6文字): 元URLから一意に決まる。衝突の可能性あり
DB設計¶
CREATE TABLE urls (
id BIGSERIAL PRIMARY KEY,
short_id VARCHAR(8) UNIQUE NOT NULL,
long_url TEXT NOT NULL,
created_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_short_id ON urls(short_id);
リダイレクトは short_id でのルックアップのみなのでシンプルなインデックスで十分。
読み込み比率が高いのでRedisでキャッシュ(TTLは1日〜7日)。
ボトルネックと改善¶
- 読み込み多い → Redisキャッシュ(キャッシュヒット率99%なら実質DBに負荷かからない)
- 書き込みスケール → DBのwrite replicaまたはシャーディング(URLを増やすほど必要)
- リダイレクトのレイテンシ → CDNでさらに高速化
学習の進め方¶
- まず構成要素を覚える(LB, CDN, キャッシュ, メッセージキュー, DB分割の基礎)
- URL Shortener → Twitter → Netflix → WhatsApp の順で難易度が上がる定番問題を解く
bugfree.aiかcodemia.ioで実際に時間を計って解く- スコアとフィードバックを見て穴を把握
- 弱いパターン(DB分割、キャッシュ戦略など)を集中的に学ぶ
参考書: "Designing Data-Intensive Applications"(DDIA)がシステムデザインの必読書。