独家 | 聊聊国内 IT 圈的“隐学”

领域驱动设计似乎成了一门悄悄发展的“隐学”,它从来不曾大行其道,却依旧顽强地发挥着出人意料的价值。

直到行业内吹起微服务的热风,人们似乎才重新发现了领域驱动设计的价值,并不是微服务拯救了领域驱动设计,是因为领域驱动设计一直在坚硬的生长,然而看起来,确乎因为微服务,领域驱动设计才又焕发了青春。

相信很多朋友对领域驱动设计会有这样或那样的困惑,比如:

领域驱动设计是什么?

它在工作中有什么作用?

为什么国内关于这方面的书籍少之又少?"

为了解决这些困惑,有幸邀请到专家张逸老师来聊聊领域驱动设计,下面是 GitChat 独家采访记录

GitChat:在探讨领域驱动设计问题时,每个人都有每个人的认识,有的时候可能谁也无法说服对方,这时候该怎么办呢?

张逸:简单说,就是 show me your code。不管领域设计做得怎么样,最终都是要落地的,看实现的效果最有说服力。当然,为了保证交流的顺畅与效率,代码这种形式可能容易让人迷失到纷繁复杂的细节中去,因此还有一种方式就是 show me your model。

这里说的 model 就是领域模型。现在诸如 Event Storming 等活动都非常强调利用可视化手段把业务专家与开发团队都包含进来,大家一块协作一块交流,并利用便利贴等工具直观地展现建模活动中的每一个步骤,可以更容易消除误会与分歧。

GitChat:可以谈谈领域驱动设计的流程吗?比如是先建模?还是做设计?以及应用的场景是什么?

张逸:领域驱动设计强调的是将分析、设计与实现统一到一个领域模型中来,同时又相对清晰地划分为战略设计和战术设计两个阶段。当然,这两个阶段并非瀑布式的,而是迭代和演进的过程。

我认同领域模型对分析、设计与实现的统一,这个思想没有问题。但在我亲身经历的项目中,我还是发现由于沟通角色与建模目标的不同,分析、设计与实现在三个不同的活动是无法完全统一的,就好像在重构时不能实现新功能,这三顶帽子自然也不能同时戴起来。

因此,在我的《领域驱动战术设计实践》GitChat 课程中清晰地将这三个活动称之为领域分析建模、领域设计建模与领域实现建模,它们各自的产出是领域分析模型、领域设计模型与领域实现模型,这三者合起来就是领域模型,而这个过程就是领域模型驱动设计。之所以在模型驱动设计前面加上“领域”作为定语,是因为我认为二者不能划等号,例如采用数据模型的,同样是模型驱动设计。

GitChat:针对一些设计能力不足的开发团队,可以采用领域驱动设计来改进设计和编码质量吗?

张逸:我个人的观点,这二者之间有关系,但并非必要关系。领域驱动设计的关键不是设计能力,而是要抓住设计的驱动力,必须是领域,且必须要求领域专家参与到分析建模活动中来。

要说明的是,这个所谓“领域专家”不是一个头衔,也不是对技能级别的要求,它其实就是一个指代,代表“懂业务”的人:可以是客户,可以是 Product Owner,可以是业务分析师,可以是产品经理,也可以是懂业务的开发人员,甚至可以是一个负责业务分析的团队。

从主流的领域驱动设计来看,主要采用的还是对象范式的设计思想与领域驱动设计结合,这就要求团队掌握基本的面向对象设计能力。这方面能力不足的团队,确实会影响到最终的设计和编码质量。这是必须要正视的问题,因此我建议那些希望实践领域驱动设计的团队,不要忘了去提高团队的面向对象设计能力。

提升设计能力并非一朝一夕就可以做到。正是考虑到面向对象设计能力不足对领域驱动设计的影响,我在《领域驱动战术设计实践》GitChat 课程中尝试总结了一个相对固化的设计过程。这个过程结合了 DCI、职责驱动设计等设计方法,它不要求团队掌握太多面向对象设计思想、原则与模式,只要懂业务,完全可以以“知其然而不知其所以然”的方式去实践领域驱动设计。

这种方法不能让你的设计变得非常优秀,却可以保证你的设计不至于太糟糕,甚至可以说是不错的设计。

GitChat:已经上线的《领域驱动战略设计实践》与刚上线的《领域驱动战术设计实践》之间的区别是?有学习的先后顺序吗?

张逸:这两个课程刚好对应领域驱动设计的战略设计与战术设计。

“战略篇”强调系统层面的架构模式,包括限界上下文、上下文映射、分层架构等,可以运用这些模式对整个系统的领域进行“分而治之”,从而降低业务复杂度,同时围绕“领域”为核心,建立业务复杂度与技术复杂度的边界。

“战术篇”强调领域层面的设计模式,以“模型驱动设计”为主线,贯穿分析、设计与编码实现这三个不同的建模活动,并引入领域驱动设计的战术设计要素,如实体、值对象、领域服务、领域事件、聚合、资源库、工厂等。

战略设计和战术设计并非单向的过程,而是一个迭代演进与不断融合的过程。整体来讲,战略更偏向于架构设计,战术更偏向于详细设计与编码。我个人还是建议先学习《领域驱动战略设计实践》,虽然它更偏向于理论,难度更高一些,但是它毕竟概括了领域驱动设计的全貌。

GitChat战略篇与战术篇,两者的侧重点有什么不同吗?

张逸:从内容来看,战术会更接地气一些,毕竟讲的是落地的实现。将战略和战术的系统案例结合起来,就是一个系统的完整设计案例了。

最后,推荐一下张逸老师在 GitChat 上的原创好课《领域驱动设计实践》。

感兴趣的同学,欢迎扫码学习

独家 | 聊聊国内 IT 圈的“隐学”


点击阅读原文,特价订阅 战略篇&战术篇套装!