回到 Blog 中文 EN

System Design 面試
完整準備指南

System Design 面試卡住、多半不是「不會」、是「沒框架」 ─ 給你 1 小時設計 Twitter、你不知道從哪開始講。這篇拆給你看 6 步答題流程、10 個必背元件、5 個經典題範例、跟新手最常踩的 4 個雷。

為什麼System Design 這麼難準備

跟 LeetCode 比起來、SD 面試 3 個獨特挑戰:

  1. 沒有「正確答案」 ─ 同一題、不同人給的設計都可能對
  2. 考的是「怎麼思考」、不是「背了多少
  3. 需要主動引導 ─ 面試官給你模糊題目、要你自己問問題、自己 scope

所以準備 SD 不是「記住答案」、是「練熟一套答題框架 + 累積元件 vocabulary」。


6 步答題框架 ─ 每題都用這個流程

Step 1 · 5 分鐘

釐清需求(Clarify Requirements)

這是最關鍵的一步、新手最容易跳過。

  • 功能需求:什麼 user action?回傳什麼?
  • 非功能需求:QPS(每秒請求)、user 數量、資料大小、延遲要求、可用性
  • scope:要做哪些 feature、不做哪些

範例提問:「設計 Twitter ─ 我們只做 timeline 跟 tweet?還是含 DM、搜尋、廣告?」

Step 2 · 5 分鐘

容量估算(Capacity Estimation)

做粗略計算、決定系統規模。

  • QPS:daily active users × 平均每人請求數 / 86400 秒
  • 儲存:每筆資料大小 × 數量 × 留存時間
  • 頻寬:QPS × 平均 response 大小

範例:1 億 DAU × 每人 50 篇推文閱讀 = 50 億 read / day ≈ 58K QPS。

Step 3 · 10 分鐘

API 設計 + 資料模型

畫出主要 endpoints 跟資料 schema。

  • List 3-5 個核心 API
  • 每個 API:method、path、input、output
  • 主要 entity 的欄位 + 關聯

範例POST /tweetsGET /users/:id/timeline

Step 4 · 15 分鐘

高層架構(High-Level Design)

畫出主要 components 跟它們怎麼互動。

  • Client → Load Balancer → API Gateway → Service
  • Service → Cache → DB
  • Service → Message Queue → Worker
  • 標出資料流向

這時候用紙筆 / whiteboard 畫、不要只用嘴講。面試官要看到圖。

Step 5 · 15 分鐘

深入單一元件(Deep Dive)

面試官會選 1-2 個元件、要你深入。

  • Timeline 怎麼產生?fanout-on-write vs fanout-on-read?
  • DB schema 怎麼設計?分片策略?
  • Cache 怎麼失效?consistency 怎麼保證?

這是最展現深度的環節。要能講出 trade-off。

Step 6 · 10 分鐘

處理 scale + 失敗(Scale & Failure)

被問到「如果流量 10 倍呢?」「DB 掛了怎麼辦?

  • Horizontal scale:分片、replication
  • 失敗處理:retry、circuit breaker、fallback
  • monitoring:metric、alert、SLO

10 個必背元件

元件 用途 什麼時候用
Load Balancer把流量分到多台 serverQPS > 單機可承受
CDN靜態資源快取到邊緣節點用戶分散在不同地區
Cache(Redis)快取常存取資料讀多寫少、可接受短暫不一致
Message Queue(Kafka / RabbitMQ)非同步處理、削峰耗時任務、不能即時完成
SQL DB(Postgres)結構化資料、強一致需要 transaction、複雜 query
NoSQL(MongoDB / DynamoDB)非結構化、水平擴展schema 變動快、巨量資料
Search(Elasticsearch)全文搜尋需要中文分詞、模糊查詢
Object Storage(S3)大檔案(圖、影片)不適合放 DB 的二進位資料
API Gateway統一入口、認證、rate limit多個 microservice 需要統一管理
Pub/Sub事件廣播多個下游需要同一事件

重點 ─ 每個元件都要能講出「為什麼選它」、不是「我就用 X 因為大家都用」。


5 個經典題 ─ 每題練 1 次

01 Design Twitter (Tweet + Timeline)

核心挑戰:timeline 怎麼產生?

  • Fanout-on-write(push)─ 我發推、立刻寫到所有 follower 的 timeline cache
  • Fanout-on-read(pull)─ follower 看 timeline 時、即時查我跟我 follow 的人的推
  • Hybrid:一般用 push、明星用 pull

主要元件:Tweet Service、Timeline Service、User Graph、Redis(cache)、Kafka(fanout)。

02 Design URL Shortener (bit.ly)

核心挑戰:怎麼生 unique short code?

  • Base62 encoding:sequential ID 轉成 [a-zA-Z0-9] 短字串
  • Hash + collision handling:md5(url) 前 7 字元、衝突就 retry
  • Counter service:中央發號(用 Snowflake / Ticket Server)

主要元件:API、ID Generator、KV store(mapping short → long)、Analytics(紀錄點擊)。

03 Design Chat App (WhatsApp / Slack)

核心挑戰:訊息即時送達 + 已讀回條 + 多裝置同步。

  • WebSocket(持久連線)
  • Message broker(路由訊息)
  • Offline queue(離線用戶上線後補發)

主要元件:WebSocket Gateway、Message Service、User Presence、Notification Service。

04 Design YouTube

核心挑戰:影片上傳 + 編碼 + 串流。

  • Multi-resolution encoding:上傳後背景轉成多個解析度
  • CDN:影片片段快取到邊緣
  • Adaptive bitrate(ABR):HLS / DASH 根據網速切換

主要元件:Upload Service、Encoding Workers、S3、CDN、Metadata DB。

05 Design Rate Limiter

核心挑戰:限制每個 user 每秒呼叫次數。

  • Token Bucket:每秒補 N 個 token、用完拒絕
  • Sliding Window:精確控制、需要更多計算
  • Fixed Window:簡單、邊界會有 burst

主要元件:Redis(存 counter)、Rate Limit middleware、Config service。


新手最常踩的4 個雷

01 不問需求、直接畫

面試官說「設計 Twitter」、新手立刻開始畫 architecture diagram。

這是最大的扣分項

Senior 工程師會先問:「Twitter 哪個部分?需要支援多少 DAU?要不要做搜尋?」

這個動作展現 ─ 你知道 scope 控制的重要

02 一直用「buzzword」、不解釋

錯誤示範:

我這邊放 Kafka、然後上 Redis、後面 sharding Postgres、前面接 nginx ingress 跟 Istio service mesh⋯

面試官知道你聽過這些字、但不知道你懂不懂為什麼用

每提一個技術、後面接「因為 ___」:「這邊放 Kafka、因為下游 worker 處理耗時、需要 decouple producer 跟 consumer。

03 只講 happy path、不講失敗

設計只有「正常運作」的 ─ 是 Junior。
設計考慮「X 掛了怎麼辦」的 ─ 是 Senior。

每個元件你都該問自己:

  • 掛了會怎樣?
  • 有 fallback 嗎?
  • 怎麼偵測?
  • 怎麼復原?

04 過度設計(Over-engineering)

設計 todo app、結果搞 microservice + Kafka + 5 個 DB ─ 面試官會覺得你不懂 trade-off。

原則 ─ 從最簡單能 work 的開始、有需要再加

被問「10 倍流量呢?」再開始加 cache / shard、不要一開始就 over-design。


準備期 ─ 建議路徑

Week 1-2:建立元件 vocabulary

  • 把上面 10 個元件、每個寫一份「它是什麼、什麼時候用、優缺點、替代品」筆記
  • 每天 30 分鐘、確保都能流暢解釋

Week 3-4:練 5 個經典題

  • 每題自己畫 1 次、不查資料
  • 看公開答案(Grokking、Donne Martin 的 system-design-primer)對照
  • 找 5 個地方你沒想到的、寫進筆記

Week 5-6:Mock interview

  • 找朋友 / 學長 / 付費 mock
  • 每次 mock 後寫「下次要改的 3 件事
  • 錄音自己聽、會聽出很多冗詞跟卡點

Week 7:去面試

  • 先面 1-2 個你不太想去的公司、當 warm-up
  • 再面 dream company

總長 ─ 7 週、約 50-70 小時。


常被問的「陷阱問題

  • 「為什麼用 SQL 不用 NoSQL?」 ─ 答 transaction、ACID、複雜 query;不要說「我比較熟
  • 「為什麼用 Kafka 不用 RabbitMQ?」 ─ Kafka 是 log、durable + replay;RabbitMQ 是 traditional queue
  • 「Cache 怎麼失效?」 ─ TTL、write-through、write-back、explicit invalidate ─ 列 trade-off
  • 「DB 怎麼分片?」 ─ by user id、by geo、by time、by hash;講出選擇依據
  • 「Consistency vs Availability?」 ─ CAP theorem、你的場景偏哪邊

最後一個提醒

System Design 面試考的不是「你知道多少技術」、是「你能不能跟資深工程師討論架構」。
前者 1 年內可累積、後者需要真的做過 production 系統

如果你還沒做過 production 級別的東西 ─ 我建議:

  1. 挑 1 個 side project、認真做到能 scale 的程度(加 cache、加 monitoring、處理 fail)
  2. 讀 1 本經典書(DDIA / System Design Interview by Alex Xu)
  3. 看 5 個大公司 engineering blog(Uber、Netflix、Discord、Cloudflare、Stripe)

這 3 件事一起做、3-6 個月後你的 SD 答題質量會質變。

想要 mock System Design 面試?

30 分鐘 1-on-1 模擬面試 NT$1,500 ─ 我給你題目、你答、我即時 feedback「該怎麼改」+ 完整錄影回放。

LINE 預約 mock 看面試準備服務