大多数系统设计备战都是无章法的零散涉猎——这里看一篇演练,那里读一篇博客, 分不清什么是根基、什么只是变体。本计划把本站的系统设计资料库按依赖顺序编排进 九周:先建立词汇,再攻锚定题,接着是你最可能被问到的产品系统,专门化题目放到 最后。基础设施原语——“设计你自己的键值存储 / 队列 / 锁”——被抽进一条可选的深入 专题线,供真正会考它们的面试环节使用。每一周都会告诉你读什么、练什么、以及如何 判断自己已经练到位。
适合谁
一位在未来一到三个月内即将迎来系统设计面试轮次的后端软件工程师,目标是资深 IC 岗位:
- Google L5
- Meta E5
- Amazon L6
- Stripe、Datadog、Airbnb 及类似公司的 Senior SWE
你做过真实的后端系统,但不一定从一块白板设计过一个系统,而你上一次接触 “设计 Twitter”可能还是一段没看完的视频。本计划假设这场面试重要到值得你在 9 周里 每周投入约 6 个专注小时。
资深系统设计面试到底考什么
一场资深系统设计面试不是一场分布式系统考试。面试官评估的是你能否:
- 澄清模糊需求 — 在动笔画任何东西之前问对问题;识别出塑造整个设计的 1–2 个约束。
- 把需求转化为容量假设 — 估算负载、存储和带宽;让数字驱动架构决策。
- 做出有意识的权衡 — 在多个备选方案间做选择,并通过点明你所牺牲的东西来 为这个选择辩护。
- 识别瓶颈和故障模式 — 什么最先崩溃、你如何检测、如何恢复。
- 为运维和演进而设计 — 部署、监控、回滚、迁移,以及在 10× 规模下什么会变。
- 在时间压力下沟通决策 — 组织一场 45 分钟的对话,根据面试官的信号校准深度, 并且主导节奏而不被牵着走。
目标不是完美的架构,而是让扎实的工程判断力被看见。
Important
核心要点: 一场资深系统设计面试评的是被说出来的判断力,而不是被画得完美的架构。下面每一周都在训练判断力的一个切片;彩色 callout 是可快速浏览的一层——红色的挑战自己问题供你自测,强调色的 callout 标出那些决定成败的陷阱和信号。
系统设计评分标准
无论面试官是否使用正式的评分表,他们打分的都是这些信号:
| 信号 | 0(担忧) | 1(低于门槛) | 2(达到门槛) | 3(强力录用) |
|---|---|---|---|---|
| 需求 | 遗漏关键需求;立刻开始画图 | 问的问题很少;照单全收题目 | 覆盖功能性和非功能性;界定范围 | 排优先级、重构问题、并识别出最难的子问题 |
| 估算 | 没有 | 薄弱或含糊带过 | 大体合理;至少驱动一个决策 | 数字塑造架构;能说明 10× 时什么会变 |
| 架构 | 零散;只有框没有关系 | 可行但泛泛 | 连贯;组件有理由 | 有意识的权衡;分阶段演进;有非显而易见的洞见 |
| 分布式系统 | 浅薄;只报技术名词不懂原理 | 局部;应用了一两个概念 | 胜任;正确应用复制、分区、一致性 | 深入且务实;应对追问毫不迟疑 |
| 运维 | 缺失 | 基础(“加监控”) | 扎实;说得出 SLO、故障检测、部署 | 生产优先;讨论 canary、回滚、迁移、可观测性 |
| 沟通 | 混乱;由面试官主导 | 可接受;跟着提示走 | 有结构;讲述权衡;确认对方理解 | 主导对话;校准深度;有效利用提示 |
大多数资深候选人失败,是因为某一类停留在 0–1,而其他类别都还不错。评分标准告诉 你该聚焦哪里:每次模拟面试后给自己打分,把精力投到拖后腿的那个维度上。
公司校准
系统设计轮次在不同公司之间的差异,比编码轮次大得多:
| 公司 | 设计侧重 | 他们最狠地考什么 | 让你的备战偏向 |
|---|---|---|---|
| Meta E5 | 大规模的产品架构 | 权衡、迭代速度、move-fast 信号 | 第 2、3、7、8 周 —— 面向产品的题目、排序、实时 |
| Amazon L6 | 模糊性与运维 | 运维思维、故障处理、设计决策中的 LP 契合 | 第 5、6、8 周 —— 事务、流式管道、故障模式 |
| Google L5 | 分布式系统基本功 | 一致性、复制、正确性论证 | 第 1、4 周 + 基础设施深入线 —— 词汇精确、AP 内核,然后从零构建 CP 数据库和锁 |
| Stripe | 可靠性、API、一致性 | exactly-once 语义、幂等、数据完整性、API 契约设计 | 第 4、5 周 + 队列深入 —— 存储、事务/幂等;扩展阅读为必读 |
| Datadog | 可观测性与规模 | 时序存储、基数、管道可靠性 | 第 6、7 周 + 队列深入 —— 流式、指标/监控、聚合 |
| Snowflake | 存储引擎、查询系统 | 分区、查询规划、存算分离 | 第 4、7 周 + 数据库深入 —— 分布式存储、CP 数据库、数据管道 |
| 其他公司 | 视情况而定 | 找到他们的差异化点 | 把各周对齐到他们的侧重领域 |
Tip
如何使用: 在第 0 周,确定你的目标公司,把你的深度投入小时数偏向”最狠地考什么”这一列。每周计划仍然是主干——只是你在对应到你目标公司侧重的那几周上多花时间。
你应该已经掌握的
本计划从分布式系统开始,而不是从零开始。在第 1 周之前,你应该对以下内容感到自如:
- HTTP 和 API。 请求/响应、状态码、REST 大致意味着什么、JSON 负载。你在工作中 构建过或调用过 API。
- 至少一个用过真章的数据库。 你设计过表或文档、写过真实查询,并至少遇到过 一个不得不修的慢查询。你知道索引是什么,也大致知道它为什么有用。
- 缓存是什么、为什么存在。 你用过 Redis 或 memcached,或者至少用过进程内缓存, 并且至少被陈旧数据坑过一次。
- 消息队列是干什么的。 即使你从没运维过 Kafka,你也说得出为什么要把工作从 请求路径上挪走。
- Big-O 直觉。 不是面试级算法——只是那种反射:每个请求扫描 1 亿行和读一行是 两回事。
- 一个生产事故的故事。 你构建过、搞坏过或修复过的某件事,能不看笔记讲上 五分钟。面试会用到它;本计划也会。
如果这几点里有两点或以上不牢靠,先花一两周补上这些缺口——本计划会立刻建立在 它们之上。
你不需要的:预先的分布式系统理论、“网络级规模”的经验,或读过任何经典论文。 这些计划里都会覆盖。
每周计划如何运作
三条让每小时都算数的规则:
- 先尝试再阅读。 对每一篇标记为先练的演练,设一个 25 分钟计时器,在打开 文章之前先自己设计这个系统——大声地、在纸上或白板上。然后把文章当作对你尝试的 差距分析来读。先读会把演练变成睡前故事;先尝试会把它变成教练指导。
- 大声就是真的大声。 面试是说出来的。练习对着空房间讲出你的澄清问题、你的 容量算术和你的权衡。这只在头两次感觉很傻。
- 每个系统一页笔记。 每篇演练之后,凭记忆用两句话写下这个系统的一个核心张力 和一个隐藏陷阱。到第 9 周,这一页就是你的复习提纲。
约 6 小时/周 ≈ 两个阅读块加一个练习块。计划可伸缩:5 周每周 11 小时可行;18 周 每周 3 小时也可行。不要重排各周——后面的周依赖前面建立的词汇。
Tip
如何使用”挑战自己”问题: 每一周都以一个红色的挑战自己 callout 结尾——一组供你思考的探究性问题。用它们的三种方式:作为自测(每一个你能不能不看笔记、凭记忆大声答出来?);当某处感觉不牢靠时,作为与模拟伙伴或教练的讨论起点;以及作为真实面试官在你主设计落地后升级追问的追问问题预览。如果某个问题把你难住了,那正是提示你该回头重读哪里的信号——而不是跳过的理由。
每周计划
第 1 周 —— 词汇、估算与热身
出现在每一道题里的概念——分区、容量算术、故障模式、运维词汇——外加经典的热身 演练,让你立刻应用它们。这一周搭建起其他一切所依赖的共同语言,然后把它落在整套 题里最温和的一道上。
阅读:
- 框架:思考系统设计中的权衡 —— 推理过程(坐标轴 → 上下文 → 成本)。读它是为了学如何做决定。
- 参考:常见系统设计决策 —— 它的配套速查表:默认选择以及何时切换。现在略读,面试前回来做快速复习。
- 参考:容量估算
- 参考:分区策略
- 演练:设计短链接系统 —— 经典热身:读多的缓存、ID 生成正确性。先练;它足够短,可以在一个块里既尝试又阅读, 它把第 1 周的词汇变成一个具体的第一个设计。
Warning
故障词汇。 这些是每一个”如果……会怎样?“追问背后的模式。 对每一个都要知道名字、机制和一个真实世界的触发场景:
- Retry storm(重试风暴)—— 级联重试在部分失败后放大负载
- Thundering herd(惊群)—— 协同的缓存未命中或重连
- Hot partition(热点分区)—— 流量倾斜集中在一个分片上
- Cascading failure(级联故障)—— 一个过载的服务拖垮它的依赖方
- Split brain(脑裂)—— 网络分区导致出现两个 leader
- Backpressure(背压)—— 生产者压垮消费者;队列增长是其症状
- Poison message(毒消息)—— 一条坏消息阻塞整个消费者组
Tip
运维词汇。 生产的语言——面试官用这些来探你是否真的运维过系统:
- SLI / SLO / SLA —— 信号、目标、协议;要知道这个层级关系
- p50 / p95 / p99 —— 为什么尾部比平均值更重要
- Error budget(错误预算)—— 在冻结发布之前你被允许有多少不可靠性
- Canary deploy(金丝雀部署)—— 在全量流量之前逐步放量以检测回归
- Circuit breaker(熔断器)—— 依赖挂了时快速失败
- Idempotency(幂等)—— 重试安全、无副作用
- Rollback(回滚)—— 回退一次坏部署;要知道代码回滚和数据回滚的区别
练习:对你使用的三个产品(一个聊天应用、一个照片应用、一个打车应用)跑一遍容量 估算方法——QPS、存储、读写比,以及每个数字所迫使的设计结论。每个十分钟,大声地。
完成标志:你能不用纸做出 1M/天 ≈ 12/秒 的算术,凭记忆走一遍短链接的读路径,并 凭记忆说出 5 个故障模式及其触发场景。
Note
挑战自己:
- 你估算出 1M 写/天。大声把它换算成 写/秒——并说出这个数字会改变的一个设计决策。
- 读写比 100:1 与 1:1——每一个如何把你的架构推向不同方向?
- 从列表里挑三个故障模式。对每一个,说出机制和一个真实世界触发场景。
- retry storm 和 thundering herd 有什么区别?它们看起来很像——什么把它们区分开?
- 在短链接系统里,为什么缓存在这里特别有效?数据的什么性质让失效不成问题?
- SLI vs SLO vs SLA——用一句话说出这个层级关系。为什么面试官在意你知道其中的区别?
- 对面向用户的服务,为什么 p99 延迟比平均值更重要?什么时候你不在意尾部?
第 2 周 —— 锚定演练与数据层词汇
根基题(News Feed),外加它迫使你去推理的复制/一致性/schema 参考。后面的一切都会 回指到这一周。
阅读(先在信息流上练):
- 演练:设计信息流系统 —— 根基:扇出、大V问题、排序、容量驱动的架构。读它两遍;它的结构就是你应该如何 走任何一道题的模板。
配套参考:
- 参考:复制策略
- 参考:一致性模型
- 参考:SQL vs NoSQL Schema 设计
- 参考:数据库索引 —— B-tree vs LSM-tree 以及复合索引的列顺序;一旦你报出一个数据库,这就是几乎必然的 追问。接着 SQL-vs-NoSQL 停下的地方继续讲。
- 参考:缓存访问与失效模式
- 参考:NoSQL 热点键缓解模式
完成标志:你能凭记忆画出混合 push/pull 信息流,解释为什么是粉丝数分布——而不是 平均值——决定了它,用两句话分别说清 leader-follower 和 leaderless 复制的区别,并用 B-tree vs LSM-tree 和复合列顺序回答”你会怎么给它建索引?”。
Note
挑战自己:
- 为什么是粉丝数的分布——而不是平均值——决定 push vs pull?如果你按平均值来设计,什么会崩?
- 走一遍混合信息流:哪些用户走 push、哪些走 pull,两者在读时如何合并?
- Leader-follower vs leaderless 复制——各两句话。你什么时候会伸手去拿其中之一?
- 你为信息流选了一个数据库。面试官问”你会怎么建索引?“——B-tree 还是 LSM-tree,为什么?
- 你有一个复合索引
(user_id, created_at)。它服务哪些查询,又不服务哪些? - 强一致性在哪里会真正伤害信息流?哪里最终一致性就够了?
- 一个有 1 亿粉丝的大V发帖。追踪写路径——成本落在哪里,混合策略如何为它设上界?
第 3 周 —— 实时系统
信息流之后频率最高的面试题簇:连接、投递、限流和实时位置。
阅读(先在聊天和限流器上练):
- 演练:设计聊天系统
- 演练:设计通知系统
- 演练:设计限流器
- 演练:设计地理空间匹配系统 —— Uber/Yelp 的”附近”题:geohash 索引、高 QPS 的位置火水管、以及边界问题。一个独立的 题目家族,不能归约成其他任何一道;打车和配送公司的最爱。
配套参考:
完成标志:你能解释 WebSocket vs SSE vs long-poll 并为每个给出一个用例,用一个算好的 例子走一遍 token bucket 算法(容量、补充、第 101 个请求看到什么),并解释为什么一次 geohash 邻近查询必须扫描 9 个格子,而不是 1 个。
Note
挑战自己:
- WebSocket vs SSE vs long-poll——各给一个每个都是正确选择的用例。
- 用数字走一遍 token bucket 算法:容量 100、每秒补充 10——一秒内第 101 个请求看到什么?
- 在聊天里,当一个用户有两台设备时,你如何保证每会话的消息顺序?
- 为什么一次 geohash 邻近查询必须扫描 9 个格子而不是 1 个?如果只扫 1 个,bug 是什么?
- 跨多个节点的限流——你如何在没有单一瓶颈的情况下正确计数?
- 对地理空间系统,为什么是位置更新速率才是真实负载,而不是查询速率?
- 一位乘客和一位司机被两个请求同时匹配——你如何防止双重匹配?
第 4 周 —— 分布式存储与一致性谱系
杠杆率最高的单独一周:KV 存储引入了每个后续系统都依赖的词汇(consistent hashing、 quorum、复制机制)——它被保留为一道”构建原语”的练习,因为没有别的东西能迫使你从 第一性原理推理 quorum 和冲突解决。然后你把那套词汇应用到一个真实产品上,同样的思想 以同步和去重的形式出现,而不是学院派的 quorum 数学。
阅读(先在文件存储服务上练):
- 演练:设计分布式键值存储 —— consistent hashing、quorum、vector clock、hinted handoff。本计划中杠杆率最高的 单篇文章。这是谱系的 AP 端——可用性和分区容忍优先于强一致性。如果有任何地方 感觉不牢靠就读两遍;后面每个系统都依赖这套词汇。
- 演练:设计文件存储与同步服务 —— 分块、内容寻址、delta sync、去重、冲突处理。KV 存储的复制和冲突词汇,现在被应用 到一个人们真正在用的产品上——一道常见的 Dropbox/Drive 式面试题。
配套参考:
完成标志:你能做 quorum 算术(R+W>N 买到什么、买不到什么),用 vector clock 走一遍 一次冲突,解释虚拟节点修复了什么,并说出 delta sync 如何检测和解决一次并发编辑。
Note
挑战自己:
- R + W > N 到底给你买到了什么?给一个它仍然返回陈旧数据的例子。
- 用 vector clock 走一遍一次写冲突——你如何检测并发写,谁来解决它们?
- 虚拟节点解决了普通 consistent hashing 解决不了的什么问题?
- 什么是 hinted handoff,它掩盖了什么故障?
- 在文件同步里,delta sync 如何检测两个客户端并发编辑了同一个文件——你又如何解决它?
- KV 存储是 AP 的。说出一个会迫使你离开它、转向 CP 设计的需求。
- 为什么一个分区系统的二级索引才是那个悄悄制造热点分片的东西?
第 5 周 —— 竞争下的事务与正确性
面试官想看你能否在并发下把系统保持正确、而不只是快时,会伸手去拿的应用题簇。 这两道题都是穿着产品外衣的强一致性(CP)问题——第 4 周 AP 存储的对照面。一个 资深信号是:识别出问题何时要求强一致性,并伸手去拿正确的机制,而不是硬拴上一个。
阅读(两道都先练):
- 演练:设计订单处理系统 —— saga 编排、幂等、库存预留、支付补偿。真实世界里的分布式事务:当任何一步都可能失败 时,你如何保持一个多步骤工作流的正确。
- 演练:设计秒杀系统 —— 库存竞争、防超卖、洪峰处理、降级。整套题里最纯粹的”极端写竞争下的强一致性”题目。
配套参考:
- 参考:队列投递语义 —— at-least-once 和幂等是两个设计的骨干。
完成标志:你能走一遍带补偿路径的 saga,说出 at-least-once 投递的失败窗口在哪里、 为什么幂等能关上它,并解释两种截然不同的防超卖方式以及各自的成本。
Note
挑战自己:
- 端到端走一遍一个带补偿路径的 saga。如果补偿本身失败了会怎样?
- at-least-once 投递的重复窗口到底在哪里,幂等如何关上它?
- 给出两种截然不同的防超卖库存方式——以及各自的成本。
- 为什么不直接跨服务用分布式事务(2PC)?saga 换来的是什么?
- 是什么让一个操作幂等?为”给这笔支付扣款”设计一个幂等键。
- 在秒杀洪峰下,你最先卸载或降级什么——无论如何都必须保持正确的又是什么?
- 两位顾客抢最后一件商品。追踪请求——谁赢,输的一方如何被干净地告知?
第 6 周 —— 流式与聚合管道
异步、高吞吐的题簇:系统如何摄入火水管级的事件、正确地聚合它们、并保持可运维。 这里是队列和流处理词汇落地为应用形态的地方——窗口、exactly-once、背压,以及把基数 当作一等的容量上限。
阅读(先在广告点击聚合器上练):
- 演练:设计广告点击聚合系统 —— 摄入、流式窗口、exactly-once 语义、反熵。队列和流语义的应用之家:消费者组、顺序、 以及服务于一个真实聚合管道的背压。
- 演练:设计指标与监控系统 —— 时序建模、每秒数百万样本的摄入、基数、降采样、告警。
配套参考:
完成标志:你能解释一个流式窗口如何在重试下实现 exactly-once,说出 at-least-once 投递的失败窗口在哪里、为什么幂等能关上它,并把基数点名为指标系统真正的容量上限。
Note
挑战自己:
- 当事件被重试时,一个流式窗口如何产出 exactly-once 的计数?
- Tumbling vs sliding vs session 窗口——各自何时合适?
- 一个迟到事件在其窗口关闭后才到达。你有哪些选项,各自的成本是什么?
- 为什么是基数——而不是原始事件量——才是一个指标系统真正的容量上限?
- 消费者 lag 在增长。走一遍诊断:是消费者慢、热点分区、还是背压——你如何分辨?
- 为什么分区键的选择决定了你能否既并行化消费者又保持顺序?
- 一条毒消息卡在分区头部。下游会发生什么,你如何恢复?
第 7 周 —— 搜索、排序与数据管道
读侧智能题簇:系统如何查找、排序和计数东西。
阅读(先在搜索和推荐上练):
- 演练:设计帖子搜索系统
- 演练:设计推荐系统 —— 召回/排序漏斗;与第 2 周的信息流配对。
- 演练:设计 Top K 系统 —— Count-Min Sketch 和 heavy hitters;它的流式窗口加深了第 6 周的聚合管道。
完成标志:你能解释为什么推荐需要一个漏斗(延迟算术),并且对倒排索引的理解具体到 足以重新实现一个玩具版。
Note
挑战自己:
- 用延迟算术解释召回 → 排序漏斗。为什么你不能直接给所有东西排序?
- 倒排索引具体是什么?为三篇短文档勾勒出它的结构。
- 推荐和信息流都做排序——这两个问题真正不同的地方在哪里?
- 当文档不断变化时,你如何保持搜索索引新鲜?新鲜度/成本的权衡是什么?
- 火水管上的 Top-K——为什么有序集合扩展不了,Count-Min Sketch 用什么换取节省?
- 你如何给搜索索引分片——按文档还是按词项——各自在查询时的成本是什么?
第 8 周 —— 投递,与模拟练习
大规模投递题目,然后是模式的转变:从学习到表演。
阅读(先在视频流上练):
- 演练:设计视频流平台 —— 上传管道、ABR 转码、CDN 投递;是前几周存储和投递词汇的一次组合。
- 演练:设计 CDN
然后是两次完整的模拟——各 45 分钟,大声地,不许偷看,之后再把演练当作你的复盘来读:
- 演练:设计协同编辑器 —— OT vs CRDT、在线状态、离线编辑。
- 演练:设计分布式任务调度器 —— cron、延迟队列、DAG 编排、规模下的 tick 问题。
这两道是组合题——它们考验第 1–7 周是否组装成了判断力。这就是为什么它们是模拟, 而不是阅读。
模拟节奏标准(每次 45 分钟模拟都用它):
| 阶段 | 时间 | 你在做什么 |
|---|---|---|
| 需求 | 5 分钟 | 澄清范围、识别最难的子问题、陈述非功能性约束 |
| 估算 | 5 分钟 | QPS、存储、读写比;点出塑造设计的那个数字 |
| 架构 | 20 分钟 | 组件、数据流、带辩护的核心权衡选择 |
| 深入 | 10 分钟 | 在最难的组件上深入 2–3 层;应对追问 |
| 故障与运维 | 5 分钟 | 故障模式、检测、恢复、部署 |
你练的不是画图,你练的是节奏。大多数候选人在架构上花 35 分钟,把最后 10 分钟仓促 带过——而那恰恰是资深信号所在(深度、故障、运维)。如果你的模拟总是在讲到故障模式 之前就用完时间,下次把架构压缩 5 分钟。
完成标志:两次模拟都在 45 分钟内到达了一个完整的设计——从需求到故障模式——即便不完美。
Note
挑战自己:
- 视频上传:从原始文件走一遍管道,直到手机能流式播放的东西。转码坐在哪里、为什么它是异步的?
- 自适应码率实际上在自适应什么,这个决策在哪里做出?
- CDN 缓存失效——为什么它很难,对一个刚刚变更的文件你的策略是什么?
- 协同编辑器:OT vs CRDT——核心权衡是什么,对离线编辑你会选哪个?
- 任务调度器:你如何保证一个任务跨一整队 worker 在其计划时间恰好运行一次?
- 在你的模拟里,你在哪里超支了时间——结果哪个资深信号段落被仓促带过了?
第 9 周 —— 整合与收尾
巩固、如果与你的面试环节相关则加上 AI 时代的差异化题目、以及休息。
- 重读你的笔记页(每个系统一个张力 + 一个陷阱)。这现在就是你的整个复习面—— 抵制重读完整文章的冲动。
- 用一道你没见过的题跑最后一次模拟:设计拍卖系统 或设计完整排序系统。
- 如果你的目标公司与 AI 相邻,读其中两篇: LLM Serving、 RAG 系统、 向量数据库、 Agent 编排。
- 面试前两天:指南:临阵系统设计复习清单 和指南:管理面试连轴期的精力。
完成标志:那份清单读起来像是确认,而不是新闻。
Note
挑战自己:
- 挑你学过的任意两个系统。它们共享什么核心张力,它们的解法又在哪里分岔?
- 面试官问一个你从没见过的”如果……会怎样”。对它大声走一遍追问阶梯。
- 说出一个你会在设计中途切换一致性模型的系统——以及迫使切换的触发点。
- 如果与 AI 相邻:为什么 LLM serving 会对请求做批处理,continuous batching 改变了什么?
基础设施深入专题(可选线)
有些面试环节会让你构建原语本身——“设计一个键值存储”、“设计 Kafka”、“设计一个 分布式锁”。这些是整套题里最深的分布式系统题目,也是 consistent hashing、quorum、 共识和 fencing 以最纯粹形态存在的地方。但它们不是资深面试的中位数:多数公司考 产品系统(信息流、聊天、订单处理),并通过它们来探基础设施概念。所以这些被围进 它们自己的专题线,而不是放进每周主干。
如果你的面试环节聚焦基础设施或存储团队(Google、数据库/存储/平台组织,或任何 把”分布式系统”点名为核心胜任力的 JD),就做这条线。如果你面的是产品或应用团队, 就跳过它——每周计划已经以应用形态锻炼了这些概念,而第 4 周的 KV 存储足以应付 你实际会遇到的追问所需的词汇。
把其中一两个放进一个较轻的周里代替,或作为额外的练习块加进来。每一个都和其余部分 一样是先练的演练。
- 演练:设计分布式数据库 —— range + Raft、在共识之上的分布式事务、MVCC。第 4 周 KV 存储的 CP 镜像:同一个 岔路,相反的契约。如果你只有时间做一个深入,这是最有价值的一个。
- 演练:设计分布式队列 —— log vs queue 语义、分区顺序、消费者组、replay、背压。把第 6 周的聚合管道加深到它 底层的引擎。
- 演练:设计分布式锁 —— fencing token、leader 选举;GC 停顿时间线是许多”如果它是慢、不是死呢?“探问的可 复用答案。
- 演练:设计分布式缓存 —— 较轻的一读;直接复用 KV 存储的 hashing 和淘汰词汇。
- 演练:设计限流器 —— 如果你在第 3 周跳过了它,分布式计数器和多租户部分本身就是一个紧凑的基础设施深入。
完成标志:你能从一张白纸设计出第 4 周 KV 存储的 CP 镜像(数据库),并能从需求出发 论证 queue-vs-log。
里程碑一览
| 完成第几周后 | 你能 |
|---|---|
| 1 | 大声跑容量算术;凭记忆走短链接;说出分区选项;列出 5 个故障模式及其触发场景 |
| 2 | 凭记忆走信息流;说出复制/一致性选项;像演练那样组织任何一道题 |
| 3 | 选择并为一个连接模型和一个限流算法辩护;跑一次 9 格 geohash 邻近查询 |
| 4 | 做 quorum 算术;走一遍 vector-clock 冲突;解释虚拟节点;说出 delta sync 如何解决一次并发编辑 |
| 5 | 走一遍带补偿的 saga;解释为什么幂等关上重试窗口;用两种方式防超卖 |
| 6 | 解释重试下的 exactly-once;把基数点名为指标系统的上限 |
| 7 | 推导召回/排序漏斗;勾勒一个倒排索引 |
| 8 | 在节奏标准内完成一次冷启动的 45 分钟设计,两次 |
| 9 | 从一页笔记复习;休息好了走进面试 |
如何回答追问问题
大多数候选人处理主设计都还行。追问才是资深面试胜负所在的地方。面试官升级追问是为 探判断力——而大多数候选人要么僵住,要么给出肤浅的”加更多服务器”式答案。
Important
核心要点: 下面的追问阶梯是本计划中最可复用的单一工具——它把任何你从没见过的”如果……会怎样?“变成一个有结构、听起来资深的答案。它也是每一周红色挑战自己问题背后的模式:那些问题就是伪装成别的样子的追问。
追问阶梯(对任何”如果……会怎样”问题都用这个模式):
- 澄清故障。 复述什么在崩、在什么规模上崩。
- 陈述权衡。 点出你会牺牲什么来修它。
- 提出一个改动。 具体到:哪个组件、什么机制。
- 解释新的成本。 这个修复搞坏了什么、或让什么变得更难?
- 点名你会盯的指标。 你如何知道它奏效了?
示例追问以及如何应用这个阶梯:
- “如果一个大V发帖呢?” → 扇出写变成热点分区(1) → 用写延迟换读延迟(2) → 对高粉丝账号切换到基于 pull(3) → 现在大V粉丝的读路径变慢了(4) → 盯大V粉丝的信息流渲染 p99(5)。
- “如果 Kafka 落后 2 小时呢?” → 消费者跟不上、队列深度在增长(1) → 用处理顺序换吞吐(2) → 扩容消费者组、对生产者加背压(3) → 可能会乱序处理一些事件(4) → 盯消费者 lag 指标和端到端延迟(5)。
- “如果一个 region 挂了呢?” → 那个 region 的所有流量都丢了(1) → 在故障切换期间用一致性换可用性(2) → 异步复制到备用 region、DNS 故障切换(3) → 切换期间可能提供陈旧读(4) → 盯跨 region 复制 lag 和故障切换期间的错误率(5)。
这个模式之所以奏效,是因为面试官考的是判断过程,而不是背下来的答案。一个有结构 的回应——哪怕是对一道你没见过的题——就传递出资深级别的思考。
生产思维
每一个系统设计答案最终都应该谈到你会如何真正地运维这东西。这是把”纸面上的好架构” 和”我真的运维过分布式系统”分开的维度。把这些编织进你的设计里,而不是作为事后补充:
- 你如何部署它? Canary → 百分比放量 → 全量。一次坏部署的爆炸半径有多大? 你要多久才能检测到它?
- 你如何监控它? 哪些 SLI 重要?你把 SLO 设在哪里?你会先建哪个 dashboard?
- 你如何知道它坏了? 对症状告警(错误率、延迟)而不是对原因。on-call runbook 条目是什么?
- 你如何回滚它? 代码回滚容易。数据回滚难。schema 迁移更难。说出你的改动落在 哪一类。
- 你如何迁移数据? 双写、回填、影子流量、切换。你的兼容窗口是什么?你如何验证?
- 你如何从操作员失误中恢复? 软删除、审计日志、时间点恢复。一条坏的手动命令的 爆炸半径有多大?
资深后端 ≠ 架构画师。资深后端 = 系统所有者。运维过生产系统的面试官能立刻分辨出你 是不是也运维过。
常见的失败模式
Caution
常见错误: 下面每一个模式都是一种用动作替代进展——用阅读替代练习、用背诵替代内化、用深挖替代完成。如果这里有一个描述了你最近两周的状态,修复办法就在这个模式自己那一行里。
- 完美主义者。 读完全部 25 篇演练、一篇也不练,然后在面试里发现:认出一个好设计 和产出一个好设计是不同的技能。修复是机械的:计时器、白纸、大声,然后再读。
- 背诵者。 把 News Feed 的答案当作一个脚本来学,然后遇到”为一家医院设计一个通知 系统”却没有脚本。演练教的是一套流程——需求、估算、核心选择、故障模式——而不是 答案。在陌生题上练这套流程;那正是第 8 周要做的。
- 深潜者。 消失在基础设施深入线里读 Raft 实现,到第 8 周还从没在 45 分钟内完成 过一个完整设计。面试深度是有界的;带判断力的广度胜过一个角落里的深度。深入线和 扩展阅读都被围在每周主干之外,正是为了不让它们吃掉主干——只有当你的面试环节确实 要求那种深度时才进去。
- 沉默的设计者。 在脑子里练一切、在那里表演流畅,然后在被观察下讲述时磕绊。说 出来才是交付物;训练交付物本身。
- 跳过估算者。 直接上框和箭头,被问”多少台服务器?“,然后拙劣地即兴发挥。第 1 周存在的意义就在于:估算才是让后面每个选择都站得住脚的东西——它是花两分钟为接下 来的四十分钟买到权威。
- 运维盲的架构师。 画出一个漂亮的架构,然后答不出”你会怎么部署这个?“或”你会 盯哪些指标?“。被标记为缺乏生产深度。生产思维那一节存在,就是因为这是资深级别最 常见的无声失败。
扩展阅读
网上最好的一手来源,映射到它们所加深的那一周。每一个都因为是面试官自己也读过的东西 而赢得它的位置。
基础(第 1–2 周)
- Latency numbers every programmer should know —— 交互版本。把 RAM/SSD/网络 的比例内化;它们是每一次容量估算里的常数。
- Notes on Distributed Systems for Young Bloods —— Jeff Hodges。一篇文章讲透那个心态转变(“故障是稳态”);后面一切最好的预读。
- Timelines at Scale —— Twitter 的扇出演讲。News Feed 演练混合设计背后的一手来源;听运维者亲口说出来,感受 是不同的。
基础设施核心(第 4 周和基础设施深入线)
- Dynamo: Amazon’s Highly Available Key-value Store —— 如果你只读一篇论文,就是这篇。quorum、consistent hashing、hinted handoff、vector clock——第 4 周的词汇,来自源头。
- The Log: What every software engineer should know —— Jay Kreps。为什么 log 是队列、复制和流处理背后统一的原语。它重构了第 6 周,并悄悄 解释了第 7 周的一半。
- How to do distributed locking —— Kleppmann。fencing-token 论证。也读对 Redlock 的反驳, 形成你自己的观点——有一个观点就是一个资深信号。
- Raft, visualized —— 交互式演练。十五分钟 就能对 leader 选举和日志复制建立持久的直觉;不需要论文。
- Jepsen: Consistency Models —— linearizable/ sequential/causal/eventual 以及谁蕴含谁的可点击地图。当面试官问”但那是 linearizable 的吗?“时你会回头查的参考。
大规模运维系统(第 6–8 周)
- The Tail at Scale —— Dean & Barroso。为什么 p99 才是重要的那个数字、扇出对它做了什么。改变你在每个设计 里谈延迟的方式。
- Timeouts, retries, and backoff with jitter —— Marc Brooker,AWS Builders’ Library。每个”如果它慢了呢?“追问都在钓的故障处理机制。
- Avoiding insurmountable queue backlogs —— AWS Builders’ Library。把背压和 lag 当作一等的设计输入;直接与分布式队列演练的容量 故障配对。
- Google SRE Book — Chapters on SLOs and Monitoring —— SLI/SLO/error-budget 思维的权威来源。第 4 章(Service Level Objectives)、第 6 章 (Monitoring Distributed Systems)和第 10 章(Practical Alerting)是生产思维的根基。 如果你还不能流畅解释错误预算或基于症状的告警,就读这些。
专门化(第 7–9 周)
- Deep Neural Networks for YouTube Recommendations —— Covington 等。来自将其正典化的团队的两阶段漏斗;读架构部分,略读 ML。
- A Brief Primer on Anycast —— Cloudflare。来自押注 anycast 的运维者的 CDN 路由;十分钟,永久的直觉。
DDIA 问题
你不需要在面试前把《Designing Data-Intensive Applications》从头到尾读完。但如果你想 大幅加深第 4–7 周,关于复制(第 5 章)、分区(第 6 章)、事务(第 7 章)和流处理 (第 11 章)的章节是这些主题上最好的单一资源。把它们当作补充读,而不是前置条件。 官方页面有章节摘要。
可以毫无愧疚地跳过:聚合器式的”系统设计入门”(上面这些的二手版本)、YouTube 模拟 面试马拉松(看不等于练),以及任何在第 9 周新发现的资源(收尾就是收尾)。
时间紧张时该砍什么
四周而不是九周:完整保留第 1、2 和 4 周——它们是主干。把第 5 和第 6 周压缩成一周 (订单处理 + 广告点击,只练订单处理),把第 3 周降到只略读一篇聊天。把第 7 周降到 两篇略读(搜索、推荐)。保留第 8 周的两次模拟——永远先砍阅读再砍练习。除非你的面试 环节聚焦基础设施,否则整个跳过基础设施深入线。扩展阅读收缩到三项:Dynamo、The Log 和延迟数字。
永远不要砍:先尝试再阅读的规则、第 8 周的两次模拟、追问阶梯的练习,或收尾。最常见 的自我破坏是在面试连轴期的前一晚读新材料。
北极星
到第 9 周,你应该能够:
- 快速澄清需求并识别最难的子问题。
- 自信地估算容量,并让数字驱动决策。
- 在节奏标准内构建一个连贯的架构。
- 为权衡辩护——你选了什么、拒绝了什么、为什么。
- 流畅地讨论故障、运维和生产问题。
- 用追问阶梯应对陌生的追问而不惊慌。
那正是资深系统设计面试所考的。框和箭头只是可见的部分。底层的技能是工程判断力—— 被说出来。
Important
核心要点: 如果这九周里每一个红色的挑战自己问题读起来都像是你能不看笔记、大声答出来的东西,你就准备好了。面试前两天的那份清单应该是确认你已经知道的东西——而不是教你任何新东西。
通过之后
系统设计判断力在面试之外也会复利增长——同一套权衡词汇驱动着设计评审和晋升材料。 当 offer 到手时,职业发展资源会从这份计划停下的 地方接着讲。