コンテンツにスキップ

システムデザイン面接練習サイト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でさらに高速化

学習の進め方

  1. まず構成要素を覚える(LB, CDN, キャッシュ, メッセージキュー, DB分割の基礎)
  2. URL Shortener → Twitter → Netflix → WhatsApp の順で難易度が上がる定番問題を解く
  3. bugfree.aicodemia.io で実際に時間を計って解く
  4. スコアとフィードバックを見て穴を把握
  5. 弱いパターン(DB分割、キャッシュ戦略など)を集中的に学ぶ

参考書: "Designing Data-Intensive Applications"(DDIA)がシステムデザインの必読書。