系统设计面试技巧
系统设计面试通常是高级及以上软件工程师面试流程的一部分。这类面试采用开放式讨论,要求候选人设计一个项目,通常是一个热门产品或服务。例如,你可能会被要求设计 Twitter、YouTube 或 Google Docs。
当然,30-60分钟根本不够设计这些系统。真正的产品是经过数千名全职开发人员多年努力打造的。
那么,在系统设计面试中你实际上应该做什么呢?我们可以将其分为四个步骤:
- 提出问题并确定范围
- 创建高级设计
- 深入研究几个组件
- 总结并讨论进一步的改进
下面让我们逐一讨论一下。
提出问题并确定范围
在系统设计面试中,你可能犯的最大错误就是不先提问就直接进入设计环节。由于系统设计面试题通常故意设得比较模糊,你需要与面试官合作,确定设计范围并验证你可能提出的任何假设。
您可能想问以下部分或全部问题:
-
哪些功能最重要?(例如,设计 Twitter 绝非易事,因此面试官可能会告诉你只关注新闻提要。)
-
每天有多少活跃用户?(重要的是要知道这是一家小型初创公司的 v1 产品,还是拥有数百万用户的成熟产品。)
-
我可以利用现有的云提供商,例如 AWS、GCP 或 Azure 吗?(有时他们希望您从头开始构建一些东西,但大多数情况下,使用现有的基础设施,例如负载均衡器(ELB)、自动扩展组、文档存储(S3)、消息队列(SQS)、缓存(Redis)或 CDN(CloudFront)是完全可以接受的。
-
我们正在处理什么类型的数据?(最好知道您是否只处理文本,或者是否将图像或视频存储为服务的一部分。数据类型和数据结构可能会影响您对数据库的选择。)
-
我们需要考虑 [X] 吗?(面试的开始主要是确定范围,所以问问面试官哪些问题应该在范围内考虑,哪些应该超出范围。通常情况下,他们会让你先采用比较简单的方法,然后在面试快结束时,如果有时间的话,再解决更难的问题。)
-
我可以假设[X]吗?(向面试官说明你的假设。这将确保你们双方达成共识。面试官也可能会根据你之前的假设为你提供额外的说明。)
一旦您觉得自己对问题有了充分的了解,就可以继续进行高级设计。
创建高级设计
在第二步中,你应该与面试官一起从高层次设计系统。暂时不要深入研究单个组件。相反,只需从高层次概述系统的工作方式即可。此时,无需深入探讨数据库架构或要实现的 API 端点。
通过从一开始就保持高水平的沟通,你可以与面试官验证你的想法。你可以与面试官交流想法,并获取他们的意见。在系统设计面试中,你应该像对待合作者或同事一样对待面试官。毕竟,如果你得到这份工作,你很可能会和他们一起工作。
重要的是要记住,尽管这次面试是关于你的技术设计技能,但它也涉及你的沟通技能。
你能解释为什么你会选择一种数据库而不是另一种吗?你能解释一下你是如何让你的应用程序具有可扩展性的吗?你能讨论一下CAP定理中关于一致性、可用性和分区容错性的权衡吗?你有没有想过如何处理系统故障?当面试官给你反馈或让你考虑不同的方法时,你的反应如何?一个好的面试官会在整个面试过程中寻找所有这些信号。
到这一步结束时,你应该有一个你和面试官都同意的系统。
深入研究几个组件
现在是时候深入探讨了。同样,你设计的系统很可能只是某个热门产品的复制品,所以在面试的短暂时间内不可能面面俱到。最好问问面试官他们下一步想关注什么。或者,建议几个你想更深入讨论的领域。
例如,如果设计 Google Docs,当多个人同时编辑同一篇文档时,您将如何处理冲突?
或者,在构建 YouTube 时,当用户上传新视频时,实现消息队列如何帮助解耦系统组件?
您已经有了高级设计,因此在面试的这个部分,您可以展示您对基础设施工作原理的深度了解。
总结并讨论进一步的改进
在面试的最后部分,你可以讨论一下如果有更多时间,你会进行哪些进一步的优化。你可以讨论如何处理各种极端情况、设计中的任何性能瓶颈,或者随着应用的增长,你会如何进一步扩展系统。
这是展示您的体贴的好时机。
结论
以下是系统设计面试的四个步骤:
- 提出问题并确定范围
- 创建高级设计
- 深入研究几个组件
- 总结并讨论进一步的改进
在面试过程中遵循这个模板,能帮你保持思路清晰,避免迷失方向。祝你下次面试顺利!
鏂囩珷鏉ユ簮锛�https://dev.to/thawkin3/system-design-interview-tips-2ohe