系统设计面试的目的是评估软件工程师在涉及多个组件的现实世界软件系统设计方面的技能。系统设计问题通常给予更有经验的候选人(拥有几年经验)。实习生通常不会被给出系统设计问题,因为很难期望实习生具有足够的和相关行业经验来很好地回答这类问题。
系统设计面试的类型
系统设计问题可以以不同的形式出现:
- 后端/分布式系统设计:候选人被要求设计跨多个服务器或数据中心工作的系统。主题包括后端架构、数据库模式设计、数据复制、容错、消息队列、一致性模型等。
- API系统设计:设计大型系统内的API(例如REST),或者软件组件内的方法。
- 面向对象设计:面向对象设计面试侧重于设计类、对象及其关系。候选人通常被要求创建类图、定义接口,并讨论设计模式。
- 前端系统设计:设计复杂客户端应用程序或UI组件的架构。更多地强调客户端和服务器之间的客户端和API设计。
作为软件工程师,你最常遇到的系统设计类型是后端/分布式系统设计类型。一些常见的后端系统设计面试问题包括:
- 设计URL缩短器(例如Bitly)
- 设计社交媒体网站(例如Twitter)
- 设计视频观看网站(例如YouTube)
- 设计聊天服务(例如Telegram、Slack、Discord)
- 设计文件共享服务(例如Google Drive、Dropbox)
- 设计共享出行服务(例如Uber、Lyft)
- 设计照片分享服务(例如Flickr、Pinterest)
- 设计电子商务网站(例如Amazon、eBay)
- 设计招聘门户(例如LinkedIn、Indeed)
- 设计网络爬虫(例如Google)
:::info
系统设计内容仍在建设中,但以下是一些资源可以帮助你同时学习。
:::
高质量资源
- "前端系统设计指南"由GreatFrontEnd提供:我自己编写的免费系统设计指南,专注于前端的系统设计,例如如何设计Facebook的新闻流、自动完成组件、图片轮播等。
- 系统设计速成班:由Meta和亚马逊前工程师构建的免费课程,涵盖交付的基础知识、高级概念和核心技术。通过实际问题的“常见难题”,引导您了解各种设计决策以及如何应对它们。
- 系统设计通讯:每周关于系统设计的通讯。还可以免费获得强大的系统设计模板。
- ByteByteGo:这是Alex Xu的新的系统设计课程,他是系统设计面试书籍的作者,在亚马逊上取得了畅销书地位。该课程涵盖了系统设计的基础知识,然后深入探讨了10个著名常见产品(例如设计YouTube、Facebook新闻提要等)和多个大数据和存储系统的设计(例如设计聊天系统)。对于每个深入探讨,都会解释概念,并使用全面的图表,使其无论资历水平如何都非常易于理解。
- "系统设计面试入门"由设计大师组织:这可能是互联网上最有名的系统设计面试课程,与大多数其他课程不同的是,它是纯文本的,这对于喜欢阅读而不是观看视频的人来说非常棒!它包含了一个流行的系统设计问题库以及系统设计基础术语表。我个人完成了这个课程,并强烈推荐许多其他人使用这个。
- "精通高级系统设计面试"由设计大师组织:我还没有尝试过这个,但它是由创造“精通系统设计面试”的同一批人制作的,所以应该不错!在我看来,除非你非常有经验或者追求专家职位,否则你可能不需要这个。
- "系统设计精选包"由设计大师组织:这个套餐允许你在设计大师的系统设计面试课程上以折扣价购买两个课程。最好的是,它是终身制的,不是订阅制的。
- "系统设计面试课程"由Exponent提供:这个课程涵盖了系统设计的基础知识,并且有一个庞大的流行系统设计问题数据库,还有模拟面试的视频。其中一些问题有文本答案和数据库模式及API供参考(我觉得很有帮助)。虽然订阅可能对仅系统设计面试内容的费用稍高,但他们还提供了质量的技术内容,用于数据结构、算法和行为面试。一个一站式平台覆盖所有技术面试准备方面,非常吸引人。
- Gaurav Sen YouTube - 系统设计播放列表: Gaurav Sen 是一位因其系统设计视频而广受欢迎的YouTuber。他在系统设计方面的播放列表为准备技术面试或想了解更多关于如何设计可扩展系统的软件工程师提供了全面的指导。该播放列表包含多个视频,每个视频涵盖与系统设计相关的不同主题。这些视频以简化复杂主题的方式呈现,便于初学者理解。
免费资源
- 系统设计入门: 这是关于系统设计最全面的资源。仅建议在有大量时间可用的情况下使用。
- 系统设计面试: 包含许多关于系统设计的提示链接,系统设计与著名公司的工程博客相关主题。
- 系统设计速查表: 简洁明了的内容。在系统设计面试前作为很好的复习资料。
- 系统设计路线图: 逐步指南,包括学习基本主题的文章和视频链接。
书籍
- 系统设计面试 - 内幕人士指南,第二版: 针对初学者的资源,学习系统设计,内容易于阅读和理解。