【纯干货】资深面试官眼里的系统设计面试

转自
https://www.acecodeinterview.com/intro

对于刚毕业初入职场的同学甚至是有一些工作年限的老司机来说,系统设计都是老大难的问题。一方面是系统设计题总数虽然不多,但同一题都能从不同角度考出花来,没有标准答案。另一方面是系统设计结构性不强,面试官讲一下设计个什么就等着同学解题,同学们不知道怎么一步步下手破题。

我在业界摸爬滚打近十年,曾在一线大厂做过近百场面试,其中一大部分都是系统面试,希望能够回馈社区,分享一些自己的干货,解答大家一些困惑,也希望抛砖引玉,大家一起讨论,不对的地方欢迎大家批评指正。

今天这篇文章会针对Software Engineer system design Interview, 从面试官的角度解构系统设计面试。这篇文章不会给具体的题做过多的分析,也不对网上有很多资料的问题做赘述,而是给系统设计的考察目标,优秀答案的特征和破题的步骤三个角度给大家分析,作为别的资料的补充。

第一, 面试官的考察目标。
跟算法面试类似的,面试官需要能从人群里分辨出谁强谁弱。算法面试因为大家都刷Leetcode,如今已经很难分辨谁是当场想出来的,谁是刷过题记住的答案。系统设计面试因为覆盖面广,而网上资料又不能面面俱到,对于面试者的区分会更容易一些,这也是为什么系统设计越来越流行的,越来越年轻化的原因。
由于系统设计对面试官的知识和设计能力要求更高,通常系统设计的面试官更为资深,在debrief中话语权也更大(尤其是在定级别的时候),大家千万要重视起来,不要因此拿不到想要的offer和级别。
拆开来说,面试官会从以下四个角度去考察:

  • 交流沟通和理解能力 - 跟面试官充分交流理解所设计系统的目标,方便做设计中的tradeoff,在厂里干过的就知道日常工作中这个非常重要
  • 设计和架构能力 - 很多我见过的面试者都只注重在这块而忽略了其他,很可惜
  • 扩展性,容错性,延迟要求 - 跟Opeartion相关的要求,如今Dev和Ops不分家,希望面试者了解系统今后能如何扩展,易于maintain。
  • 资源需求 - 对于我们所要求的QPS和latency,需要多少台机器,其中CPU, 内存,硬盘等资源都是如何配置

大家看到这里可能要说,我要是有这个本事把这些都做的面面俱到,我就是顶尖的构架师了,自己做startup也不在话下。不得不说,要求确实很高,但不要忘记面试官除了决定给不给offer,还要决定给几级的offer, 面试官就是考你怎么造火箭,然后好给你定级别说去拧几级的螺丝钉。
当然,以上四点,根据同学们的实际情况,并不用在每一点上都给出完整的回答,面试官会在面试过程中指出深挖的方向,有可能是根据同学的专业或者职业背景,有可能是根据所面试的岗位,有可能是根据面试中同学提到的他熟悉的技术。

第二,优秀答案的特征。
在面试生涯中,我见过的最优秀的面试者比我的级别要高,让我印象非常深刻,四个字,深不见底。
面试的前半段,面试官会先从广度下手,要求受试者对题目的大框架给出一个完整的正确的解法。如果受试者给出了足够好的解法,那么面试官会从受试者的提过的某一个细部进行深挖,可能是深挖scalability,可能是改变一个需求要求重新做tradeoff,可能是某一个service的细节设计。因为其中的细节足够多,受试者一般很难准备得面面俱到,面试官可以比较清楚的画出受试者的能力边界。前面提到的这个受试者之所以让我感到深不见底,是因为我才疏学浅,画不出他的能力边界,不得不赞叹大神,在debrief中好好膜拜了一番。
说了这么多,还是想说平时的积累很重要,面试速成能够让你在广度上做的很好,深度方面还是要多花时间学习。
讲完了废话,讲一些可以操作性强的,我们来把前面说的考察目标和优秀回答的特征做进一步表述。
交流沟通和理解能力

  • 询问系统的商业目的,建这个系统是为了解决什么问题 (相关的问题比如这个服务的受众有什么特点,是商业用户还是个人用户。很多时候问不问这个问题就能看出Senior的程度)
  • 询问系统的功能和技术需求(比如DAU, QPS, Latency,包含哪些子功能。这部分网上内容很多,不赘述了)
  • 定义成功 (前面问了那么多,我们要总结说我们在面试结束前我们的设计要实现什么功能,达到什么QPS,latency或者availability指标。写下来并跟面试官确认。如果这里牵涉到一些ballpark calculation,跟面试官确认是不是需要算。)
  • 整场面试过程中跟着面试官的引导走(有的同学看到准备过的题就很兴奋,文思泉涌面试官都拉不住,会让人觉得理解能力不足)

设计和架构能力
这是正常面试的核心部分,因为资料比较多,我简单列个提纲。非常重要,是面试通过的基础,其中deep dive非常考验真实水平。
考点

  • High-level diagram
  • 数据结构与存储
  • 核心子服务设计
  • 接口设计
  • 专题 deep dive

要点

  • 完整性
  • 正确性
  • 充分讨论tradeoff

扩展性,容错性,延迟要求

  • 确认系统在以上三点 Scalability, Fault Tolerance, Latency Requirement是否符合先前定下的需求
  • 根据需求进行改进(推荐在第一轮设计中先不考虑这里的三点,先拿下设计和架构能力的分数,再做改进)
  • Log,monitor and alert on key metric (系统投入使用前,把系统关键指标 - 之前定义的成功和它的leading indicator,确定下来并且做好监控。)

资源需求 (optional)

  • 根据之前定义的成功要求,计算需要多少台机器,需要多少内存硬盘和CPU的能力,量级正确即可(back of envelope calculation)。

第三, 破题的步骤。
了解完了考察目标和优秀答案的特点,最后一个角度就是用什么样的顺序去答题,以及时间上的分配。
系统设计面试因为流程不明确,有时候先讲点什么再讲点什么没那么重要,但是为什么我们这里还是要提一个步骤给大家参考呢?答案是为了引导面试官。
虽然面试官在系统设计面试中有比算法面试更强的引导的责任,但是引导的行为只有在需要的时候才会发生。如果一场面试中,总是受试者提问,面试官回答,受试者滔滔不绝地讲,面试官连连点头,画面是不是很美?虽说前面的情景很理想化,但是如果我们能很好地把面试官想踩到的点按一个大概的顺序去踩到,不仅面试官会更少地打断受试者的思维,而且面试官也会在面试中很省力给你个好印象。当然,如果引导发生了,那么一定要根据引导来思维。
废话说完,以40分钟的面试时间来算(掐头去尾除去自我介绍问问题),我面试的大概流程如下。

  • 【3分钟】理解需求 (询问系统的商业目的 + 询问系统的功能和技术需求 + 定义成功)
  • 【0-5分钟】资源需求(optional)(计算需要多少台机器,需要多少内存硬盘和CPU的能力)
  • 【5分钟】High-level diagram
  • 【5分钟】数据结构与存储
  • 【10分钟】核心子服务设计
  • 【5分钟】接口设计
  • 【5分钟】扩展性,容错性,延迟要求
  • 【2-7分钟】专题 deep dive

注意几点,4,5,6顺序没太大关系。8可以考虑成额外分数,答对大量加分,答错少量减分,如果没时间会跳过,也是少量减分。
看完这个流程是不是感觉分秒必争,要踩的点很多,没有时间浪费。这时候如果面试官听出来某一步骤有错误,就算是回头改对了,浪费的时间也会造成一些本能踩到的点因为时间不足踩不到,所以大家还是好好准备,刷算法题之余也把系统设计重视起来。

说了这么多,希望对大家有帮助。
文中提到了很多大块的内容没有深入去写,如果大家觉得哪一块想听,可以在帖子里留言,我也可以进一步说说。

补充
文中 扩展性是Scalability的翻译,中文有含糊的地方,大家照英文来理解。

补充
我没有要贬低算法题的意思,算法题仍是面试最重要的部分,拿到offer的基础。

2 Likes

我是本文的原作者。关于这篇文章,我在我的系统面试总结中做了进一步的补充和提供了范例。https://www.acecodeinterview.com/intro/

@nnn @Xavier 很高兴你们认可我的内容,也希望你们可以在转载之前联系我。

对上面内容感兴趣的朋友,可以看看我的新文章 两周速成系统设计面试 https://www.acecodeinterview.com/intro/2_week_prep.html
手把手教你短时间进阶