DDD和DSL、DCI的关系是什么?开发团队为何需要DDD?它与微服务与中台又有着怎样的联系?目前业界实践DDD最大的问题是什么?11 月30 日,在由ThoughtWorks 举办的领域驱动设计峰会 DDD-China 2019上,InfoQ 记者带着这些问题对中兴通讯资深软件架构师张晓龙进行了采访。
DDD概念最早提出于2004年,作为一种软件开发的指导思想,DDD对软件开发带来了诸多可能与方向,张晓龙认为DDD为软件开发带来的好处主要有以下几点:
张晓龙此前曾在DDD-China峰会和ArchSummit全球架构师峰会上分别做过《当DDD遇上DSL(Domain-Specific Language)》、《当DDD遇上DCI(Data,Context, Interactive)》的演讲,在他看来,DDD和DSL、DCI之间存在极强的关联性。
DDD和DSL的融合有三点:
DSL可以看作是在领域模型之上的一层外壳,可以显著增强领域模型的能力。它的价值主要有两个,一是提升了开发人员的生产力,二是增进了开发人员与领域专家的沟通。举个例子:想让BA负责流程契约的设计,该流程契约是一个活文档,可以跑测试,而BA不熟悉宿主语言。于是,我们设计了一种外部DSL来专门描述流程契约,对BA非常友好,学习成本也很低(不超过5分钟就可以学会),最后发现BA很快就广泛使用了起来。外部DSL并不一定要定义新文法,我们直接复用了plantUML文法,安装该插件可以自动生成序列图,非常棒!对于外部DSL,需要自己实现一个解析器将DSL文法解析成语法树,再根据语法树生成语义模型。语义模型可以看作领域模型(严格的讲语义模型是领域模型的子集),外部DSL就是对领域模型的一种组装方式。
DCI的作用主要体现在两方面:
首先,DCI助力DDD战术设计:
其次,DCI助力DDD代码落地:
张晓龙认为,DCI对一些开发人员的影响可能比DDD和DSL还大,因为开发人员每天都在不断倒腾代码,想让代码的组合性更强,以便快速应对需求的变化。
DDD思想贯穿了整个软件开发的生命周期,包括对需求的分析、建模、架构、设计,和最终的代码实现,甚至对代码的测试与重构。代码是业务的核心资产,不管是否特性团队,开发团队肯定是代码的编写者和守护者。
对于开发团队而言,需要关注以下几点:
更进一步,在分层架构里,应用层更加关注横切面的东西,比如说要上报一个告警,要给用户发送一个Email,这些最好都集中放到应用层里面。但触发是在领域层发生的,应用层怎么知道?通过领域事件来实现依赖反转,即应用层订阅领域事件,领域层发布领域事件。
在中兴通讯,核心业务属于通信行业,DDD的应用场景跟互联网企业有着很大差别:
张晓龙举例提到,中兴通讯在开发团队中实践DDD的经验具体而言有以下几点:
DDD概念提出距今已经有15年的历史,前十年时间都一直处于不温不火的状态,而在最近几年才开始大行其道。张晓龙表示,中兴通讯在2012-2015年期间也有过一些成功的案例,但对于整个业界来说了解的人并不多。他拿DDD-China峰会举例解释:这次峰会的参会者有500人的规模,而我们假设峰会在2015年之前举办的话,估计参会者不会超过100人。因此,我们可以断定是微服务的热风让人们重新发现了领域驱动设计的价值。
微服务架构从提出以来一直没有很好的理论支撑如何合理地划分服务边界,人们常常为服务要划分多大而争吵不休。而DDD被发现恰好可以弥补微服务的营养不良:(1)服务最大不要大过一个BC,否则服务内可能会存在有歧义的领域概念;(2)服务最小不要小过一个聚合,否则会引入分布式事务的复杂度;(3)服务间最好通过Domain Event来进行交互,这样可以让服务保持松耦合。微服务和DDD的结合,让微服务架构看起来似乎更加稳健了。
“微服务就像是DDD的心上人,使得DDD真正焕发起了青春。”张晓龙这样解释。
对于业界目前流行的中台概念,张晓龙同样也有自己的看法:
中台和DDD不是同一个层面的东西,不能为了把它们联系在一起,而强行找相似点。中台实际上就是多条业务线的共同需求,比如对于滴滴公司来说,快车、专车和出租车等业务都是微服务架构,这些业务的很多服务是相似的,考虑将这些服务从各个前台下沉到统一的平台,这个平台就是中台。中台要考虑各个前台的需求,所以复杂性变高了。
中台是一种企业级的架构模式,从企业全局整体视角来看架构全貌,而DDD是一种主流的软件开发方法,用来应对软件的核心复杂性。中台架构可以看作是微服务架构的延伸和发展,服务复杂性很高,所以更需要用DDD的方式去设计和建模,但二者之间并不是相同层面的概念。
最近几年DDD的火爆也给业界开发团队带来了一些迷思,为什么我的DDD推行不下去?为什么我的DDD做起来总是跟敏捷一样,最后都变了味?
张晓龙总结了DDD目前面临的几大困局:
针对以上几大困局,张晓龙也给出了自己的解决方案:
软件开发没有银弹,DDD也不是万能的。如果开发团队真的决定用DDD的思想指导软件开发,就一定要跟随时代的脚步,吃透DDD这个旧瓶里装的新酒。
领取专属 10元无门槛券
私享最新 技术干货