Skip to content

加餐2 读这些书,帮你学懂DDD

你好,我是钟敬。

今天是大年初五。如果你还在继续学习,那么我也要继续为你点赞!这节课是春节策划的第2期,我们谈谈学习DDD可以读什么书。同时,我也会分享一些自己的读书体会,希望我们共同进步。

DDD的“老三篇”

现在国内外DDD方面的书已经出版了不少,其中有三本出现最早,影响最大的大部头,我把它们称为 DDD的“老三篇”。一本是《领域驱动设计——软件核心复杂性应对之道》(以下简称《领域驱动设计》),另外两本是《实现领域驱动设计》和《领域驱动设计模式、原理与实践》。

《领域驱动设计》

图片

Eric Evans的《领域驱动设计》是奠基之作,书中提出了DDD的概念,说明了这种方法的基本原理和主要内容。

我认为这本书应该是学习DDD的必读书。不过很多人觉得这本书晦涩难懂,因此他们就转而阅读“老三篇”里另外两本书了。

而我自己读这本书的时候并没有觉得难懂,反而有豁然开朗的感觉。我分析,感觉这本书难懂的主要原因是缺乏面向对象方法学的基础。而当年,我读这本书的时候,已经研究了面向对象分析和设计一段时间了。

所以,如果你一开始确实没有完全读懂,那么可以把前面几章先读个大概,把不知所云的部分标记出来,然后补一下面向对象方法学的基础,再回过头来读原书,说不定就能够茅塞顿开了。稍后,我会推荐几本关于面向对象基础的图书。

另外还有两个原因提高了这本书的理解成本:一是这本书有一定深度,需要有一定的开发经验,并且有一定思考,才能产生共鸣;另一个是翻译问题,我们后面再聊怎么克服。

虽然这本书已经是经典了,但也存在一些改进余地。个人认为,其中比较大的问题是没有把“领域建模”和“模型的实现”两者的边界区分清楚。

前者应该只包含业务概念,后者则要进一步包含技术概念。比如,作者讲值对象的时候,说值对象的特点是“不用区分哪个是哪个”。这种说法其实是从实现的角度来说的,而不是从业务概念的角度。学习了这门课程里关于值对象的几讲(第 181920 节课)以后,你可以再对比一下原书讲值对象那一节,大概就能明白我说的意思是什么了。

总之,建议在读书和实践时,要不断问自己一个问题:哪些是纯粹的业务概念,哪些是领域专家不关心的技术概念。

《实现领域驱动设计》和《领域驱动设计模式、原理与实践》

图片

图片

另外两本书里,《实现领域驱动设计》是《领域驱动设计》原书出版了9年以后写的,而《领域驱动设计模式、原理与实践》是在《领域驱动设计》原书出版的15年以后写的。

两本书都很厚,都雄心勃勃地希望解决DDD落地难的问题。它们补充了原书中一些没有包含的内容,比如说事件驱动架构、CQRS等等,也从另外的角度重新阐释了《领域驱动设计》原书中的基本概念。

这两本书对大部分DDD概念的理解还是很到位的,值得参考。但是,这两本书也有一定的不足。主要是《领域驱动设计》原书中的一些思想精华反而被抛弃了,因此显得深度不够。比如说对领域建模技能的深入探讨、模型的重构、大型结构等等。不知是出于浅显易懂的目的,还是作者本身理解不到位。另外,这两本书对“核心域”的理解和原书也是不同的。

对于这两本书,我的建议是,如果你还没读过它们,那么最好还是从《领域驱动设计》入手,在建立了比较正确的观念后,再有选择地参考另外两本。比如说,读了《领域驱动设计》中聚合的部分,发现还不是很明白,可以再读读另外两本的对应章节,看看别人是怎么说的。另外,这两本书中补充了一些内容,原书里没有,也可以重点看看。

如果你已经先读了后两本书,也没关系,但心里要知道,在没有读《领域驱动设计》原书的时候,未必能理解DDD的全貌,最好还是找时间再读读原著。

补充面向对象方法学基础

如果你想补充面向对象的基础,我推荐两本书《UML和模式应用》以及《面向对象分析与设计》。

你可能会问,为什么我没有推荐《设计模式》《Effective Java》之类的书呢?因为这里强调的是面向对象 方法学,是包含面向对象分析、设计、编码的整体。而《设计模式》只关注设计,《Effective Java》重点则在于Java 编程,虽然它们都很值得读,但对读懂《领域驱动设计》帮助不大。

《UML和模式应用》

图片

《UML和模式应用》作为面向对象方法学的入门读物,被很多业界大咖推荐过。目前出到第三版。

这本书的优点在于不是空谈理论,而是用一个例子贯穿始终,因此容易理解。另外,虽说是入门读物,但实际上也不乏深度。如果你能深刻理解它的话,应该可以达到面向对象开发的中级水平了。我们的课程围绕一个具体案例,采用几个迭代讲解的做法,实际上就受到了这本书的影响。

《面向对象分析与设计》

图片

《面向对象分析与设计》是Booch大师的代表作,目前也出到了第三版。前两版是Booch独立写的,第三版引入了另外几位作者合著。

Booch是面向对象方法学的奠基人之一,也是UML的三个发明者之一,在软件开发方法学上面具有开创性的成就。他的学术地位超过了前面说过的几本书的作者,包括Eric Evans。

这本书写得也是深入浅出,不难读懂,而且获得了有“软件界奥斯卡”之称的Jolt大奖。读这本书,能帮你了解真正的大师是怎么想问题的。

你可以在这两本书中选择一本来读,理解个六七成,再读《领域驱动设计》,可能就会有感觉了。

不过,相比《领域驱动设计》,这两本书介绍的方法还是比较“传统”的。例如《UML和模式应用》所参照的UP(也就是统一过程),相比目前流行的敏捷方法,还是太重了一些。我在课程里的 第7节课 也提过DDD和传统方法的区别,你可以体会一下。总之,尽信书不如无书。

学习UML

无论是读《领域驱动设计》原书,还是补充面向对象基础的两本书,都是用UML来建模的。如果你想把UML再学透彻一点,可以读一读《UML用户指南》和《UML精粹》。

《UML用户指南》

图片

《UML用户指南》是由UML的三个发明人合写的,权威性毋庸置疑。其中一个作者就是前面提到的Booch,另外两位作者在面向对象方法学的开创性地位,也不亚于Booch。

而且,这本书的几位译者都是学院派,在术语的翻译上字斟句酌。比如说,Stereotype 这个词,过去有译作“版型”的,有译作“构造型”的,本书则译作“衍型”,可以理解为“衍生出来的符号类型”,意思很贴切,所以我们的课程也沿用了这种译法。

《UML精粹》

图片

《UML精粹》是Thoughtworks 的首席科学家 Martin Fowler 写的。另外,本书的译者徐家福老先生,也是我国计算机方面的先驱之一。

之所以叫“精粹”,是因为UML本身的体系比较庞大,而作者选取了一个开发者最常用的子集来介绍,比较少用的细枝末节就不讲了。

有一些想学UML的同学,就是觉得UML太复杂,担心学不会,所以打了退堂鼓。其实,围绕本书中的子集来学习就足够了。

这两本书各有特色。《UML用户指南》更加标准和规范,而且可以看出发明UML时的一些初衷,缺点是深度略有不足。《UML精粹》则个人风格明显,不乏真知灼见。我们在课程的 第20节课 里提到的“属性和关联的等价性”,就是出自这本书,而《UML用户指南》里则没有讲这个比较深入的原理。

不过《UML精粹》在一些术语的使用上,并没有《UML用户指南》这么标准。这是由于UML经历了由第一版到第二版的重大变革,而Martin Fowler有时会用到旧的术语。

这两本书一定程度上是互补的,你可以根据自己的偏好,先读其中一本,对于不太理解的部分,再参考另一本的相应章节。

领域建模进阶

当你掌握了前面说的面向对象基础、领域驱动设计等内容后,应该可以解决中等难度的问题了。但是遇到业务需求更复杂、灵活的情况,可能还是觉得不好应付。这时可以在领域建模技术的深度和广度方面继续拓展,这里我推荐几本有帮助的书。

《分析模式》

图片

第一本是Martin Fowler写的《分析模式》。

在《领域驱动设计》原书的第11章专门讲了“应用分析模式”。我们不妨把《分析模式》和著名的《设计模式》对照一下。如果不学习设计模式,你是不知道复杂的面向对象设计里有这么多“道道”的。同样,《分析模式》则讲解了真正复杂的领域模型到底长什么样。所以读这本书可以使你向领域建模的深度方向拓展。

仅从烧脑程度来说,这本书应该和《设计模式》不相上下。但由于本书的重点是领域模型(书中称为概念模型),所以牵涉到了组织管理、合同管理、财务管理、金融产品等不同的业务领域知识,而不像《设计模式》那样,只是纯粹的设计技术。这就给我们理解内容又增加了一重难度,不过也正因为这个原因,这本书还能让你在“广度”方面拓展。

因为这本书有一定难度,所以你可以先尝试读两三章。如果感觉良好,就继续;否则,可以先读前面“补充面向对象方法学基础”推荐的书。基础补足,再积累了一定的实践经验以后,应该就可以读懂这本书了。不过,这本书出版也比较早,个别地方和现在DDD的观念未必很一致了。你可以先读一下,也欢迎在留言区分享自己的想法,我们后面再找时间探讨。

这本书十几年前曾经有一个中译本,在翻译方面还是有一些改进余地的。我前两年把这本书重新翻译了一遍。现在大家能买到的就是我的新译本。虽然有点老王卖瓜了,但如果你刚好手里有这本书,也期待你的宝贵意见。

《对象模型——策略、模式与应用》

图片

对于领域建模的高级技能,还有一本书也不错,就是Coad的《对象模型——策略、模式与应用》(后面简称《对象模型》)。Coad在面向对象方法学的建树不亚于UML的三个作者。之前有些同学问到的四色建模,也来源于Coad的另一本书《Java Modeling in Color with UML》。

《对象模型》一书通过5个实例,讲解了 177 个建模策略和 31 种模式。这本书难度比《分析模式》要低一点。多年前同样出过一个中译本,翻译质量也有提高的余地。我曾经问一家出版社是否可以由我把这本书重译一下,对方说现在讲面向对象的书不吃香了。

《数据模型资源手册》

图片

如果你还有余力,想在广度上更进一步,可以读一下《数据模型资源手册》。这是一套书,共3册,总结了大量不同业务领域的数据模型。尽管这本书是按更早期的数据建模思路写的,但其实和面向对象的领域模型是相通的。如果你掌握了面向对象方法学的基础,不难把这套书里的内容运用到面向对象的领域建模中来。

读书心得:怎样拯救被烂翻译毁掉的好书

读计算机的书,最怕的一件事就是原书本来非常棒,但翻译质量“有待提高”。多年前,我读翻译的书,凡是看不懂的时候,就会认为自己水平太低。但后来逐渐发现,多数看不懂的地方,都是翻译的问题。

直到我自己也翻译书了,才发觉不能太苛责译者。这是因为,翻译其实是一件非常困难的事,哪怕一个语气词用错了,意思可能就变了,而且有些内容牵涉到更深层的历史文化背景。

按理说翻译是要经过专门训练的,大学里就有专门的翻译专业。但现状是,懂翻译的人不懂IT,懂IT的人不懂翻译,这就尴尬了。

我虽然翻译过书,但英文水平其实属于半桶水,读英文原著也非常慢。不过这两年倒是总结出一个相对靠谱的经验:就是买一本中文版,同时找一本英文版。先读中文版,觉得有怀疑或读不懂的地方,再对照英文原文。这样,虽然速度会稍慢一点,但基本上可以把这本书“拯救”了。

下节课,我继续和你分享在架构、编程领域里,对DDD落地有帮助的图书,敬请期待。