📜  如何在面试中破解系统设计回合?

📅  最后修改于: 2021-10-19 06:02:34             🧑  作者: Mango

你能在 45 分钟内设计 Netflix 吗?

什么???你是认真的 ?? (我可以看一整夜,但是……)。甚至无法解释 Netflix 的单个组件,而且您要我在短短 45 分钟内设计它??

是的,如果您想在大型科技巨头公司获得梦想的工作,这就是您在系统设计面试中应该做的事情。您必须向面试官清楚解释如何设计此类大型可扩展分布式系统(如 Twitter、Messenger、Netflix、Uber 等)。这一轮对你来说可能是一个具有挑战性和复杂的轮次,因为你应该在这个有限的时间范围内涵盖所有主题和权衡,这似乎是不可能的。我们不想让这一轮让您感到害怕,因此我们将逐步讨论如何清除这一轮以及一些有用的提示,以避免常见错误。

如何破解系统设计回合面试

在开始准备这一轮之前,让我们尽量简化并讨论一些关键点。

  • 将您的面试官视为团队成员,并将这一轮视为与他合作的机会,你们都应该解决与公司目标相关的现实问题,但在这里,您需要拥有所有权并领导一切。
  • 这一轮的主要目的是了解您构建大型系统的能力以及设计服务背后的思维过程。思路清晰很重要,因为如果你能向面试官解释清楚,你也可以在你的团队中做到这一点。
  • 这一轮对你来说的好处之一是,你应该为各种开放式问题提出最佳解决方案,而不是准确的解决方案。您表达想法的能力比您呈现给他们的最终设计更重要。

我们希望从以上几点我们为您简化了一些事情,让您更轻松地完成这一轮。

好的,我明白了,但是从哪里开始,从哪里结束,告诉我在这个严格的时间范围内逐步涵盖所有内容的最佳方式。

我们知道这对您来说可能是一个压倒性的回合,所以让我们开始讨论逐步方法,并尝试让您更轻松地进行此回合。

1. 了解目标并收集所有要求

在跳到解决方案之前,您需要首先了解您的最终目标,以便从面试官那里收集所有基本要求。提出相关问题以消除您的疑虑。设计问题基本上是开放式对话,没有一个正确的解决方案,因此最好从一些基本假设开始。

  • 系统或服务的最终目标是什么?
  • 谁是最终用户?他们将如何使用该服务?您的面试官希望您包括哪些功能以及排除哪些功能?
  • 输入及其输出或最终结果应该是什么?

像 Facebook、Twitter 或 Reddit 这样的产品是众所周知的产品,所以即使你知道如何设计这样的系统,你仍然有责任分享你的假设并与面试官讨论他们关心的功能和他们不关心的功能。吨。他们可能希望您包含此类系统中不存在的某些功能,或者他们可能会告诉您排除某些功能。因此,请确保您对所有要求和功能有更好的了解。
考虑设计推特的例子。一些问题是谁可以发布推文?谁可以阅读推文?谁可以关注用户?喜欢,评论,图片,活跃用户,总用户数,并讨论您的面试官希望您包括的其他功能。

2. 系统接口定义和建立范围

在第一步之后,您需要根据您包含的任何功能确定您的系统需要什么样的 API 来完成工作。此外,讨论系统的范围和可用性,讨论一些相关问题,例如你们都只关心端到端体验还是只关心 API?。客户端支持(移动、网络等)。身份验证、分析、集成、性能等。如果主机宕机或整个数据系统宕机,系统是否还能正常工作?因此,与面试官讨论他/她关心系统的可用性。从这两个方面,以上两个步骤确保您知道问题的确切范围和系统的复杂性。

3. 可扩展性估计:

您设计了一项适用于一百个用户的服务,但它适用于一千个用户还是一百万个用户?随着我们添加更多用户或更多请求,它会扩展并正常工作吗?基本上,您需要针对不同的比例考虑相同的特征,并且获得正确的比例非常重要,因为不同的答案需要不同的设计。可扩展性还有助于负载平衡、缓存和分区,因此您可以提出以下问题:

  • 我们需要关心的数据或网络或带宽的限制是什么?
  • 我们需要多少存储空间?
  • 平均响应时间是多少?

4. 从高级组件开始,然后转向详细设计

根据您的目标开始涵盖端到端流程,因此确定每个组件以解决实际问题或实施您的完整系统。所有组件如何组合在一起以满足实际需求?以下是在解释组件时正确指导您的一些快速要点:

  • 将您的完整系统划分为 6-7 个更高级别或核心组件
  • 进一步深入讨论每个组件的角色和职责,以及它们将如何交互或相互通信。在解释组件时,您的面试官可能会引导您了解 1-2 个组件,并希望您深入解释这些组件。因此,您需要进一步详细讨论。
  • 讨论前端、后端、网络、缓存、负载均衡、排队、数据库、外部API调用、用户交互、离线流程等。
  • 告诉面试官你可以在你的系统中使用哪些技术或数据库。

5. 权衡和解决瓶颈

设计面试是开放式对话,所以没有单一的答案,当你向面试官展示你的架构和你的思考过程时,每一个决定都会有一个权衡复杂的系统总是需要妥协,所以你需要告诉他们不同的方法、它们的优点和缺点,以及为什么你会选择一种而不是另一种。

  • 哪个数据库适合您的系统,为什么?
  • 为什么要在不同的层或组件中选择特定的技术。
  • 哪些框架适合您的设计,您需要选择哪一个?
  • 有哪些不同的安全选项可以确保您的数据安全,您会选择哪一个?

您还需要思考和解决瓶颈问题,例如您的系统中可能会发生什么样的故障以及解决方案是什么。您是否需要保留备份,或者您将需要任何其他资源的帮助。如果您的服务器崩溃并丢失整个数据,您是否有任何数据备份?您将如何监控服务的性能?如果任何组件出现故障,那么有什么解决方案可以平稳正确地运行您的系统?基本上,您应该有一个有组织和清晰的计划来处理系统中的所有这些类型的严重故障。

快速提示:

  • 尝试在面试中遵循80-20 规则,其中 80% 的时间您将讲述和解释所有内容,而 20% 的时间则是您的面试官。
  • 如果您什么都不知道,请不要使用流行语并假装是专家。你今天读了一些博客文章或几个主题,明天就是你的面试,如果你在面试中抛出一些流行语,比如“No-SQL”、“Mongo DB”和“Cassandra”,那么它可能会适得其反。你不能把行业专家的面试官当傻子,总要考虑到你的面试官可能会问更多的细节和理由,所以如果你使用的是技术 X 或数据库 Y 那么“为什么?”,为这种情况做好准备问题。
  • 不要过早地详细介绍。很多时候,当候选人开始解释系统的某个部分时,他们会深入了解组件的太多细节,而忘记了严格的时间表和其他组件。也许面试官希望你在他们不需要太多细节的地方停下来。所以为了避免这个错误,等待面试官的反馈或回应。他们会给你一些提示或将你引导到他们希望你进一步解释的系统的任何部分。
  • 不要有一个固定的架构,比如 MVC 或事件驱动,并尝试以某种方式在该架构中满足需求。也许它不符合要求。面试期间要求可能会发生变化以测试您的灵活性,因此请尽量避免这种错误。
  • 在你的面试中诚实,如果你从未使用过 X 技术,那么在这种情况下你不需要假装。尝试找到通用的解决方案,并向他们展示您的诚实、自信和学习意愿。这样会给面试官留下好印象。
  • 你的实践经验、你的知识、对现代软件系统的理解以及你在面试中如何清楚地表达自己对成功设计系统非常重要。

GeeksforGeeks 系统设计课程

想在领先的科技公司获得软件开发人员/工程师的工作吗?或 想要从 SDE I 平稳过渡到 SDE II 或高级开发人员配置文件?如果是,那么您需要深入了解系统设计世界!对系统设计概念的正确掌握非常重要,尤其是对于工作专业人士而言,要在技术面试中获得比其他人急需的优势。

GeeksforGeeks 系统设计课程

这就是为什么 GeeksforGeeks 为您提供以深度面试为中心的System Design – Live Course ,它将帮助您准备与 Google、Amazon、Adobe、Uber 和其他基于产品的公司的 System Designs 相关的问题。