设计大型分布式系统已成为软件工程访谈的标准部分。 工程师在进行系统设计面试(SDI)时遇到困难,主要是由于以下两个原因:
- 他们缺乏开发大型系统的经验。
- SDI的非结构化性质。 即使是在构建大型系统方面有一定经验的工程师也不愿意接受这些采访,这主要是由于设计问题的开放性无法得到标准答案。
SDI的出色表现非常可取,因为它反映了您使用复杂系统的能力,并转化为面试公司将为您提供的职位和薪酬(薪金和股票)。
请查看以下资源,以准备进行软件工程面试:
系统设计面试: 进行系统设计面试
面向对象的设计面试: 对面向对象的设计面试
编码面试准备: Coderust 3.0:具有交互式挑战和可视化的更快的编码面试准备
数据结构: 用于访谈的数据结构
在Educative.io上 ,我们已经与数百名接受设计面试的候选人进行了交谈。 作为该过程的一部分,我们已经汇编了最常见的系统设计面试问题列表。
以下是一些最常见的问题,以及一些指向访问员在设计系统时要考虑的事项的指针。
1.设计TinyURL或bititURL(URL缩短服务)
给定一个(通常)长的URL,您将如何设计将为其生成较短且唯一的别名的服务。
讨论如下内容:
- 如何为每个URL生成唯一的ID?
- 您将如何大规模生成唯一的ID(每秒发送成千上万个URL缩短请求)?
- 您的服务将如何处理重定向?
- 您将如何支持自定义短网址?
- 如何删除过期的URL等?
- 如何跟踪点击统计信息?
2.设计YouTube,Netflix或Twitch(全球视频流服务)
视频意味着您的服务将存储和传输PB和PB的数据。您应该讨论如何有效地存储和分发数据,以使大量用户可以同时观看和共享它们(例如,想象一下流传最新的热门歌曲)电视节目,例如《权力的游戏》。
另外,讨论:
- 您将如何记录有关视频的统计信息,例如观看总数,上投票/下投票等。
- 用户如何(实时)在视频上添加评论。
3.设计Facebook Messenger或WhatsApp(全球聊天服务)
采访者有兴趣了解:
- 您将如何设计用户之间的一对一对话?
- 您将如何扩展您的设计以支持群聊?
- 用户未连接到互联网时该怎么办?
- 何时发送推送通知?
- 您可以提供端到端加密吗? 怎么样?
4.设计Quora或Reddit或HackerNews(社交网络+留言板服务)
服务的用户可以发布问题或共享链接。 其他用户可以回答问题或对共享链接发表评论。 该服务应该能够:
- 记录每个答案的统计信息,例如,观看次数,赞成/反对的总数等。
- 用户应该能够关注其他用户或主题
- 他们的时间表将包含所有用户的热门问题以及他们关注的主题(类似于新闻源生成)。
5.设计Dropbox或Google云端硬盘或Google相册(全局文件存储和共享服务)
讨论如下内容:
- 用户将如何上传/查看/搜索/共享文件或照片?
- 您如何跟踪文件共享的权限
- 您如何允许多个用户编辑同一文档
6.设计Facebook,Twitter或Instagram(具有数亿用户的社交媒体服务)
当设计具有数亿(或数十亿用户)的社交媒体服务时,访问员有兴趣知道您将如何设计以下组件
- 高效的存储和搜索帖子或推文。
- 新闻源生成
- 社交图谱(谁与谁成为朋友或谁跟随谁-特别是当数百万用户关注名人时)
很多时候,访问者会在整个采访过程中讨论新闻源的设计。
7.设计Uber或Lyft( 乘车共享服务)
在设计乘车共享服务时,请讨论以下内容:
- 最关键的用例-当客户要求乘车时,以及如何有效地将其与附近的驾驶员匹配?
- 如何为经常移动的驾驶员和骑手存储数百万个地理位置。
- 如何处理驱动程序/驾驶员位置的更新(每秒数百万次更新)?
8.设计Web爬网程序或预输入(与搜索引擎相关的服务)
对于预输入,随着用户在查询中输入内容,您需要设计一项服务,该服务将以用户键入的内容为开头,建议搜索的前10个字词。 讨论如下内容:
- 如何存储以前的搜索查询?
- 如何保持数据新鲜?
- 如何找到与已键入的字符串的最佳匹配?
- 如何处理更新并且用户输入速度太快?
对于Web Crawler,我们必须设计一个可伸缩的服务,该服务可以对整个Web进行爬网,并可以获取数亿个Web文档。 讨论如下内容:
- 如何找到新的网页?
- 如何确定动态变化的网页的优先级?
- 如何确保您的搜寻器不会无限停留在同一域上?
9. 设计一个API速率限制器(例如,用于Firebase或Github)
您应该开发一个可以提供以下功能的限速器服务:
- 将实体可以在一个时间窗口内发送给API的请求数限制为每秒15个请求。
- 速率限制应适用于分布式设置,因为可以通过服务器群集访问API。
- 您将如何处理节流(软节流和硬节流等)。
10.设计Yelp或附近的地方/朋友(一个邻近服务器)
该服务将需要存储数百万人/地点的位置。 讨论如下内容:
- 服务的用户将如何搜索附近的朋友或地点
- 如何对地点进行排名(基于距离,用户评论)。
- 如何根据人口密度有效存储位置数据(例如,纽约市的一个街区可能比小城市拥有更多的地点/人)。
软件工程师面试准备资源
以下是可以帮助您准备软件工程面试的一些资源。
- 系统设计面试: 浏览系统设计面试 。
- 编码采访: Coderust 3.0:使用交互式可视化工具更快地进行编码采访准备 。
- 数据结构: 用于访谈的数据结构 。
面试愉快!
如果您发现此帖子有帮助,请单击 符号并关注我以获取更多帖子。 如果您有任何反馈意见,请通过 Twitter 与我联系 。
Fahim是 Educative 的联合创始人 。 我们正在为软件工程师和讲师构建下一代交互式学习平台。 学习者通过参加互动课程来学习。 讲师可以使用我们的课程生成器快速创建和发布交互式课程。 如果您对发布课程感兴趣或了解更多信息,请随时联系。
From: https://hackernoon.com/top-10-system-design-interview-questions-for-software-engineers-8561290f0444