《解构领域驱动设计》前言

简介: 《解构领域驱动设计》前言

写下本书内容第一个字的具体时间已不可考,从文档创建的时间看,本书的写作至少可以追溯到2017年11月,屈指算来,距今已是三载光阴流逝而过,为了本书,我已算得上呕心沥血。回想这悠悠三年,无论在万米高空的飞行途中,还是在蔚蓝海边的栖息之旅,抑或工作之余正襟危坐书桌之前,我的心弦一刻不敢放松,沉思于体系的构建,纠结于案例的选择,锱铢必较于每个文字的运用,我力求输出最好的文本,希望打造领域驱动设计技术书籍的经典!


我在ThoughtWorks的前同事滕云开我的玩笑,说:“老人家,你写完这本书,也就功德圆满了!”老人家是我在ThoughtWorks的诨名,虽然我对此称呼一直敬谢不敏,不过写作此书至今,我已心力交瘁,老人家的称谓也算名实相副了,至于是否“功德圆满”,就要交给读者诸君来品评了。


本书内容主要来自我在GitChat发布的课程《领域驱动设计实践》。该课程历经两年,完成于2020年1月21日。当时的我,颇有感慨地写下如此后记:


课程写作结束了。战略篇一共 34 章,15 万 5 千字;战术篇一共 71 章,35 万 1 千字;合计 105 章,共 50 万 6 千余字,加上两篇开篇词与这篇可以称为写后感的后记,共108 章,算是凑齐了一百单八将。如此成果也足可慰藉我为之付出的两年多艰辛时光!


我对《领域驱动设计实践》课程的内容还算满意,然而,随着我对领域驱动设计理解的蜕变与升华,我的“野心”也在不断膨胀,不仅希望讲清楚该如何实践领域驱动设计,还企图对这套方法体系进行深层次的解构。这也是本书书名《解构领域驱动设计》得名的由来。


所谓“解构”,就是解析与重构:

  • 解析,就是要做到知其然更知其所以然
  • 重构,则要做到青出于蓝而胜于蓝


我钦佩并且尊敬Eric Evans对领域驱动设计革命性的创造,他对设计的洞见至今让我赞赏不已,尤其在我彻底吃透限界上下文的本质之后,结合微服务之大行其道,更让我彻底佩服他的远见卓识;然而,尊敬不是膜拜,佩服并非盲从,在实践领域驱动设计过程中,我确实发现了这套方法体系天生存在的不足,于是,我在本书提出了GitChat课程不曾涵盖的领域驱动设计统一过程(Domain-Driven Design Unified Process),相当于站在Eric Evans的巨人肩膀上,我构建了自己的一套领域驱动设计知识体系。


领域驱动设计统一过程的提出,从根基上改变了本书的结构,我调整和梳理了写作的脉络,呈现出与《领域驱动设计实践》课程迥然有别的全新面貌,整本书不再满足于粗略地将内容划分为战略篇和战术篇,而是在领域驱动设计统一过程的指导下,将该过程的全部三个阶段作为本书的三个核心篇章:全局分析、架构映射与领域建模,再辅以开篇和融合,共分为五篇二十五章,全面而完整地表达了我对领域驱动设计的全部认知与最佳实践。在对内容做进一步精简后,本书仍然达到了43万余字,算得上是软件技术类别的大部头著作了。


该如何阅读这样一本厚书?


若你时间足够充裕,又渴望彻底探索领域驱动设计的全貌,建议还是按部就班、循序渐进地开始你的阅读之旅。或许在阅读开篇的三个章节时,你会因为太多信息量的一次性涌入,产生迷惑、困扰和不解,那只是因为我期望率先为读者呈现领域驱动设计的整体面貌,在获得整体印象之后,哪怕只是在脑海中存留了如雾一般朦胧的轮廓,也足以指导你开启对设计细节的理解和认识。


若你追求高效阅读,又渴望寻求困惑于领域驱动设计问题的答案,当然可以根据目录按图索骥,精准定位你最为关心的技术讲解。或许你会失望,甚至产生质疑,从目录中你获得了太多全新的概念,而这些概念从未见诸于任何一本领域驱动设计的书籍,那只是因为这些概念都是我针对领域驱动设计提出的改进与补充,它们是我解构全新领域驱动设计知识体系的得意之笔。——要不然,一本技术书籍怎么会写三年之久呢?


我自鸣得意的开创性概念一一罗列于此:

  • 业务活动:它是全局分析的基本业务单元,在统一语言的指导下完成对业务需求的抽象,既可帮助我们识别限界上下文,对它的细节分析还可以帮助开发团队开展领域分析建模、领域设计建模和领域实现建模;业务活动的粒度也是服务契约的粒度,由此拉近了需求分析与软件设计的距离,甚至可以说打通了需求分析与软件设计的鸿沟。
  • 菱形对称架构:虽然该模式脱胎于整洁架构与六边形架构,但它更为简洁,与限界上下文的搭配可谓珠联璧合,既保证了限界上下文作为基本架构单元的自治性,又融入了上下文映射的通信模式,极大了丰富了设计元素的角色构造型。
  • 场景驱动设计:采用过程式的设计思维,却又遵循面向对象的职责分配,从而在提高设计质量的同时降低了开发团队的设计门槛,完成了从领域分析模型到领域实现模型的无缝转换,并可作为测试驱动开发的前奏,让领域逻辑的实现变得更加稳健而高效。


以上概念皆为领域驱动设计统一过程的设计元素,同时又能与领域驱动设计的固有模式有机融合。至于我对软件复杂度成因的剖析,对价值需求和业务需求的划分,在领域驱动设计统一过程基础上建立的领域驱动设计魔方、参考过程模型与能力评估模型,诸多新概念、新方法、新模式、新体系虽说都出自我的一孔之见,但自觉可圈可点,确乎来自于我的一线实践和总结。至于内容的优劣,还是交给读者诸君来品判吧。


照例表示致谢!


感谢GitChat创始人谢工女士,没有她的支持与鼓励,就不会有《领域驱动设计实践》课程的诞生,自然不会让我下定决心撰写本书。感谢人民邮电出版社异步图书的杨海玲女士,是她的宽容与耐心,使得我能够有足够充裕的时间精心打磨本书的内容,没有因为错过最好的出版时间窗口,而催促我逼迫我尽快交稿。感谢京东周吉鑫、Amazon高翊凱 (Kim, Kao) 、腾讯王立、阿里蚂蚁金服于君泽(花名右军)与ThoughtWorks王威诸兄的抬爱,不仅拨冗为我的著作写序,也给予了许多好的建议与指点,提升了本书的整体质量。感谢阿里的彭佳斌(花名言武)、自主创业人张闯、中航信杨成科、工商银行劳永安,四位兄台作为本书试读的第一批读者,花费了大量时间认真阅读了我的初稿,提出了非常宝贵的反馈意见,帮助我订正了不少错误。感谢我的领域驱动设计技术交流群,近1500名群友的耐心等待以及坚持不懈的催促,使得我能够坚持写完本书。


之所以“三年磨一剑”,是希望通过我的努力让本书的质量对得起读者!可是,在态度上对得起读者的同时,我却对不起我生命中最重要的两个人:我的妻子漆茜与儿子张子瞻。这三年经历了风雨阳光,很遗憾,我把大部分业余时间都交给了《解构领域驱动设计》,多少个晚上笔耕不缀,妻子陪着儿子,我则陪着电脑。为了支持我的创作,没有怨怼,只有默默的支持。本书的出版,有他们一大半的功劳!最后,还要感谢我的父母,每次匆匆回家看望他们,极短的时间和他们聊天,挤出来的时间都留给本书的写作了!


在写作本篇前言的前一天,我偶然读到苏东坡的一首小词:


春未老,风细柳斜斜。试上超然台上看,半壕春水一城花。烟雨暗千家。

寒食后,酒醒却咨嗟。休对故人思故国,且将新火试新茶。诗酒趁年华。


蓦然内心被叩击,仿佛心弦被优美的辞章轻轻地带着诗意拨弄。吾身虽不能上超然台,然而书成之后,是否能够看到半壕春水一城花呢?未曾饮酒,却咨嗟,是否多情笑我早生华发?如今的我,已然焙出新火,恰当新火试新茶,却不知待到明年春未老时,能否做到何妨吟啸且徐行的落拓不羁?不管如何,还当诗酒趁年华,如此当——仰天大笑出门去,吾辈岂是蓬蒿人!

相关文章
|
3月前
|
存储 Java 程序员
|
13天前
|
Python
Python函数式编程:你真的懂了吗?理解核心概念,实践高阶技巧,这篇文章带你一次搞定!
【8月更文挑战第6天】本文介绍了Python中的函数式编程,探讨了高阶函数、纯函数、匿名函数、不可变数据结构及递归等核心概念。通过具体示例展示了如何利用`map()`和`filter()`等内置函数处理数据,解释了纯函数的一致性和可预测性特点,并演示了使用`lambda`创建简短函数的方法。此外,文章还强调了使用不可变数据结构的重要性,并通过递归函数实例说明了递归的基本原理。掌握这些技巧有助于编写更清晰、模块化的代码。
14 3
|
3月前
|
消息中间件 JavaScript Kafka
谈谈代码:DDD从入门到完全入门
之前的DDD文章——谈谈代码:降低复杂度,从放弃三层架构到DDD入门,通篇下来像 是简单的讲了一些概念,然后快速的实战一下——很多同学反馈感觉就是入门了,但没有完全入门,因此我们再加一篇。
226 3
谈谈代码:DDD从入门到完全入门
|
3月前
|
安全 数据挖掘 定位技术
笔记 - 《业务架构解构与实践》
《业务架构解构与实践》的笔记
|
9月前
一个案例搞懂解构
一个案例搞懂解构
|
10月前
|
存储 编译器 C++
C++类和对象概念及实现详解(下篇)
C++类和对象概念及实现详解(下篇)
28 0
|
前端开发 架构师 Java
领域驱动设计DDD从入门到代码实践
在本文中,作者将借鉴《实现领域驱动设计》的做法,介绍领域驱动设计的基本概念的同时,用一个虚拟的公司和一个虚拟的项目,把领域驱动设计进行落地实践。
12609 9
领域驱动设计DDD从入门到代码实践
|
存储 缓存 架构师
《解构领域驱动设计》第一章
《解构领域驱动设计》第一章
《解构领域驱动设计》第一章
|
测试技术 领域建模 API
《解构领域驱动设计》思维导图
《解构领域驱动设计》思维导图
《解构领域驱动设计》思维导图
|
存储 Java 编译器
【C++初阶】二、类与对象(下篇)
目录 一、再谈构造函数 1.1 构造函数体赋值 1.2 初始化列表 1.3 explicit 关键字 二、static成员 2.1 static 概念 2.2 static 的特性 三、友元 3.1 友元函数 3.2 友元类 四、内部类 五、匿名对象 六、拷贝对象时的一些编译器优化 七、再次理解类和对象
60 0