系统设计面试框架

86 阅读9分钟

有效的系统设计面试的 4 步流程

每个系统设计面试都不一样。一次出色的系统设计面试是开放式的,没有一刀切的解决方案。但是,每次系统设计面试都有一些步骤和共同点需要涵盖。

步骤 1 - 了解问题并确定设计范围

“老虎为什么咆哮?”

教室后排突然举起了一只手。

“什么事了,吉米?”老师回答道。

“因为他饿了”。

“非常好,吉米。”

在他的整个童年时期,吉米总是班里第一个回答问题的人。每当老师提出问题时,教室里总有一个孩子喜欢尝试解答这个问题,无论他是否知道答案。那就是吉米。

Jimmy 是一名优等生。他以能快速知道所有答案而自豪。在考试中,他通常是第一个完成题目的人。在任何学术竞赛中,他都是老师的首选。

不要像吉米一样。

在系统设计面试中,不假思索地快速回答不会给你加分。在没有彻底了解要求的情况下回答问题是一个很大的危险信号,因为面试不是知识竞赛。没有正确答案。

所以,不要马上给出解决方案。慢慢来。深入思考,提出问题,以澄清需求和假设。这非常重要。

作为工程师,我们喜欢解决难题并着手最终设计;然而,这种方法很可能会导致您设计出错误的系统。作为一名工程师,最重要的技能之一是提出正确的问题、做出适当的假设并收集构建系统所需的所有信息。所以,不要害怕提问。

当你提问时,面试官要么直接回答你的问题,要么要求你做出假设。如果是后者,请将你的假设写在白板或纸上。你以后可能会需要它们。

要问什么样的问题?提出问题以了解确切的要求。以下是帮助您入门的问题列表:

  • 我们要构建哪些具体功能?
  • 该产品有多少用户?
  • 公司预计扩张速度有多快?预计 3 个月、6 个月和 1 年内的规模是多少?
  • 公司的技术堆栈是什么?您可以利用哪些现有服务来简化设计?

例子

如果你被要求设计一个新闻推送系统,你需要问一些有助于明确需求的问题。你和面试官之间的对话可能是这样的:

应聘者:这是一个移动应用吗?还是一个网络应用?还是两者都有?
面试官:两者都有。

应聘者:该产品最重要的功能是什么?
面试官:可以发帖并查看好友的动态。

应聘者:新闻推送是按时间倒序排列的,还是按特定顺序排列的?特定顺序意味着每条帖子都有不同的权重。例如,来自亲密朋友的帖子比来自群组的帖子更重要。
面试官:为了简单起见,我们假设新闻推送是按时间倒序排列的。

应聘者:一个用户可以有多少个好友?
面试官:5000

应聘者:流量是多少?
面试官:1000万日活跃用户(DAU)

应聘者:feed 里可以包含图片,视频,还是只有文字?
面试官:可以包含媒体文件,包括图片和视频。

以上是一些你可以问面试官的示例问题。了解要求和澄清歧义很重要

第 2 步 - 提出高层设计并获得认可

在此步骤中,我们的目标是制定一个高级设计,并与面试官就设计达成一致。在此过程中与面试官合作是一个好主意。

  • 提出设计的初步蓝图。征求反馈。将面试官视为队友,共同努力。许多优秀的面试官都喜欢交谈和参与。
  • 在白板或纸上绘制包含关键组件的框图。这可能包括客户端(移动/Web)、API、Web 服务器、数据存储、缓存、CDN、消息队列等。
  • 进行粗略计算,评估您的蓝图是否符合规模限制。大声思考。在深入研究之前,请与面试官沟通是否需要进行粗略计算。

如果可能的话,请浏览一些具体的用例。这将帮助您构建高级设计。这些用例还可能帮助您发现尚未考虑的极端情况。

我们是否应该在这里包含 API 端点和数据库模式?这取决于问题。对于像“设计 Google 搜索引擎”这样的大型设计问题,这有点太低级了。对于像设计多人扑克游戏的后端这样的问题,这是一个公平的游戏。与你的面试官沟通。

例子

让我们使用“设计新闻推送系统”来演示如何进行高级设计。在这里,您不需要了解系统的实际工作原理。所有细节将在“设计新闻推送系统”一章中解释。

从高层来看,设计分为两个流程:新闻推送发布和新闻推送构建。

  • 动态发布:当用户发布帖子时,相应的数据被写入缓存/数据库,并且该帖子将被填充到好友的动态中。
  • 新闻推送构建:通过按时间倒序聚合好友的帖子来构建新闻推送。

图 1 和图 2 分别展示了 feed 发布和新闻 feed 构建流程的高级设计。

image.png

image.png

第 3 步 - 深入设计

到了这一步,你和你的面试官应该已经实现了以下目标:

  • 就总体目标和功能范围达成一致
  • 勾勒出总体设计的高层蓝图
  • 从面试官那里获得了关于高级设计的反馈
  • 根据她的反馈,对深入研究的重点领域有了一些初步想法

你应该和面试官一起确定架构中的组件并确定其优先级。值得强调的是,每次面试都是不同的。有时,面试官可能会暗示她喜欢关注高级设计。有时,对于高级候选人的面试,讨论可能是关于系统性能特征,可能侧重于瓶颈和资源估计。在大多数情况下,面试官可能希望你深入了解某些系统组件的细节。对于 URL 缩短器,深入研究将长 URL 转换为短 URL 的哈希函数设计是很有趣的。对于聊天系统,如何减少延迟以及如何支持在线/离线状态是两个有趣的话题。

时间管理至关重要,因为很容易被无法展示你能力的琐碎细节所吸引。你必须准备好信号来向面试官展示。尽量不要涉及不必要的细节。例如,在系统设计面试中详细讨论 Facebook feed 排名的 EdgeRank 算法并不理想,因为这会浪费很多宝贵的时间,而且不能证明你设计可扩展系统的能力。

例子

至此,我们已经讨论了新闻推送系统的高层设计,面试官也对您的提案感到满意。接下来,我们将研究两个最重要的用例:

  1. 信息发布

  2. 新闻提要检索

图 3 和图 4 展示了这两个用例的详细设计,将在“设计新闻推送系统”一章中详细解释。

image.png

image.png

第 4 步 - 总结

在这最后一步,面试官可能会问你几个后续问题,或者让你自由讨论其他要点。以下是一些需要遵循的指示:

  • 面试官可能希望你找出系统瓶颈并讨论潜在的改进。永远不要说你的设计是完美的,没有什么可以改进的。总有需要改进的地方。这是一个展示你的批判性思维并留下良好最终印象的好机会。
  • 向面试官简要介绍一下你的设计可能会很有用。如果你提出了一些解决方案,这一点尤其重要。在长时间的面试后,刷新面试官的记忆会很有帮助。
  • 错误情况(服务器故障、网络丢失等)很有趣。
  • 值得一提的是操作问题。如何监控指标和错误日志?如何推出系统?
  • 如何处理下一个规模曲线也是一个有趣的话题。例如,如果你当前的设计支持 100 万用户,那么你需要做出哪些改变来支持 1000 万用户?
  • 如果您有更多时间,请提出您需要的其他改进。

最后,我们总结了一份应该做和不该做的事情的清单。

  • 一定要要求澄清。不要假设你的假设是正确的。
  • 了解问题的要求。
  • 没有正确答案,也没有最佳答案。为解决年轻初创公司的问题而设计的解决方案与为拥有数百万用户的成熟公司而设计的解决方案不同。确保您了解需求。
  • 让面试官知道你的想法。与面试官进行沟通。
  • 如果可能的话,建议多种方法。
  • 一旦你与面试官就蓝图达成一致,就详细讨论每个组件。首先设计最关键的组件。
  • 与面试官交流想法。优秀的面试官会像同事一样与你合作。
  • 永不放弃。

注意事项

  • 不要对典型的面试问题毫无准备。
  • 在没有明确需求和假设的情况下,不要急于寻求解决方案。
  • 一开始不要对单个组件进行过多的详细描述。先给出总体设计,然后再进行深入研究。
  • 如果您遇到困难,请毫不犹豫地寻求提示。
  • 再次强调,要沟通。不要沉默地思考。
  • 不要以为一旦你给出了设计,你的面试就结束了。直到面试官说你完成了,你才算完成。尽早并经常询问反馈。

每个步骤的时间分配

系统设计面试问题通常非常广泛,45 分钟或一个小时不足以涵盖整个设计。时间管理至关重要。你应该在每个步骤上花多少时间?以下是关于在 45 分钟的面试环节中分配时间的非常粗略的指南。请记住这是一个粗略的估计,实际时间分配取决于问题的范围和面试官的要求。

步骤 1 了解问题并确定设计范围:3 - 10 分钟

第 2 步提出高级设计并获得认可:10 - 15 分钟

第 3 步 深入设计:10 - 25 分钟

步骤 4 包裹:3 - 5 分钟