专业书籍精读 · System Design Interview 卷一 · 第 3 章
System Design Interview: An Insider's Guide · Vol 1 · Ch 3 · Alex Xu · 2020
请设计师来装修房子,靠谱的那位不会张口就说「我给你铺大理石」。她先问:几口人住?孩子多大?养不养猫?预算多少?在家做饭多不多?——问完这些,方案才有意义。这一章讲的就是工程师版的这套问法:面对一道故意问得很含糊的大题,怎么用一套固定的顺序,把它变成一道能做的题。
这是全书唯一一章不讲任何技术的章。没有缓存,没有数据库,一个组件名都不出现。可它偏偏是决定成败的那一章。因为这种考试从来不是比「谁的答案对」——题目根本没有标准答案。它看的是:把一件谁也没想清楚的事交给你,你能不能一步步把它收拾成一个方案。
最常见的失败长这样:题目一念完,人就开始答。因为紧张,因为怕冷场,因为觉得答得快显得聪明。
问题是,他答的往往不是这道题。没问清楚就动手,等于花四十分钟做了一道自己脑补出来的题。做得再漂亮也没用——对面从头到尾在想同一件事:你为什么不先问一句?
另一种失败正好反过来:一直在讲大格局,一个细节都不肯落地。看着面面俱到,可对方想听的那句「这块具体怎么做」始终没等到。
两种毛病是同一个:没有顺序。
① 先问。这个东西给谁用、要有哪几个功能、大概多少人在用、要多快。问清楚了,才知道要做的是一辆自行车还是一列火车——这两件事没有任何共同做法。
② 先画粗的,并且征求对方同意。拿几个方框把大结构摆出来:数据从哪进来、经过谁、存在哪、怎么出去。然后停下来问一句「这样走,你觉得行吗?」。这一停很关键——得到点头再往下,才不会在错的方向上越走越远。
③ 挑最要紧的那一两块,往深里挖。不是每块都挖,时间不够,也不是重点。对方最想看的通常就一两块,挑出来,把里面的门道讲透:怎么做、为什么这么做、代价是什么。
④ 收尾。花最后几分钟说清楚:这套东西哪儿最先撑不住、坏了怎么办、上线之后靠什么盯着它、用的人再多十倍要改哪里。
贯穿四步只有一条纪律:把想的东西说出声。对方看不见你脑子里的东西,你沉默的那两分钟在他那里就是一片空白。连犹豫都该说出来:「我在两种做法之间摇摆,一个省钱一个快,我倾向后者,因为……」——这句话本身就是分数。
诚实说一句代价:这套顺序只保证你把话说清楚,它替代不了你真的懂那些东西——框架能让一个懂行的人正常发挥,不能让一个不懂的人蒙混过关。
考的不是你最后画的那张图,是你怎么从一句含糊的话走到那张图。先问清楚,再画粗的并取得同意,然后挑一两块挖透,最后留三分钟收尾——全程说出声。
想进到具体机制、时间预算和示意图? → 切到精读版
你以为系统设计面试考的是「你会不会设计系统」,其实它考的是:在信息严重不足、时间只有 45 分钟、对面还坐着一个人的条件下,你怎么把一个含糊的问题变成一个可做的问题。原书把这件事说得很直白——这是一次「两个同事协作解决开放问题」的模拟,最终那张图远没有你走到它的那段过程重要。这一章不教任何技术,它只给一个顺序;而这个顺序,恰好就是真实世界里做一次设计评审的顺序。
POST /v1/tweets。这是卷一 Part I「方法与基础」的收尾章,也是全书的转轴:Ch1 给零件(缓存、从库、负载均衡、分片)、Ch2 给尺子(QPS、存储、可用性的量级),Ch3 给的是把零件和尺子组织起来的顺序。它之后的十二个案例章——限流器、短网址、爬虫、信息流、聊天、YouTube、Google Drive——没有一章引入新方法,每一章都是这四步跑一遍的实录。对应到现实里也很具体:这四步就是一份设计文档 / 设计评审会的骨架,只是把两周压缩进了 45 分钟。
面试官说「设计一个 Twitter」,然后闭嘴。这五个字里没有规模、没有功能范围、没有约束——这是故意的。原书点破了原因:题目开放且含糊,因为公司里真实的题目就长这样。含糊本身就是考题的一部分。
不解决会怎样?三种死法,每一种都很典型。
一、直接开答。原书写得很不客气:不加思索地快速给出答案不会给你任何加分;这不是知识竞赛。更糟的是你答的可能根本不是这道题——面试官心里那个 Twitter 是日活五千万、读写比大约 100:1 的系统,你却按一个日活一万的内部工具做了四十分钟。差三个数量级的两道题,正确答案毫无交集。
二、广度铺满、深度为零。八个方框都画上了,可每个框都只有一个名字。你证明了自己听说过这些组件,没证明用过。
三、一头扎进去。第 3 分钟就在推敲哈希环上该放多少个虚拟节点,而需求还没问清。原书特意举了个例子:在一道本意考「能不能扛住大规模」的题里,花大段时间讨论 BFS 与 DFS 的取舍,是一个明确的负信号——它说明你不知道对方在看什么。
再加一个硬约束:45 分钟。一场标准的现场轮次 45–60 分钟,掐掉自我介绍和最后的反问,真正属于设计的通常只有四十分钟出头。在这个预算下,没有顺序 = 一定会整块整块地漏——不是漏细节,是漏掉「非功能需求」或「收尾」这样一整个维度。所以这一章要交付的能力只有一个:一套能套在任何题目上的固定顺序,外加每一步该花多少分钟。
原书对这一步的要求近乎苛刻:不要立刻回答。慢下来,深想,问问题。它把「面试不是知识竞赛」写在旁边,就是要堵住抢答的冲动——抢答没有加分,只有风险。
该问什么?原书给了两层。第一层是任何题都适用的四问:要建的具体功能有哪些?有多少用户?公司预期扩张有多快?现有技术栈是什么、有哪些现成服务可以直接用?最后一问最容易被跳过,却最贴近真实工作——真实的设计从来不是在白纸上做的。
第二层是把四问落到具体题目。原书以「设计信息流系统」为例,问出来的是:是移动 App、网页还是两者都要?最重要的功能是哪几个?信息流按时间倒序排,还是按权重排(比如好友的帖子权重更高)?一个用户最多多少好友?流量量级多大?帖子里能不能带图片和视频?
注意这几个问题的共同性质:每一个的不同答案都会改掉架构,而不只是改掉参数。「按权重排」意味着要多一套排序服务和特征存储;「能带视频」意味着转码流水线、对象存储和 CDN——这一条本身就够是另一道题了。反过来说,一个问题如果不同答案不会改变你的设计,它就不该占用这十分钟。
这一步的产出不是那些问题,是一份写在白板角上、双方都认可的清单:功能范围、规模假设、明确不做的部分。写下来的价值和 Ch2 一样——它让后面每一句话都有据可依,也让对方能指着其中一条说「这条改一下再看」。
这一步的目标不是画对,是画到双方都点头。原书用了 buy-in(取得认同)这个词,它就是这一步的全部重点:把面试官当队友,边画边征求反馈,而不是自己闷头画完再展示成果。
具体做三件事。一是画方框图:客户端、API、Web 服务器、数据存储、缓存、CDN、消息队列——用最少的框把数据的进出路径描出来。二是做一次粗略估算(Ch2 那套),当场验证这张图撑不撑得住第一步定下的量级;原书特别提醒,算的时候要说出声。三是和面试官商量要不要展开 API 端点和数据库表结构——这是可协商的选项,不是必答项:有的面试官想看接口签名,有的觉得那是浪费时间。
这一步最容易犯的错不是画得不好,是画完不停。停下来问一句「这个方向你觉得可以吗」,成本十秒;不问的代价,是后面二十分钟全部走在一条对方并不认可的路上。
走到这里,四件事已经具备:目标与功能范围谈定了、高层蓝图画出来了、拿到了反馈、也大致知道该重点看哪里。这一步就是和面试官一起挑出该挖的组件,然后挖透。
挖哪一块由题目决定,原书给了两个对照例子:短网址服务的重点在哈希函数——怎么把长 URL 映射成短 key、碰撞怎么处理;聊天系统的重点则在延迟怎么压下来、在线与离线状态怎么维护。同一套流程,落点完全不同,这正是「框架」和「模板」的区别。
这一步真正的技巧是时间管理。原书直接点名一种失分方式:陷入不必要的细节。10–25 分钟这个预算,够挖两个组件,不够挖五个。所以挑之前先问一句「你更想看存储这块,还是扇出这块」——这一问省下的常常有五分钟,而五分钟在这个预算里是八分之一场。
挖的时候,一个组件讲三件事就够了:怎么做、为什么这么做、代价是什么。第三件最见功力——只讲「怎么做」的人像在背书,讲得出代价的人才像做过。同样说「用缓存」,停在这里是背书;说到「缓存挂掉的瞬间全部流量会直接打到数据库上,所以要么预热要么加熔断」,才是深挖。
原书列的收尾动作有五件:
这五件的共同点是:它们谈的全是「之后」。很多人把这三分钟当客套,其实它是全场性价比最高的三分钟——前面四十分钟你在证明你会设计,这三分钟你在证明你知道设计完之后会发生什么,而后者正是「会做题」和「上过线」之间那道分水岭。原书还有一句常被忽略的话:设计讲完不等于结束,面试官说结束才是结束;要早、要频繁地征求反馈。
这一章没有技术选型,但有三组真实的权衡:时间怎么分、广度与深度怎么配、什么时候该承认不会。
表 1 · 四步:产出、预算、最常见的失误与自救话术
| 步骤 | 预算(45 分钟场) | 必须交付的产出 | 最常见失误 | 自救话术 |
|---|---|---|---|---|
| ① 界定范围 | 3–10 分钟 | 双方认可的功能范围 + 规模假设 + 明确不做的部分 | 不问就答;或反过来问成需求访谈,问到第 15 分钟 | 「我先花三分钟确认几件会影响架构的事,然后开始设计。」 |
| ② 高层设计 | 10–15 分钟 | 一张对方点过头的方框图 + 一次当场估算 | 画完不停,没要过认同;或过早展开表结构 | 「这是我的整体思路,方向上你觉得可以吗?要不要我把接口也写出来?」 |
| ③ 深挖 | 10–25 分钟 | 1–2 个组件的机制、理由与代价 | 挖了五块,每块两句;或陷进与题无关的细节 | 「你更想看存储这块还是扇出这块?我按你更关心的挖。」 |
| ④ 收尾 | 3–5 分钟 | 瓶颈、错误场景、监控发布、下一档规模 | 时间被前面吃光,整块跳过 | 「还剩几分钟,我把瓶颈和上线后要盯的指标过一遍。」 |
表 2 · 原书的 Dos & Don'ts,折成一张对照表
| 维度 | 该做 | 别做 |
|---|---|---|
| 开场 | 永远先问清楚,别把自己的假设当成事实 | 需求和假设都没澄清就跳进方案 |
| 心态 | 接受「没有唯一正确答案,也没有最好答案」;能给多个方案就给多个,并说清各自代价 | 去猜一个「标准答案」硬往上靠;只给一个方案,且讲不出它放弃了什么 |
| 沟通 | 把在想什么说出来;卡住了直接要提示 | 在沉默中思考——对面看不见,等于没想 |
| 节奏 | 先高层达成一致,再逐个往下钻,最关键的先钻 | 一开局就在某个组件里陷得很深 |
| 收场 | 早而频繁地要反馈;他说结束才是结束 | 把他当考官;讲完设计就默认自己交卷了 |
表 3 · 三组真实权衡:怎么选,以及选错的代价
| 权衡 | 偏向 A 的代价 | 偏向 B 的代价 | 怎么决定 |
|---|---|---|---|
| 广度 vs 深度 | 广:像在念组件清单,看不出工程判断 | 深:整体结构缺口没人发现,收尾被挤掉 | 先保证四步都到位,再把余下时间全给深度 |
| 自己主导 vs 跟随面试官 | 主导:可能一路挖在对方不关心的地方 | 跟随:显得没有主见,问一句才动一步 | 每个大转折处主动给方向、同时征询:「我打算先挖 X,可以吗」 |
| 承认不会 vs 硬撑 | 承认:暴露一处知识空白 | 硬撑:暴露的是判断力和诚实度,代价大得多 | 原书立场明确:卡住就要提示。要提示不扣分,编造扣分 |
表 3 最后一行值得单独说一句。很多人以为说「我不确定」是失分,其实相反:面试官几乎一定比你更懂这块,编造会被当场识别,而识别出的不是「不懂」,是「不可信」。可信度一旦掉了,前面讲得再好也救不回来。
这四步不是为面试发明的,它是一次真实设计评审的压缩版。把时间尺度从 45 分钟拉到两周,每一步都能在真实工程里找到对应物:第一步 = 需求与非目标(non-goals)的确认——Amazon 的 Working Backwards 把它推到极致,动工前先按「产品已发布」的样子写好新闻稿与 FAQ,打动不了客户的想法在派工程师之前就被砍掉;第二步 = 设计文档里的「架构概览」那一节,以及那场让人点头的评审会;第三步 = 设计文档最厚的那部分,关键决策与备选方案对比;第四步 = 上线前的清单:监控、告警、回滚、容量。这也是为什么这一章值得单独学:它的收益不止于拿 offer。
① 这是一次两个同事协作解决开放问题的模拟。题目含糊是故意的;含糊本身就是考题的一部分。
② 四步:界定范围 → 高层设计并取得认同 → 深挖 → 收尾。45 分钟的分配是 3–10 / 10–15 / 10–25 / 3–5 分钟。
③ 第一步:不要立刻回答,抢答没有加分。该问什么的判据只有一条——这个问题的不同答案会不会改掉架构?不会就别问。
④ 第二步的关键词是 buy-in:画完停下来要一次认同。这十秒防的是后面二十分钟走错方向。
⑤ 第三步只够挖 1–2 块,所以先问对方想看哪块。每块讲三件事:怎么做、为什么、代价是什么;讲得出代价才算深挖。
⑥ 第四步别跳:瓶颈、错误场景、监控与发布、下一档规模——它证明的是你知道上线之后会发生什么。
⑦ 贯穿全程的纪律:说出声。沉默思考在评价里等于没有思考;卡住了直接要提示,要提示不扣分,编造扣分。
⑧ 三面红旗:过度设计(沉迷设计纯粹性、无视权衡)、思路狭窄、固执。三条都不是技术问题,是协作问题。
⑨ 这四步就是真实设计评审的压缩版:非目标 → 架构概览 → 关键决策与备选方案 → 上线清单。学它的收益不止于拿 offer。