系统设计问题比较棘手有很多原因。 其一在日常工作中你可能没有太多机会接触设计系统,尤其是对于junior engineer来说。其次,与算法问题不同,学习系统设计的资料在网上并不多,近几年网上出现了大量的资源,但是质量上参差不齐。当我第一次开始学习系统设计面试时(那是2019年了),我对系统设计没有任何经验。所以我不得不在网上找资源。我读的第一本系统设计书是Stanley Bellbrook和David L. White的《System Design Interview: A Strategic Guide for a Successful Interview》,我是在亚马逊上搜“系统设计面试”找到的这本书的。这本书没有太大帮助,因为它只是介绍了基本概念,没有实例。然后,我在educative.io上找到了一门名为“Grokking the System Design Interview”的系统设计课程(这个课程想必大家都知道了)。找到这个课程时我非常兴奋,因为这套课程有一系列的实例。我完成了这门课程,然后进行了几次面试,但结果仍然不理想。现在想想,我还是建议避免这门课程,因为它充斥着很多不必要的,有时甚至是误导性的内容,这些内容在真正的系统设计面试中很少涉及。尤其是它用了太多的篇幅去cover estimate那部分, 让人感觉就是拿来充字数的。如果他们近几年对这门课的内容有所改善,请留言告诉我。
后来我找到Artur Ejsmont的《Web Scalability for Startup Engineers》,情况开始发生变化。我忘了是如何找到它的。从书名上看,它似乎跟系统设计面试没有太多关系。但事实证明,它是一本非常适合系统设计面试的入门书。首先,在这本书中,你将学到系统设计面试中将要使用的所有components,包括web servers, caching, data replication, data partitioning, message queues, load balancer, DNS, CDN等。其次,在大多数系统设计面试中,你将被要求去scale a system。这本书介绍了三种scale的设计技巧。-baidu 1point3acres
. ----
1. Adding more clones
2. Functional partitioning
3. Data partitioning
..
这本书比较详细解释了各个components在scale a system中所扮演的角色和为什么要用到它们。正本书讲解了从一个只有一个server的小系统逐步到最后加入了上述所有components的一个大型的high avalability的系统。当我读完了这本书,我觉得我的对于how to scale a system有了更深的理解。.--
另一本很好的书是Martin Abbott和Michael Fisher的《The Art of Scalability, Scalable Web Architecture, Processes, and Organizations for the Modern Enterprise》。-baidu 1point3acres
在这本书中,你将读到在《Web Scalability for Startup Engineers》中看到的类似的观点。例如,它介绍了AKF Scale Cube,由x、y和z三个轴组成。每个轴描述了一种scale a system的方法。这三个轴大致对应于《Web Scalability for Startup Engineers》中的三种scale a system的设计技巧。这本书比较偏理论性,但仍然是一本很好的补充书。