如果您正在准备编码面试,但想知道如何准备关键的系统设计主题,并寻找正确方法、技巧和问题的分步指导,那么您来对地方了。在本文中,我将分享 2023 年系统设计面试的完整指南。
在软件开发领域,如果您正在申请高级工程师/主管/架构师/或更高级的职位,系统设计是最受欢迎的技能,因此也是整个过程中最重要的环节之一。
如果你把这件事搞砸了,其他的都无所谓了。如果你做对了,你每年至少可以获得数万美元的加薪。
那么如何在系统设计中取得好成绩呢?这就是我在准备 Facebook、 Google和Amazon面试时所做的事情,效果相当好。
在系统设计面试中,候选人的期望是什么?
准备系统设计面试的第一步是了解对你的期望是什么?一旦您知道您可以调整您的准备策略来满足这些期望。
以下是您对系统设计面试的主要期望:
- 您应该能够设计一个满足您的要求并且具有良好扩展性的系统,例如设计自动售货机或设计交易支付聚合器。
- 您的设计应该是可嵌入的,并且不限制新功能的添加。
- 您应该能够比较各种替代方案并选择最佳的一种。例如,哪个数据库是最重要的,或者您应该使用哪种协议,或者扩展系统的最佳方法是什么,等等。
- 您应该了解从系统设计角度来看相关的基础知识,
- 负载均衡器
- Bee
- 缓存
- 数据库
- 网络协议
- 消息队列
- CDN
- 有关机器学习和大数据的详细信息
- CAP定理
- 监控和分析
这些实际上是每个开发人员应该准备的基本系统设计主题和概念。如果您了解这些主题,那么您一定会在系统设计面试中取得好成绩。
如何准备2023年系统设计面试?
虽然 2023 年发生了很多变化,但系统设计面试也发生了变化,更加关注 API、性能和微服务。无论如何,这里有一个简单的四步流程,可以帮助您在任何系统设计面试中取得好成绩,不仅是在 2023 年,而且在未来几年也是如此。
- 掌握基本的系统设计概念,例如可扩展性
- 通过阅读 Uber 和 Netflix 等科技巨头的博客向他们学习
- 练习系统设计问题,例如设计 YouTube、WhatsApp 等
- 练习和模拟面试(如meetapro或DesignGuru)
系统设计理念
任何系统设计面试肯定会要求您尝试构建任何系统提出基本的高级设计。有一些组件是肯定需要的。
1.负载均衡器
如果没有负载均衡器,就无法拥有分布式系统来在各个节点之间分配传入请求。这可确保正确的资源利用,并且系统中不存在单点故障。Nginx是这样实现的。
在学习负载均衡器的同时,了解API Gateway并仔细了解负载均衡器和 API Gateway 之间的区别也是一个好主意,从面试的角度来看,这一点非常重要。这个问题已经在面试中被问过几次了。
缓存
如果您曾经进行过性能改进,那么您知道缓存可能是您首先想到的。大多数系统都有一些需要大量读取的交互,即用户会经常访问但更新不多的一些信息。
以无需数据库查找即可轻松获取的方式缓存此信息是有意义的。考虑低延迟。
此外,根据您的用例,您可能需要存储更频繁访问的信息或最近访问的信息。因此,请阅读各种驱逐策略,例如最近最少使用 (LRU)。
如果您想了解更多信息,那么ByteByteGo 系统设计课程提供了大量有关缓存策略以及如何有效使用缓存的信息。您可以参考他们以了解更多信息。
数据库
数据库是最重要的技能之一,因为您将构建的大多数现实世界应用程序都将具有某种数据存储,例如关系数据库或 NoSQL。
事实上,没有某种形式的数据存储就不可能有系统。无论您是要存储文件、图像、产品信息、金融交易,还是只是转储各种用户交互中的所有数据以便稍后运行分析。
这一切都需要数据库。所以请仔细阅读。了解选择数据库时最重要的因素,阅读SQL / NoSQL、查询模式以及CAP 定理在权衡时如何发挥作用。
4.消息队列
有时我们的系统需要执行一些需要完成但不一定立即完成的任务,或者它们的结果不会影响用户的旅程。
在这种情况下,与其进行服务调用并等待响应,不如将消息写入队列以便稍后执行。这也称为异步消息传递 ,它是许多微服务的支柱。
如果您需要在数据库中插入信息,并且批量插入可能更高效,该怎么办?只需跟踪消息队列中的这些插入并执行 1 次批量插入(而不是数百次一对一插入)来优化资源是有意义的。
对 RabbitMQ、ActiveMQ 和 Apache Kafka 等消息队列的深入了解对于任何软件工程师来说都是必不可少的,
5.CDN
当您的用户分布在不同的地理位置时,在合理的时间内向他们提供您的内容就成为一个真正的挑战。CDN 允许我们在靠近用户位置的各个数据中心维护数据副本,以减少延迟。
分析和监控
这是您创建的每个系统都需要的东西。这是一个隐藏的要求,没有人在要求收集中指出这一点,但每个面试官都希望这样。
用户登录还是注销?已将某件商品列入心愿单?支付失败?这就是我们的所有信息!发生任何重要的事情,触发一个事件并将其保存在您的消息队列中。
您可以对数据执行实时分析,或者将其转储到Hadoop 集群中以供以后使用。同样,如果 API 调用经常失败,或者您的服务器即将耗尽资源,您难道不想提前知道吗?
熟悉Grafana、Prometheus 等工具可以帮助您进行分析和监控,并在系统设计面试中给面试官留下深刻的印象。
网络协议
根据您的要求和您共享的内容类型,您可能需要决定使用哪种网络协议。阅读各种网络协议,例如TCP 和 UDP,它们何时相关,您可能需要做出哪些妥协,等等。
第一步是了解所有这些概念。通过了解概念,我指的不仅仅是关于这些概念的一些理论知识,而是关于应该何时使用什么的更实际的实践经验。
您需要了解以下内容:
- 考虑到用例,哪个是最佳选择。
- 在做出这些决定时您需要考虑哪些权衡?
- 某些用例的最佳实践。
向 Uber 和 Netflix 等科技巨头学习
这在短期内可能不会有帮助。但从长远来看,要成为系统设计专家,最好看看各个科技公司的技术博客,看看他们是如何解决各种技术问题的。
这将清晰地描绘出他们面临的实际问题以及他们如何创新地解决这些问题。了解这些知识将帮助您更好地进行系统设计,并让您了解最新的技术创新。
一些值得关注的最佳博客是:
Facebook 工程博客
- Netflix 技术博客
- Uber 工程博客
如果您不喜欢阅读而喜欢观看,那么您还可以参加由前 FAANG 员工创建的在线课程,例如Frank Kane (前亚马逊招聘经理)的《掌握系统设计面试》 。这是学习面试系统设计的最佳资源之一。
解决系统设计常见问题
了解基础知识确实很重要,但这还不够!开始实践的最基本方法是查看一些常见问题及其解决方案。
大多数系统设计面试都围绕着 5-6 个常见的系统设计问题,如果您知道这些问题的解决方案,那么您很可能通过这次面试。
最常见的问题是:
- 如何设计YouTube?
- 如何设计 WhatsApp 或 Facebook Messenger 等聊天系统
- twitter系统设计
- Facebook系统设计
- Whatsapp系统设计
- Airbnb系统设计
- Uber系统设计
- Tinyurl系统设计
如果您需要资源来解决这些问题,而这些资源不仅可以解决问题,还可以解释解决系统设计问题的基本概念和方法,那么 CodeKarle 的这门高评价课程讨论了大部分案例研究和更多问题,其中包括:帮助许多人顺利通过谷歌、Facebook、微软、亚马逊等公司的面试。
练习(模拟面试)
您还应该更好地了解组织中的系统是如何设计的。其他团队做得怎么样?他们考虑哪些因素?
下一个最好的事情就是和朋友一起练习。确保在实际面试之前进行一些模拟面试,以避免一些常见但容易避免的陷阱。
由于像 Google 和 Meta 这样的公司很难获得机会,所以你应该尽可能做好准备,模拟面试对他们来说非常重要。它们可以让您在真正的面试之前了解自己的实际准备水平。
同时,你的模拟面试也应该模仿真实的面试,为此我建议你加入MeetAPro,它可以让你与真正的专家进行模拟面试。
Meetapro 就像模拟面试和职业指导的 Airbnb。它将求职者与经验丰富的 FAANG 面试官联系起来,他们提供宝贵的反馈,帮助您为现实生活中的面试做好准备。我的许多朋友、读者、同事以及众多求职者已经从这个平台中获益。
是什么让 Meetapro 脱颖而出?
1.价格实惠:与其他平台相比,每次会话的平均成本明显较低。
2.专家面试官:来自 FAANG 和顶级公司的资深人士带来了多年的经验,提供了真正产生影响的无价反馈。
3.直接沟通:求职者可以直接向面试官发送消息,解决任何问题或疑虑,例如经验分享或重新安排时间,确保双方更好的准备。
4.多合一工具: Meetapro 为您提供了有效面试的基本工具,包括用于会后回顾的录音选项。
系统设计面试中要避免的常见错误
我见过人们犯的一些最常见的错误是:
- 不推动面试
- 不问问题
- 没有正确组织采访
- 时间不多了
- 不考虑要求
- 没有探索所有替代设计选项
通过与熟悉系统设计的人进行一些模拟面试,所有这些错误都可以轻松避免。并安排面试时间。目标必须是在 40 分钟内达成解决方案,包括一些讨论时间。
通过这 4 个步骤的过程,您很快就能在任何系统设计面试中取得好成绩!希望这对您来说应该是一个良好的起点。祝大家面试一切顺利。
原文:https://medium.com/javarevisited/how-to-crack-system-design-interviews-in-2022-tips-questions-and-resources-fcad05e2dab,本文经翻译整理后发布。