我第一次參加 Meta L6 系統設計面試時徹底搞砸了,因為在壓力下我想不起 write-through 和 write-back 快取的區別。我知道自己讀過相關內容,甚至在上一份工作中實現過這兩種模式。但在那個時刻,面試官等待著,我的大腦一片空白。
那次失敗讓我明白了一件事:系統設計面試不僅僅是理解概念,更是要能瞬間回憶起權衡取捨、設計模式和關鍵數字。你需要把 CAP 定理、一致性模型和負載均衡策略裝在腦子裡隨時呼叫,而不是埋在書籤裡或半記半忘的部落格文章中。
間隔重複記憶法解決了這個問題。在四個月裡,我構建了一套 80 張卡片的牌組,涵蓋快取、資料庫、訊息佇列和一致性模型。當我走進 Stripe 的下一輪面試時,我能毫不猶豫地比較 Redis Cluster 和 Cassandra 的複製機制。我拿到了 offer。
TL;DR
系統設計面試需要瞬間回憶分散式系統模式,而不僅僅是概念理解。使用間隔重複記憶法來掌握快取策略(write-through、write-back、write-around)、一致性模型(強一致性、最終一致性、因果一致性)、分片方法和佇列模式。一套 80 張卡片的牌組,複習 3-4 個月,能讓你在面試壓力下擁有所需的心智索引。SmartRecall 的綜合模式幫助你連線概念,而不只是機械記憶事實。
為什麼系統設計需要間隔重複記憶法
大多數工程師通過閱讀《設計資料密集型應用》或觀看 YouTube 白板講解來準備系統設計面試。這能建立直覺,但無法建立回憶速度。
在 45 分鐘的系統設計面試中,你大概只有 5 分鐘來勾勒初始架構。如果你花 90 秒試圖回憶 Kafka 是在分割槽內保證順序還是跨分割槽保證順序,你已經失去了節奏。面試官評估的是你對分散式系統基礎元件的流暢度,而不是你即時從第一性原理推理的能力。
間隔重複記憶法通過將關鍵事實和權衡取捨轉移到長期記憶中來解決這個問題。你不是為了記住冷知識而記憶,而是在構建一個心智索引,讓你能瞬間比較各種選項。當面試官問"你如何處理每秒 1000 萬次寫入?"時,你可以立即調出分片策略、預寫日誌和批處理模式,而不會產生認知負擔。
我用這種方法準備了 Google、Meta 和 Stripe 的 L5/L6 面試。我的牌組涵蓋:
- 快取層:Redis vs. Memcached、淘汰策略、cache-aside vs. read-through
- 資料庫模式:分片(雜湊、範圍、地理)、複製(主從、多主)、分割槽
- 一致性模型:強一致性、最終一致性、因果一致性、讀己之寫
- 佇列系統:Kafka、RabbitMQ、SQS——交付保證和順序性
- 負載均衡:輪詢、最少連線、一致性雜湊
- 限流:令牌桶、漏桶、固定視窗、滑動視窗
每張卡片不只是定義,而是比較、權衡或我需要在壓力下引用的數字。
系統設計閃卡應該包含什麼
系統設計卡片與典型的 SRS 卡片不同。你不是在練習"什麼是最終一致性?"而是在練習綜合:"你什麼時候會選擇最終一致性而不是強一致性,運維上的權衡是什麼?"
這是我使用的結構:
1. 概念比較卡片
正面:"比較 write-through 和 write-back 快取。你會在什麼時候使用它們?"
背面:
- Write-through:同步寫入快取和資料庫。寫入較慢,無資料丟失,一致性更簡單。
- Write-back:寫入快取,非同步重新整理到資料庫。寫入更快,崩潰時有資料丟失風險,需要預寫日誌。
- 使用 write-through:金融交易、使用者資料。
- 使用 write-back:分析、日誌、高吞吐量寫入且偶爾丟失可接受的場景。
這種格式迫使你從權衡角度思考,而不是定義。
2. 數字卡片
正面:"Redis GET 的典型延遲是多少?Postgres 索引查詢呢?"
背面:
- Redis GET:亞毫秒級(0.1-1ms)
- Postgres 索引查詢:1-10ms
- Postgres 全表掃描(100 萬行):100ms-1s
面試官喜歡你引用真實數字,這表明你有生產經驗。
3. 模式卡片
正面:"一致性雜湊如何解決擴容時的快取失效問題?"
背面:
- 傳統雜湊:新增節點會重新雜湊所有鍵 → 完全快取未命中風暴。
- 一致性雜湊:新增節點時只有 1/N 的鍵需要重新雜湊。
- 虛擬節點(vnodes)改善負載分佈。
- 應用於:Cassandra、DynamoDB、Memcached 叢集。
4. 權衡卡片
正面:"主從複製 vs. 多主複製。一致性和可用性的權衡是什麼?"
背面:
- 主從複製:強一致性,單一寫入路徑,主節點是單點故障。
- 多主複製:最終一致性,需要衝突解決,寫入可用性更高。
- 使用主從複製:事務系統(Postgres、MySQL)。
- 使用多主複製:地理分散式寫入(Cassandra、CouchDB)。
5. "什麼時候使用 X?"卡片
正面:"什麼時候使用 Kafka 而不是 RabbitMQ?"
背面:
- Kafka:高吞吐量事件流、日誌保留、重放、分割槽內順序。用於:分析管道、事件溯源、CDC。
- RabbitMQ:低延遲任務佇列、複雜路由、單訊息確認。用於:後臺作業、微服務 RPC、優先順序佇列。
這些卡片訓練你將模式與需求匹配——系統設計面試的核心技能。
80 張卡片牌組示例分解
這是我為高階面試構建的牌組結構:
快取(15 張)
- Cache-aside vs. read-through vs. write-through vs. write-back
- Redis vs. Memcached(持久化、資料結構、叢集)
- 淘汰策略:LRU、LFU、TTL
- 快取雪崩緩解(鎖定、機率性提前過期)
- CDN 快取(邊緣位置、cache-control 頭)
資料庫(20 張)
- 分片策略:雜湊、範圍、地理、一致性雜湊
- 複製:主從、多主、無主(quorum)
- 索引:B-tree vs. LSM-tree、覆蓋索引
- ACID vs. BASE
- Postgres vs. MySQL vs. Cassandra vs. DynamoDB(何時使用)
- 讀副本 vs. 讀己之寫一致性
一致性模型(10 張)
- 強一致性(線性一致性)
- 最終一致性(收斂時間、衝突解決)
- 因果一致性(happens-before、向量時鐘)
- 讀己之寫、單調讀、單調寫
- CAP 定理(實際影響,不只是理論)
佇列與流(12 張)
- Kafka:分割槽、消費者組、偏移量管理、精確一次語義
- RabbitMQ:交換機、繫結、死信佇列
- SQS:可見性超時、長輪詢、FIFO 佇列
- 至多一次 vs. 至少一次 vs. 精確一次交付
- 背壓處理(限流、熔斷器)
負載均衡(8 張)
- L4 vs. L7 負載均衡
- 演算法:輪詢、最少連線、IP 雜湊、一致性雜湊
- 健康檢查和故障轉移
- 粘性會話(何時需要、權衡)
限流(6 張)
- 令牌桶(突發處理)
- 漏桶(平滑速率)
- 固定視窗(邊界問題)
- 滑動視窗日誌(精確但佔記憶體)
其他(9 張)
- 布隆過濾器(用例、誤報率)
- 一致性雜湊(虛擬節點、負載分佈)
- 預寫日誌(永續性、崩潰恢復)
- 兩階段提交(分散式事務、協調器故障)
- Saga 模式(補償事務)
前兩週我每天覆習這套牌組,然後讓 SmartRecall 的演算法接管。到第三個月,我每 2-4 周看到每張卡片一次,模式已經自動化了。
如何使用 SRS 進行綜合,而不僅僅是回憶
我看到工程師在系統設計閃卡上犯的最大錯誤是把它們當作詞彙練習。你不能只記住"Kafka 使用分割槽實現並行"就期望設計出即時分析管道。
你需要練習應用這些概念。我是這樣做的:
1. 新增"設計一個..."卡片
正面:"設計一個短連結服務。關鍵元件和權衡是什麼?"
背面:
- 寫入路徑:雜湊函式(MD5 → base62)、衝突處理、資料庫寫入(按雜湊分片)。
- 讀取路徑:快取(Redis)、資料庫查詢(按短連結索引)。
- 規模:10 億個 URL → 6 字元 base62 = 560 億種可能,無衝突風險。每秒 1 萬次寫入 → 按雜湊字首分片。
- 權衡:自定義短連結需要單獨表,分析需要非同步事件流。
這些卡片迫使你將多個模式綜合成連貫的設計。
2. 使用 SmartRecall 的"解釋你的答案"模式
當我在 SmartRecall 中複習卡片時,我不只是翻轉它並標記"正確"。我會大聲口頭解釋權衡,就像在面試中一樣。如果我結巴或遺漏關鍵點,即使技術上記住了答案,我也會標記為"困難"。
這訓練的是流暢度,而不僅僅是識別。
3. 將卡片連結到真實系統
在每張卡片背面,我添加了"真實世界示例"部分:
正面:"什麼時候使用預寫日誌?"
背面:
- 是什麼:在應用到主資料結構之前的僅追加寫入日誌。實現崩潰恢復。
- 用例:Postgres(WAL)、Kafka(提交日誌)、Redis(AOF)。
- 權衡:額外的磁碟 I/O,但保證永續性。
- 真實示例:Postgres WAL 讓副本在網路分割槽後能夠追趕。
將概念連結到你實際使用過(或在故障報告中讀到過)的系統會讓它們更容易記住。
這需要多長時間?
我在全職工作的同時花了 4 個月構建和複習我的 80 張卡片牌組。時間線如下:
- 第 1-2 周:構建牌組(每天 2 小時閱讀《DDIA》、AWS 文件和工程部落格)。每天新增 10-15 張卡片。
- 第 3-8 周:每日複習(每天 15-20 分鐘)。遇到空白時每隔幾天新增新卡片。
- 第 9-16 周:隨著間隔拉長,複習降至每天 10 分鐘。專注於模擬面試和"設計一個..."卡片。
到第三個月,我能在 5 分鐘內勾勒出分散式快取架構。到第四個月,我能毫不猶豫地應對"黑色星期五促銷期間如何處理快取雪崩?"這樣的刁鑽問題。
如果你在 6-8 周內準備面試,可以壓縮這個過程。專注於 40 張最高槓杆的卡片(快取、分片、一致性模型、Kafka),每天覆習兩次。你不會有同樣的深度,但會有足夠的流暢度通過 L5 面試。
工具:為什麼我為此構建了 SmartRecall
我最初使用 Anki,但不斷遇到摩擦:
- 沒有綜合模式:Anki 不會提示你解釋推理。你只是翻轉卡片並自我評分。
- 移動端笨拙:我想在通勤時複習,但 Anki 的移動應用感覺像桌面移植版。
- 沒有面試特定功能:我想按面試公司(Meta、Google、Stripe)標記卡片並相應地集中複習。
這就是我構建 SmartRecall 的原因。它使用 FSRS(SM-2 的繼任者)進行排程,但增加了:
- 綜合提示:翻轉卡片後,你會得到後續問題,如"解釋你何時在真實系統中使用這個"。
- 公司特定牌組:按面試重點標記卡片(例如,"Meta 強調規模,Google 強調一致性")。
- 語音模式:大聲解釋你的答案並獲得流暢度反饋。
我有偏見,但這是我在磨練系統設計準備時希望擁有的工具。
要避免的常見錯誤
1. 脫離上下文記憶
不要只練習"Kafka 保證分割槽內順序"。要練習"為什麼 Kafka 按鍵分割槽?如果不指定鍵會發生什麼?什麼時候使用單個分割槽?"
2. 跳過數字
面試官會注意到你說"Redis 很快"和"Redis GET 是亞毫秒級,所以對於熱資料比 Postgres 快 10-100 倍"的區別。引用真實的延遲、吞吐量數字和儲存成本。
3. 忽略權衡
每個系統設計決策都是權衡。你的卡片應該始終包括"什麼時候使用 X 而不是 Y?"和"X 的缺點是什麼?"
4. 不練習綜合
複習 80 張卡片不會有幫助,如果你不能將它們組合成連貫的設計。新增"設計一個..."卡片並練習大聲解釋你的推理。
記住牌組後該做什麼
一旦你的間隔延長到 2-4 周,你就進入了維護階段。此時:
- 做模擬面試:使用 Pramp、Interviewing.io 或朋友。將你的牌組知識應用到真實問題。
- 閱讀故障報告:AWS、Google 和 Cloudflare 釋出詳細的故障報告。將每個報告轉化為 2-3 張新卡片。
- 新增公司特定卡片:如果你在 Meta 面試,新增關於 TAO、Memcache 和他們的分片策略的卡片。對於 Google,新增 Spanner、Bigtable 和 Chubby。
你的牌組應該隨著學習而演變。兩年後我仍在工作中遇到新模式時新增卡片。
最後的想法
系統設計面試是時間壓力下的模式匹配遊戲。你需要在幾秒鐘內識別出"這是快取問題"或"這需要最終一致性",而不是幾分鐘。
間隔重複記憶法給你這種速度。它不是理解的替代品——你仍然需要閱讀《DDIA》、觀看 YouTube 講解並做模擬面試。但它是知道一個概念和在面試官提問時準備好它之間的區別。
我從在快取策略上大腦空白到在 45 分鐘內自信地設計分散式系統。我構建的 80 張卡片牌組至今仍是我思考架構的基礎。
如果你在準備 L5+ 面試,本週就開始你的牌組。專注於快取、分片、一致性模型和佇列。每天覆習一個月,然後讓演算法接管。當你走進系統設計面試時,模式將是自動的。
如果你想要一個專門為這種準備構建的工具,看看 SmartRecall。我構建它是因為我需要它,它已經幫助數百名工程師在 FAANG 和創業公司獲得高階職位。
現在去構建你的牌組吧。你的下一個 offer 正在等待。

