软件工程师十大系统设计面试问题
注:本文最初发表于Hackernoon。
设计大规模分布式系统已成为软件工程面试的标配。工程师在系统设计面试(SDI)中遇到困难,主要原因如下:
- 他们缺乏开发大型系统的经验。
- SDI 的非结构化性质。即使是拥有一定大型系统构建经验的工程师,也不太适应这类面试,主要是因为设计问题的开放性,没有标准答案。
在 SDI 中的出色表现非常值得称赞,因为它反映了您处理复杂系统的能力,并转化为面试公司将为您提供的职位和薪酬(工资和股票)。
如果您正在寻找资源来准备系统设计面试,请查看Grokking the System Design Interview。
在Educative.io,我们采访了数百位经历过设计面试的候选人。作为其中的一部分,我们整理了一份系统设计面试常见问题清单。
以下是一些常见问题,以及面试官希望你在设计系统时考虑的一些要点。
1. 设计 TinyURL 或 bitly(URL 缩短服务)
给定一个(通常)很长的 URL,你会如何设计一个服务来为其生成一个更短且唯一的别名?
请讨论以下问题:
- 如何为每个 URL 生成唯一的 ID?
- 如何在大规模情况下生成唯一 ID(每秒都会收到数千个 URL 缩短请求)?*您的服务如何处理重定向?
- 您如何支持自定义短网址?
- 如何删除过期的 URL 等?
- 如何追踪点击统计数据?
2. 设计 YouTube、Netflix 或 Twitch(全球视频流服务)
视频意味着您的服务将存储和传输数 PB 级的数据。您应该讨论如何高效地存储和分发数据,以便大量用户可以同时观看和共享数据(例如,想象一下播放《权力的游戏》等热门电视剧的最新一集)。
另外讨论:
- 您如何记录视频统计数据,例如总观看次数、赞成/反对票数等。
- 用户如何(实时)对视频添加评论。
你可以看看我之前的帖子“如何在 45 分钟的系统设计面试中避免设计 Netflix”
3. 设计 Facebook Messenger 或 WhatsApp(全球聊天服务)
面试官有兴趣了解:
- 您将如何设计用户之间的一对一对话?
- 您将如何扩展您的设计以支持群聊?
- 当用户没有连接到互联网时该怎么办?
- 何时发送推送通知?
- 你们能提供端到端加密吗?怎么做?
4. 设计 Quora、Reddit 或 HackerNews(社交网络+留言板服务)
该服务的用户可以发布问题或分享链接。其他用户可以回答问题或对分享的链接发表评论。该服务应该能够:
- 记录每个答案的统计数据,例如总浏览量、赞成/反对票数等。
- 用户应该能够关注其他用户或主题
- 他们的时间线将包含所有用户的热门问题和他们关注的话题(类似于新闻提要生成)。
5. 设计 Dropbox、Google Drive 或 Google Photos(全球文件存储和共享服务)
讨论如下事项:
- 用户如何上传/查看/搜索/共享文件或照片?
- 如何跟踪文件共享的权限
- 如何允许多个用户编辑同一篇文档
6. 设计 Facebook、Twitter 或 Instagram(拥有数亿用户的社交媒体服务)
在设计拥有数亿(或数十亿)用户的社交媒体服务时,面试官感兴趣的是了解您将如何设计以下组件
- 高效存储和搜索帖子或推文。
- 新闻推送生成
- 社交图谱(谁与谁成为朋友或谁关注谁——尤其是当数百万用户关注名人时)
很多时候,面试官会花整个面试时间来讨论新闻推送的设计。
7. 设计 Uber 或 Lyft(拼车服务)
在设计拼车服务时,请讨论以下事项:
- 最关键的用例——当客户请求乘车时,如何有效地将他们与附近的司机匹配?
- 如何为经常移动的司机和乘客存储数百万个地理位置。
- 如何处理司机/乘客位置更新(每秒数百万次更新)?
8. 设计一个网络爬虫或预输入(搜索引擎相关服务)
对于“预输入”功能,当用户输入查询时,你需要设计一个服务,该服务会根据用户输入的内容,推荐前 10 个搜索词。讨论以下内容:
- 如何存储以前的搜索查询?
- 如何保持数据新鲜?
- 如何找到与已输入字符串最匹配的字符串?
- 如何处理更新,以及用户打字太快?
对于网络爬虫,我们需要设计一个可扩展的服务,能够爬取整个网络,并获取数亿个 Web 文档。讨论以下内容:
- 如何查找新的网页?
- 如何对动态变化的网页进行优先级排序?
- 如何保证你的爬虫不会无限的卡在同一个域名上?
9. 设计 API 速率限制器(例如,用于 Firebase 或 Github)
您需要开发一个速率限制器服务,该服务可以:
- 限制实体在时间窗口内可以向 API 发送的请求数量,例如每秒 15 个请求。
- 速率限制应该适用于分布式设置,因为 API 可以通过服务器集群访问。
- 您将如何处理节流(软节流和硬节流等)。
10. 设计 Yelp 或附近地点/朋友(邻近服务器)
这项服务需要存储数百万个人/地点的位置信息。请讨论以下事项:
- 该服务的用户如何搜索附近的朋友或地点
- 如何对地点进行排名(基于距离、用户评论)。
- 如何根据人口密度有效地存储位置数据(例如,纽约市的一个街区可能比一个小城市有更多的地方/人)。
软件工程师面试准备资源
以下是一些可以帮助您准备软件工程面试的资源。
- 系统设计面试: 了解系统设计面试。
- 编码面试: 理解编码面试:编码问题模式。
- 进一步阅读: 系统设计面试剖析
祝面试愉快!
Fahim 是Educative的联合创始人。我们正在为软件工程师和讲师打造下一代互动学习平台。学习者通过互动课程进行学习。讲师可以使用我们的课程创建器快速创建和发布互动课程。如果您有兴趣发布课程或了解更多信息,请随时联系我们。
*所有产品名称、徽标和品牌均为其各自所有者的财产。
文章来源:https://dev.to/fahimulhaq/top-10-system-design-interview-questions-for-software-engineers