系统设计面试的框架
系统设计面试往往令人生畏,比如让你“设计一个知名的产品X”,没人能在1小时内设计出原本需要成百上千个
工程师才能创建的受欢迎的产品。
这个问题是开放的,没有完美答案,与你在设计过程中付出的努力相比,最终的设计结果并不重要。在这个过程可以展示自己的设计能力,为自己选择的设计方案辩护,建设性地回应反馈。
有效的系统设计面试的四个步骤
每家公司的系统设计面试都不一样,好的系统设计面试是开放式的,没有万能的解决方案。
一 理解问题并确定设计的边界
在系统设计面试中,不假思索快速给出答案并不会为你加分,在没有彻底了解需求之前就回答问题是面试中的大忌,
因为面试不是知识问答竞赛,它没有正确答案。
工程师要
问正确的问题,做合适的假设,并收集构建系统需要的所有信息,不要害怕提问。
例如,要求设计一个 news feed
(新鲜事信息流)系统,你想问几个问题弄清楚需求
- 候选人: 这是一 个移动应用 , 还是一 个网页应用?或者都是?
- 面试官:都是。
- 候选人: 这个产品最重要的功能是什么?
- 面试官 : 可以发布帖子,并且可以看到朋友的动态 。
- 候选人: 这个 news feed
系统中的帖子是按时间倒序排列的,还是按其他特定顺序排列的?特定顺序指的是每个帖子都有不同的权重
。 比如,和你亲近的伙伴的帖子 比 其他人的帖子更重要。
- 面试官:简单点吧,我们假定是按时间倒序排列的 。
- 候选人:一个用户最多可以有多少个好友?
- 面试官: 5000 。
- 候选人:网络流量有多少?
- 面试官:日活用户 (DAU) 为 1000 万 。
- 候选人:帖子中包含图像、视频 吗?还是只有文字?
- 面试官:可以包含多媒体文件,包括图像和视频 。
二
提议高层级的设计并获得认同
指定高层级的设计,与面试官与设计达成一致。
- 为设计制定一个初始蓝图。可以征求面试官的反馈,把面试官当作自己的队友,一起工作。很多优秀的面试官是愿意参与讨论的。
- 在白板或者纸上用关键组件画出框图,可能包括客户端(移动端/Web 端) 、
API 、Web 服务器、数据存储、缓存、 CDN 、消息队列等 。
- 做封底估算,评估你的初步设计是否满足系统需求。你需要表达出自己的思考过程,将思考过程公开。在深入研究之前
, 如果有必要做封底估算,要先就此和面试官进行沟通。
设计一个 news feed 系统,从高层级来看,系统的设计分为两个流程:发布
feed 和 创建 news feed。
- 发布 feed : 用户发布一篇帖子
,对应的数据就被写入缓存、数据库中,并且该帖子会被推送到好友的 news feed
中 。
- 建 news feed: news feed 是将好友的帖子按照时间倒序的方式聚合而成的
。
图3-1
图3-2
三 设计继续深入
你应该和面试官一起识别架构中的组件并对它们划出优先级顺序。
面试中的时 间
管理是至关重要的,因为你很容易就会陷入一些无法证明自己能力的小细节中。你必须向面试官展示自己的能力
。 尽量不要陷入不必要的细节讨论 。
接下来,探讨两个最重要的用例。
- feed 发布
- news feed 获取
图3-3
图3-4
四 总结
在最后 一 步 ,面试 官可能会对你之前的 回答进一步追问,
或者让你自由讨论一些其他问题。下面是一些你可以尝试的方向。
- 面试官可能想让你识别出系统的瓶颈并讨论潜在改进方案。展示批判性思维
- 复述你的设计方案是有用的
- 故障场景 服务器故障、数据包丢失 值得讨论
- 运维问题值得讨论,比如 怎样监控指标和错误日志?如何发布系统?
- 怎样应对下一次扩展,举例,如果你现在的设计支持100万用户,你需要改变什么才能支持1000万用户?
面试中每一步的时间分配
系统设计面试的问题非常广泛,45分钟或1小时的面试往往不够讲完整个设计。所以,时间管理很重要。
- 理解问题并确定设计的边界(3-10分钟)
- 提高高层级的设计并获得认同(10-15分钟)
- 设计继续深入(10-25分钟)
- 总结(3-5分钟)