40场模拟面试,0次被问到这个。
「Design a URL shortener.」四个单词,45分钟,我6年的经验像纸糊的一样。
这位谷歌L7(技术职级7级,通常对应Staff Engineer或更高级别)面试官没问我哈希算法,没问Base62编码,没问怎么防碰撞。他看着我画的6台服务器、3个缓存层、2个数据库的架构图,只问了一句:「如果明天早上9点,你的短链服务要承接Super Bowl(超级碗)广告流量,你现在改哪三行代码?」
我愣了45秒。不是不知道答案,是从没想过问题可以这样问。
01 我准备的「标准答案」,全是错的
过去三个月,我刷了40场系统设计模拟面试。题库倒背如流:短链、推特、Uber、WhatsApp。每个系统我都准备了「标准架构图」——负载均衡(流量分发器)后面挂应用服务器,再加缓存层(高速数据存储)和主从数据库。
面试官点头,我过关。这套打法在L3到L5(初级到中级工程师)面试里百试百灵。
但L7的面试规则完全不同。那位面试官听我讲完哈希+Base62的常规方案后,直接打断:「你假设了每秒1万次写入,但这个数字从哪来的?」
我说是「行业常见假设」。他追问:「如果客户是TikTok,这个数字是100倍;如果是内部工具,可能是1/1000。你设计的是哪个?」
我设计的其实是「面试常见系统」,不是「某个客户的真实系统」。
他继续:「你用了6台服务器。如果其中2台在凌晨2点同时宕机,你的故障转移(自动切换备用系统)要几秒?这几秒里,已经生成的短链会不会丢?」
我画的架构图里有故障转移的箭头,但没算过时间。没算过时间,等于没设计。
02 真正被考的不是知识,是「压力下的决策」
面试的后半段变成了一场实时推演。面试官不断往系统里扔变量:
「现在你的数据库主节点(主要写入节点)CPU飙到95%,监控告警响了,你只有30秒决策——扩容、限流(流量控制)、还是直接降级(关闭非核心功能)?」
「选限流。但限流会误伤付费用户,你怎么区分?」
「用用户等级。但等级信息在另一张表,查表会增加200毫秒延迟,你接受吗?」
每个选择都有代价,没有标准答案。他要看的是我在信息不完整时,能不能快速说出「我选X,因为Y,代价是Z,如果Z发生我会做W」。
这种思维模式叫「权衡显式化」(trade-off articulation)。不是知道所有选项,而是让面试官看到我的决策链条。
我之前的40场练习,练的是「背诵正确答案」。L7要的是「在噪声中做选择」。
03 那个让我破防的「三行代码」问题
面试最后10分钟,他回到Super Bowl场景。我的架构图里有缓存、有队列(异步任务缓冲)、有预生成的短链ID池——都是教科书里的高并发(高访问量)方案。
他摇头:「这些都要改配置、扩机器、预热缓存。我问的是三行代码,现在就能部署的。」
我想了90秒,说了个答案:在生成短链的API入口加快速拒绝(fast reject),判断如果是新用户且来源是Super Bowl广告域名,直接返回503(服务暂时不可用)并提示「请稍后重试」。
他面无表情:「这是业务自杀。广告流量来的用户,第一秒体验就是报错?」
我又憋了60秒,说第二个方案:把短链生成从同步改成异步,先返回一个「处理中」的token,让用户轮询(定期查询)结果。
这次他点头了:「三行代码:改API返回结构,加token生成,启一个后台worker(处理程序)。代价是用户体验从200毫秒变成可能5秒,但系统不会崩。」
他没说这是最优解。他说的是:「你现在知道什么叫『保护系统优先于保护功能』了。」
04 我重新理解的「系统设计」
走出会议室,我复盘了这场面试和之前40场的区别。
之前的准备是「知识集邮」:收集所有可能考到的组件,Redis(内存数据库)、Kafka(消息队列)、Cassandra(分布式数据库),面试时尽量多提到几个。
L7的面试是「压力测试」:给定一个模糊目标,看我能不能在约束条件下(时间、资源、信息不全)快速收敛到一个可执行的方案。
一位通过谷歌Staff面试的朋友后来告诉我:「L7以上不考你知道多少,考的是你『不知道的时候怎么办』。」
我之前的6年,做的是「实现别人设计好的系统」。面试暴露的是:我从没真正「设计」过——没在白纸状态下,为一个具体场景做过完整的决策链条。
05 我现在怎么练
我不再刷题库了。现在的练习方式是:选一个真实产品,比如Bitly(短链服务),假设我是2011年的唯一工程师,从第一行代码开始推演。
第一周只有一台服务器,怎么设计数据库表结构才能支持未来分片(数据拆分)?
第三个月用户破百万,发现哈希碰撞概率比预期高,是改算法还是加业务层处理?
第一年拿到企业客户,对方要求99.99%可用性(全年宕机不超过52分钟),我的架构哪里是单点故障(无备份的薄弱环节)?
每个阶段只给30分钟决策时间,强制写出「选X,因为Y,代价是Z」。
这种练法和面试技巧无关。它练的是「在约束中做选择」的肌肉记忆。
那位L7面试官最后送我一句话:「好的系统设计师和差的区别,不是知道的更多,是能在混乱中更快找到『足够好』的出口。」
我现在每天花1小时做这种「混乱推演」。不是为了下一场面试,是为了补上6年没练过的那门课。
如果你也准备过系统设计面试——你遇到过那种「明明背过答案,却被问懵」的时刻吗?最后是怎么破局的?
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.