领域驱动设计(DDD)高手养成记

开发出一款基于业务的高质量软件产品,一直是架构师与软件开发工程师为之努力的目标,之所以说是努力的目标,是因为这其中存在众多的难题。

比如:如何将业务需求准确的转化为软件设计?如何能让团队人员在开发时能专注于业务,而不是技术本身?如何解决跨部门间语言沟通问题,如开发与业务之间的沟通障碍?如何解决软件系统不会随着时间推移而慢慢腐烂的问题等等……

为了解决这一系列的问题,15年前,Eric Evans提出了一个行之有效的方法论,即领域驱动设计(Domain Driven Design,简称DDD),Eric Evans也因此享誉全球的IT圈。

略微让人遗憾的是,对于DDD,国内了解的人却并不多,我们也甚少听闻,业界有宣称应用了DDD原则的项目和软件。

没有掌握DDD的人,抱怨这一技术过于晦涩、在现实中根本无处着手。而掌握了它的人却觉得没那么难,不过是一种很自然的设计方法选择。

DDD对架构师和软件开发工程师意味着什么?对企业又意味着什么?我们应该如何正确的理解DDD并落地使用它?DDD高手是如何养成的?

近日,由ThoughtWorks发起的第二届领域驱动设计中国峰会(2018 DDD China Conference)在北京召开,笔者有幸采访到2位DDD的实践型专家,他们分别是民航信息技术总监,领域驱动设计中国峰会话题出品⼈张逸,ThoughtWorks高级咨询师,周宇刚。一起来看他们的经验之谈。

如何学习并使用DDD?

对于98年大学毕业的张逸来说,2006年的他,已经是一名有着丰富编程经验的老程序员了,就在那年,他通过Eric Evans的《领域驱动设计》一书,第一次接触到DDD。

“那个时候,学习DDD主要靠看书,外加自己琢磨,因为,没有人教,也没有氛围。”张逸说。

与此同时,他也开始在工作中逐渐尝试使用DDD,因为Eric一书晦涩难懂,并不好理解,因此,在实践的过程中,很多时候他都是一知半解的在做,就这样持续不断的实践了10多年。

“类似航延结算、协同决策等偏业务的系统,我们就会尝试采用DDD去改进系统架构,改进代码质量,但过程并不是那么顺利,走的磕磕绊绊的。有时间周期问题,还有团队成员能力问题。” 张逸说。

如今回过头来再看,一个项目,纯粹按DDD的方式去做的比较少,很多项目因为历史遗留问题,再加上团队在DDD理解上的一些分歧,导致很难有项目完全按照DDD去做,但会引入一些DDD思想。当找不到答案时,其实还是从设计的本质去看,甭管是否符合Eric Evans书中所介绍的东西。

周宇刚接触DDD的时间是 2009,比张逸略晚,很难想象他是一个做过导游的程序员,周宇刚学习DDD的原因是在日常编程工作中遇到很多挑战,比如,一个预订流程,面向对象应该如何去做?对象是什么?怎么协作?

直到有一次,无意中看到了Eric的书,仅看到战术设计的前半部分,就让他如获至宝。为了进一步学习DDD,他还特意去国外网站Stack Overflow上注册了个账号,就是为了去看看别人是如何学的。其实,跑到国外网站去看也是无奈之举,因为搜遍了国内网站,发现根本没人在聊DDD。

事实上,书的后半部分战略设计甚至还没来得及看,他就已经等不及了,要在自己项目中去实践。

作为Team Leader,他工作中有较大的自主权,所以,比较容易的就在自己项目中开始尝试,但过程是曲折的。“因为最初并不知道DDD到底是什么?一边要尝试去理解它,一边又要在自己项目中去实践”,周宇刚说。

当书上的知识或别人的案例跟实际项目不是特别契合时,在实践的过程中应该怎么去积累自己的经验呢?周宇刚认为,要跳出这个领域去设计,因为,我们追求的不是用不用DDD,而是用了DDD能达到什么效果。

如何正确理解DDD?

为什么很多人会觉得DDD很难学?因为,它就是一个思想,一个方法。周宇刚说。

开始,你以为DDD是一个面向对象的建模方法,能告诉你企业应用架构该怎么做,慢慢的,你又会发现,它告诉你的是怎么识别问题,如企业应用中的问题,业务领域的问题,哪些应该拆开处理……

事实上,DDD最初是一个综合软件系统分析和设计的面向对象建模方法,如今已经发展为一种针对大型复杂系统的领域建模与分析方法。

张逸认为,要了解DDD,首先得弄清楚它的历史背景与来龙去脉。

虽然,从Eric Evans出版那本划时代的著作《领域驱动设计》至今,已有差不多十五年时间,DDD也发生了一些变化,但Eric Evans为什么要提出DDD?这是学习DDD需要去了解的。

2004年,Eric Evans提出DDD,刚好是面向对象设计大为流行之时,UML也是甚嚣尘上,但是,这个时间节点上,软件设计还有一个致命的问题,软件系统开发还是从数据库角度去进行。当然,这里面涉及多种原因的,也是需要了解的。

原因一、当时的软件系统开发,并没有现在的多样性,系统操作的源头还是操作数据库,只是简单与复杂的区别。

原因二、软件行业本身很像是一个软件作坊,依靠的是老代新的传承方式。而老人最早接触到的就是面向数据库的设计,所以,虽然已经有面向对象,但开发者的开发工作仍然是基于数据库驱动。

因此,Eric Evans的书中就特别强调,如果采用面向数据库设计的思维去建模,很难去享受DDD带来的好处。张逸认为,要正确理解DDD的最关键的一点,是理解Domain Driven,并由此角度去驱动它,而这需要保证两点:

一、在设计时,压根就不要去考虑技术实现,只考虑业务,只考虑domain。

二、DDD不纯粹是一个软件开发方法,强调Domain,强调领域就要有沟通,一定要有协作,很多人之所以做DDD比较困难,甚至于做的不好,就是没有业务人员参与,基于业务的沟通机制是DDD最核心的。

DDD对企业、对架构师和软件开发工程师意味着什么?

在周宇刚和张逸看来,DDD对企业有2个方面的价值,一是能帮助企业识别自身核心领域,决定企业资源的运用。二是能帮助企业优化团队组织结构与文化。

周宇刚说,从价值导向看,DDD对于企业而言,是一种策略,能帮助企业识别自身核心领域,决定了企业资源怎样去运用,来支撑核心竞争力。比如核心领域,需要花大精力去做,非核心领域,可以采用更简单、更快速的方式去做,甚至直接采购成熟的软件套件。

而张逸则就DDD对团队组织结构和文化的价值进行了阐述,他表示,很多时候并不是技术上的问题,而是团队组织结构和文化方面的问题。当然这不纯粹是DDD能推动的,还可以通过敏捷或者精益的方式。

对架构师而言,DDD对架构师落地战略设计是会有帮助的,周宇刚说。因为,DDD解决跨部门间语言沟通问题,在业务、产品、开发之间建立领域通用语言以提高沟通效率。而对于开发者,DDD的作用更实际,能帮助开发者正确地开发所负责项目的代码。

张逸认为,对架构师而言,DDD能帮助架构师确认系统、领域边界,边界确认好,即使里边有问题,只要边界是稳定的,那么,系统就不会受到太大影响。

边界控制好,整体架构就会很清晰,把控也会更直观,这样的架构就不容易腐烂,现在的软件系统最大的问题,是随着时间推移它就会慢慢腐烂。而且把边界控制好,代码落到实现层面上也就相对容易。

对于开发者,张逸认为DDD主要有两个层面价值:

一、能够帮助开发者补充知识,不想当架构师的开发者不是一个好的开发者,开发者不能只满足于架构师分配的一亩三分地,也必须了解DDD知识。开发者如果只知道架构师要干嘛,却不知道架构师为什么要这么干,是很难提高的,这也不利于开发者去实现出来。

二、一体化的知识结构,从DDD落地上说,因为DDD更偏向于业务,更希望从业务的角度去看,所以,DDD能更好地和开发者所掌握的一些最基本设计原则匹配起来。

Image placeholder
IT头条
未设置
  44人点赞

没有讨论,发表一下自己的看法吧

推荐文章
职责驱动设计及状态模式的融会贯通

一、需求针对某通信产品,我们需要开发一个版本升级管理系统。该系统通过Java开发后台管理,由Telnet发起向前端基站设备的命令,以获取基站设备的版本信息,并在后台比较与当前最新版本的差异,以确定执行

1.3. 工厂方法模式(Factory Method)

1.3.1.目的 对比简单工厂模式的优点是,您可以将其子类用不同的方法来创建一个对象。 举一个简单的例子,这个抽象类可能只是一个接口。 这种模式是「真正」的设计模式,因为他实现了S.O.L.I.D原则

数据科学在信任与安全领域的7个典型用例

什么是信任和安全?它们在当前世界中扮演什么角色?我们经常在许多网站和平台上遇到“信任与安全”这个词。它被要求规范访客和平台之间的交互,以此促使用户的权益得到保障。从电子商务网站到社交网络,都需要防止欺

区块链仍处于婴儿期,金融业是应用最多的两个领域之一

如果问你2018年什么技术比较火,答案中一定会有区块链。从春节“3点钟无眠区块链”的狂欢开始,伴随着过山车一般的币价逐渐走向沉寂,链圈、矿圈、币圈的鄙视链似乎也不再那么重要。10月24日下午过后,在国

盘点 | 近期网络安全领域的7次重大收购

网络安全在今天比以往任何时候都更加重要。原因是我们比以往任何时候都更紧密地联系在一起。数字转型给我们带来了新的曙光,一切都通过互联网连接起来。然而,这使得我们的数据比以往任何时候都更容易受到攻击。技术

数据科学领域的核心技能和新兴技能分别有哪些?

近年来随着大数据的迅速发展,各种各样的数据分析技能也逐渐大热,为了找到数据科学领域目前最常用的技能和未来最流行的应用趋势,我们进行了一项调查。我们确定了数据科学技能的两个主要类别:一个是大多数受访者拥

解读 KubeCon EU 2019 应用管理领域的新看点

作者 |阿里云智能事业群技术专家邓宏超划重点阿里云容器平台技术专家、原CoreOS公司工程师、K8sOperator项目的核心作者之一邓洪超,精彩解读KubeConEU2019“应用管理“领域精华内容

首日精彩 DTCC大会见证数据库领域十年变迁!

【ITPUB独家报道】2019年5月8日-10日,第十届中国数据库技术大会(DTCC2019)在北京新云南皇冠假日酒店隆重召开。作为国内顶级的数据领域技术盛会,本次大会以“数据风云十年变迁”为主

盘点2018:数据库领域关键词“自研” ”融合“ ”崛起“

尽管2019年已然开始,但只要农历春节还没过,就意味着2018年还没有真正结束。回望过去一年,数据库领域发生了哪些有代表性的事件?这些事件背后预示哪些趋势?尽管2019年已然开始,但只要农历春节还没过

数据科学在市场营销领域的8个最佳用例

在这篇文章中,我们将介绍一些数据科学在营销领域的关键用例。就数据科学的关键目标是将数据转化为可操作的洞察而言,为了获得更高的盈利,营销领域不能忽略这些洞察的应用。大数据技术,为在营销中更好地了解目标受

如何成为数据库管理员(DBA)

作者:MacyBayern编译:老鱼如果你想成为DBA,但又不知道从何入手,那么,这里有一份关于DBA薪酬、就业前景、技能和常见面试问题指南,也许可以给您一定的参考。人工智能(AI)、机器学习和物联网

《MongoDB高手课》学习记录(第十六天)

第十六天今天开始事务的学习,要学习的章节为《19|事务开发:写操作事务》,其实主要就是讲一个参数writeConcern。什么是writeConcern?之前第一章我们学过,生产环境中MongoDB最

【数据结构】1_进阶高手的大门

理解程序的本质问题:为什么会有各种各样的程序存在?程序的本质是什么?程序是为了解决实际问题而存在的,从本质而言,程序是解决问题的步骤描述。一小步的进阶:理解实际问题 确认问题类型 如:数值计算,求最

Python程序员进阶必备:从新手到高手的100个模块

在知乎和CSDN的圈子里,经常看到、听到一些python初学者说,学完基础语法后,不知道该学什么,学了也不知道怎么用,一脸的茫然。近日,CSDN的公众号推送了一篇博客,题目叫做《迷思:Python学到

60秒一口Python:147个demo,助你从新手小白步步进阶编程高手

人生苦短,编程苦手,不妨学起Python,感受一飞冲天的快乐。不要害怕学习的过程枯燥无味,这里有程序员jackzhenguo打造的一份中文Python“糖果包”:147个代码小样,60秒一口,营养又好

《MongoDB高手课》学习记录(第十七天)

写在前面最近有新项目上线,实在太忙了,学习的进度有点拖沓,但会坚持。第十七天今天要学的是《20|事务开发:读操作事务之一》章节。主要讲解的是怎么哪里读取数据的问题。readRreference参数值有

如何设计 QQ、微信、微博、Github 等等,第三方账号登陆 ?(附表设计)

前言:多账户登陆1.创业初期用户名密码注册登陆手机号注册登陆2.数据库设计3.引入第三方账户方案4.数据库设计5.总结前言:多账户登陆互联网应用当中,我们的应用会使用多个第三方账号进行登录,比如:网易

Go语言高级编程_5.8 接口和表驱动开发

5.8接口和表驱动开发 在Web项目中经常会遇到外部依赖环境的变化,比如: 公司的老存储系统年久失修,现在已经没有人维护了,新的系统上线也没有考虑平滑迁移,但最后通牒已下,要求N天之内迁移完毕。 平台

如何通过测试驱动开发构建 Laravel REST API

这是TDD和敏捷开发方法学的先驱之一 JamesGrenning的名言 如果您不进行测试驱动的开发,那么您将进行后期调试-JamesGrenning 今天我们将进行测试驱动的Laravel之旅。我们

如何构建“小数据”驱动的泛场景智能应用体系?

张真百信银行首席技术架构师&AILab负责人目前负责基于自然语言的动态银行研究与落地,关注AI技术与金融,办公,生活场景的深度融入;开源软件UAVStack创始人,面向智能运维提供解决方案,AIOps

软件架构被高估,清晰简单的设计被低估

软件架构最佳实践、企业架构模式以及系统描述的正式方法都是非常重要且实用的工具,总会有合适的场景让它们发挥作用。但在设计系统时,请从简单始、以简单终,尽可能避免一切会无谓提高复杂度的架构与正式工具。

Laravel 使用 CURD 之外- Domain,大中型 Laravel 项目架构设计

0x01面向领域的Laravel 人类分类思考,我们的代码应该映射这一点 首先说明,我没有提出这个术语『领域』-我从流行的开发模式DDD中学来的。引用牛津词典,『领域』可以描述为『一个特定范围的活

GoWeb教程_13.0. 如何设计一个 Web 框架

前面十二章介绍了如何通过Go来开发Web应用,介绍了很多基础知识、开发工具和开发技巧,那么我们这一章通过这些知识来实现一个简易的Web框架。通过Go语言来实现一个完整的框架设计,这框架中主要内容有第一

GoWeb教程_13.2. 自定义路由器设计

HTTP路由 HTTP路由组件负责将HTTP请求交到对应的函数处理(或者是一个struct的方法),如前面小节所描述的结构图,路由在框架中相当于一个事件处理器,而这个事件包括: 用户请求的路径(pat

GoWeb教程_13.3. controller 设计

传统的MVC框架大多数是基于Action设计的后缀式映射,然而,现在Web流行REST风格的架构。尽管使用Filter或者rewrite能够通过URL重写实现REST风格的URL,但是为什么不直接设计