如何进行系统设计


系统设计面试是评估应聘者在面试中资历的一个很好的方式。你可以在网上找到很多关于如何准备设计面试或预期系统设计面试的问题,但很少关于如何进行实际面试。

    在这篇文章中,我将介绍我面试分布式系统角色高级候选人的经验。如果你偶然发现这篇文章,因为你想知道如何通过设计面试,你应该继续阅读 - 一个很好的方式准备面试是了解面试官怎么想他们。

    在我继续之前,我先提一下建议:这种面试最适合面试有行业工作经验的工程师。工程师直接离开学校,或有几年的经验,还没有必要的技能,以通过这次面试。


【选择您熟悉的系统】

    系统设计面试需要要求应聘者设计一个解决特定问题的系统。面试通常大约需要一个小时,主要是开放式对话,目的是在与他们合作时了解应聘者的经验和解决问题的技能,因为他们是您的同事。

    你想选择一个你过去工作过的系统,或者至少知道。理想情况下,它应该与您的团队或公司的工作相关,以便应聘者有机会看到如果他们加入您的团队,他们将要从事的项目。不要忘了,不只是你评估他们 - 他们也在评价你。

    选择您了解的系统的另一个原因,是您花费了大量时间内部化其解决方案空间、可伸缩性限制、权衡和失败模式。您不仅更容易为面试做准备,而且能够将他们的解决方案与您或您的团队所想的解决方案进行比较。谁知道呢, 他们甚至可能给你一些你错过的见解 — — 我称之为双赢。

    无论你做什么,不要问他们如何设计一个Twitter克隆(除非你在Twitter工作),或任何其他典型的设计面试问题。当你在酒店预订业务,并要求设计一个Twitter克隆在面试期间,你告诉候选人,没有什么有趣的地方,你工作。对于一个高级工程师来说,这是一个大红旗,这是理所当然的。

    "但是, 如果我没有 Twitter 规模的问题呢?这很好,您不需要让数百万用户来推理可伸缩性 - 此外,这只是设计分布式系统时要解决的许多挑战之一。


【从小规模设计开始】

    花头几分钟与应聘者交谈,了解他们过去的经验、长处和短处。然后,选择一个在面试前准备的设计问题,并呈现给应聘者。绘制您希望他们在白板上构建的系统的基本草图 - 这将有助于让他们感觉更放松,因为空的白板会让人们紧张。

    在演示系统时,他们应该设计,从小规模开始,并确保候选者在同一页上 - 稍后将有时间深入探讨可伸缩性。此外,不要详细讨论所有要求,因为您希望应聘者提出问题,看看他们能否在进入解决方案之前清楚地了解他们被要求设计什么。

    最后,询问他们如何设计系统。但是,不要只是静静地坐在角落里,与候选人交谈,并试图了解他们为什么做他们的决定,他们是如何处理的问题。在此阶段,无需深入探讨设计或技术的特定组件 - 去宽,并给候选空间来散列一个完整的体系结构。

    如果您觉得移动部件太多,请询问是否有方法在不影响整体解决方案的情况下删除特定部件。此外,请应聘者证明他们正在做出权衡是正当的 - 例如,为什么他们选择 NoSQL 商店而不是 SQL 商店?

    前 30 分钟结束时,他们应该在白板上勾勒出一个简单的设计。


【曲柄规模】

    现在,候选人有一个初始设计,曲柄规模。增加每秒钟的请求数、被摄入的数据量或与特定问题相关的任何其他请求数。无论初始设计是什么样子,它一定会击中砖墙,你增加负载,它下。

    问问他们认为随着规模的增长会打破什么,以及他们会如何处理。如果候选人能自己指出砖墙,这是一个很好的迹象。一旦他们确定了突破点,就与候选人合作消除它们。从首先被击中的可能性最高的开始,因为一旦设计发展,其他可能变得不那么相关。这个阶段是非常迭代的,随着设计的变化,所以权衡 - 讨论这些是什么,以及它们是否有意义。

    指出他们错过的故障模式,并询问如果此组件或该链接出现故障,将会发生什么。你可以通过发现失败模式(如单点故障)的速度来了解考生的经验,并想出优雅的方法来解决这些问题。因为您询问的是您拥有的经验,所以您只需回忆过去最典型的问题是什么,以及如何缓解这些问题。

    到前 50 分钟结束时,您应该已详细讨论缩放和可靠性问题。如果有时间,选择一块设计,并深入到它。例如,如果考生的设计需要复制数据,请讨论一致性保证以及如何详细实施它们。

    这与问题类似于:"告诉我在浏览器中键入example.com时会发生什么",但根据手头的设计进行定制。如果您要聘请高级系统工程师,您期望他们对基本知识有深入的了解,如 TCP、分页、一致性模型等。在调试和优化复杂系统时,这些知识至关重要。

    面试结束时,您应该对应聘者的长处和短处以及他们如何处理没有最佳答案的问题有一个好主意。高级候选人应该能够快速完成面试的第一部分,并且在第二部分扩展系统和解决故障模式方面没有任何问题。他们应该对每一个决定都有一个很好的解释,并能够列出他们设计的权衡。面试强者时,你应该离开面试的感觉,就像你从他们那里学到了一些东西一样。


【最后】

    系统设计面试是了解高年级学生解决问题技巧的一个很好的方式。不过,用箭头连接框只是其中的一部分,而不是最具挑战性的。棘手的部分是了解需求、故障模式和权衡。这种类型的面试也鼓励生动的讨论,这让你瞥见了候选人的软技能。他们能清楚地解释事情吗?他们收到建设性的反馈是否良好?

    如果您有兴趣了解有关设计分布式系统的信息,而不仅仅是在访谈中,请查看系统设计手册。它详细讨论了网络基础知识、分布式系统理论、可扩展系统的体系结构模式、弹性模式以及如何与小型团队维护大型系统的操作最佳实践。


上一篇 下一篇
注:本文转载自Roberto Vitillo,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除。

评论

登录后可发表评论