最常问的系统设计面试题

2025年3月17日 | 阅读 14 分钟

以下是最常被问到的系统设计面试题及其最佳答案列表。

1) 什么是系统设计?/ 你对系统设计有什么理解?

系统设计是根据指定的几个要求,定义系统元素(如模块、架构、组件、接口和数据)的过程。在此过程中,公司定义、开发和设计满足企业或组织特定需求和要求的系统。


2) 系统设计面试中会问哪些类型的问题?

在系统设计面试中,候选人会被问到许多关于系统各部分的问题,如模块、架构、组件、接口、通信、数据存储、聊天服务等,以及公司可能面临的实际问题。之后,候选人会根据他们的专业领域进行分类,例如程序员、设计师、开发人员和软件工程师。


3) 系统设计师必备哪些技能?/ 设计师需要具备哪些技能?

系统设计师必须具备以下素质:

  • 他们必须能够理解和解决复杂问题。
  • 他们对解决问题和客户需求有逻辑和分析的方法。
  • 他们必须具备良好的沟通技巧。
  • 他们必须能够独立工作,也能作为团队的一员工作。
  • 他们必须具备扎实的 IT 知识,并能将其应用于项目。
  • 系统设计师应有能力指导他人的工作。

4) 什么是 Pastebin?设计 Pastebin 这样的系统有什么好处?

Pastebin 是一个允许我们将文本或代码粘贴到其中的网站。设计此类系统的最大好处是,我们可以将之前粘贴在这里的代码或文本的链接分享到任何地方。它不是在线代码编辑器,但我们可以将此系统或网站用作存储任何文本或代码的工具。


5) 作为系统设计师,你能设计出像 Google Drive 或 Dropbox 这样的通用文件共享和存储应用程序吗?

Google Drive 和 Dropbox 都用于存储和共享文件、照片和其他媒体服务。我们可以设计出允许用户上传/搜索/查看文件或照片等的系统。它会检查文件共享的权限,并允许多个用户对同一文档进行更改。

通过问这个问题,面试官想了解你将如何处理以下事项:

  • 用户将如何上传/查看/搜索/共享文件或照片?
  • 你将如何跟踪文件共享权限?
  • 你将如何允许多个用户编辑同一文档?

6) 如何设计像 Facebook、Twitter 或 Instagram(处理数亿用户的社交媒体服务)这样的网站或应用程序?

面试官问这个问题是为了了解你如何处理海量用户,因为这需要大量的存储系统和其他复杂性。当我们设计需要处理数百万甚至数十亿用户的社交媒体服务时,我们必须关注以下组件:

  • 海量且高效的帖子或推文存储和搜索。
  • 新闻 feed 的生成和维护。
  • 社交图谱(谁和谁交友,或者谁关注谁?特别是当数百万用户关注一位名人时)。

很多时候,面试官会花整个面试时间讨论设计和你的新闻 feed 创意。


7) 如何设计像 Quora、Reddit 或 HackerNews 这样的社交网络和留言板服务?

像 Quora、Reddit 或 HackerNews 这样的网站允许用户发布问题或分享链接,其他用户可以回答这些问题或评论共享的链接。面试官问这个问题是为了检查你的应用程序是否能提供以下服务:

  • 维护和记录每个答案的统计数据,例如总查看次数、赞/踩次数等。
  • 让用户关注其他用户或话题。
  • 用户的 timeline 应包含他们关注的所有用户和话题的置顶问题(类似于新闻 feed 生成)。

8) 交通控制软件有什么用?如何设计这样的应用程序?

交通控制软件用于使交通控制变得简单、无忧且自动化。要设计交通控制软件,我们必须了解如何从一个状态转换到另一个状态。例如,信号灯如何从红灯变为绿灯,以及从绿灯变为橙灯再变为红灯。


9) 如何设计像 YouTube、Netflix 或 Twitch 等全球视频流媒体服务或网站/应用程序?

面试官问这个问题是为了检查你如何处理如此庞大的数据库,并为用户提供不间断的互联网流。像 YouTube、Netflix 或 Twitch 这样的视频流媒体服务或网站/应用程序存储和传输数百 PB 的视频数据。它们还存储统计数据(如观看次数、点赞数、评论数等),并允许用户发表评论。因此,你提供的解决方案必须可扩展,以支持数百万并发用户。

你在设计时应牢记以下功能:

  • 你的应用程序必须支持上传到网络的所有类型的视频格式。
  • 用户应通过互联网获得不间断的流。
  • 你必须提供所有视频统计信息,例如总观看次数、赞/踩次数等,这些信息应存储并对每个视频可用。
  • 视频上的评论必须保存并与视频一起显示,以便其他用户可以看到。每个评论也都应提供回复功能。
  • 该应用程序应支持数千用户的极高流量。

面试官在回答这个问题时可以讨论哪些类型的问题?

  • 你将如何确保你的服务在各种网络质量下提供流畅的视频流?
  • 如果你的服务遇到流速突然下降(缓冲、质量下降等)的问题,你将如何处理?
  • 你将如何存储视频?

开发人员应使用以下技术:

  • 云技术用于存储和传输视频数据。
  • 机器学习用于新视频推荐。

10) 如何设计一个 URL 缩短服务,如 TinyURL 或 bit.ly 等?

面试官问这个问题是为了检查你是否能创建一个像 TinyURL 或 bit.ly 这样的程序,它可以缩短长 URL。这些程序接受一个长 URL 并生成一个新的、唯一的短 URL。你也可以在这里输入缩短后的 URL,然后获取原始完整 URL。

在这里,你必须展示你扎实的设计基础。你还可以指定示例回答中未列出的内容,例如为每个 URL 创建唯一 ID,处理重定向以及如何删除过期的 URL 等?

你在设计时应牢记以下功能:

  • 你的应用程序必须返回一个比原始 URL 短的 URL。
  • 你必须存储原始 URL 以备将来使用。
  • 新生成的 URL 必须能够链接到存储的原始 URL。
  • 缩短后的 URL 应允许重定向到原始 URL。
  • 它必须支持自定义短 URL。
  • 它还应能够同时支持大量请求。

面试官在回答这个问题时可以讨论哪些类型的问题?

  • 你将如何处理两个用户输入相同自定义 URL 或用户数量超出预期的问题?
  • 你将如何管理你的数据库存储空间?

使用哪些技术来开发此类应用程序最好?

  • 哈希算法用于链接原始 URL 和新 URL。
  • REST API 用于加载高并发流量并处理前端客户端通信。
  • 使用多线程处理多个请求。
  • 使用 NoSQL 数据库存储原始 URL(存储的 URL 之间没有关系)。

11) 如何设计一个限价订单簿?

限价订单簿在股票交易所用于根据价格和时间优先级匹配买单和卖单。通过问这个问题,面试官想了解你将如何做到这一点。你将使用什么数据结构?你应该始终记住,匹配速度应该是快的,可靠性应该是好的。


12) 如何用任何一种编程语言设计一个自动售货机?

在这里,你必须编写代码来实现一个自动售货机,它必须包含许多产品,例如巧克力、糖果、冷饮,并接受不同类型的硬币,例如卢比、美分、镍币、角币、25 美分硬币等。你还应该确保当你插入硬币时,能收到产品并找回零钱。


13) 如何设计一个像 Uber、Ola 或 Lyft 等网约车服务或应用程序?

当面试官向候选人提出这个问题时,他/她希望你设计一个服务,用户可以通过应用程序请求乘车,然后司机到达目的地接送他们。

你在设计此服务时应牢记以下功能:

  • 这是一个实时服务,因此其架构应为整体式/微服务,并且应拥有快速的数据库。
  • 此应用程序的后端主要服务于手机流量,因此该服务必须能够通过移动数据与后端通信。
  • 你必须提供一种有效的方法来存储数百万司乘人员不断移动的地理位置信息。

面试官在回答这个问题时可以讨论哪些类型的问题?

  • 如何处理最关键的用例,即当客户请求乘车时,你必须将他们匹配给附近的司机?
  • 你将如何存储数百万司乘人员不断移动的地理位置信息?
  • 如何处理每秒需要数百万更新的司乘人员位置信息?
  • 如何绘制地图和设置路线,以及如何计算 ETA?
  • 如何有效地将用户请求与附近的司机匹配?

开发人员应使用以下技术:

  • 使用最佳方法处理数百万个司机位置的更新。
  • 对于后端和调度,Node.js 是最受欢迎的选择。
  • 最好用 Python 编写业务逻辑服务。
  • 最好使用 PostgreSQL、Redis 或 MySQL 作为数据库。

14) 你对 Search Typeahead 有什么理解,如何设计它?

Search Typeahead 是一项服务,它允许用户输入查询,并根据查询建议与用户输入的词语开头的最热门搜索项目。它也被称为“输入时搜索”功能。

面试官在回答这个问题时可以讨论哪些类型的问题?

  • 你将使用什么方法来存储先前的搜索查询?
  • 系统的实时要求是什么?
  • 你将使用什么方法来保持数据新鲜?
  • 你将使用什么方法来查找与已输入字符串的最佳匹配?
  • 你将如何处理系统每秒的查询量?
  • 你将设定什么标准来选择建议?
  • 你将如何存储总数据查询次数?
  • 你将使用什么方法来查找与已输入字符串的最佳匹配?

15) 你对网络爬虫有什么理解,它是如何工作的?

网络爬虫是一种计算机程序,它会自动搜索网络上的文档并轻松抓取它们。它由 Google 和 Bing 等搜索引擎运营。爬虫的编程方式使其能够执行重复性操作并实现浏览自动化。每个搜索引擎都频繁使用爬虫来浏览互联网并建立索引。爬虫也称为蜘蛛或搜索引擎机器人。

爬虫的主要目的是索引全球网站,以便它们能够出现在所有搜索引擎结果中。


16) 如何设计网络爬虫?

网络爬虫是一项与搜索引擎相关的服务,用于索引互联网上的网站内容,以便它们能够出现在所有搜索引擎结果中。换句话说,我们可以说它是一项可扩展的服务,它从整个 Web 收集信息,并将数亿个网页文档获取给用户。

面试官在回答这个问题时可以讨论哪些类型的问题?

  • 你如何存储先前的搜索查询?
  • 你将使用什么技术来保持数据新鲜?
  • 你将如何找到与已输入字符串的最佳匹配?
  • 如果用户输入速度过快,你将如何处理更新?
  • 你将使用什么方法来查找新的网页?
  • 你将使用什么方法来优先处理动态变化的网页?
  • 你如何确保爬虫不会无限循环在同一域上?

17) 如何设计一个像 Github 这样的 API 速率限制器?

当面试官向候选人提出这个问题时,他/她希望你设计一个服务或工具,该工具监控服务同意允许的每窗口时间内的请求数量。如果请求数量超出限制,速率限制器将阻止所有多余的请求。

你在设计此服务时应牢记以下功能:

  • 你必须限制一个实体在时间窗口内可以向 API 发送的请求数量。例如,每秒十个请求。
  • 速率限制应适用于分布式设置,因为 API 可通过一组服务器访问。
  • 你必须很好地处理软限制和硬限制。

18) 搜索引擎的作用是什么?如何设计一个像 Google、Bing 或 Baidu 这样的搜索引擎?

搜索引擎是一种程序或软件系统,旨在系统地搜索万维网,以查找特定信息,这些信息在文本网页搜索查询中指定。当我们尝试在搜索引擎中搜索某项内容时,结果通常会按顺序显示。这些搜索结果被称为搜索引擎结果页面(SERP)。自定义搜索引擎可以用于组织内部的特定部门,以系统地查找某个项目或重要的员工信息。面试官提出这个问题是为了检查你是否能做出符合公司需求的设计。你可以详细说明整体架构,并使用以下基础来解释。你还可以考虑讨论其他相关问题,例如网站前端性能、测试搜索引擎改进,以及将先前的搜索数据和趋势整合到索引中。


19) 如何设计一个 ATM 系统?

在银行系统中,ATM 用于客户存款和取款。它还方便用户查看其账户余额。你应该制定一个设计方案来创建这个系统。

你在设计此服务时应牢记以下功能:

  • 每个用户在银行至少有一个银行账户。
  • 用户应能够插入卡并进行交易。
  • ATM 应根据输入的 PIN 码验证用户。
  • 用户通过身份验证后,应能够进行交易,即查看账户余额、存款和取款。
  • 用户在任何给定时间只能进行一项交易。
  • 交易结束后,应向用户显示适当的消息,以告知交易的成功/失败。
  • 交易结束后,用户应能够开始另一项交易。
  • 用户退出时,机器应退还卡片。

ATM 架构

以下是 ATM 中可能的状态列表:

  • 准备就绪(READY):这是第一个状态,准备接受 ATM 卡。
  • 输入 PIN 码(ENTER PIN):用户插入卡后,此状态等待用户输入 PIN 码。
  • 选择交易(SELECT TRANSACTION):用户选择交易后,此状态等待用户选择交易。
  • 存款(DEPOSIT):用户选择存款选项后,此状态等待用户插入现金。
  • 取款(WITHDRAW):用户选择取款选项后,此状态等待用户输入所需金额。
  • 显示余额(DISPLAY BALANCE):交易结束后,此状态显示账户余额,并等待用户决定下一笔交易或退出。
  • 现金已吐出(CASH DISPENSED):交易结束后,此状态用于吐出现金,并等待用户领取。
  • 显示错误消息(ERROR MESSAGE DISPLAYED):如果 ATM 现金不足或用户账户余额不足,此状态用于显示错误消息,并等待用户决定下一笔交易或退出。
  • 无效现金退还(INVALID CASH RETURNED):交易结束后,如果发现任何无效货币,此状态用于退还无效货币,并等待用户领取。
  • 显示退出消息(EXIT MESSAGE DISPLAYED):用户退出后,此状态用于显示退出消息并退还卡片。
System Design Interview Questions

20) 系统设计中有哪些不同类型的文档?

系统设计主要使用四种类型的文档:

  • 程序文档
  • 系统文档
  • 运维文档
  • 用户文档

21) 准备文档时应牢记什么?

我们应该记住,我们在系统设计的每个阶段都需要准备文档。


22) 在系统设计过程中,在哪里进行问题分析?

在系统设计中,问题分析是在系统分析阶段进行的。


23) 组织规模是系统失败的因素吗?

否,组织的规模不能被视为系统开发和设计项目的因素。


24) 你对“控制器”一词有什么理解?

控制器是一种程序组件,用于做出决策。它还用于指导其他组件。


25) 什么是算法?算法的用途是什么?

算法是一系列有限的、明确定义的、可计算机实现的指令,用于解决一类问题或执行计算。它通常在数学和计算机科学中使用。

算法应始终是无歧义的,并用作执行计算、数据处理、自动推理和其他任务的规范。

算法的特点

  • 算法是解决复杂计算问题的一种非常有效的方法。
  • 算法可以在有限的空间和时间内表示。
  • 算法应以明确定义的正式语言来计算函数。
  • 算法从初始状态开始,经过一些描述计算的指令后,会经历有限数量的明确定义的连续状态,最终产生输出。
  • 输出是最后一个,并终止于最终的结束状态。
  • 在算法中,从一个状态到下一个状态的转换不一定是确定性的;一些算法,称为随机算法,会结合随机输入。

26) 系统分析和设计中的“自顶向下”方法是什么?

自顶向下方法是一种信息处理和知识排序策略,用于软件、人文科学和科学理论以及管理等各个领域。它也被公司和组织使用。它也被称为分步设计和分步细化。


27) 在自顶向下方法中,我们必须做什么?

在自顶向下方法中,我们必须识别顶层函数,然后创建由低级模块和组件组成的层次结构。


28) 你对“系统研究”有什么理解?

系统研究是用于确定是否、在何种程度上以及如何使用自动数据处理设备的详细研究过程。此过程包括对现有系统的分析和新系统的设计,以及系统规范的开发,这些规范为选择设备提供了基础。


29) 系统研究的重要方面有哪些?

系统研究是设计任何系统的主要要求。以下是最重要的系统研究方面列表:

  • 首先,我们必须识别当前问题,然后确立新目标。
  • 详细研究现有系统。
  • 记录现有系统。

30) 自动完成功能是什么,如何设计它?

自动完成是一项用于预测用户正在输入的下一个单词或单词剩余部分的功能。自动完成功能用于加速人机交互。它能在用户在文本输入字段中只输入几个字符后,正确预测用户想要输入的单词。它也称为单词补全功能。

在设计自动完成功能时,我们应牢记以下功能:

  • 确保类型提示建议已开启。
  • 系统应处理每秒的查询量。
  • 我们必须为建议提供个性化支持。
  • 确保存储的数据量。

31) 系统分析和设计中最重要的结构化工具是什么?

以下是系统分析和设计中最重要的结构化工具:

  • 数据流图
  • 数据字典
  • 决策树
  • 结构化英语
  • 伪代码