专业书籍精读 · System Design Interview 卷一 · 第 16 章
System Design Interview Vol 1 · Ch 16 · Alex Xu · 2020
你手上这本书,前面十五章教的都是同一件事:面试官说「设计一个微信」「设计一个 YouTube」,你怎么在白板前当场把它画出来。最后一章突然不教题了。它给了你一份清单——真实公司自己写下来的、「我们这套东西到底是怎么搭的」那类文章,外加几十家公司的技术博客地址。然后说了一句:接着读下去。
你照着一本菜谱练了十二道菜,每道都练熟了。现在客人点了第十三道,菜谱上没有。你会不会做,取决于你学到的是十二套固定动作,还是「火候怎么看、下锅什么顺序、咸了怎么救」。这一章想把你送进的,是真实后厨:不是干净的菜谱,是有人手忙脚乱临时改方案的现场。
自学搭系统,最难的不是找不到资料,是资料的形状不对。教科书给你干净的原理,练习题给你干净的题面——两边都把最值钱的东西删掉了:当时的限制。真实项目里选了甲没选乙,往往不是因为甲更好,而是因为当时只有三个人、机器就那么多、下个月必须上线。这些在题面上一个字都看不到。
办法说穿了很朴素:去看人家写下来的那一份。过去二十年里,大公司养成了一个习惯——把自己踩过的坑写出来公开。不全是因为慷慨:写出来能招到人、能让同行帮着挑毛病、能让自己的做法变成行业里的默认选项。于是有了两类东西。一类是一篇文章讲透一个系统的来龙去脉:我们当初怎么做的、做到多大就撑不住了、后来改成什么、改完付出了什么代价。另一类是公司博客,隔三差五更新一篇,让你不掉队。这一章做的事,就是把这两类东西的入口一次性列给你。
最有效的用法不是从头读到尾——那是读不完的,也不必读完。而是每练一道题,就去找同一个问题的真实版本对一遍:你刚自己设计完一套发通知的系统,就去读某家公司讲他们怎么发通知的那篇,看两边哪里不一样、为什么不一样。不一样的那几处,才是你真正学到的东西。
代价要说清楚:这些文章几乎只写成功了的那一版,中间失败的三次不会写;而且从写下的那天起就开始过时——五年前那份清单里,今天有些链接已经点不开了。
题会做完,清单不会。把「自己练一道题」和「读一个真实系统怎么做的」配成一对,一直重复下去,这一章就算读对了。
想进到具体机制、记号和示意图? → 切到精读版
你以为这是全书的励志收尾,其实它是唯一一章在承认:前十五章的答案会过期,读真实系统的习惯不会。这一章没给新方法,给的是一份语料库——几十篇公司自己写下的架构文章(Amazon 的 Dynamo、Google 的 GFS 与 Bigtable、Facebook 的 TAO 与 Haystack、Twitter 的 Snowflake……)加几十家工程博客的入口,外带一句「熟能生巧」。提纯出来只有一条可操作的主张:把「做一道设计练习」和「读一个真实系统的公开资料」配成一对,用后者去校准前者里那些你根本不知道自己在瞎猜的地方。
卷一第 16 章,全书最后一章。Ch1–3 给方法(扩展阶梯、粗略估算、四步框架),Ch4–15 给十二道案例练习,Ch16 回答的是练习用完之后怎么办。它不对应任何一道题,对应的现实问题是:一个工程师在没人带的情况下,怎么把架构判断力养成长期能力。
读完前十五章的人会撞上一个很具体的坎:第十六道题。书给的题库是有限的,而且从写下那天起就在贬值——它成书于 2020 年,里面的容量数字、中间件选型、云服务报价,今天都得重算一遍。
不解决会怎样?两种失败都很常见。一种是把系统设计背成了模板:题面一改约束就塌——「如果只给你三台机器呢」「如果写比读多十倍呢」「如果这些数据受监管、不许出境呢」。面试官恰恰专挑这种追问,因为它一问就能分开「背过」和「懂了」。另一种失败更贵:面试过了,进了公司真要做架构决策时,手里只有十二个干净的参考答案,而真实项目从来不干净。这一章的回答不是再给十道题,是换语料。
把这一章拆开,实质内容只有两类东西,分工相当明确。
第一层是点名的单篇:一篇文章或一篇论文,讲透一个系统。清单里点名的包括 Amazon 的 Dynamo、Google 的 GFS 与 Bigtable、Facebook 的 TAO(社交图数据存储)与 Haystack(照片存储)、Twitter 的 Snowflake 公告与「一亿五千万活跃用户的架构」、「A Brief History of Scaling LinkedIn」、「Scaling Pinterest」、Uber 实时撮合平台、Dropbox 的扩展历程、WhatsApp 的架构等等。共同点:一篇读完,你拿到的是一条完整的决策链。
第二层是几十家公司的工程博客入口(Airbnb、Dropbox、Etsy、Facebook、Google、LinkedIn、Netflix、Pinterest、Slack、Stripe、Uber、Yelp……)。单篇给深度,博客给增量与时效。
一句话概括这个分工:单篇是教材,博客是订阅。教材把一件事讲透一次,订阅让你别在三年后还在讲三年前的做法。
练习题给你的是终局——「设计一个短网址服务」,然后是一张最终架构图。真实文章给你的是轨迹:我们一开始这么做 → 做到某个量级出问题 → 改成了什么 → 新代价是什么。差别不在信息量,在有没有那个「撑不住」的拐点。
而拐点几乎就是架构判断力的全部。知道一个设计怎么工作是入门;知道它在什么量级、因为什么原因失效才是能拿来做决策的知识。「读缓存命中率掉到 80% 以下时数据库就被打穿」「单表过一亿行之后这个查询的 p99 从 20 毫秒涨到 2 秒」——这种句子在教科书和题面里都不会出现,只在真人写的复盘里出现。LinkedIn 那篇讲的是从一个叫 Leo 的单体 Java 应用一路拆出去的过程,它的价值也不在最终架构长什么样,在于每一步是在什么压力下、什么时候做的。
可操作的判据:一篇读完,如果你说不出它放弃了什么,就等于没读。
原书这份清单是按公司排的,但它和前十五章其实能一一对上——对上之后才真正好用:
这不是巧合:前十五章的题面本来就是从这类公开资料里提炼出来的。所以最高效的读法不是照清单顺序啃,而是做完哪道题就读哪一篇——你刚在白板上亲手做过一轮取舍,再去看真人当时怎么取舍,差异会自己跳出来;反过来先读文章再做题,你只会复述它。
原章只给了清单、没给读法——这是它最大的缺口。下面这套四问是本页的补充,不是书里的内容,但它补的正是「读完之后什么都没留下」这个真实问题。每读一篇,问一遍:
产出物要具体:每篇读完写三行进你自己的一张表——问题、他们的选择、失效条件。二十篇之后,这张表就是你在面试和架构评审里真正能当场掏出来的东西;没有这张表,读过的一百篇和没读过区别不大。
书只给了清单,没说这几类来源该怎么挑。下面两张表是把清单按用途拆开的读法,属本页补充。
表 1 · 四类公开资料,各给你什么、各收你什么
| 来源 | 你能拿到什么 | 代价 / 局限 | 什么时候选它 |
|---|---|---|---|
| 会议论文 SOSP / OSDI / NSDI | 完整机制 + 实验数据 + 同行评议,细节最经得起推敲 | 读得慢;形式化记号劝退;写的常是三五年前的系统,且论文里的系统未必等于线上跑的那个 | 想把一个机制学到能自己动手实现的程度 |
| 公司工程博客 | 时效最好、约束最真,常直接给出 QPS、成本、迁移耗时这类数字 | 有公关成分;几乎只写成功的那一版;深度参差;链接最容易腐烂 | 想知道「现在的人现在怎么做」 |
| 技术大会演讲 | 拐点讲得最坦白,尤其问答环节里那些「我们当时想错了」 | 难检索、无引用、一小时才换来一页笔记 | 已经读过文字版,想补那个「为什么」 |
| 二手聚合 / 架构解析 | 一篇看到全貌,最省时间 | 转述会丢约束;错误会被整段复制传播,且常年不更正 | 做筛选——定位该去读哪一份一手材料 |
表 2 · 三种目的下,时间该花在哪
| 你的处境 | 主要投入 | 次要投入 | 明确不该做 |
|---|---|---|---|
| 两周内要面试 | Ch4–15 每题限时 45 分钟动手做一遍,写完整的估算与取舍 | 每题配读一篇对应的真实系统文章 | 现在才开始啃论文原文——时间产出比最差的选项 |
| 在职要做架构决策 | 先量出你自己系统的真实数字,再读与你同量级的公开资料 | 论文补机制细节 | 照抄比你大两个数量级的公司的方案 |
| 长期养判断力 | 订阅 5–8 家工程博客,坚持写那张「问题 / 选择 / 失效条件」三行表 | 一年精读 3–5 篇经典论文 | 清单式收藏——收藏不等于读,书签数不是进度条 |
这一章的主张听着软,其实有很硬的证据:过去十五年行业的默认架构,有相当一部分就是某家公司把自己的内部系统写出来之后长出来的。你今天用的工具,很多就是别人「学习的延续」的产物。
面试里这一章怎么用:当面试官问「你平时怎么学系统设计」「最近读了什么」,有具体答案和没有具体答案,差别非常大。「我读了 X,它的拐点是数据量到了某个数之后写入打满,我们系统在这点上不一样,因为我们的读写比是反的」——这是少数几个能提前准备、且几乎必被问到的开放问题。
① 这一章表面是励志收尾,实质是全书唯一一次承认:题库会用完、会过期,读真实系统的习惯不会。
② 它的内容只有两层:点名的单篇(Dynamo、GFS、Bigtable、TAO、Haystack、Snowflake 等)和几十家公司工程博客的入口。单篇是教材,博客是订阅。
③ 公开资料比练习题有营养,是因为它写了约束、拐点和代价——「做到多大才撑不住」这件事,题面上永远不会有。
④ 清单按公司排,但该按题重排:Ch6↔Dynamo、Ch7↔Snowflake、Ch11↔TAO、Ch1↔Scaling LinkedIn。先做题,再读对应那篇;反过来你只会复述。
⑤ 读法(原章缺的部分):每篇问四件事——约束、拐点、放弃了什么、在你这儿成不成立;产出是三行表(问题 / 选择 / 失效条件)。
⑥ 四类来源各有价格:论文最扎实但慢且滞后,工程博客最及时但有公关成分且链接最易烂,演讲最坦白但难检索,二手聚合最省时但会丢约束、传错误。
⑦ 三个最常见的坑:把清单当收藏夹、忽视幸存者偏差(只有 postmortem 专门写失败)、规模错配(大你两个数量级的方案默认不适用)。
⑧ 反方值得听:量一次自己系统的真实负载,可能比读十篇大厂文章更有用。正确姿势是先量自己的,再找同量级的公开资料对照。