📜  在系统设计轮面试中要遵循的 8 个最重要的步骤

📅  最后修改于: 2021-10-19 08:33:51             🧑  作者: Mango

在软件工程面试过程中,系统设计轮已成为面试的标准部分。如果你想在一些大型科技巨头公司得到你梦寐以求的工作(尤其是作为一名高级工程师),那么你需要告诉你关于构建一个复杂的大型可扩展系统的方法。

设计问题没有准确标准的答案。对于同一个问题,您可能会与不同的面试官进行不同的对话。由于缺乏构建大规模系统的经验,加上这一轮的开放性,很多候选人在这一轮中挣扎。不仅是初级和中级开发人员,而且经验丰富的开发人员在这一轮中都感到不舒服。

8 个最重要的步骤来跟进系统设计轮面试

这一轮不太关注编码。面试官想知道您如何构建整个系统以及如何将它们粘合在一起。您需要在 30-45 分钟的时间范围内涵盖许多复杂的组件。由于时间有限,大多数候选人都会迷失在小事上,而错过了大局。

在这个博客中,我们将分享一些技巧来组织你的面试,让你能够向面试官传达你系统的整体情况。在此之前,我们建议您阅读博客如何在面试中破解系统设计回合?

1. 拥有自主权并推动面试过程

当面试官向你提出设计问题时,承担起推动面试的责任或所有权。将面试官视为团队成员,并将这一轮视为与他合作的机会。你是领导一切的人,而不是面试官。但这并不意味着你不会让你的面试官说话。如果面试官分享了什么或指出了什么,仔细听他们说。

您将是进行大部分谈话的人,您将是解释设计中所有内容的人。你需要主动提出问题,如果面试官戳你,你还需要处理边缘情况。

2. 功能性和非功能性需求

向面试官清楚地提及所有功能性和非功能性需求。您的要求应该足够大,可以适应给定的时间范围,并使问题对您具有挑战性。一旦您了解了功能性和非功能性需求,就可以构建满足这些需求的系统。

在软件中,开发可扩展性非常重要,因此请记住非功能性需求,您需要大规模构建系统。在低可扩展性的系统上工作没有乐趣。

当您清除功能性和非功能性需求时,请与面试官一起审查。他们可能想要添加/删除某些内容。有时面试官想在你要构建的系统中添加一些特定的需求或用例。

3. 容量估算

很多考生跳过了这部分,他们没有考虑系统容量。大多数候选人只关注设计部分,而不是计算来估计系统的容量。他们假设所需的内核数或所需空间量有足够大的近似数。您必须与面试官确认他们是否想要进行容量估算。

4. 计划

一旦功能性和非功能性需求明确,您就需要计划各种事情来设计您的系统。

  • 检查系统中的用户交互点。当用户与其交互时,流将如何在整个系统中工作。
  • 在每个用户交互点,您需要检查延迟、可用性和一致性要求。您可能需要进行一些权衡,这完全取决于需求。
  • 快速分析并评估您的系统是读取密集型交互还是写入密集型交互。
  • 以上三点都将使您在系统中清楚一些事情。您需要哪些所有服务以及哪个数据库适合您的系统来存储数据。

5. 高层设计

这是系统设计轮面试中最重要和最具挑战性的部分。在高级设计中,您必须涵盖以下内容。

  • 整个系统流程应划分为多个功能组件。检查所有服务都存在以及您需要如何基于这些服务构建整个系统。此外,检查需求或服务是否适合微服务架构。在 SDE 面试的大部分时间里,候选人更喜欢使用基于微服务的方法。
  • 检查服务在系统中是如何连接的,以及使用哪种协议来进行内部服务的通信,例如 Async/Sync-Rest、RPC 等。
  • 您需要向面试官明确说明所有服务对用户可用,以及用户将如何与整个系统交互以使用这些服务。完整的服务流将如何在整个系统中工作?您是否需要缓存来减少系统中的延迟?
  • 您需要确定哪个数据库适合您系统中的哪个服务。
  • 检查您是否需要在整个系统的任何地方缓存。如果是,那么驱逐政策应该是什么,您是否需要密钥到期。是否需要成为直写缓存?
  • 基于以上所有分析,绘制整个系统的高级设计。

HLD 的关键事项

  • 负载平衡器将整个流量分配到不同的服务器。
  • 服务
  • 数据库和缓存
  • 用户交互点
  • 消息队列、CDN 等工具。

6. 演练设计

当一个完整的图表准备好后,遍历你的整个设计。选取您系统的一个组件/一个用例,向面试官高层次地解释该组件将如何在您的系统中工作。您还需要告诉面试官哪个特定的数据库适合您的系统,以及为什么需要使用特定的通信模式,例如同步/异步等。

如果您在系统中做出了特定的设计选择,您可以进入 RPC 与 HTTP 类型的对话。您还需要检查数据库中使用的数据复制策略(例如主从或多主设置)。

注意:当您完成设计过程时,请确保您没有涉及设计 API 或 DB 模式的太多细节。您可能会用完时间,并且会错过系统中的一些重要内容。只有在面试官要求时才深入了解细节。

七、实施与执行

当你解释完整个系统的设计并且它流向面试官时,回顾一下并询问他们想要深入讨论系统的哪个特定部分或流程。由于时间有限,不可能遍历整个系统并详细解释每个部分。

让面试官决定他们想要深入研究系统的哪个特定部分。根据面试官的选择,解释系统特定组件的实现和执行。您需要涵盖以下内容……

  • API:提及您的系统需要哪些 API。此外,请确保在向面试官解释 API 时使用最佳实践。例如:如果您使用 GET API 的 URL 那么最好使用GET /user/{id} 而不是使用GET /user/getUserbyUserId
  • API 协议:您还需要检查公开 API 的协议。很多人选择 REST API,但根据用例/系统要求,您可以选择更高效的 API,例如 Thrift 或 Protobuf。
  • 事件:您还需要检查特定服务正在侦听的事件、哪个服务生成了该事件、传入的负载以及对该事件进行的处理类型。
  • DB 模式:检查系统中的 DB 模式。当您谈论高级设计时,您需要阐明哪个数据库适合您的系统以及您为什么选择该特定数据库。在这里,您需要在 SQL 和 NoSQL 之间做出决定。
    如果您选择了 SQL,那么请谈谈索引和优化查询。如果您选择 NoSQL,请确保检查您的数据库提供的一致性保证。它是否是您在该数据库上运行的任何问题和查询类型的原因?当你清楚你的数据库选择和数据库模式时,调出键值存储的键或列式存储的分区键等。

8. 处理墨菲定律

大多数人会在面试中跳过这一部分,但这是您在这一轮中应该涵盖的最重要的事情之一。这部分讨论您的系统的弹性。在现实世界中事情会发生变化,但是当它发生时,您需要确保您完全控制了您的系统。

讨论您需要如何监控整个系统以及您如何看待它的每个部分。提及您系统中的警报机制。讨论 KPI(关键绩效指标)以及您跟踪它们的方式。如果您的系统出现故障,如果您的服务崩溃,如果您的数据库的主节点出现故障或数据中心出现故障,您将如何处理这些问题?

GeeksforGeeks 系统设计课程

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

GeeksforGeeks 系统设计课程

这就是为什么 GeeksforGeeks 为您提供以深度面试为中心的系统设计直播课程,帮助您准备与 Google、亚马逊、Adobe、优步和其他基于产品的公司的系统设计相关的问题。