System Design 面試
完整準備指南
System Design 面試卡住、多半不是「不會」、是「沒框架」 ─ 給你 1 小時設計 Twitter、你不知道從哪開始講。這篇拆給你看 6 步答題流程、10 個必背元件、5 個經典題範例、跟新手最常踩的 4 個雷。
為什麼System Design 這麼難準備
跟 LeetCode 比起來、SD 面試 3 個獨特挑戰:
- 沒有「正確答案」 ─ 同一題、不同人給的設計都可能對
- 考的是「怎麼思考」、不是「背了多少」
- 需要主動引導 ─ 面試官給你模糊題目、要你自己問問題、自己 scope
所以準備 SD 不是「記住答案」、是「練熟一套答題框架 + 累積元件 vocabulary」。
6 步答題框架 ─ 每題都用這個流程
釐清需求(Clarify Requirements)
這是最關鍵的一步、新手最容易跳過。
- 功能需求:什麼 user action?回傳什麼?
- 非功能需求:QPS(每秒請求)、user 數量、資料大小、延遲要求、可用性
- scope:要做哪些 feature、不做哪些
範例提問:「設計 Twitter ─ 我們只做 timeline 跟 tweet?還是含 DM、搜尋、廣告?」
容量估算(Capacity Estimation)
做粗略計算、決定系統規模。
- QPS:daily active users × 平均每人請求數 / 86400 秒
- 儲存:每筆資料大小 × 數量 × 留存時間
- 頻寬:QPS × 平均 response 大小
範例:1 億 DAU × 每人 50 篇推文閱讀 = 50 億 read / day ≈ 58K QPS。
API 設計 + 資料模型
畫出主要 endpoints 跟資料 schema。
- List 3-5 個核心 API
- 每個 API:method、path、input、output
- 主要 entity 的欄位 + 關聯
範例:POST /tweets、GET /users/:id/timeline。
高層架構(High-Level Design)
畫出主要 components 跟它們怎麼互動。
- Client → Load Balancer → API Gateway → Service
- Service → Cache → DB
- Service → Message Queue → Worker
- 標出資料流向
這時候用紙筆 / whiteboard 畫、不要只用嘴講。面試官要看到圖。
深入單一元件(Deep Dive)
面試官會選 1-2 個元件、要你深入。
- 「Timeline 怎麼產生?fanout-on-write vs fanout-on-read?」
- 「DB schema 怎麼設計?分片策略?」
- 「Cache 怎麼失效?consistency 怎麼保證?」
這是最展現深度的環節。要能講出 trade-off。
處理 scale + 失敗(Scale & Failure)
被問到「如果流量 10 倍呢?」「DB 掛了怎麼辦?」
- Horizontal scale:分片、replication
- 失敗處理:retry、circuit breaker、fallback
- monitoring:metric、alert、SLO
10 個必背元件
| 元件 | 用途 | 什麼時候用 |
|---|---|---|
| Load Balancer | 把流量分到多台 server | QPS > 單機可承受 |
| 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 個 side project、認真做到能 scale 的程度(加 cache、加 monitoring、處理 fail)
- 讀 1 本經典書(DDIA / System Design Interview by Alex Xu)
- 看 5 個大公司 engineering blog(Uber、Netflix、Discord、Cloudflare、Stripe)
這 3 件事一起做、3-6 個月後你的 SD 答題質量會質變。
想要 mock System Design 面試?
30 分鐘 1-on-1 模擬面試 NT$1,500 ─ 我給你題目、你答、我即時 feedback「該怎麼改」+ 完整錄影回放。