程序员和软件工程师的 30 大系统设计面试问题
程序员和软件工程师的 30 大系统设计面试问题
系统设计面试问题和系统设计问题列表,以及为准备技术面试的软件工程师和开发人员提供的解决方案
[
](https://www.educative.io/collection/5668639101419520/5649050225344512?affiliate_id=5073518643380224)
大家好,如果您正在准备 FAANG 或任何软件开发人员在 Startup 或 Spotify、Flipkart 或 Zoom 等科技公司的工作面试,但担心系统设计问题,那么您并不孤单。系统设计是一个令人生畏的话题,需要大量的学习和经验来设计一个真实世界的系统。
虽然这不是一门火箭科学,但很难获得有关不同系统设计组件和概念的知识。过去,我分享过 最佳系统设计课程 和 最好的软件架构课程 因为两者是相互关联的,所以在本文中,我将分享 20 个系统设计面试问题,并为具有零到 3 年经验的程序员提供答案。
系统设计面试就像其他面试一样,要求你能胜任任务。这意味着您必须做好充分的准备,以便在面试时可以轻松自如。如果你不想在面试时盯着屋顶,那么你必须找到通常被问到的问题 系统设计面试 以便您熟悉它们。
30 道系统设计面试题及答案
以下是您可以在下次面试之前准备的前 20 个系统设计面试问题。这些是非常基本的问题,作为开发人员,您应该已经熟悉它们,但如果不熟悉,请确保在进行任何系统设计面试之前进行练习。
- 什么是系统设计?
回答 : 系统设计是定义系统元素的过程,例如模块、组件、各种接口和架构。面试官提出系统设计问题以检查候选人的技术知识。这是了解候选人是否真正了解事物如何工作以及计算机和技术基础知识的好方法,而不仅仅是诸如扩展、高可用性、耐用性、弹性等流行语。
2.你如何设计一个网络爬虫? ( 解决方案 ]
回答 :网络爬虫服务从整个互联网收集信息/爬取并获取数百万个网络文档。设计网络爬虫时要记住的事情是:
- 采取的方法是寻找新的网页
- 对可以动态变化的网页进行优先级排序的方法
- 确保网络爬虫服务绑定在同一个域上
您可以尝试解决问题,但如果您遇到问题,我建议您结帐 深入了解系统设计面试 关于教育的课程,它不仅为这个问题提供了逐步解决方案,还为其他系统设计问题提供了解决方案。
这是一个不错的网络爬虫系统设计图:
[
](https://www.educative.io/collection/5668639101419520/5649050225344512?affiliate_id=5073518643380224)
3. 完成系统设计面试需要哪些关键技能?
以下是破解系统设计面试的关键技能:
- 良好的计算机基础知识
- 熟悉API集成
- 用户交互
- 熟悉如何部署和扩展系统
一般来说,系统设计师应该对不同的技术以及它们如何工作以及何时使用它们以在设计系统时做出正确的选择有广泛的了解。
4. 你们是如何设计 YouTube 的? [ 解决方案 ]
设计 YouTube 是一个有趣的系统设计问题,因为每个人都熟悉 YouTube,但设计像 YouTube 这样的视频流服务需要做很多事情。在存储数据、索引数据和提供流服务方面存在很多挑战。
可扩展性是另一个主要挑战,因为它需要快速并且应该能够支持数百万用户。您可以开始自己设计 YouTube,但如果您遇到困难或需要指导,您可以查看 Alex Xu 的这个免费教程,来自他的热门 ByteByteGo 系统设计面试课程 .
这是一个很好的流程图来解释视频上传过程:
[
](https://bytebytego.com/courses/system-design-interview/design-youtube?fpr=javarevisited)
5. 你如何设计像 bit.ly 或 goo.gl 这样的 URL Shortner?
这是另一个在 FAANG 面试中经常被问到的流行系统设计问题。这个问题提出了很多挑战,例如短 URL 和目标 URL 将存储在哪里。您应该如何为不同的目标 URL 每次创建一个唯一的短 URL,并为相同的目标 URL 返回相同的短 URL。
你可以尝试自己解决这个问题,但如果你卡住了,那么你也可以检查一下 URL Shortner的逐步解决方案 在 DesignGuru 上,这是我最喜欢的用于准备系统设计面试的门户之一。
[
](https://designgurus.org/link/84Y9hP?url=https%3A%2F%2Fdesigngurus.org%2Fblog%2Furl-shortening)
如果您喜欢他们的教学风格,我也建议您查看他们的 系统设计面试包 他们在这里分享他们最好的系统设计课程以获得折扣。
[
最佳系统设计
购买这两个系统设计课程可节省 10% 的费用并终身使用。
设计大师.org
8. 如何设计自动完成功能?
回答 : 以下是开发自动完成功能的重要事项:
- 要提供的预先输入的建议。
- 系统每秒处理的查询数。
- 支持个性化的建议。
- 要存储的数据量。
9、在系统设计过程中,问题分析在哪里做?
回答 :问题分析是在系统分析阶段完成的。
9. 系统设计中的文档类型有哪些?
回答 : 四种类型的文档是:
- 程序文件
- 系统文档
- 操作文档
- 用户文档
10. 水平缩放与垂直缩放有何不同?
回答 :
- 水平扩展是指将更多计算机添加到网络中,在分布式设备网络中共享处理和内存工作负载。简而言之,更多的服务器实例被添加到现有的池中,并且流量负载以有效的方式分布在这些设备上。
- 垂直扩展是指升级资源容量的概念,例如增加单机的RAM、添加高效处理器等或切换到容量更大的新机器。无需代码操作即可增强服务器的功能。
如果您想了解有关可扩展性概念的更多信息,那么我强烈建议您查看 Frank Kane 的 Udemy 系统设计课程 他详细分享了所有这些关键的系统设计概念。
[
11、你对负载均衡的理解是什么?为什么它在系统设计中很重要?
回答 :负载均衡是指在一组不同的后端服务器之间有效地分配传入流量的概念。这些服务器称为服务器池。现代网站旨在为来自客户的数百万个请求提供服务,并以快速可靠的方式返回响应。为了满足这些请求,需要添加更多服务器。
在这种情况下,必须在每个服务器之间有效地分配请求流量,以免它们面临过度负载。负载均衡器充当面对请求的交通警察,并将它们路由到可用的服务器上,这样不会使单个服务器不堪重负,这可能会降低应用程序的性能。
12. 什么是分片?
回答 :分片是将大型逻辑数据集拆分为多个数据库的过程。它还指数据的水平分区,因为它将存储在多台机器上。通过这样做,分片数据库变得能够处理比单个大型机器更多的请求。
考虑一个例子——在下图中,假设我们有大约 1TB 的数据存在于数据库中,当我们执行分片时,我们将 1TB 的大数据分成更小的 256GB 的块到称为分片的分区中。
13. 系统设计中可用的各种一致性模式有哪些?
回答 :
- CAP 定理的一致性表明,每个读取请求都应该获取最近写入的数据。当有多个数据副本可用时,就会出现同步它们的问题,以便客户端始终如一地获得新数据。以下是可用的一致性模式:
- 弱一致性:数据写入后,读请求不一定能得到新数据。这种类型的一致性在 VoIP、视频聊天、实时多人游戏等实时用例中效果很好。例如,当我们打电话时,如果我们失去网络几秒钟,那么我们就会丢失关于那段时间说了什么。
- 最终一致性:发布数据写入,读取最终将在毫秒内看到最新数据。在这里,数据是异步复制的。这些可以在 DNS 和电子邮件系统中看到。这在高可用性系统中运行良好。
- 强一致性:数据写入后,后续读取将看到最新数据。在这里,数据是同步复制的。这在 RDBMS 和文件系统中可以看到,并且适用于需要数据事务的系统。
14. 系统研究最重要的方面是什么?
回答 : 系统研究有以下三个最重要的方面:
- 识别当前问题并建立新目标。
- 研究现有系统。
- 记录现有系统。
15. 作为系统设计师,您如何设计一个通用的文件共享和存储应用程序,如 Google Drive 或 Dropbox?
回答 :上述应用程序用于存储和共享文件
、照片和其他媒体。我们可以设计一些东西,比如允许用户上传/搜索/查看文件或照片。它检查文件共享的权限并允许多个用户在同一个文档中进行更改。
16. 什么特征允许一个类从另一个类派生特征?
回答 :继承特性允许一个类从另一个类派生特征。但通常你应该使用 Composition 来重用代码
从另一个类而不是继承。组合比继承更灵活,使用组合有很多好处,比如更容易测试。你也可以看看我的帖子 选择组合而非继承的 5 个理由 更多细节。
17. 第一种被开发为纯面向对象编程语言的语言是哪一种?
回答 :Smalltalk 是第一个被开发为纯面向对象的编程语言的编程语言。虽然有许多支持 OOP 的优秀编程语言,如 Java、C++、JavaScript、Python 和 C#,但如果您认为穿着纯粹的鞋子,它们都不是纯面向对象的编程语言。
18. 您如何设计交易头寸聚合器或投资组合管理器?
您需要设计一个可以接受交易然后显示每个品种的头寸的系统,就像投资组合经理一样。您的系统需要支持
多个符号,它应该足够快以实时计算位置。
为了测试您的系统,您可以输入一组交易,包括买卖双方,然后查询系统以查看实时头寸。你可以先尝试自己解决这个问题,但如果你卡住了,你可以看到我的实施解决方案 Java中的贸易头寸聚合器 寻求指导。
21. 什么是 RAID?
回答 :RAID 代表独立磁盘的冗余阵列。 RAID 是一种专门用于数据存储的技术,它将各种物理磁盘驱动器组件组合在一个或多个逻辑单元中,以实现数据冗余和性能改进。
22. 你如何用 Java 设计自动售货机?
这是一个常见的 面向对象分析与设计题 这也在系统设计面试中被问到。你需要设计一个自动售货机,它可以出售几种产品,如可乐、饼干、巧克力和蛋糕。它可以接受硬币(Nickle、Dime、Pence 和 Cent)和小面额纸币
有多种方法可以解决此问题,但解决方案使用 状态设计模式 是最简单的。你可以自己试试,但如果你卡住了,你也可以看看我的帖子 如何用 Java 设计自动售货机 逐步解决此 OOP 设计问题。
[
](https://javarevisited.blogspot.com/2016/06/design-vending-machine-in-java.html)
这就是全部 编码面试的系统设计面试问题和答案 .如果你掌握了本文中所有的问题和答案,你的面试肯定会做得更好。这是您可以对自己做的最好的事情,因为这次采访将以某种方式改变您的生活。只要为那一天做好准备,你就会亲眼看到,如果你只做准备,一切都会变得简单而完美。
其他 面试题文章 你可能想探索
- 你必须练习的 5 个 OOP 设计面试问题
- 12个SQL查询面试题及解决方案
- 面试中的 20 个软件设计和模式问题
- 25个带有答案的递归面试问题
- 30 个 JavaScript 面试问题及答案
- 130+ 道 Java 面试题及答案
- 40多个面向对象的编程问题及答案
- 面向初学者的 50 个 SQL 和数据库面试问题
- 软件开发人员的 20 个算法面试问题
- 20+ Spring Boot 面试题及答案
- 20 个 JUnit 面试问题及答案
- 35 道 Python 面试题 1 到 2 年有经验
感谢您到目前为止阅读这篇文章。祝您的系统设计和编码面试一切顺利,如果您有任何不知道答案或疑问的问题,请随时在评论中提问。
附言 — 如果您难以解决系统设计问题,那么我强烈建议您参加全面的系统设计课程,例如 学习关于教育的系统设计面试课程 **** 这是准备系统设计面试的好方法。
[
深入了解系统设计面试 - 交互式学习
Design Gurus 的这门课程已经帮助超过 60k 订阅者完成了他们的系统设计面试 (SDI)。系统设计…
www.education.io
](https://www.educative.io/collection/5668639101419520/5649050225344512?affiliate_id=5073518643380224)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明