我偶然发现了《系统设计面试:不为人知的内部指南》这本书(平装书和在线课程-均为25美元)。在几个人问我如何才能更好地构建分布式系统或大规模学习设计系统之后,我一直在寻找好的书籍资源。尤其是当他们没有机会将其作为日常工作的一部分时。
这个话题有点像鸡和蛋。在您设计一个大型系统之后,您将知道如何设计大型系统。但是,如果您还没有这样做,您将如何构建一个具有数亿个链接的,像bit.ly这样的URL缩短器?像Whatsapp这样的聊天应用程序?像Dropbox或Google Drive这样的文件存储系统?
在线上有很多资源-最著名的资源是GitHub上的System Design Primer或阅读High Scalability文章。就我而言,我正在寻找更具结构化的结构方法,而不是仅仅抛弃您在这些采访中需要了解的概念。
这本书是最真实的世界。我遇到过系统设计书,它为向尚未在大规模系统上工作的人们逐步讲授概念做出了坚实的努力。对于熟悉其中一些系统但又想涉足各种其他类型的大型系统的人来说,这也是令人欢迎的复习。从一开始就很明显,这本书是由熟悉系统的人大规模编写的。作者是Alex Xu,以前是Oracle,Zynga和Twitter的软件工程师。
本书附带了十多个案例研究,并引入了一个框架,并与这些案例研究一致使用。还有一本附带的在线课程,其内容与本书相同,但是您可以在Web浏览器中进行后续操作,并且图表为彩色。
系统设计面试可能会令人生畏,拥有一个如何进行导航的框架可以帮助您更好地控制自己。该书推荐了一个我同意的4个步骤:
了解问题并确定设计范围。我喜欢将其表述为确认问题,提出问题和明确限制条件。 "在系统设计面试中,快速给出答案会给您加分。 -这本书建议。他们是对的。
提出高级设计并获得支持。我看到人们经常跳入实施过程,而没有证实他们的方法满足约束条件,并且他们并没有过度设计。面试官希望进行对话-与现实生活中的设计类似-此步骤可以帮助您实现目标。
设计深入。一旦您知道自己走在正确的轨道上,就该收起袖子,深入了解细节。这是您需要了解系统领域的知识和词汇的部分。这本书将帮助您理解一些您需要的概念。诸如System Design Primer之类的资源在此阶段也有帮助。
包起来。采用看似明智的设计,您可能会发现瓶颈和需要改进的地方。
该书为一个小时的访谈列出了时间分配建议:几分钟可以理解,高级设计需要10-15分钟,深度学习需要10-25分钟,总结还需要更多时间。我不会过于说明性,但我建议不要在开始的前10分钟(足够的上下文)中开始深度学习,并留出时间进行总结。
我曾作为访问员进行过数十次系统设计访问。回到我在Facebook和Uber等公司进行采访时,我也收到了关于我的方法有多好(或不好)的反馈。
您应该避免的一件事是"只是记住"问题的解决方法。那离重点很远。我在Facebook面试时犯了这个错误,并被要求建立Instagram的一部分。我已经完成了此练习,所以我只画了一个复杂的系统。我从未与面试官谈论过约束或权衡。实际上,我从未进行过双向对话。
系统设计面试不仅涉及与面试官的沟通,也涉及系统和架构知识。这就是为什么尽管这本书将帮助您弥补在构建大型系统方面可能存在的空白,但它并不能替代您与某人在设计系统时的协作。
这本书的案例研究在问题领域中越深入越好,因此您必须在每个步骤中都了解相关概念。以速率限制器问题及其解决方法为例:
性能优化与监控。其中大部分属于生产和运行实际系统。
进一步阅读参考,链接到行业资源,例如Cloudfare如何构建其速率限制器或了解AWS API速率限制设置。
该书的一个优点是,书中的案例研究如何涵盖良好的基础以及各种问题:
这本书是我的坚定建议:不仅是为了准备系统设计面试,而且是为了增强您的系统设计能力。本书/课程带有典型的设计问题,并为它们带来了很好的逐步解决方法。但是,如果您仅阅读它们,就会错过这种资源的真正价值。
在阅读作者如何解决该问题之前,先要弄清楚如何设计系统。您会更慢地阅读这本书:但是这些概念会坚持下去。您不仅可以在面试中使用方法,还可以在与同事就如何构建系统进行辩论时使用这些方法。
我从书中错过了一些本来可以涵盖的主题。尽管该书在深入研究诸如速率限制,一致的哈希和分片等基本概念方面非常出色,还是在探索键值存储背后的场景方面做得很好,但我希望对缓存和复制策略之类的东西进行更多的探索。这两个主题在许多情况下都是相关的。
虽然这本书为每个问题都提供了不错的解决方案,但我错过了权衡取舍的替代解决方案。在某些情况下,您可以在机器数量(以及成本)和延迟之间进行权衡,在灾难恢复方面的成本或延迟方面,等等。通过示例更容易掌握这些概念。尽管本书在这个方面比我以前看到的更深入,但仍有更大的深度。
此外,这本书着重于后端系统设计。对于本地移动工程师或Web工程师而言,客户端系统的设计问题通常是不同的-我已经帮助设计了这两种类型的采访。公平地说,涵盖这些方法很可能超出了本书的范围。不过,对于非后端工程师而言,这本书可能会有所帮助,但可能不太适用。
阅读本书后,我与作者Alex取得了联系,祝贺他提供了扎实的资源。当我也在写书时,我们开始谈论他是如何写作的,以及他从这种经验中学到的东西。以下是一些有趣的事实,直接来自作者:
Alex在准备进行系统设计面试时就开始写这本书,但找不到足够的资源来做这本书。他的朋友很快变得感兴趣,他最终在课程和亚马逊上发布了第一版的课程。
这本书的第一版收到了很多读者的反馈。虽然本书有很多读者,但许多人抱怨图表不清晰,没有足够的案例研究。亚历克斯决定对所有反馈采取行动,并将本书的大部分内容重新改版为第二版。
该书的第二版花了一年的时间编写。亚历克斯每月大约进步一章。他分享了如何“易于理解”的想法。图表非常耗时,并且在"足够好"中找到了进度的平衡。读者遵循的速度。
随着时间的流逝,这本书进入了亚马逊上的100部计算机与技术书籍。在撰写本文时,它在该类别中排名第89。亚历克斯分享了这是一个有机过程的过程。这本书和随附的课程现在都非常受欢迎,以至于他考虑花更多的时间在它们上面。
您可以在此处预览在线课程的免费章节,并在亚马逊上获取该书。除了本书之外,这里还有一些其他有用的资源来学习如何构建真实的系统。
Google在2008年推出的具有高度可扩展性的架构。我发现了解十年前公司如何处理规模很有帮助。请记住,Google在2008年的规模已经超过了许多公司在2020年需要担心的规模。
YouTube架构于2008年。建立与YouTube类似的系统是一个普遍的挑战。最好早点了解YouTube是如何解决此问题的。
在Uber进行大规模的货币变动时,这有点不合时宜,因为我使用了本文介绍的系统,并写了一些我的经验。 Airbnb扩展其支付平台也是一个不错的选择。
GitHub上的System Design Primer:所有与系统相关的概念中最大的集合,值得了解。
《设计数据密集型应用程序》一书:这是一本有关分布式系统概念和构建块的必读书籍。它比这本书(或想要)要深入得多。这是更困难和更长的阅读时间。我的两分钱是任何认真研究分布式系统的人都应该读的书,这本书也在我的书架上。
通过educative.io进行系统设计访谈($ 66 /年)。从书中发现的示例材料来看,案例研究的数量类似,但图表较少,并且图表也不那么整洁。我听说过去有很多人推荐这门课程。
SystemsExpert by AlgoExpert(每年$ 79)10个系统访谈演练。根据此视频评论,这些是视频演练。如果您通过视频学习得更好,则对您来说可能会很好。我仍然建议暂停并提前绘图。巩固学习成果。
请注意,以下两门课程都是基于时间的订阅,这意味着一年后您将无法访问它们。很高兴看到《 Systems Design Interview》在线课程是一项终生购买,价格为25美元,这在当今的订户经济中是很少见的。
拥有20多名技术招聘人员聘请管理人员做出贡献,这是一份关于优秀开发者简历的综合指南。免费供工程师失业。在这里抓。
喜欢这篇文章吗?订阅我的新闻通讯,并在收件箱中获取以后的帖子。读起来不错,订阅人数超过5500。
订阅我的时事通讯,并及时了解实用的软件开发和工程职业发展。