[笔记] 系统设计面试框架

By | 29 1 月, 2023

以下为 ByteByteGo 04 – A Framework For System Design Interviews 文章笔记内容:

系统设计面试其实是模拟日常工作中,和同事们面对某一个不确定问题,共同探讨一个最终满足目标的解决方案的过程。在这个里面,重要的是探讨的过程,当然不是说最终的方案不重要,而是在系统设计面试的过程中,主要会考察一个人的协作能力、在压力下工作的能力、妥善解决分歧的能力,以及如何在有限的成本下做权衡与取舍的能力。最终的解决方案往往并不是确定性的,也没有什么标准答案。

常规标准系统设计面试过程:

Step-1 详细了解问题,并确定设计的范围

不要太快的回答问题,尽量把节奏慢下来。要详细的了解问题的方方面面。在整个过程中,需要不停的问问题、做假设,并收集尽可能多的信息。一般来说,可以问下面的这些问题:

  • 最终需要完成哪些确定的功能特性?
  • 这个系统会有多少用户?
  • 公司会期望这个系统的设计容量以什么样的速度进行扩张?3 个月、6 个月甚至一年后,期望这个产品的设计容量能够达到多少?
  • 公司主要的技术栈是什么?有什么已有的服务是期望用来简化整个设计过程的?

Step-2 在全局视角进行设计,并和面试官一起确认可行性

先在脑海中构思最初的整体设计,并通过一系列的问题和面试官进行确认,以确认一些设计的思路是可行的,之后在草纸或白板中通过流程图画出一个个的关键组件。并对可能的一些容量限制进行粗略的计算。

如果可能的话,可以设计几个具体的用户使用的场景和用例。这些用例能够帮助你更好的结构化全局设计,以及发现一些没有提前想到的一些边边角角的内容。

Step-3 细化设计

在这个步骤中,当前的系统设计面试应该已经完成了下面的目标:

  • 确认了系统设计的目标和需要完成的功能特性点
  • 在白板上已经完成了全局设计的草图,并且已经从面试官处获得了一些在全局设计层面上的反馈
  • 根据反馈,已经知道需要在哪些方面需要对设计进行细化,并和面试官进行进一步探讨

这个时候需要对上面已经完成的全局设计进行一些说明,比如系统性能瓶颈点、资源限制,或者是一些关键组件如何实现,某些功能特性如何通过已有的设计来实现并完成。

时间管理也是这个步骤中重要的一环,把时间和精力放在能够展示个人能力的那些方面。其他的就不要谈了。

Step-4 总结

一般在这个时候,面试官会问你一些问题,并开始自由讨论。这里有一些注意事项:

  • 面试官期望你能够识别出系统中存在的一些瓶颈,并提出一些可能的改进方案。不要说你设计的系统已经很完美了,没有完美的系统,总会有地方可以提高
  • 如果面试时间过长,这里可以重新简短论述一下你的整个设计方案中的关键内容,因为面试官可能已经忘记了一部分的内容,让他加深一下印象
  • 针对一些失败场景的设计和处理,也是一个很好的自由讨论的方面
  • 运维和运营相关的问题也是可以提及的,比如如何监控指标和错误日志,如何无损发布这个系统等等
  • 如何在当前的规模前提下,设计下一个规模量级的系统,比如当前能够支撑 100W 用户,那么 1000W 用户呢?

最后,有一些在系统设计面试过程中的 Dos 和 Don’ts 可供参考:

Dos:

  • 通过询问来确定自己的假设是正确的,不要自己默默的假设自己的假设是正确的
  • 理解问题的需求
  • 没有正确的答案,只有更好的答案。
  • 整个面试过程中需要让面试官知道你当前在想什么,需要不停的沟通和交流
  • 如果有多种可能的方案,都说出来
  • 一旦和面试官在全局设计的草图层面达成一致,就么就需要去设计其中的每一个组件,先设计最重要的组件
  • 永不放弃

Don’ts:

  • 不要对常见的面试问题毫无准备
  • 不要在没有澄清需求和假设的情况下直接提供解决方案
  • 不要在开始的时候浪费大量时间在一个单独的组件上。先提供全局设计后,再向下挨个解释组件
  • 如果你卡住了,和面试官要提示,不要干坐着
  • 多沟通交流,不要沉默
  • 不要认为当你写完设计后,面试就结束了,只有当面试官说结束的时候才是真的

时间分配建议:

  • Step-1 详细了解问题,并确定设计的范围: 3-10 minutes
  • Step-2 在全局视角进行设计,并和面试官一起确认可行性: 10-15 minutes
  • Step-3 细化设计: 10-25 minutes
  • Step-4 总结: 3-5 minutes

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注