本文书接上回《这就是为什么你学不会DDD》,关注公众号(老肖想当外语大佬)获取信息:
  1. 最新文章更新;
  2. DDD框架源码(.NET、Java双平台);
  3. 加群畅聊,建模分析、技术实现交流;
  4. 视频和直播在B站。

https://mp.weixin.qq.com/s/TJEtclwcJydiE58pjWpXXw
 

背景

前文说到,我们在建模的时候要放下技术层面的心智负担,这是我们自己内在的问题,相对来讲容易克服。但另外一面,我们分析需求、设计模型时候,就会与业务人员、产品经理等角色进行深入沟通互动,这个时候,很难找到一个比较一致的表述方式,以在大家的大脑中展现出比较一致的形象,往往会出现认知偏差,甚至相互得出相反的理解却无法察觉的情况,沟通效率和准确性非常糟糕。
为了解决这个问题,我们发现了一个很容易被接受的“类比”,就是“拟人化模型沟通法”。
PS: 你依然要先忘掉所有的技术知识。
 

为什么可以拟人化

我们先来看下面的图,展示了一家公司的组织架构:

 
如果我们把图中的结构不变,仅仅是把元素的名称进行替换,就能得到一个系统的结构图:

 
在这里我们得到如下的对应关系

 
其中公司对应系统,部门对应模块,可以理解为层级或者分组,是比较自然的,接下来我们重点看看员工和模型为什么可以对应。
 

“人”与“模型”的共性

 
首先我们思考一下,企业中员工之间是怎么协作的,我觉得无外乎下面两种情形:
 
  1. 真“手把手”教你做事;
  2. 我做好我的事,然后通知你,你做好你的事;
 
类似下图:

 
如果一个任务需要员工A手把手教员工B做,那是不是意味着下面几个情况:
  1. 员工B无法独立完成该任务;
  2. 员工A对该任务最终负责,或者至少是AB共同负责;
 
如果两个员工的协作模式模式2,即“我做好我的事,然后通知你,你做好你的事”,是不是意味着:
  1. 员工A和员工B各自有自己的职责;
  2. 员工A和员工B通过“通知(事件)”来协作;
 
基于上述的逻辑,我们是不是可以得出下面的类比:
 

 
基于这样的类比,我们可以得出如下结论:
 
  1. 如果一个任务需要模型A直接依赖(调用)模型B,说明它们无法独自完成任务;
  2. 如果模型A和模型B仅通过事件协作,说明它们相互独立,职责边界清晰;
 
这个结论情形2是非常合理的,但如果我们遇到的是情形1,一个任务需要模型A和模型B共同的信息协作才能完成,我们一般认为有两个可选方案:
  1. 合并模型A和模型B,把他们看作一个整体,在模型图上的表现,就是他们之间有实线相连,他们是一个聚合整体;
  2. 创建模型C,来负责这个任务的解决,由模型A和模型B通过事件通知的方式把信息告诉模型C;
 
最终我们的模型都会是通过事件的方式协作,“人”与“模型”的共性大体如下:
 
  1. “人”与“模型”都有自己的职责,负责解决特定的业务问题;
  2. “人”与“模型”都拥有要履行自己职责所需要的信息;
  3. “人”与“模型”都通过事件驱动来协作;
 
 

拟人化建模沟通法

 
基于上面的推导,我们可以把一个个“模型”看作是一个个人的名字,那么在我们沟通时,就会可以用拟人化的方式来表达业务流程,表达模型的职责,表达模型身上需要携带哪些信息,表达命令与事件:
 
  1. 当“支付单”支付成功的时候,“订单”得把自己的支付状态设置成已支付;
  2. 当“用户”注册成功的时候,得向“用户积分账户”里发5个积分;
  3. “商品列表”要展示“商品信息”和“销售统计”的综合信息,还得支持各种纬度的搜索,性能还得跟得上;
 
通过拟人化的方式,我们可以在业务人员、产品经理、技术人员的大脑中构建比较一致的形象,这些形象对应着“职责”、“能力”和“边界”,从而我们可以在一个频道上推演这些“模型”的定义和分工协作,是否真的可以满足需求,至此,我们的团队获得了一个能力,就是“有效的建模沟通”,借助这个能力,我们就可以实现“需求-模型-代码”三者一致性的前半部分,即“需求-模型”的一致性:
 

 
 

后续

后续,我们会就“模型-代码”如何保持一致性展开剖析,敬请期待。
 
请关注公众号(老肖想当外语大佬)获取最新更新。
 

一种很变态但有效的DDD建模沟通方式的更多相关文章

  1. 介绍一种很棒的wince 如何替换系统声音的方法

    Topic:介绍一种很棒的wince 如何替换系统声音的方法(作者:Baiduluckyboy) //------------------------------------------------- ...

  2. 一种很有意思的数据结构:Bitmap

    昨晚遇到了一种很有意思的数据结构,Bitmap. Bitmap,准确来说是基于位的映射.其中每个元素均为布尔型(0 or 1),初始均为 false(0).位图可以动态地表示由一组无符号整数构成的集合 ...

  3. 用 Java 技术创建 RESTful Web (服务 JAX-RS:一种更为简单、可移植性更好的替代方式)

    作者: Dustin Amrhein, 软件工程师, IBM Nick Gallardo, 软件工程师, IBM 出处: http://www.ibm.com/developerworks/cn/we ...

  4. 操作系统实现线程的几种模式 和 java创建线程的3个方式

    操作系统实现线程的几种模式 和 java创建线程的3个方式  这是两个概念 在操作系统中,线程可以实现在用户模式下,也可以实现在内核模式下,也可以两者结合实现. 1.实现线程的三种方式: (1)继承t ...

  5. Ckeditor一种很方便的文本编辑器

    ckeditor官网:http://ckeditor.com/ 这里介绍ckeditor的其中一个的用法,自己做小项目练手非常的适合,上手非常的快. 首先去官网下载这个东西,链接:http://pan ...

  6. mac下两种很常见的button的xib设置

    第一种,双变button.就是有两种状态的button:普通态和点击选中态. 第二种,点变button.有两种状态:普通态和mouseDown的态,mouseUp时同普通态.

  7. 【很变态】PHP类实例化对象竟然可以访问类的“静态(static)方法”!!!

    之前发现一个PHP的变态问题:PHP中静态(static)调用非静态方法详解 这次看了下 ThinkPHP 的源码 function.inc.php ,里面有个函数: /** * 取得对象实例 支持调 ...

  8. 在不开启事件循环的线程中使用QTimer(QThread::run函数自带事件循环,在构造函数里创建线程,是一种很有意思的线程用法) good

    引入 QTimer是Qt自带的定时器类,QTimer运行时是依赖于事件循环的,简单来说,在一个不开启事件循环(未调用exec() )的线程中,QTimer是无法使用的.通过分析Qt源码可发现,调用QT ...

  9. iOS 一种很方便的构造TarBar

    直接在TarBarController中操作,代码如下: #import "DLTabBarController.h" #import "ViewController.h ...

  10. 一个很变态的SQL

    select max(s.operat_time) as pzTime from ws_state_record s where s.status = (select p1.node_id from ...

随机推荐

  1. ReST,以及RESTful的 简单介绍

    什么是 ReST 阮一峰说的比较清楚,具体见他的博客文章. 二.名称 ReST这个词,是[Roy Thomas Fielding](http://en.wikipedia.org/wiki/Roy_F ...

  2. 设备树DTS 学习:3-驱动开发中常用的 DTS api

    背景 本章的内容是为了实现在驱动中的开发,通过调用有关的api来寻找设备树节点熟悉,从而达到使用设备树进行驱动开发的目的. 参考:Linux内核 设备树操作常用API Linux设备树语法详解一文中介 ...

  3. 使用Sqlcel操作数据库整理数据视频

    链接:https://pan.baidu.com/s/1G4FJbLbN0oXAu61syWxCOA 提取码:noyz

  4. ubuntu22 python2 pyinstaller 打包报错:'NoneType' object has no attribute 'groups'

    前言 最近有个需求,需要在 ubnutu22 上使用 pyinstaller 打包一个python2 的文件. 中间遇到了一些问题: pip2 install pyinstaller 报错 解决方案: ...

  5. Java常用JDK类库和第三方类库

    以下是收集的一些有用的第三方库,Java开发人员可以在其应用程序中使用它们来完成许多有用的任务.为了使用这些库,Java开发人员也应该熟悉这些类库. jdk自带的常用类库 java.lang包 jav ...

  6. [oeasy]教您玩转python - 0002 - 你好世界(hello world!)

    ​ 你好世界 回忆上次内容 这次我们, 了解了 Python 进入了 Python 退出了 Python 这并不难 这就是我们对于 Python 的初体验 恭喜您存活了下来! ​ 编辑 python ...

  7. AT_agc022_a 题解

    洛谷链接&Atcoder 链接 本篇题解为此题较简单做法及较少码量,并且码风优良,请放心阅读. 题目简述 给定字符串 \(S\) , 仅包含互不相同的小写字母, 你需要找到仅包含互不相同的小写 ...

  8. Sonar 扫描之分析参数介绍

    Sonar扫描之分析参数介绍 强制参数 服务器 Key 描述 默认 sonar.host.url 服务器网址 http://localhost:9000 项目配置 Key 描述 默认 sonar.pr ...

  9. 新做了一个MySQL 数据库 DDL 差异对比的网站

    MySQL 数据库 DDL 差异对比的网站 摘要 新做了个网站,用来对比不同环境下的 DDL 差异,生成变更点和 迁移 DDL 网站地址:https://ddlcompare.com/ 对比过程中如果 ...

  10. 使用maven搭建父工程与子工程

    父/子工程的作用: 1.依赖管理 2.配置信息共享 3.模块化 4.版本控制 5.提高重用性可维护性 什么是dependencyManagement: maven中的一个元素,用于集中管理项目中的依赖 ...