许多同学在读了我有关领域驱动设计的文章之后,都会咨询同一个问题,就是具体怎么学习领域驱动设计,有没有什么比较好的学习路径。以我自己的经验而言,其实领域驱动设计并不是什么高深的学问,而编程本身作为一项实践性很强的工作,追求的也是 Show me your code 这种形式。所以在掌握了一定的理论知识之后,结合自己的工作,参考一些开源代码,多写代码,多反思,掌握领域驱动设计自然水到渠成。
但是在自己动手之前掌握一些必要的理论知识,也是必需的。子曰: 学而不思则罔,思而不学则殆,没有经过系统的学习就盲目编写代码,容易陷入到自己的思维误区,游离在领域驱动设计的大门之外。所以掌握领域驱动设计的基本概念,了解它的核心思想,看一些具体的示例代码是学习领域驱动设计的第一步,而阅读高质量的图书则是迈出这第一步的最好方式。所以本次会推荐一些适合大家阅读的,有关领域驱动设计的书籍,按照我自己觉得恰当的阅读顺序排列,并简单的做一些评价。
基础知识
在学习领域驱动设计之前,最好对软件架构,设计模式有一定程度的了解。领域驱动设计中有许多软件架构相关的术语及上下文的描述,还提供了大量可供参考的模式,如果对相关知识一无所知的话很容易不知所云,无法理解领域驱动设计的重要概念。所以在真正学习领域驱动设计相关的知识之前,不妨先学习一些软件架构和模式的相关知识作为热身。以下是我推荐的相关入门书籍。
企业应用架构模式 & 分析模式
企业应用架构模式 (豆瓣)
分析模式 (豆瓣)
这两本书的作者是被国内开发者亲切的称呼为老马的 Martin Fowler。可能是因为他的<<重构>>名气太大,导致这两本书鲜少被人提及,特别是 <<分析模式>>。先看<<企业应用架构模式>>,这本书中罗列了「企业软件开发」中可能面临的问题,以及处理方式,并提供了大量的架构模式。特别是其中对于数据层访问的部分,列出了三种不同的解决方案,示例代码,更主要的是详细分析了各自的优缺点。而这一特点贯穿了全书,老马不仅告诉你了如何解决问题,也告诉了你不同解决方案之间的差异,大部分时候并不存在着完美的解决方案,架构的关键在于权衡。
如果说<<企业应用架构模式>>偏向于系统架构,那么<<分析模式>>更加倾向于业务。许多开发者或是架构师的问题往往不在于技术,而是对于业务的理解。如何更好的理解业务,能够用面向对象的方式设计合理的业务模型是系统架构的核心之一。<<分析模式>>中列出了大量在项目遇到的业务场景,例如如何设计一个账户结构;如果要支持多币种,如何设计一个支持多种货币的结构;更难能可贵的是老马在书中都是从一个简单的模型开始,然后指出其中的缺点,接着给出一个更近一步的模型,再以此反复,最终给出一个相对完善的模型(当然也是最复杂的)。
这两本书对于任何一个企业软件的开发者而言我觉得都应该是必读的,书中不仅提供了许多参考的方案与模式,更重要的是对于各种方案的分析与梳理,在开始学习领域驱动设计之前强烈建议先读一读这两本书。
理论和实现
领域驱动设计
领域驱动设计 (豆瓣)
首先推荐的肯定是领域驱动设计的开山之作,也是领域驱动设计发明者 Eric Evans 的著作。这本书对于学习领域驱动设计的必读,书中介绍了领域驱动设计的背景,术语,基本概念,并使用了作者参与的几个项目作为示例,每一个重要的概念,名词,术语都能在书中找到。但是我个人觉得这本书并不是完美无缺的,最大的问题在于思路跨度较大,几个章节之间的衔接比较松散,如果没有一些架构或是模式的知识很难跟上作者的节奏。
这本书犹如一幅宏大的画卷,为我们展现了磅礴的气势,但是当我们需要去追究细节时却发现很多地方需要我们更多的思考。很多人也是通过这本书了解了领域驱动设计,但是大部分人读完之后却仿佛似懂非懂,可能明白了概念,但是无法落实到具体的代码上,抑或是对于领域驱动设计中的一些做法持怀疑态度,并没有理解作者的用心。
所以在读完这本书之后你需要继续学习。
实现领域驱动设计 & 领域驱动设计精粹
实现领域驱动设计 (豆瓣)
领域驱动设计精粹 (豆瓣)
曾经听过一种说法,要学习某个领域的知识时,第一本书虽然很重要,可以帮助你更有效的入门,但是最重要的却是第二本书,因为它可以帮助你更为全面的了解这个领域。至少在学习领域驱动设计这件事上,这种说法有一定的道理。我建议你的第二,第三本书领域驱动的书可以<<实现领域驱动设计>> 和 <<领域驱动设计精粹>>。这两本书的作者是同一个人,个人感觉精粹更像是一本<<领域驱动设计>>的笔记,对于<<领域驱动设计>>中的核心概念,例如限界上下文,聚合,实体做了更加详细的解释。这本书非常薄,中文版总共才 150 页不到,一个周末看完都绰绰有余。我建议你可以话一个周末,把精粹和之前<<领域驱动设计>>对照的看,把自己之前不明白的概念重新思考一遍,我想一定会有所收获。
当概念逐渐清晰后,你关心的应该是如何将领域驱动设计的思想落实到代码上。正如书名所示,<<实现领域驱动设计>>聚焦在具体的代码实现上。作者借助一个实际项目的例子,用代码将大部分领域驱动设计的概念,模式展现在读者面前。这本书相对而言就厚多了,甚至要比原书都厚,所以你不妨花些时间,不仅重温一遍这些知识,也细细的品味一下作者的代码。完整的代码作者都放在 Github 上,供你参考。
其实撇开这两本书还有一本 领域驱动设计模式、原理与实践 (豆瓣),国外评价也不错,但是因为其中大部分示例是用 .Net 技术,而我对 .Net 也不是很在行,所以也没有读过这本书,具体如何就留给读者你自己探索吧。
拓展视野
函数响应式领域建模 (豆瓣)
之前写过两篇有关函数式编程在领域驱动设计中应用的文章,其实里面大部分的思想也是来源一本书 —— <<函数响应式领域建模>> 。当你对领域驱动设计逐渐找到感觉,进而慢慢的得心应手,那么不妨看看这本 <<函数响应式领域建模>>。从函数式编程的角度出发,你一定会发现一片新的天地。在面向对象中一些领域驱动设计的实现可能并不优雅,而你也苦于找不到什么太好的解决方法,函数式编程很可能会给你惊喜。
<<函数响应式领域建模>>介绍了函数式编程的一些特定,例如抽象代数类型,不变性,高阶函数等,同时也把这些特性和领域驱动设计结合在一起,用具体的代码展示了如何解决领域驱动设计中遇到的各种问题,而代码也显得更加优雅,易于维护,非常值得推荐。
小结
以上就是我推荐的有关领域驱动设计的书单。虽然阅读并不能使你成为一个领域驱动设计的专家,但是在概念都没有搞清的情况下就一股脑的扎进代码里,最终可能也是白白浪费了时间。对于编程与架构而言,学习与实践是不可偏废的,再强大的理论还是要落实在代码上,希望你能够阅读更多的书籍,编写更多的代码,找到自己的领域驱动设计学习之道。
欢迎关注我的微信号「且把金针度与人」,获取更多高质量文章