从战略到战术,领域驱动设计(Domain Driven Design,DDD)给出了诸多关于软件架构、设计、建模与编码的方法和模式,以用于应对业务复杂度。然而,许多开发人员对于 DDD 的价值仍然心存疑惑,相反,对于它的难以理解、难以学习倒是确信不疑,甚至有人惊呼 DDD 是「反人类地难懂」。这真是现实给 DDD 沉痛的当头一击啊!

从 2004 年 Eric Evans 出版《领域驱动设计》一书以来,已有十五余载。实事求是说,DDD 的推进与项目落地真的是举步维艰。个中原因,难以说清。DDD 是否真正反人类地难懂可以另说,但它毫无疑问,是在反「早期的开发传统」。这一开发传统就是从实现技术出发,由数据驱动软件设计。软件开发人员往往擅长解决技术难题,却不善于(或者说不愿意)理清复杂的领域逻辑或对领域概念进行抽象。领域建模本身是一个主观思考的结果,这个问题也造成了优劣判定的不可衡量。

只要克服对 DDD 的畏难情绪(甚至是反感情绪),其实,DDD 的学习并没有想象中的那么困难。最大的挑战在于如何落地。当一个企业或者一个团队希望选择 DDD 帮助他们提升软件的设计与开发质量时,他们是否想过:

团队有没有专门的业务分析师,或者领域专家?

是否组建了特性团队,并以迭代的方式进行开发?

是否愿意以可视化的工作坊形式沟通需求,确定统一语言?

是否创造了足够的条件让特性团队的所有成员与角色能够面对面地高效沟通?

是否愿意为打造高质量的核心领域模型而为成本买单?

这些问题并非 DDD 能解决的,但却是成功实施 DDD 时需要确保的场外因素!因此,DDD 实施成败的关键,不仅在于 DDD 本身,还在于企业或团队能力成熟度是否达到了实施 DDD 的要求。这也正是为什么我要在《领域驱动设计实践》专栏中提出「领域驱动设计能力评估模型(DDD Capability Assesment Model,DCAM)」的原因所在。

我眼中的 DDD 已经超越了软件设计技术的范畴,它更像是一门哲学。何谓「哲学」,可以理解为是对人生、世界乃至宇宙的智慧思考。而 DDD 就是对软件世界的一种思考形式,它提出以抽象的领域模型去反映混乱的现实需求世界,以有序、合规、演进的方式去打造满足业务需求的软件世界,并尽量将技术因素推出这个世界的大气层边界之外。简言之,DDD 是我们观察软件世界的态度。

因此,对于学习 DDD 的开发人员而言,第一重要的不是掌握 DDD 的模式,而是要改变分析思维与设计思维的方式。将这种思维方式运用到软件项目开发过程中,就是我在专栏中提到的「领域模型驱动设计」,它的核心内容可以通过层层推进的形式汇集为如下三句话:

以领域为分析建模的驱动力

以场景为设计建模的驱动力

以任务为实现建模的驱动力

如何理解这三句话?

当你开始领域模型驱动设计时,必须在分析建模阶段抛开实现技术对你的影响,与需求分析人员、测试人员一起单纯针对「领域」进行分析建模,即提炼与抽象领域概念,并以统一语言和模型的形式来表达。

在设计建模阶段,围绕着一个完整的「场景」开展设计工作。需求分析人员为「场景」编写用户故事;测试人员为「场景」编写验收标准;开发人员则开始解剖「场景」,将其分解为组合任务与原子任务,然后各自分配给不同的角色构造型。

到了实现建模阶段,就针对这些任务定义测试用例,开始测试驱动开发,由内至外到达应用服务时,再将它们集成起来。显然,领域模型驱动设计就是针对领域开展的「合而分分而合」的解构过程。

同时,必须谨记:领域模型驱动设计的基础是限界上下文。在领域驱动设计的战略阶段,同样是一个「合而分分而合」的解构过程:将领域分解为限界上下文,再通过上下文映射联合限界上下文共同实现多个领域场景。

以上内容正是我言犹未尽想要表达的精髓。学习领域驱动设计,就需要抓住 DDD 的根本和精髓。你需要理解什么是限界上下文,它带来的价值是什么;你需要理解如何进行领域建模,统一语言在其中扮演了什么样的角色;你需要理解为何领域驱动设计提倡以领域为驱动力,为何需要领域专家参与到项目开发中来。

提升了对这些内容的认识后,再去学习 DDD 给出的设计模式,学习我在专栏中给出的固化设计过程,如场景驱动设计。然后找三两个不曾实施 DDD 的项目,寻两三个实施了 DDD 的项目,相互对比其模型与代码,你绝对会有一种醍醐灌顶的感觉。当然,这些都需要你沉下心来细心体会,认真思考,还需要你广泛涉猎更多软件设计与开发的知识,如此方能打通 DDD 的任督二脉。

至于团队实施 DDD,则不仅在于你个人的 DDD 知识与能力,而在于我前面提及的「场外因素」。企业或团队若期望在项目中实施 DDD,首先需要利用 DCAM 评估一下团队的能力成熟度,再来决策做不做 DDD,怎么做 DDD,并着手培养团队成员的 DDD 能力。《领域驱动设计实践》这个专栏可以在一定程度提高读者的 DDD 能力,却无法确保成功实施 DDD 的场外因素。

谈谈DDD的更多相关文章

  1. DDD 领域驱动设计-谈谈 Repository、IUnitOfWork 和 IDbContext 的实践(3)

    上一篇:<DDD 领域驱动设计-谈谈 Repository.IUnitOfWork 和 IDbContext 的实践(2)> 这篇文章主要是对 DDD.Sample 框架增加 Transa ...

  2. DDD 领域驱动设计-谈谈 Repository、IUnitOfWork 和 IDbContext 的实践(2)

    上一篇:<DDD 领域驱动设计-谈谈 Repository.IUnitOfWork 和 IDbContext 的实践(1)> 阅读目录: 抽离 IRepository 并改造 Reposi ...

  3. DDD 领域驱动设计-谈谈 Repository、IUnitOfWork 和 IDbContext 的实践(1)

    好久没写 DDD 领域驱动设计相关的文章了,嘎嘎!!! 这几天在开发一个新的项目,虽然不是基于领域驱动设计的,但我想把 DDD 架构设计的一些东西运用在上面,但发现了很多问题,这些在之前的短消息项目中 ...

  4. DDD 领域驱动设计-谈谈 Repository、IUnitOfWork 和 IDbContext 的实践(转)

    http://www.cnblogs.com/xishuai/p/ddd-repository-iunitofwork-and-idbcontext.html 好久没写 DDD 领域驱动设计相关的文章 ...

  5. DDD:谈谈数据模型、领域模型、视图模型和命令模型

    背景 一个类型可以充当多个角色,这个角色可以是显式的(实现了某个接口或基类),也可以是隐式的(承担的具体职责和上下文决定),本文就讨论四个角色:数据模型.领域模型.视图模型和命令模型. 四个角色 数据 ...

  6. DDD 领域驱动设计-谈谈 Repository、IUnitOfWork 和 IDbContext 的实践

    http://www.cnblogs.com/xishuai/p/ddd-repository-iunitofwork-and-idbcontext.html

  7. 谈谈一些有趣的CSS题目(三)-- 层叠顺序与堆栈上下文知多少

    开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...

  8. WeText项目:一个基于.NET实现的DDD、CQRS与微服务架构的演示案例

    最近出于工作需要,了解了一下微服务架构(Microservice Architecture,MSA).我经过两周业余时间的努力,凭着自己对微服务架构的理解,从无到有,基于.NET打造了一个演示微服务架 ...

  9. DDD 领域驱动设计-在动手之前,先把你的脑袋清理干净

    惨不忍睹的翻译 英文原文:http://www.codeproject.com/Articles/339725/Domain-Driven-Design-Clear-Your-Concepts-Bef ...

随机推荐

  1. MySQL系列操作

    Linux环境下安装使用MySQL Portal 数据备份&恢复 Portal

  2. 数据结构与算法--二分搜索(binary search)

    前言 之前面试准备秋招,重新翻起了<编程之美>.在第三章节看到了一道关于二分搜索的讨论,觉得有许多细节是自己之前也没怎么特别注意地方,比如二分搜索的初始条件,转化.终止条件之类的. 问题 ...

  3. [linux][MongoDB] mongodb学习(二):命令使用数据库

    使用数据库 # 查看数据库 > show dbs admin 0.000GB local 0.000GB # 查看表(集合) > show tables # 删除集合 > db.us ...

  4. SpringBoot word 转换为 pdf

    转换文件 swagger 地址, 基于 SpringBoot 开发 http://119.27.167.41:8888/convertor/swagger-ui.html 带有图片的word 转换体验 ...

  5. PostMan接口测试(很全面的接口测试教程)

    一:理论部分 1. 前言 在前后端分离开发时,后端工作人员完成系统接口开发后,需要与前端人员对接,测试调试接口,验证接口的正确性可用性.而这要求前端开发进度和后端进度保持基本一致,任何一方的进度跟不上 ...

  6. Caused by: java.lang.ClassCastException: class java.lang.Double cannot be cast to class org.apache.hadoop.io.WritableComparable

    错误: Caused by: java.lang.ClassCastException: class java.lang.Double cannot be cast to class org.apac ...

  7. python爬虫——用selenium爬取京东商品信息

    1.先附上效果图(我偷懒只爬了4页)  2.京东的网址https://www.jd.com/ 3.我这里是不加载图片,加快爬取速度,也可以用Headless无弹窗模式 options = webdri ...

  8. javascript-文件File转换成base64格式

    不能直接访问用户计算机中的文件,一直都是Web应用开发中的一大障碍.2000年以前,处理文件的唯一方式就是在表单中加入<input type="file">字段,仅此而 ...

  9. failed to open stream :HTTP request failed 解决方法

    用curl抓取,不要用file_get_contents(); 前者比后者效率高一点

  10. python学习01python入门一

    在正式开启python代码的学习之旅之前,先来了解一下有关python语言的一些内容吧. python的命名,起源等等,大家自行百度了解,此处不再赘述. python是一种解释型语言,具有强调代码可读 ...