加餐3 这些书里,藏着高手们的“不传之秘”
你好,我是钟敬。
虽然春节长假转瞬即逝,但今天我们还是给春节策划收个尾,继续说说能帮你落地 DDD 的相关图书。下节课,我们再继续更新正文内容,也给没跟上学习步伐的同学一点缓冲时间。
架构相关
落地DDD,除了领域建模以外,也离不开架构设计,近年说的比较多的是微服务架构。
《演进式架构》和《软件架构》
关于架构,先说两本书,《演进式架构》和《软件架构 —— 架构模式、特征及实践指南》。之所以放在一起说,是因为他们作者都有 Neal Ford,他是 Thoughtworks 的技术总监。
DDD强调领域模型要不断演进,集中体现在《领域驱动设计》一书的第三部分“通过重构来加深理解”。领域模型的演进,很可能导致架构的演进,这是一件比较困难的事情。
《演进式架构》就是讲架构演进的原理和技巧。这本书里提到了架构的质量属性、架构模式、演进策略等内容,但展开得还不够充分。估计作者是意犹未尽吧,于是又和人合写了另一本《软件架构》,深入讨论了在云时代软件的架构思维、架构风格、架构模式以及软技能等话题。
在微服务和分布式架构方面有三本可以参考。
《微服务设计》
《微服务设计》是比较早的全面介绍微服务的书籍,包含了微服务的概念、设计、集成、部署、运维、开发过程以及人员组织等多方面的内容,还是很有参考价值的。
《微服务架构设计模式》
《微服务架构设计模式》从模式的角度,介绍了微服务架构的方方面面。我多年前读过作者的另一本书《POJO in Action》,留下了不错的印象。这本书还有一个特点,就是用一个贯穿始终的案例来讲,而不像多数讲模式的书那样,每个模式都是独立讲解的。
《凤凰架构》
《凤凰架构》是周志明老师写的,也是我这次推荐的书里面唯一一本国人的作品(我也不想这样呀)。你即使没听说过这本书,大概也听说过他写的《深入理解Java虚拟机》吧。
《凤凰架构》分析了构建可靠的大型分布式系统的各种架构问题,理论上说,比微服务架构的概念要宽泛一些。
这本书的特点在于实践派和学院派的结合。一方面,很多内容都是来源于作者在实践中的经验之谈。另一方面,身为博士的周志明老师,谈到每个内容时,总是会从原理讲起,也会从历史的角度梳理某个技术点的来龙去脉,甚至最早的出处。这样的书读起来放心呀。
另外,极客时间有一门公开课 《周志明的软件架构课》,看内容应该就是《凤凰架构》的前身。这门课是免费的,如果你有兴趣的话,也可以看一看。
编程实践
领域模型的演进,牵涉到架构的演进。而架构的演进,最终是由代码层面的演进实现的。所以如果编程功力不足,也不能很好地实践DDD。在编程实践方面,这里推荐三本书。
《重构》
第一本是《重构》。前面介绍了Martin Fowler写的《分析模式》,而这本书也是怹老人家写的,而且影响更大。如果你没听说过重构的概念,只需要知道它是专门用来拯救烂代码的就可以了。
尽管老马不是第一个提出重构的人,但重构的技术得以在业界普及,则是拜本书所赐。另外,不论你是用 Eclipse 还是 IDEA,都会发现有一个“重构”菜单,其实也是由这本书来的,甚至菜单项的名称,多数都是来源于书中的重构手法,可见这本书影响之深远。
这本书的第一版是2000年出版的,目前大家能买到的是第二版。这本书有一个特点,就是如果只是“读”的话,是绝对学不会的,必须一边看书一边敲代码。
本书第一版用的是Java,第二版用的是JavaScript。不过这本书讲的实际上是普遍原理,而不局限于某种语言。你不一定要用 JavaScript 来实践,看着JavaScript,按照同样的原理,转换成你熟悉的语言来做一遍,一般也是没问题的。
《测试驱动开发》
第二本是《测试驱动开发》,作者是 Kent Beck。他是和 Martin Fowler 齐名的敏捷奠基人,也是极限编程的发明人之一。《测试驱动开发》是他的代表作。那么,为什么在编程实践方面,我会推荐一本讲“测试”的书呢?
测试驱动开发简称 TDD,是重要的敏捷技术实践。而 TDD 中所谓的“测试”,和我们之前理解的写完代码再做的测试,不是一个概念。与其说 TDD 是一种测试技术,不如说是一种详述需求和代码设计的技术。
在 TDD 的过程中,测试、设计、编码是融合在一起的不可分的过程。TDD 和代码重构的关联在于,重构代码时是很容易出错的,而 TDD 为程序编织了一张安全网,能够及时发现重构中的错误,从而极大地降低了重构的风险;另一方面,TDD 中又有一个专门的步骤就是“重构”。所以 TDD 和重构是两个互相依存,互为补充的技术。和《重构》一样,这本书也是一边读,一边敲代码才容易学会。
如果你希望有一位老师手把手地教你 TDD,也可以了解一下极客时间上的《 徐昊 · TDD 项目实战 70 讲》这门课,跟一位真正懂得 TDD 的专家一起写代码,更容易精进技术。
《代码整洁之道》
第三本书是《代码整洁之道》,讲的是怎样开发出容易理解,容易维护的代码。作者是 Robert C Martin,业内管他叫 Bob 大叔。他是和 Martin Fowler、Kent Beck 齐名的敏捷软件开发大师。
关于整洁代码,本来也可以看《代码大全》。不过那本书厚得可以作武器了,而《代码整洁之道》篇幅比较适中,可以节省大家的时间。当然,有时间的话,翻翻《代码大全》也是不错的。
上面三本书,虽然会用特定的语言来写例子,但讲的都是不局限于编程语言的普遍原理。至于特定语言的编程技巧,我们今天没有提太多。如果有兴趣,课后自己找找《Effective C++》《Effective Java》《Effective Python》之类的书就可以了。
读书心得
最后,再分享两点读书的心得。
“经”和“传”的关系
首先说说“经”和“传”的关系。在中国古代,把公认的权威著作称为“经”,把解释经的书称为“传”。比如说《春秋》是经,《春秋左氏传》(也就是《左传》)是传。《易经》是经,《系辞传》是传。古人强调经和传的地位是不同的,读“传”时,不要忘了读“经”。
不太恰当地类比一下,《领域驱动设计》原书好比是经,后来讲的 DDD 书好比是传。之所以 DDD 的很多概念众说纷纭,就是因为很多人只读过各种二手三手的资料,而没有通过读原著建立共同的概念基础。而且,我发现原书中的一些思想精华,似乎没有被后来的书充分发扬光大。所以我强调首先读原典,把其他的书作参考,哪怕开始时不容易读懂,也要迎难而上。当然,对原典也要本着“尽信书不如无书”的态度。
关于模式
下面再谈两句“模式”。你可能已经发现了,这两期特别策划里,我推荐的好几本书都牵涉到“模式”。《领域驱动设计》本身其实也是按模式的套路来写的,一共有四十多个模式。
软件开发的高手往往比新手能够更快,更优质地完成任务。那么,这些高手必然知道一些新手不知道的东西。这些东西过去常常是只可意会不可言传的。但是后来,有各路专家,把高手们的这些“不传之秘”,分门别类地总结出来,成为处理特定问题的既定解决方案。这就是“模式”。其中最早对软件开发产生重大影响的是《设计模式》,后来就掀起了轰轰烈烈的“模式运动”。
不论是分析模式、架构模式还是设计模式,凡是讲模式的书,都是提炼了大量实践中的精华才得来的。
读模式的书,难度和收获都会倍增。这类书读起来一般都会比较困难,因为里面的知识密度太大。但是另一方面,又好像同时有好几个专家给你上课,逼着你快速提高。而且,国外的学术风气比较严谨,敢写“模式”书的人,都是有自己的“金刚钻”的,否则也不敢在人前出丑。所以你可以有意识地多看看关于模式的书,只要肯下功夫,这是提高水平的捷径。
思考题
虽说是加餐,也给你留一道思考题吧。
发现没有,这两节课列的讲方法学和领域建模的书,年份普遍比较“老”,而讲架构的书,多数都比较“新”。你觉得这说明了什么呢?
下一节课,我们继续回到 DDD 专栏的主线,开始学习“泛化”,敬请期待。