回答任何系统设计面试问题的7步程序。
什么是系统设计面试?
系统设计面试问题是为了了解应聘者如何思考复杂的问题,他们如何很好地沟通他们的想法,以及他们如何很好地与他人合作。
系统设计面试中提出的问题是基于大规模的真实世界问题。回答这些问题显示了候选人的创造性思维和团队工作的能力。
为什么系统设计面试很重要?
系统设计面试的目的是评估你从头到尾设计和实现一个系统的能力。系统设计面试允许你展示你的知识,你解决问题的技能,你把一个问题分解成小部分的能力,以及你在团队中工作的能力。
如何为系统设计面试做准备?
• 让你的准备工作取得最大成效的最好方法是练习。
• 阅读有关系统设计面试的书籍和在线课程。
• 与朋友和同事一起练习。
• 和导师一起练习;可以是你的团队中经验丰富的开发人员或高级工程师,也可以是其他人,他们可以给你反馈你在模拟面试中的对错,帮助你在下一次面试中改进。
• 使用网上的许多资源来练习模拟面试。
• 为了确保你不会忘记你所学到的东西,在笔记本或电子表格中记录一切,并定期回顾。
如何回答系统设计问题?
系统设计面试问题的重点是抽象的问题解决,而不是你对编程语言或技术栈的具体知识。同样地,它们是衡量你在没有掌握所有信息的情况下设计和解决大规模问题能力的良好指标。
回答系统设计面试问题的关键是理解你的系统是如何运作的大画面。
当你被问及某个特定系统的设计时,花点时间了解面试官想知道这个系统的情况,以及为什么这个系统对他们很重要。
你如何开始处理系统设计的面试问题?
这里有一个7步流程,可以帮助你创建一个系统设计问题的解决方案。
第1步:澄清需求
当你被要求为一个问题设计一个系统时,你应该做的第一件事就是了解这个问题。你需要了解你的系统的用户要做什么,他们要完成什么,你的解决方案如何帮助他们实现目标?
了解系统的所有限制。你需要知道的是,总共有多少个用户,他们会同时使用这个系统吗,还是他们会单独访问这个系统?
第2步:信封背面的估计
估算你要设计的系统的规模总是一个好主意。这也将有助于以后你专注于扩展、分区、负载平衡和缓存的时候。
第3步:系统接口定义
定义系统预期会有哪些API。这将确立系统预期的确切合同,并确保你没有搞错任何需求。
第4步:定义数据模型
定义数据模型将阐明数据如何在不同的系统组件之间流动。之后,它将指导数据的划分和管理。
第5步:高水平的设计
用5-6个盒子画一个框图,代表我们系统的核心部件。你应该从头到尾确定解决实际问题所需的足够的组件。
第6步:详细设计
深入挖掘两到三个主要的组件;面试官的反馈应该一直引导你对系统的哪些部分需要进一步讨论。你应该提出不同的方法,它们的优点和缺点,并解释为什么你会选择一种方法而不是另一种。
第7步:识别和解决瓶颈问题
尽量讨论尽可能多的瓶颈问题,以及缓解这些问题的不同方法。
准备参加系统设计面试的主题
以下是你在系统设计面试前应该熟悉的一些关键概念。
1. 缓存
2. 存储
3. 复制
4. 数据分区技术
5. 负载平衡
6. 可扩展系统的性能测量
7. API设计
8. 大型系统的可扩展性、可用性和可靠性
9. 正向和反向代理。
10. SQL与NoSQL
针对软件开发人员的顶级系统设计面试问题
由于系统设计面试可能涵盖广泛的主题,因此事先研究潜在的问题来准备是很重要的。
下面是一些在系统设计面试中最常见的问题。
1. 设计一个全球文件存储和共享服务,如Dropbox或Google Drive。
2. 设计一个社交网络,如Facebook、Instagram或Twitter。
3. 设计一个全球聊天服务,如Facebook Messenger或WhatsApp。
4. 设计一个全球视频流服务,如YouTube或Netflix。
5. 设计一个像Uber或Lyft那样的乘车服务。
6. 设计一个网络爬行器。
7. 设计Typeahead搜索。
8. 设计Ticketmaster。
9. 设计一个键值存储。
10. 设计一个API速率限制器。
11. 设计URL缩短服务。
12. 设计一个分布式的信息传递系统。
13. 设计一个电梯系统。
14. 设计一个停车场系统。
15. 设计一盘国际象棋。
16. 设计一个电影票预订系统。
17. 设计一个图书馆管理系统。
18. 设计一个像亚马逊一样的电子商务商店。
系统设计面试中的常见问题
• 不要害怕问问题。重要的是要记住,你应该始终感到舒适,向面试官提出你可能有的任何问题。这是一个让你澄清任何不清楚或困惑的问题的机会,这也将有助于在你和你的面试官之间建立起沟通的渠道。
• 不要被面试官吓倒。有几个面试者对被置于现场感到紧张。如果这种情况发生在你身上,请记住,这是面试过程的一部分:每个人在面试前都会感到紧张。在回答问题时,尽量不要让紧张阻碍你的思路--相反,要专注于给出精彩的回答。
• 如果有些问题不够清楚,不要害怕要求澄清,因为他们问的是什么。询问有关要求和限制的问题。诸如我们需要什么类型的数据?我们期望得到多少数据?这些数据从哪里来?我们对用户的行为了解多少(以及我们不了解什么)?
准备好在下一次技术面试中获胜了吗?
在这篇文章中,我们已经讨论了软件开发人员的系统设计面试过程。
请看Grokking the System Design Interview,了解系统设计面试的问题,如。
1. 设计一个像Google Drive或Dropbox的文件共享服务。
2. 设计一个流行的信息服务,如Facebook Messenger。
3. 设计流行的社交网站,如Twitter或Facebook。
4. 设计一个全球视频流服务,如Youtube。
5. 设计一个像Uber这样的全球叫车服务。
学习软件架构和实践先进技术