如何破解系统设计?提示、问题和资源

582 阅读9分钟

image.png

大家好,如果您想知道如何准备关键的系统设计主题并寻找具有正确方法、提示和问题的分步指导,那么您来对地方了。

早些时候,我分享了最好的系统设计课程25 道系统设计面试问题,在这篇文章中,我将分享一份完整的 2022 年系统设计面试破解指南。

软件工程就业市场火了!特别是如果你有几年的经验。而在软件工程的世界里,如果你申请的是高级工程师/主管/架构师/或更高级的职位,系统设计是最抢手的技能,因此是整个过程中最重要的一轮。

如果你把这件事搞砸了,其他一切都无关紧要。但是,如果你做对了,你每年至少可以加薪数万美元。

那么,您如何在系统设计方面取得成功呢?好吧,这就是我在为 Facebook、GoogleAmazon的面试做准备时所做的,而且效果很好。

我最终为自己创建了一个清单,让我通过了大部分回合,所以如果你遵循类似的路径,你应该能够想出一些对你有用的东西。

不过,在我们进入细节之前,什么是系统设计面试? 面试官对候选人的真正期望是什么?

期望:

  1. 您应该能够设计一个满足给您的要求并且可以很好地扩展的系统,例如设计一个自动售货机设计一个交易头寸聚合器
  2. 您的设计应该是可插拔的,并且不限制添加新功能。
  3. 您应该能够比较各种替代方案并选择最佳的一个。比如,哪个数据库最重要,或者你应该使用哪个协议,或者扩展系统的最佳方法是什么,等等。
  4. 您应该了解从系统设计的角度来看相关的基础知识,例如:
  5. 负载均衡器
  6. 接口
  7. 缓存
  8. 数据库
  9. 网络协议
  10. 消息队列
  11. CDN
  12. 关于机器学习和大数据的高级细节
  13. CAP定理
  14. 监控和分析

这些实际上是每个开发人员都应该准备的基本系统设计主题和概念。如果您对这些主题有所了解,那么您肯定会在系统设计面试中表现出色。顺便说一句,不要被主题的数量所淹没,大多数优秀的系统设计课程,如CodeKarle 都涵盖了所有这些主题。

如何准备系统设计面试?

有一个简单的四步过程可以在任何系统设计回合中获胜。

  1. 概念
  2. 向科技巨头学习
  3. 常见问题
  4. 实践

一、系统设计理念

任何系统设计面试都肯定需要你为你试图构建的任何系统提出一个基本的高级设计。肯定会需要一些组件。

负载均衡器——没有负载均衡器的分布式系统无法在各个节点之间分配传入请求。这确保了适当的资源利用,并且系统中没有单点故障。以下是Nginx的做法。

缓存——大多数系统都有一些读取繁重的交互,一些用户会经常访问但不会更新太多的信息。以一种无需数据库查找即可轻松获取的方式缓存此信息是有意义的。考虑低延迟。此外,根据您的用例,您可能需要存储更频繁访问的信息或最近访问的信息。因此,请阅读各种驱逐政策

数据库——同样,没有某种形式的数据存储就没有系统。无论您是想存储文件、图像、产品信息、金融交易,还是只是转储来自各种用户交互的所有数据,以便稍后运行分析。

这一切都需要数据库。所以请阅读它。了解选择数据库时的重要性,了解SQL / NoSQL、查询模式以及 CAP 定理在权衡时可能如何发挥作用。

image.png

消息队列——有时我们的系统需要执行一些需要完成但不一定立即完成的任务,或者它们的结果不会影响用户的旅程。在这种情况下,与其进行服务调用并等待响应,不如将消息写入队列以便稍后执行。

如果您需要在数据库中插入信息怎么办,而批量插入可能更有效?只在消息队列中跟踪这些插入并执行 1 个批量插入而不是数百个一对一插入以优化您的资源是有意义的。

CDN — 当您的用户分布在不同的地理位置时,在合理的时间内将您的内容提供给他们成为真正的挑战。CDN 允许我们在靠近用户位置的各种数据中心维护我们的数据副本,以减少延迟。以下是有关 Akamai 如何做到这一点的简短视频

分析和监控——这是您创建的每个系统都需要的东西。这是一个隐藏的需求,没有人在需求收集中说出来,但每个面试官都想要这个。用户登录或注销?将物品列入心愿单?支付失败?这是我们所有的信息!任何重要的事情都会发生,触发一个事件并将其保存在您的消息队列中。

您可以对数据执行实时分析,也可以将其转储到Hadoop 集群中以供以后使用。同样,如果 API 调用经常失败,或者如果您的服务器即将耗尽资源,您不想提前知道吗?

网络协议——根据您的要求,根据您共享的内容类型,您可能需要决定使用哪种网络协议。阅读各种网络协议,如TCP 和 UDP,以及它们何时相关,您可能需要做出哪些妥协等。

第一步是了解所有这些概念。并且通过了解概念,我不仅仅指关于这些是什么的一些理论知识,而是关于何时应该使用什么的更实际的实践经验。

您需要了解以下内容:

  1. 给定用例,这是最好的选择。
  2. 在做出这些决定时,您需要考虑哪些权衡?
  3. 某些用例的最佳实践。

要了解其中的大部分内容,我建议您完成CodeKarle 的系统设计课程,该课程涵盖了上述所有内容以及来自现实世界的具体示例。 image.png

2. 向科技巨头学习

这在短期内可能不会有帮助。但从长远来看,要成为系统设计专家,最好看看各个科技公司的技术博客,看看他们是如何解决各种技术问题的。

这将清楚地描绘出他们面临的真正问题以及他们如何以创新的方式解决这些问题。了解这些内容将帮助您更好地进行系统设计,并让您了解最新的技术创新。

一些最好的博客是:

  1. Facebook 工程博客
  2. Netflix 技术博客
  3. 优步工程博客

如果您不喜欢阅读并且喜欢观看,那么您也可以参加由前 FAANG 员工创建的在线课程,例如Frank Kane (前亚马逊招聘经理)的 Mastering the System Design Interview。这是学习面试系统设计的最佳资源之一。

image.png

3. 系统设计常见问题

一个明显的方式开始你的面试准备!了解基础知识肯定很重要,但这还不够!开始练习的最基本方法是查看一些常见问题及其解决方案。

大多数系统设计面试都围绕着一些 5-6 个常见的系统设计问题,如果你知道这些问题的解决方案,你很有可能通过这次面试。

最常见的问题是:

  1. 如何设计 YouTube?
  2. 如何设计像 WhatsApp 或 Facebook Messenger 这样的聊天系统
  3. 推特系统设计
  4. 脸书系统设计
  5. Whatsapp 系统设计
  6. Airbnb系统设计
  7. 优步系统设计
  8. Tinyurl 系统设计

如果您需要资源来解决这些问题,不仅可以解决问题,还可以解释解决系统设计问题的基本概念和方法,那么CodeKarle 的这门评价很高的课程讨论了大部分案例研究和更多问题,帮助许多人通过谷歌、Facebook、微软、亚马逊等公司的面试。

image.png

4. 练习

练习,练习,练习!我说练习了吗?那里有很多资源。我分享了一些,详细讨论了一些最流行的系统设计问题。一旦你经历了其中的一些,你就会开始注意到一种模式,并且很快就能自己想出解决方案。

更好地了解您的系统在您的组织中是如何设计的。其他团队的表现如何?他们考虑了哪些因素?下一个最好的事情是和朋友一起练习。确保在实际面试之前进行一些模拟面试,以避免一些常见但容易避免的陷阱。

我见过人们犯的一些最常见的错误是:

  1. 不进行面试
  2. 不问问题
  3. 没有正确安排面试
  4. 没时间
  5. 不考虑需求
  6. 不探索所有可替代设计选项

通过与熟悉系统设计的人进行几次模拟面试,可以轻松避免所有这些错误。和时间你的采访。目标必须是在 40 分钟内达成解决方案,包括一些讨论的时间。

嗯,就是这样,伙计们。通过这 4 个步骤的过程,您很快就可以准备好迎接任何系统设计面试了!希望这对您来说应该是一个很好的起点。快乐学习!

最佳系统设计面试资源

如果您需要更多资源,例如书籍和在线课程来准备系统设计面试,我的建议是:

来源:medium.com/javarevisit…