系统设计面试(适合初学者)

2025-06-10

系统设计面试(适合初学者)

说实话,当我第一次听说系统设计是许多技术面试环节的一部分时,我心想:“LeetCode 还不够吗?!” 所以,很自然地,我尽可能地推迟了学习。但当情况紧急,我不得不更深入地研究这些面试中真正会问到什么时,我意识到这个概念的重要性是有道理的。

面试中这类系统设计或架构问题只是为了考察你的思维过程。了解你如何在算法层面解决问题固然重要,但了解你如何在更高层次上处理情况也同样重要。

以上只是我对系统设计面试的一些看法,但我想和大家分享一些我的研究成果。我最近参加了一次面试,感觉还不错,所以想分享一下面试过程,希望能对大家有所帮助。

介绍

随便在谷歌上搜索一下“系统设计面试题”或“系统架构面试题”,你就会发现,学习内容并没有固定的学习规则。这可不是“嘿,做 100 道 leetcode 题就万事大吉了!”那么简单。面试的结构性要差得多,而且更具开放性,这可能是面试的难点之一。

您可以通过谷歌搜索这些问题或观看一些 YouTube 视频(我在下面附上了一些有用的视频)来了解面试内容,但我将详细介绍我的面试过程和我的思考过程。

这类面试还有一个有趣的地方,那就是你很可能不会写太多代码。面试官可能会问一些关于你的想法或你的函数功能的细节,但不会像算法题那样详细。

注意:这只是我站在初学者的角度,绝对不适用于中高级职位。我的理解是,这些级别的系统设计面试更加复杂,需要更详细的信息。

面试指南

现在,我们已经解决了这个问题,让我们深入了解一下系统设计面试指南:

  1. 充分了解问题以及可以采取的解决方法

    • 一开始最好花一点时间问一些澄清问题,确保你完全理解需要解决的问题。以下是一些可以问自己或面试官的问题:
      • 这需要是一个完整的 Web 应用程序还是仅仅是一个 API?
      • 该产品如何帮助解决用户问题/他们从中得到了什么?
      • 有多少人会使用这个应用程序?
      • 该应用程序或 API 将如何使用?
    • 注意:一开始不要太详细,否则会影响整体的理解。一开始先概括一下,然后慢慢积累更多细节。
  2. 范围和可扩展性

    • 现在您已经清楚了解了要解决的问题,您应该记下应用程序或 API 的范围和可扩展性。
    • 您可能在澄清问题中提到过这一点,但在这里您可以想象一下,如果成千上万的用户同时访问这个应用程序,那对一台服务器来说将是一个巨大的负担。而这可能是一个公司内部工具,每天只有少数人使用。
    • 您现在不必做出任何明确的选择,例如“我们绝对需要 15 台服务器!”,但只要您在心里对以后如何扩展有一个大致的想法,那就很好了。
  3. 为您的总体结构创建模板

    • 有了所有这些信息,您应该能够对您的应用程序或 API 的外观做出非常非常广泛的概述。
    • 假设您正在开发一款食谱应用,希望能够创建食谱卡片,并查看您自己以及其他人的所有食谱。您很可能需要一个完整的应用,它包含一个前端,用户可以在其中添加和查看自己的食谱卡片,以及一个带有数据库的后端,用于保存食谱的相关信息。
    • 此时,您可以非常有创造力地决定如何创建您的应用程序或 API,但请确保您有充分的理由选择这样做。
  4. 再深入一点!

    • 太棒了,你的总体结构已经搭建好了!现在你可以更深入地了解我们之前讨论过的细节了。你可以选择自己想深入讨论的内容,但请确保能够为应用或 API 的每个部分添加一些细节。
    • 前端:您可以在这里讨论页面的外观以及用户如何访问。如果您认为有必要,也可以稍微讨论一下身份验证。您还可以提及前端如何与后端通信(例如 REST 风格)。
    • 后端:我实际上并没有在后端花费太多时间,但我确实提到了我可能会使用哪些框架并简要解释了原因。
    • 数据库设计:我的面试很大一部分内容是讨论数据库架构。实际上,我必须写出数据库表的基本设计和一些 SQL 查询语句。所以我建议大家复习一下 SQL,以防万一遇到这种情况。
  5. 重新审视扩展

    • 现在您已经为您的应用程序或 API 添加了很多细节,现在是重新审视我们之前推迟的扩展想法的好时机。
    • 如果您的应用或 API 需要在前端进行大量活动(例如读取或写入),则可能需要添加负载均衡器来处理所有服务器请求。以下是负载均衡器功能的简要示意图:

负载均衡器示例

  • 如果你知道你的某台服务器将会收到大量请求,可能比其他服务器多数百倍,你可能需要考虑缓存及其带来的益处。或者,你甚至可以考虑拆分该服务器的处理任务,或者通过增强其性能来扩展服务器。
    • 缓存很有用,因为它允许更频繁访问的信息被存储和引用,而不是每次发出请求时都启动数据库。

尖端

  • 请记住,这是一次公开的讨论!
    • 一开始我有点犹豫要不要提问,但面试官非常乐于助人,我们会讨论我提出的不同想法的优缺点。这很棒,因为答案其实没有对错之分,很多时候只是个人喜好问题。
  • 这种面试有很多部分,不要觉得你必须了解所有的事情,要诚实地说明你知道/不知道的事情
    • 我认为,尤其是从初学者的角度来看,了解所有这些工具是很棒的,但说出你不知道的内容也是可以的。有时面试官会很友善地向你解释某个工具的功能,或者帮你思考针对特定问题可以使用哪些不同的工具。

资源:

祝你面试顺利!请在下方分享你的面试经历以及一些建议😊

鏂囩珷鏉ユ簮锛�https://dev.to/mwong068/the-system-design-interview-for-beginners-n85
PREV
我如何让我的网站加载速度提高 18%
NEXT
全栈开发应该更容易简化堆栈联络结论