文章简介

在B端产品研发及项目实施中,DDD带给我们哪些思考?我们是如何应用的?本文不是科普贴,旨在分享我们的经历和思考。

背景

Domain Driven Design(简称 DDD),又称为领域驱动设计,起源于杰出软件建模专家Eric Evans在2003年发表的书籍《DOMAIN-DRINEN DESIGN —TACKLING COMPLEXITY IN THE HEART OF SOFTWARE》(中文译名《领域驱动设计—软件核心复杂性应对之道》)。随着2014年Martin Flower和James Lewis的《Microservice》出版,微服务概念为业界所接受,DDD也被重新提起。人们发现,DDD里的领域、限界上下文、领域模型等理念,和微服务的高内聚、低耦合理念有着天然契合,越来越多的人把DDD作为指导微服务划分的方法论之一,也有越来越多的人认为,掌握DDD才是一名优秀的架构师。

DDD工作流程 - 图片来自于网络

限界上下文 - 图片来自于网络

为什么我们要开始DDD?

笔者所在团队于2015年左右开始进行公司自主产品的研发,当时,DDD主要应用在我们的微服务划分、代码分层中,对我们当时从技术角度出发、搭建统一的微服务技术框架,有着重要的指导意义。而真正开始思考将DDD应用在具体的业务领域与业务场景中,是在2018年末。那时,我们面临着自主产品实施的项目越来越多、需要帮助客户从0到1构建业务应用的情况,如何在企业甚至行业的复杂业务场景中找到合适的架构方案,是当时我们期望借助DDD去更体系化回答的问题。

我们是如何应用DDD的?

在DDD的实践中,大多数人应该都会面临一个问题:名词太多!“领域”、“子域”、“限界上下文”、“聚合”、“实体”、“值对象”等等名词,令人眼花缭乱。并且,DDD的理论虽然告诉了我们名词的定义和处理原则,但是具体场景之下,到底如何基于原则去分析,好像并没有标准答案。

这也是我们在应用DDD时的最大困境,我们也在反复思考:如何在团队内统一语言、如何把DDD原则融入到具体可执行的工作事项中?

接下来,我们将从人和事两个方面来分享我们的经历与思考。

人:

DDD里强调,领域专家和开发团队共同工作。

领域专家的加入,其本质在于让一切的设计回归业务本身,从业务价值出发,聚焦业务核心域,避免过度设计。

希望领域专家和开发团队共同工作,往往是实践中的第一个难题,如何找到合格的领域专家?如何保障领域专家的时间投入?如何最大化发挥领域专家的“价值”?

  • 关于合格的领域专家:领域专家不是指某一个特定的人,可以是很多人,可相互补充,但同时也不建议过多。在寻找领域专家时,企业可以从自身的业务领域出发,在每个业务领域寻找到有丰富经验的人员。这里的“经验丰富”并不仅仅是一线实战经验丰富,更是对业务要有深度的理解和认知。
  • 关于领域专家时间投入的保障:在实践中会发现,有各种各样的“客观”原因,导致领域专家无法有效投入。虽然有很多客观的情况,但是不管有多么困难,保障领域专家的时间投入都是必须要做的。如果领域专家都不参与,我们怎么有信心讲我们交付的是业务价值而不是一堆代码呢?
  • 如何最大化发挥领域专家的“价值”:把抽象的问题具象化,通过聆听和引导,更多地从企业的领域专家处获得信息,放弃“我是专家”的执念。

开发团队:在多数的信息化项目中,常见的分工是需求分析师进行需求收集与设计,技术人员负责开发和实现,需求分析师进行测试验收。在DDD实践时,建议开发团队的业务架构师、技术架构师、测试架构师从一开始便共同工作,这样才能够发挥每个角色在各自专业领域的长处、逐步统一语言、快速达成共识。

事:

DDD区分了战略设计与战术设计两个层次,提出了聚焦核心域、创造性协作、统一语言的三个原则。很多人在刚开始应用DDD的时候,会感觉自己都“不会说话”、“不会做事儿”了。这其实是因为过于关注名词本身,陷于对名词的理解和解释上,因此,在“事”上,我们认为,需要抓住两个要点。

  • 找到更舒服的方式

DDD通过战略设计解决业务边界划分的问题,通过战术设计实现领域模型的抽象,解决的是从业务到技术的过渡。

在谈DDD的时候,一定绕不开事件风暴。“事件风暴(Event Storming)是一种快速的设计技术,让领域专家和开发人员都可以参与到这个快节奏的学习过程中。它聚焦于业务和业务流程,而非名词概念和数据。”(摘自Vaughn Vernon《领域驱动设计精粹》)。事件风暴为DDD战略与战术落地,提供了一种非常有逻辑、有体系的方法,那么在这个方法之外,还有没有其他的方法呢?答案是,有的。尤其在B端企业的信息化建设中,瀑布实施方法论、敏捷开发等等非常多优秀的方法与工具,都可以为我们所用。

在DDD的落地过程中,我们核心的是要抓住最终要获得的结果,在过程中所采取的方式,可以根据实际情况进行调整,关键是要找到一个让大多数团队成员都舒服的方式。以笔者的经历为例,有一家客户习惯了以流程图的方式进行业务梳理,在这种情况下,使用事件风暴的方式会对客户的习惯造成冲击,甚至让客户不知道如何输出。此时,我们就应该及时调整,思考流程图与事件风暴如何融合,既能以客户习惯的方式推进,同时也能拿到我们想要的结果。

  • 将原则与概念形成模板与具体工作任务

一千个人有一千个哈姆雷特,每个人对DDD原则、概念都有自己的解读。为了更快速地在团队内达成DDD落地方法的“统一语言”,建议以具体的工作任务、产出物模板来承载,让团队更聚焦在目标与任务的达成上。

通过在自主产品的研发和实施项目中应用DDD并持续迭代其应用方法,我们不仅有效地完成了中台项目的实施、为客户构建了合理地应用架构,也逐步完善了项目实施方法论体系,为更广泛地项目交付和产品研发提供了助力。DDD帮助解决了产品架构设计中的一部分问题,在架构设计之后,如何保障设计的落地、高效地交付,是每个团队会面临的下一个问题。在这里,笔者推荐使用猪齿鱼这款数智化效能平台,它可以有效管理架构设计所形成的微服务或模块,拉通设计与开发,通过提供协作、测试、DevOps、容器工具,提高团队效能。

猪齿鱼数智化效能平台

现在我们是如何理解DDD的?

DDD首先是一种思想,“聚焦核心域、创造性协作、统一语言”,是关于价值发现、价值认定、讨论、聆听、共识、迭代。这种思想不仅适用于软件设计,也适用于日常工作、个人生活、家庭教育等等方面。我们不可能在每个方面都做到完美,需要识别关键要务、聚焦投入;我们也不可能独自存在,需要与人连接、深度聆听、积极反馈;我们欣喜于共识默契,也有勇气接受差异,因为正是这些差异让我们不断碰撞、更好地学习与成长。

其次,DDD是一种方法,它区分了战略设计与战术设计的,引入了限界上下文与统一语言,提供了实体、值对象、聚合、工厂、资源库等。同时,业界也有很多DDD的相关著作,可以帮助我们更有效地去理解这些概念与具体应用方法。当然,你本身所在的领域与你的过往经验,也是应用这些方法时非常值得参考的。

软件的架构,究其根本是物理世界在数字世界的映射。在DDD的应用中,我们不仅汲取DDD的思想与方法,也学习敏捷、DevOps、测试、微服务等领域知识,同时结合我们既往的经验,逐步总结和迭代了适合我们的一套架构设计体系与方法。正如Eric Evans所说的,“DDD还未结束”,我们也在持续实践与持续调整。

本文是基于笔者当前的认知与理解所形成的,欢迎留言讨论。


本文由猪齿鱼技术团队原创,转载请注明出处

浅谈 DDD 领域驱动设计的更多相关文章

  1. 浅谈我对DDD领域驱动设计的理解

    从遇到问题开始 当人们要做一个软件系统时,一般总是因为遇到了什么问题,然后希望通过一个软件系统来解决. 比如,我是一家企业,然后我觉得我现在线下销售自己的产品还不够,我希望能够在线上也能销售自己的产品 ...

  2. (转载)浅谈我对DDD领域驱动设计的理解

    原文地址:http://www.cnblogs.com/netfocus/p/5548025.html 从遇到问题开始 当人们要做一个软件系统时,一般总是因为遇到了什么问题,然后希望通过一个软件系统来 ...

  3. DDD 领域驱动设计-三个问题思考实体和值对象

    消息场景:用户 A 发送一个消息给用户 B,用户 B 回复一个消息给用户 A... 现有设计:消息设计为实体并为聚合根,发件人.收件人设计为值对象. 三个问题: 实体最重要的特性是什么? Messag ...

  4. DDD领域驱动设计的理解

    DDD领域驱动设计的理解 从遇到问题开始 当人们要做一个软件系统时,一般总是因为遇到了什么问题,然后希望通过一个软件系统来解决. 比如,我是一家企业,然后我觉得我现在线下销售自己的产品还不够,我希望能 ...

  5. [转] DDD领域驱动设计(三) 之 理论知识收集汇总

    最近一直在学习领域驱动设计(DDD)的理论知识,从网上搜集了一些个人认为比较有价值的东西,贴出来和大家分享一下: 我一直觉得不要盲目相信权威,比如不能一谈起领域驱动设计,就一定认为国外的那个Eric ...

  6. 关于DDD领域驱动设计的理论知识收集汇总

    原文:关于DDD领域驱动设计的理论知识收集汇总 最近一直在学习领域驱动设计(DDD)的理论知识,从网上搜集了一些个人认为比较有价值的东西,贴出来和大家分享一下: 我一直觉得不要盲目相信权威,比如不能一 ...

  7. DDD领域驱动设计落地实践(十分钟看完,半小时落地)

    一.引子 不知今年吹了什么风,忽然DDD领域驱动设计进入大家视野.该思想源于2003年 Eric Evans编写的"Domain-Driven Design领域驱动设计"简称DDD ...

  8. DDD 领域驱动设计-商品建模之路

    最近在做电商业务中,有关商品业务改版的一些东西,后端的架构设计采用现在很流行的微服务,有关微服务的简单概念: 微服务是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成.系统中的各个微服务可被独 ...

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

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

  10. DDD 领域驱动设计-两个实体的碰撞火花

    上一篇:<DDD 领域驱动设计-领域模型中的用户设计?> 开源地址:https://github.com/yuezhongxin/CNBlogs.Apply.Sample(代码已更新) 在 ...

随机推荐

  1. 2021云栖大会丨阿里云发布第四代神龙架构,提供业界首个大规模弹性RDMA加速能力

    ​简介: 10月20日,2021年杭州栖大云会上,阿里云发布第四代神龙架构,升级至全新的eRMDA网络架构,是业界首个大规模弹性RDMA加速能力. 10月20日,2021年杭州栖大云会上,阿里云发布第 ...

  2. [FAQ] Win10 WSL Ubuntu 根目录实际位置

    1. 运行(win+R),直接输入 \\wsl$ 进入Ubuntu的目录. 2. 或者文件夹里同样输入  \\wsl$ 进行查找. Refer:Win10 WSL 路径 Link:https://ww ...

  3. [FAQ] Goland 始终没有包代码的提示 ?

    表现:import 引入的包始终是红色的,表示没有找到引入的包. 注意,在这里开启Go Modules: 然后在 Exteneral Libraries 里看到 Go Modules 即可. Refe ...

  4. dotnet 使用 windbg 运行脚本方式自动批量调试处理 dump 文件

    本文将和大家介绍一个简单且实际用途不大的使用 windbg 配合脚本的方式,进行自动化的大批量对 dotnet 系应用的 dump 进行自动化分析调试处理,可以自动根据调试需求输出 dump 文件的一 ...

  5. WPF 简单判断主线程界面是否卡顿的方法

    本文来告诉大家如何使用简单的代码判断当前的软件的 UI 线程或界面是否卡顿 在后台线程调用如下代码即可用来判断是否卡顿 private static async Task<bool> Ch ...

  6. 2.生产环境k8s-1.28.2集群小版本升级到1.28.5

    环境:https://www.cnblogs.com/yangmeichong/p/17956335 # 流程:先升级master,再升级node # 1.备份组件参考:https://kuberne ...

  7. vue-axios设置公共的请求ip

    1.安装axios,网上找方法 2.src->network->request.js并复制: import axios from 'axios' export function reque ...

  8. docker / compose 的安装 和 体验

    文档 官网文档 视频 视频 简介 课程内容 1.Docker Compose 容器编排 2.Docker Swarm #集群 热扩容 需要在阿里上买服务器,至少冲100+以上的人民币 文档: 集群方式 ...

  9. 显示器AVG、DVI、HDMI、DisplayPort、Type-C、雷电接口

    在近十年的发展,显示设备的接口发生了巨大的改变.以前使用比较多的是蓝色VGA接口,接著出现了白色的DVI接口,当遇到不同接口时,还得买转接头进行转接.后来,又有了HDMI等接口,现在则出现DP和USB ...

  10. Ubuntu 上安装 Docker

    步骤 1:删除任何现有的 Docker 包 但在跳到安装部分之前,有必要删除所有以前安装的 Docker. 要 卸载以前的 Docker,请使用以下命令. sudo apt remove docker ...