第 3 章 系统设计面试的框架
引言
系统设计面试是招聘流程中的关键环节,它模拟的是现实中解决问题的场景。这类面试不仅考察技术能力,还考察协作、沟通以及应对模糊需求的能力。
本章介绍一个四步框架,帮助你高效地完成系统设计面试。
第 1 步:理解问题并确定设计范围
核心目标
- 澄清需求和假设。
- 避免过早地跳到解决方案。
- 通过提出好的问题来展现批判性思维。
做法
-
提出澄清性问题:
- 最重要的功能有哪些?
- 系统需要支撑多大的规模?
- 我们要做的是 Web 端、移动端,还是两者都有?
- 是否有现成的技术或约束条件?
-
记录假设: 把假设写在白板或纸上,方便随时参考。
示例
问题: 设计一个信息流(news feed)系统。
可以提的问题:
- 这是移动应用、Web 应用,还是两者都有?
- 一个用户最多可以有多少个好友?
- 信息流是否需要包含图片和视频?
- 信息流是否按时间倒序排列?
第 2 步:提出高层设计并获得认同
核心目标
- 构建高层架构。
- 与面试官协作,不断完善设计。
做法
-
画出设计蓝图:
- 用方框图表示关键组件(例如客户端、API、数据库、缓存、CDN)。
- 把面试官当作队友,一起完善设计。
-
进行粗略估算:
- 确保设计能够满足规模上的约束。
-
走查用例: 找出边界情况,并验证设计中的假设。
示例
对于信息流系统,可以把设计拆分为:
- 信息流发布流程: 把帖子写入数据库,并填充到好友的信息流中。
- 信息流获取流程: 聚合好友的帖子,并按时间倒序展示。
第 3 步:深入设计
核心目标
- 深入探讨关键组件。
- 展现理解的深度和应变能力。
做法
- 优先考虑关键组件: 聚焦于与问题最相关的部分。
- 讨论瓶颈: 找出潜在的性能问题并提出解决方案。
- 把握细节的分寸: 避免过度设计或不必要的深挖。
示例话题
- 短网址服务: 重点讨论哈希函数的设计。
- 聊天系统: 探讨如何降低延迟,以及如何处理在线/离线状态。
- 信息流系统: 研究信息流的发布和获取过程。
第 4 步:总结收尾
核心目标
- 指出可以改进的地方。
- 回顾设计并讨论后续问题。
做法
- 找出瓶颈: 讨论潜在的局限以及扩展策略。
- 总结设计: 回顾主要的设计决策和权衡(trade-off)。
- 提出改进建议:
- 如何从 100 万用户扩展到 1000 万用户。
- 如何处理服务器故障或网络问题等错误。
最佳实践
应该做的
- 多提问: 在深入解决方案之前先澄清模糊之处。
- 多沟通: 向面试官分享你的思考过程。
- 与面试官一起迭代: 把面试官当作合作者。
- 展现灵活性: 提出替代方案并不断完善你的设计。
- 聚焦关键组件: 优先处理系统中的关键部分。
不应该做的
- 避免过早给出方案: 在理解需求之前不要急于设计。
- 不要沉默: 在整个过程中保持持续沟通。
- 避免过度设计: 专注于实用、可扩展的方案。
时间管理
建议的时间分配(以 45 分钟面试为例):
- 理解问题并确定范围: 3–10 分钟
- 高层设计并获得认同: 10–15 分钟
- 深入设计: 10–25 分钟
- 总结收尾: 3–5 分钟