0 前言
系统设计问题是编程面试的重要组成部分,如果你想取得好成绩,就必须准备。在我的网站,分享了八股面试题时,也分享了一些系统设计问题,但粉丝们一直在要求更多问题,因为这个主题的确很难掌握,需要更多练习。我自己也收集了一些从朋友和同事那里获得的面试题,但为了这篇文章和自己的准备,我需要更多问题,然后我偶然发现了“深入系统设计面试”课程。这是一份优秀的资源,因为它不仅提供大量系统设计问题,还提供了解决这些问题所需的所有知识和工具。这门课逐步教你如何设计一个真实世界的系统,如Facebook、Twitter、Uber等。
当你将这门课程与问题列表结合时,你将拥有最好的材料来准备系统设计面试。在参加课程或查看我对某些问题的解决方案之前,你还可以先自己尝试所有这些问题。
顺便说一句,这对有一定的编程经验和计算机科学与软件设计基础知识的人最有效。如果你在这个领域完全是个初学者,我建议你首先从一门基础课开始学习基础知识,如Coursera上的《Java编程:软件设计原则》。
这门课程不仅会教你如何使用Java和多个类解决实际问题,还会教软件设计,软件设计不仅是编程,还涉及逻辑思维和设计,这对成为成功的软件开发人员非常重要。
一旦你建立了基础,你可以参加Udemy上的实际课程,如《底层系统设计[面试角度]》,以开发解决实际系统设计问题所需的技能,而解决问题的方法将由该课程教给你。
以下是击败任何编程面试所需的一些最流行的系统设计或面向对象分析和设计问题。
1 如何用Java设计自动售货机?
你需要编写代码来实现一个自动售货机,里面有一堆商品,如巧克力、糖果、冷饮,并接受一些硬币,如五分币、十分币、25分币等。确保你插入硬币,拿到商品,并找零。另外,编写单元测试来演示这些常见用例可以工作。如果遇到困难,可以阅读我的两篇文章(第1部分和第2部分),这些文章讨论了如何解决这些经典的系统设计问题。
2 如何设计类似goo.gl的URL短链服务?
这是一个常见的系统设计问题。给出一个(通常)长的URL,你将如何设计生成较短且唯一的别名的服务?
创建像goo.gl这样的URL缩短服务涉及几个关键组件。用户需要注册,以管理和跟踪他们缩短的URL。用户友好的网页界面或浏览器扩展简化了URL缩短。该服务应该为每个URL生成唯一的短代码,并提供分析来跟踪链接性能。可扩展的数据库存储原始和缩短的URL。实施速率限制和防止恶意链接等安全措施至关重要。使用内容分发网络(CDN)进行快速重定向和高可用性是明智之举。此外,在遵守隐私法规和确保链接持久性的同时,设计可扩展性和容错性是必不可少的考量。如果你不熟悉URL缩短服务,可以看看一些流行的服务,如谷歌的goo.gl和Twitter使用的bit.ly。
一定要提供数据库模式和一些设计决策背后的原理,如保留数据的时间、获取统计数据和分析等。如果遇到困难,可以参考DesignGuru上的“[Grokking the System Design Interview]”课程中的解决方案,这是准备系统设计面试的最佳场所之一。他们提供了包括系统设计、编码问题、动态规划和高级系统设计问题在内的课程,以备你的面试。如果你正在准备面试,也可以购买他们的课程套餐,不仅包括这门系统设计面试课程,还包括高级系统设计面试和所有的 grokking 课程,可以以大幅折扣的价格准备好面试。他们现在还提供了额外 20% 的折扣。
3 如何设计交通控制系统?
一个来自古老时代的经典系统设计问题,但仍很流行。确保你知道如何从一个状态过渡到另一个状态,如从红灯到绿灯,从绿灯到橙灯到红灯等。
4 如何设计限价订单簿?
限价订单簿用于根据价格和时间优先级在股票交易所匹配买入订单和卖出订单。你将如何实现?你将使用哪种数据结构?记住,匹配速度是关键,可靠性也是。如果你需要复习数据结构,可以查看数据结构与算法的Java课程,如果遇到困难,可以在此查看我的解决方案。
5 如何设计类似Pastebin的网站?
Pastebin允许你粘贴文本或代码,然后在任何你想要的地方共享链接到该代码。这不是在线代码编辑器,但你可以使用它来存储任何类型的文本。
6 你将如何创建自己的Instagram?
Instagram是一个提供一些自定义滤镜以增强照片质量的照片分享应用程序。
7 如何设计类似谷歌云端硬盘或Dropbox的全球文件共享和存储应用?
这些用于存储和共享文件、照片和其他媒体。如何设计允许用户上传/查看/搜索/共享文件或照片的功能?跟踪文件共享的权限,并允许多个用户编辑同一文档?
8 如何设计类似WhatsApp或Facebook Messenger的聊天应用程序?
你肯定使用过WhatsApp和Facebook,对吧?没有?如果你没有,让我告诉你,聊天应用程序允许你给你的朋友发送消息。这是点对点连接。你保持一个朋友列表,看到他们的状态并与他们聊天。在WhatsApp中,你也可以连接群组,但这是针对高级和有经验的开发人员的。至少,你应该提供一个设计来保持一个朋友列表,并从中发送和接收消息。
9 如何设计Twitter?
Twitter是一个流行的消息服务,允许你向所有关注者广播消息。你发推文,你的关注者看到这些消息,他们可以喜欢或转发。确保实现常见功能,如关注者、标签、推文、删除等。如果感觉没进展,卡住了,你可以参考系统设计面试:深入现代系统设计面试中的解决方案。
10 如何设计一个全球视频流服务,例如YouTube或Netflix?
设计像Netflix或YouTube这样的视频流服务,关键是在低带宽连接下平稳流动和缓冲,如何管理这些挑战。
11 如何设计ATM机器?
ATM机允许用户存取现金。它还允许用户查看他的余额。你如何设计这样一个系统?你面临的主要挑战是什么?
12 如何设计API速率限制器?
13 如何设计Twitter搜索?
14 如何设计类似谷歌的网页爬虫?
网页爬虫访问网站并爬取所有链接并索引它们,例如谷歌,以便它们以后可以出现在搜索结果中。爬虫也可以用于在一组目录中搜索特定文件,如何设计这样的东西?主要挑战是什么?
15 如何设计Facebook的新闻供稿?你将使用什么算法?
新闻供稿是Facebook的一个重要组成部分,它允许用户查看周围世界的动态,包括朋友和家人、他喜欢的页面、他关注的小组,当然还有Facebook广告。 新闻源排序算法的工作是为用户显示最重要的消息,这些消息可以产生高参与度。显然,来自朋友和家人的消息应该优先。如果感觉没进展,卡住了,你可以参考系统设计面试:深入系统设计面试中的解决方案。
16 如何设计类似Yelp或附近朋友的应用?
这是另一个流行的面向对象设计面试问题,你将被要求设计一个类似Yelp的应用程序,它可以帮助你找到附近的东西。它们由你的关系评论和建议。在构建此产品或设计解决方案之前,你可以查看Yelp以了解更多信息。
现在,进入设计部分。设计一个像Yelp餐厅点评或附近朋友位置社交网络这样的平台涉及几个关键组件。用户需要个人资料和偏好设置。 对于Yelp,餐厅需要列表、评论和评级。附近的朋友需要实时位置跟踪和地图。这两个平台都可以从社交功能中受益,如好友请求、通知和消息。可扩展的数据库管理用户数据、评论和位置历史记录。地理定位服务提供实时位置数据。 移动友好界面和自适应设计增强了用户体验。 此外,强大的推荐引擎、用户生成内容审核和隐私控制可确保功能和用户安全,同时遵守当地法规至关重要。
17 如何设计类似Uber、Grab或Ola的全球拼车后端服务?
Uber和Ola是两种最受欢迎的拼车服务,它将司机和乘客联系在一起。你要如何设计一个系统,允许乘客查看附近的出租车并预订它们?
例如,设计一个像Uber、Grab或Ola这样的全球拼车服务的后端涉及到健壮且可扩展的架构。它从需求收集开始,以了解用户期望、业务目标和目标市场。关键组件包括用户认证和个人资料、实时跟踪的地理定位服务、匹配引擎用于匹配乘客和司机、支付处理以及健壮的数据库系统来管理用户数据和行程记录。通常采用微服务架构以实现灵活性和可扩展性,云基础设施可以适应全球需求。此外,优先考虑数据安全性、遵守地区法规以及彻底测试性能和可靠性对于成功的全球拼车平台来说至关重要。
18 如何设计BookMyShow?
这是另一个流行的系统设计面试问题,你需要设计一个允许你预订电影院和活动门票的网站。这是印度的一个流行创业公司,但也带来了许多挑战,如预订家庭座位、保留优质座位等,但你不需要构建这些功能,只需要构建一个简单的解决方案,允许你预订门票。
19 如何设计类似Quora、Reddit或HackerNews的社交网络和留言板服务?
Reddit、Quora和HackerNews是一些最受欢迎的社交网站,用户可以在上面发布问题或分享链接。其他用户可以回答问题或评论共享的链接。你还可以查看Udemy上的完整设计面试课程-系统设计面试课程,以学习一些简单的技巧来解决实际的系统设计问题。
20 你如何设计一个类似Airbnb的应用程序?
如果你不知道Airbnb是什么,它允许一些用户上传出租房间,其他用户可以出租它们。一些功能仅限于管理员、发布者和订阅者。如果这个问题被问到你,你可以从解释功能开始,然后分享如何实现它。
例如,如果我在系统设计面试中问到这个问题,我会以系统的方式 approached 它。我会先讨论架构,强调可扩展性和用户体验。
首先,我会考虑微服务架构来处理各种功能,如房源列表、预订、评论和消息。这将允许每个组件的灵活性、可扩展性和独立开发。
对于用户体验,我会专注于响应灵敏且用户友好的网页和移动平台界面,确保直观的导航、高效的搜索和预订流程。合并地理定位功能以定位房源位置和交互式地图至关重要。
关于数据库,我会选择关系数据库和NoSQL数据库的组合,以高效处理结构化和半结构化数据。可以实现缓存机制以访问频繁访问的数据。
安全和隐私措施至关重要,包括安全认证、数据加密和遵守隐私规定。
可扩展性考虑包括负载平衡、水平扩展和性能优化监控。
支付处理集成、通知和实时通信将是需要解决的关键技术挑战。
在整个讨论过程中,我会强调彻底测试的重要性,包括压力测试和安全评估,以确保健壮可靠的应用程序。
以上是Java程序员常被问到的一些系统设计面试问题。顺便说一句,这些问题不仅对Java程序员有用,还对Python、C++和Ruby程序员同样有用。这些问题实际上与编程语言无关,而是测试你的软件设计和架构技能。
标签:面试题,Java,如何,系统,用户,2024,面试,课程,设计 From: https://blog.51cto.com/JavaEdge/8520108