3 系统设计面试的框架
前言
你刚刚获得心仪公司的现场面试机会。招聘人员给你发送了当天的时间表。 扫了一眼这个时间表,你感觉非常好,直到看到其中的这个面试环节——系统设计面试。
系统设计面试往往令人生畏,因为它的题目可能非常模糊,比如让你“ 设计一个知名的产品 X” 。 这类问题不明确,听起来宽泛得不可理喻。你感到疲惫是可以理解的。 毕竟,怎么可能有人可以在1小时内设计出原本需要成百上千个工程师才能创建的受欢迎的产品呢?
好消息是没有人期待你能给出完美的答案。真实世界的系统设计是极其复杂的。 举个例子,谷歌搜索看似简单,但其背后有数量惊人的技术在提供支持。如果没有人期待你能在1小时里设计出一个真实世界的系统,那么系统设计面试有什么用呢?
考察能力:协作、压力下工作、建设性解决模糊问题、提问等。
警惕:过度设计、忽视权衡、想法狭隘、固执等。
有效的系统设计面试的四个步骤
每家公司的系统设计面试都不一样。好的系统设计面试是开放式的,没有万能的解决方案。尽管如此,系统设计面试还是有一些通用步骤和常见套路的。
第一步:理解问题并确定设计的边界
别急着给出解决方案,慢一点,深入思考并提几个问题来厘清需求和假设。
工程师最重要的技能之一就是问正确的问题,做合适的假设,并收集构建系统需要的所有信息。所以,不要害怕提问。
当你提出一个问题时,面试官要么直接回答你的问题,要么让你做出自己的假设。如果是后者, 请把你的假设写在白板或者纸上。之后你可能会需要用到它们。
问什么样的问题呢?问问题是为了准确理解需求。你可以从下面这些问题开始:
- 我们要构建什么样的具体功能?
- 该产品有什么用户?
- 公司预计多久需要扩展系统?预计3个月、6个月和1年后的系统规模是怎样改的?
- 公司的技术栈是什么?有哪些现有服务可以直接用来简化设计?
示例:
如果你被要求设计一个news feed(新鲜事信息流)系统,你想问几个问题来弄清楚需求,那么你和面试官之间的对话可能是下面这样的。
候选人: 这是一个移动应用, 还是一个网页应用?或者都是?
面试官:都是。
候选人: 这个产品最重要的功能是什么?
面试官: 可以发布帖子,幵且可以看到朋友的动态。
候选人: 这个news feed系统中的帖子是按时间倒序排列的, 还是按其他特定顺序排列的?特定顺序指的是每个帖子都有不同的权重。比如,和你亲近的伙伴的帖子比其他人的帖子更重要。
面试官: 简单点吧,我们假定是按时间倒序排列的。
候选人: 一个用户最多可以有多少个好友?
面试官: 5000。
候选人: 网络流量有多少?
面试官: 日活用户(DAU)为1000万。
候选人: 帖子中包含图像、 视频吗?还是只有文字?
面试官: 可以包含多媒体文件,包括图像和视频。
以上是你可以问面试官的一些样例问题。理解需求并厘清不明确的地方很重要。
第二步:提议高层级的设计并获得认同
步骤:
- 为设计制定一个初始蓝图。
- 在白板或者纸上用关键组件画出框图,可能包括客户端(移动端/Web端)、 API、Web服务器、数据存储、 缓存、 CDN、消息队列等。
- 做封底估算, 评估你的初步设计是否满足系统需求。你需要表达出自己的思考过程,将思考过程公开。在深入研究之前,如果有必要做封底估算,要先就此和面试官进行沟通。
feed发布构建流程的高层设计:
news feed构建流程的高层级设计:
第三步:设计继续深入
目标:
- 就系统的整体目标和功能范围,与面试官达成一致;
- 勾画出系统整体设计的高层级蓝图;
- 从面试官那里得到关于系统高层级设计的反馈;
- 基于面试官的反馈,大概知道自己需要在哪些地方继续深入研究。
你应该和面试官一起识别架构中的组件并对它们划出优先级顺序。值得强调的是,每次面试都是不同的。有时,面试官可能会透露她想要专注于高层级设计。有时,在高级候选人的面试中, 讨论可能会集中在系统性能特征上,重点关注系统瓶颈和资源估计。在大部分情况下,面试官可能希望你深入探讨一些系统组件设计的细节。
面试中的时间管理是至关重要的,因为你很容易就会陷入一些无法证明自己能力的小细节中。你必须向面试官展示自己的能力。尽量不要陷入不必要的细节讨论。
第四部:总结
方向:
- 识别出系统的瓶颈并讨论潜在的改进方案。永远不要说你的设计是完美的, 不需要改进。
- 给面试官扼要复述你的设计方案是有用的。如果你提出了几个设计方案,那么这一点就特别重要。
正确的操作:
- 总是向面试官寻求明确的解释,不要认为你的假设是对的;
- 理解问题,及要求;
- 没有正确的答案或最佳答案。为了解决创业公司的问题而设计的方案与为了解决拥有数百万用户的成熟公司的问题而设计的方案是不相同的。要确保你理解了需求;
- 让面试官知道你在想什么,与面试官持续沟通;
- 如果有可能,请提出多个方案;
- 一旦你和面试官就设计蓝图达成一致,接下来就要深入讨论每个组件的细节。先设计最重要的组件;
- 试探面试官的想法,好的面试官会和你一起解决问题;
- 永不放弃。
禁忌:
对于常见的面试问题没有做好准备;
- 在没有弄清需求和假设之前就给出解决方案;
- 在面试一开始就讨论关于某一组件的大量细节。请先给出高层级设计后再深入讨论细节;
- 思路卡住时干着急。如果你一时找不到解题的突破口,去找面试官要点提示,不要犹豫;
- 不沟通。再说一次,一定要沟通。别在那里一个人默默思考;
- 认为给出设计方案后面试就结束。面试官说结束才是真的结束。要尽早且尽量频繁地征求面试官的反馈。
面试中的每一步的时间分配
如果面试是45分钟:
- 理解问题并确定设计的边界,3~10分钟;
- 提议高层级的设计并获得认同,10~15分钟;
- 设计继续深入,10~25分钟;
- 总结,3~5分钟。