DDD做为软件设计方法于2004年提出,一直不温不火,最近几年突然火起来了,为啥呢?正所谓机会给有准备的人,因为微服务的流行,大家都跃跃欲试把传统单体软件转成微服务架构,但理论很丰满,现实很骨感,光是分解微服务就让人找不到北,而DDD是歪打正着也好,富有远见也好,正好适合微服务转型设计,不火都难。

最近学习了领域驱动设计(Domain-Driven Design),感觉受益匪浅,那到底啥是DDD呢?这里分享一下学习心得。网上有很多详细的资料,感兴趣可以看看这个https://www.infoq.cn/article/implementation-road-of-domain-driven-design。

个人理解:DDD首先是一种设计思想,所谓思想就是回答“设计的本质是什么,主要逻辑是什么”这类大的问题。DDD强调要从业务视角思考怎么设计软件架构,设计一定要知道业务是什么样子的,业务的需求和问题是啥,有啥内在逻辑,而不是从软件技术技术本身出发,这个对设计而言就是大的方向问题。虽然这个方向说出来好像没什么,但是实践上很多软件人员更多是从软件本身开始设计,一遇到业务问题就绕道走,所以强调从业务出发是这个方法最有价值的地方,这种梳理就称为战略设计。

DDD不只回答了方向问题,也提供一套方法,软件设计是个高度逻辑化的工作,需要概念特别清晰,推导过程有章法可循。DDD提供了对业务描述的一套方法,先对业务实体进行抽象,定义了一些软件设计概念,如实体对象,值对象,聚合对象,服务等,也提供了对象关系之间的描述。这部分对业务人员来说理解起来不容易,但是一旦理解了,对业务理解也就更深入了。前面根据业务把战略设计好了,就可以利用这些软件概念把业务逻辑映射成软件架构,这种过程DDD称为战术设计。

DDD还是一种具体的实践指导,在实际工作中,组织跨部门讨论是很难的,软件兄弟抓业务人员讨论就更困难了,一是大家思维模式差异比较大,沟通自然比较困难;二是大家都忙,不一定好找人,而且找到了业务人员也没啥设计概念,当面讨论都难深入,别提电话邮件了效果就更差了。针对这两点,DDD首先干的一个事情就是把业务人员拉在一起,澄清概念,互相理解对方做的工作,这个方法DDD称为统一语言。其次DDD还开发了事件风暴方法,一步一步指导大家操作得出结论,为了有好的效果,操作指导具体到讨论时用什么颜色的标签纸。

对统一语言的重要性我觉得怎么强调都不过分,这个对业务设计太重要了。比如在故障定位的业务架构设计中,深入讨论后发现很多基本概念都是不统一的,例如TT故障单到底指什么?故障范围到底怎么定义,什么叫根因。如果这些都不明确,软件自然就不会有高质量。

但是事件风暴方法我倒是持半信半疑态度,半疑是因为这类操作方法和业务场景有关系,看起来方法适合短时间内收集业务需求,而我司业务人员和软件开发集成在一起,不一定这么死板操作。半信是因为目前讨论的确需要一个好的形式,说不定有效,当然实践上我觉得先分组输出再集成讨论也是一种选择。

另外说说翻译问题,大凡直译的文章都令人费解,例如中文PMBOK把项目翻译成一种临时性工作,怎么看怎么别扭。DDD 中Domain一词翻译成领域,直译没有问题,但不符合信达雅的原则,说起来很绕。DDD是从软件公司的通用软件架构师的视角来思考怎么设计软件的,对软件架构师而言,要给各行各业设计软件,这种情况最难的是啥,就是理解千差万别的行业领域,所以老外理所当然在方法中突出领域这两个字,不过按照中文习惯翻译成业务驱动设计会更好理解。还有Bounded Context翻译成限界上下文,本意是强调内部的事情内部解决,具体定义只在业务模块内有效。我更愿意把它翻译成组件,只是这个组件需要有明确边界和职责。

最后贴几页故障定位架构设计材料,大家感受一下实际的应用例子,按照高内聚低耦合的理念,TOP DOWN一步步分析业务,会很方便的导出软件架构。

作者:华为云专家 秦广溥

【华为云技术分享】如何设计高质量软件-领域驱动设计DDD(Domain-Driven Design)学习心得相关推荐

  1. 【华为云技术分享】“技术-经济范式”视角下的开源软件演进剖析-part 1

    前言 以互联网为代表的信息技术的迅猛发展对整个经济体系产生了巨大的影响.信息技术的发展一方面使知识的积累和传播更加迅速,知识爆炸性的增长:另一方面,使信息的获取变得越来越容易,信息交流的强度逐渐增加, ...

  2. 【华为云技术分享】“技术-经济范式”视角下的开源软件演进剖析-part 3

    4. 微观层面 4.1 个体动机 在开源软件发展之初, 商业组织的投入很少甚至没有, 完全是靠Richard Stallman 或者 linus Torvalds 这样的个人在努力推动开源软件艰难前行 ...

  3. 【华为云技术分享】三大前端技术(React,Vue,Angular)探密(下)

    [华为云技术分享]三大前端技术(React,Vue,Angular)探密(上) [Angular] Angular(通常被称为 "Angular 2+"或 "Angula ...

  4. DDD(domain driven design)-领域驱动设计

    domain driven design-领域驱动设计 领域驱动设计概述 背景 软件架构模式的演进 概念 分层架构与六边形架构 分层分包 复杂是我们软件生涯的一生之敌. 分层架构 & 面向过程 ...

  5. DDD(Domain Driven Design) 领域驱动设计从理论到实践 四

    - 接上 SOA 架构 ​     面向服务架构(Service Oriented Architecture,SOA)对于不同的人来说意思不同.这里梳理一下SOA原则: 服务契约 : 通过契约文档,服 ...

  6. 【华为云技术分享】从 Cloud 1.0 到 2.0,云计算的“多元架构命题”

    今天,我们处于 Cloud 2.0 时代.1.0 时代,企业接触云计算,开始上云:2.0 时代,企业云化加深,核心业务上云.然而,在 2.0 时代,我们看到云计算正在进入多元架构时代. 什么是多元架构 ...

  7. 【华为云技术分享】直播回顾丨激发数据裂变新动能,HDC.Cloud云数据库前沿技术解读

    3月24日14:00-17:00,HDC.Cloud开发者沙龙系列云数据库专场直播线上开启,此次华为云数据库通过三场直播从NoSQL数据库新技术.数据库迁移.行业解决方案等方面对云端数据库进行深度解读 ...

  8. 【华为云技术分享】如何览遍“数字中国”的现在与未来?云上智慧地图来支招

    以前,家家户户都会挂着一张中国地图和世界地图,很多人对世界的概念也源于那一方轮廓,小小地图记载了整个世界的山川河流.城市人文,也撩动了我们对世界的好奇心.如今,随着科技的发展,纸质地图逐渐退出了我们的 ...

  9. 【华为云技术分享】浅谈服务化和微服务化(下)

    [摘要] 服务化来自于真实世界的映射.对于微服务,我们也要寻找真实世界的隐喻. 上篇主要讲服务化,下篇我们谈谈微服务.很显然,服务化来自于真实世界的映射.对于微服务,我们也要寻找真实世界的隐喻. 1. ...

最新文章

  1. html图片怎么设置悬浮效果,图片漂浮效果js实现
  2. select选中的值_selenium下拉框处理(select)
  3. linq判断集合中相同元素个数_java----Collection集合常用方法
  4. 说好的弯曲损耗不敏感呢!入户皮线光缆的衰耗从何而来?
  5. 实现elementUI多语言切换
  6. veu——引入iconfont图标
  7. curator分布式锁
  8. 硬盘克隆工具Linux,硬盘克隆(FarStone DriveClone)下载_硬盘克隆(FarStone DriveClone)官方下载-太平洋下载中心...
  9. 云米发布上市后首份财报:非GAAP净利3875万 同比增36%
  10. C语言数组讲解(1)一维数组的创建和初始化。
  11. FTDI 234XD USB转串口 PC识别串口固定的解决方法
  12. 【极简版GH60】【GH60剖析】【一】组件的选购
  13. 北斗导航试运行将可兼容GPS 2020年有望普及
  14. 示波器中符号的意思是什么
  15. android设备变砖,安卓手机变砖了怎么办?
  16. 循环-09. 支票面额(15)
  17. Linux | 关于putty出现access denied的问题解决方案
  18. android平板刷ubuntu6,andorid平板中安装完整的ubuntu系统
  19. 两个键盘一台电脑玩实况的方法
  20. Mp4文件和3gp文件的区别

热门文章

  1. 视觉SLAM笔记(65) 简约总结
  2. ROS笔记(32) MoveIt!关节控制器
  3. java 一个大事务下的新增、修改、查询_一文带你轻松搞懂事务隔离级别(图文详解)...
  4. c++利用初始化列表在类内部和类外部定义构造函数的区别
  5. ASTreeView 1.4.0发布(ASP.NET树控件)
  6. [转]iOS SDK:iOS调试技巧
  7. composer安装laravel-u-editor及其使用
  8. php - MySQL创建新用户并授权
  9. c#中关于delegate、委托、事件之间的联系、关系
  10. 第一次HACK别人的DLL