你在使用哪种编程语言?快来投票,亲手选出你心目中的编程语言之王 了解详情
写点什么

运用四色建模法进行领域分析

2011 年 11 月 07 日

领域建模有很多种方法,对于同样的问题域使用不同的建模手段得到的模型可能也不尽相同。于是我经常听到这样一个问题:怎么才能保证建模的正确性?

这听起来是个合理的质疑,但实际上却不是那么有道理。首先我们需要明白建模的目的是什么?如果仅仅是为了描画问题,那么并没有什么对错之分——仅仅是立场和角度的差别;而如果是为了企业业务系统而进行建模,那么这个问题应该变为:如何保证模型能够支撑企业的运营?

我想用下面这个例子来简要的回答一下这个问题。

在开始分析和建模之前,我们需要知道企业业务系统的目的是什么;而企业业务系统的目的往往跟决策者或者管理的诉求相关。我们现在需要移情到一位管理者身上,看看他的诉求到底是什么。

现在假想你是一家在线电子书店的 COO。突然有一天,有一位顾客向你投诉,说他订购的书少了一本,并且价钱算错了,他多给了钱。在你承诺理赔之前,你需要核对一下这位顾客说的是否属实。那么这个时候你需要知道什么样的信息才能做出准确的判断呢?

简单来说,你需要知道这位顾客订购了那些书籍,付了多少钱以及书店到底为这个顾客递送了那些书籍。不幸的是,由于科技不够发达,你无法直接驾驶时间机器回到从前去亲眼看看发生了那些事。但幸运的是,你并不需要这么做,你只需要看看这位顾客的订单,和网银的支付记录以及你们书店交给 EMS 的快递单存根,就应该知道这些信息了。

你找到了订单和 EMS 快递存根。发现这位顾客是在三天前订购的书,而你们在前天就已经将书邮寄出去了。并在订单上看到这位顾客一共订购了 7 本书,但是在 EMS 的快递存根上,并没有任何书籍的信息,只有地址,包裹号,邮费和重量什么的信息。这时候你觉得应该去询问一下配送部门,看看他们做了什么。

在配送部门你根据包裹号查到了那个包裹的信息,果然里面只有 6 本书。同时你在包裹部门发现了一张延期交货单。上面说明由于缺货,这位顾客另外一本书正在等待发货。

那么剩下的问题就是支付问题了,从网银的记录上看,客户不含邮费一共支付了 132.5。订单上显示的价钱也是 132.5,显然这位顾客并没有多付钱。

为了保证准确,你重新从网站上选了这 7 本书,想看看是否也会是这个价钱。但你却意外的发现,一共只需要 128.3。仔细辨认后,你发现有一本图书现在是促销。那么现在的问题是,促销到底是什么时候开始的?

你到了市场部,市场部给了你一份近期促销计划。你发现那本书是昨天才开始促销的,也就是说在那位顾客在下订单的时候,促销还没有开始。

这个时候,你觉得应该给你的顾客打一个电话致歉,商讨如何后续邮寄的问题,并向他说明促销的事情。

你是否觉得这个 COO 当得有点累呢?这当然是虚构的。但是从这故事里面我们看到什么呢?

任何的业务事件都会以某种数据的形式留下足迹。我们对于事件的追溯可以通过对数据的追溯来完成。正如上面这个故事里,你无法回到从前去看看到底发生了什么,但是却可以在单据的基础上,一定程度的还原当时事情发生的场景。当我们把这些数据的足迹按照时间顺序排列起来,我们几乎可以清晰的推测出这个在过往的一段时间内到底发生了那些事情。

那么为什么这些数据形成的链条能够成帮助我们追溯业务的营运呢?

因为这些数据并不是随便挑选的。如果我们回顾一下你作为 COO 检查这个疏漏的过程,你首先选择了订单和 EMS 快递存根,换句话说,如果订单出现差错,或者 EMS 快递存根上说明你的确邮寄了 7 本书,那么这个疏漏的责任并不在你。所以这两个订单实际上这个你这个企业法律责任的起点和终点。

当你确定这个疏漏的责任在你之后,你选择审查一些流程执行的结果,比如包裹存根。从而验证一些主要的业务流程执行的结果是否正确。换句话讲,这些数据是支撑你运营体系的关键流程的执行结果

正是由于这些数据是流程执行的结果,它们才使我们可以在不了解流程细节的前提下,对某些突发事件进行追述和分析。

除了上面那个极端的例子(投诉),对于任何一笔正常的经济往来,我们都需要知道:

  1. 如果我付出一笔资金,那么我的权益是什么?
  2. 如果我收到一笔资金,那么我的义务是什么?

而这些问题都需要业务系统捕捉到相应的足迹才能够回答。所以企业的业务系统主要的目的之一,就是记录这些足迹,并将这些足迹形成一条有效的追溯链。

而作为业务分析师的你,则应该知道那些事件在运营上是需要追溯的,这些事件都留下了什么足迹。

这些足迹通常都具有一个有意思的特性,即它们都是时标性对象(moment-interval)。发现这些时标性对象就是建模的起点。对于这些时标性对象稍加整理,我们就得到了整个领域模型的骨干:

在得到骨干之后,我们需要丰富这个模型,使它可以更好的描述业务概念。这时候,我们需要补充一些实体对象。通常实体对象有三类:人,地点, 物(party/place/thing)。

在这个基础上,我们可以进一步抽象这些实体事如果参与到各种不同的流程中去的,这时候,我们就需要用到角色(role):

最后再把一些需要描述的信息放入描述对象(description)。

我们就得了应用四色建模方法(color modeling)建立的一套领域模型。

简要回顾一下上面的过程,不难发现我们建模的次序和重点:

  1. 首先以满足管理和运营的需要为前提,寻找需要追溯的事件。
  2. 根据这些需要追溯,寻找足迹以及相应的时标性对象。
  3. 寻找时标对象周围的人/事/物
  4. 从中抽象角色
  5. 把一些信息用描述对象补足。

由于在第一步中,我们就将管理和运营目标做为建模的出发点。因此,整套模型实际上是围绕这些“如何有效地追踪这些目标”而建立的,这样的模型可以保证模型支撑企业的运营。

附言

几位同事帮我审校这篇文章的时候,有人问了一个很有意思的问题:为什么你会以一个看上去像极端情况的例子来说明这个建模方法? 以我的经验来看,对于业务系统有两个东西是很重要的:可追溯性(traceability)和执行效率(efficiency)。这里的可追溯性是指责任的可追溯性(traceability of liability),而通常都是在一些不太好的事情发生之后,才需要对责任进行追溯。所以想一个相对负面的例子更容易帮助我们找到建模所需要解决的问题。

另外还有位同事说,你的四色方法与 Peter Coad 的四色法并不完全相同。是的,我所介绍的并不是 Peter Coad 的四色法, 我不敢说是发展, 仅仅是对于 Peter Coad 四色的一种变化吧。


感谢张凯峰对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家加入到 InfoQ 中文站用户讨论组中与我们的编辑和其他读者朋友交流。

2011 年 11 月 07 日 00:0041861

评论 2 条评论

发布
用户头像
这句话“我们可以进一步抽象这些实体事如果参与到各种不同的流程中去的”,应该是“我们可以进一步抽象这些实体是如何参与到各种不同的流程中去的”吧。从图中看,“市场总监”和“配货人”并不是员工的抽象吧。应该是对“员工”的具化。上面这句话是不是可以修改为“我们可以进一步具化这些实体,以便它们能更清晰的参与到各种不同的流程中去的”
2021 年 02 月 25 日 07:51
回复
市场总监,配货员是角色抽象吧。
2021 年 06 月 10 日 11:03
回复
没有更多了
发现更多内容

重磅!阿里首推内部“SpringCloudAlibaba项目文档”这细节讲解,从基础到实战一应俱全!

神奇小汤圆

Java 程序员 架构 微服务

一文读懂微前端架构

EAWorld

60个适合练手的C语言/C++项目,值得收藏!

C语言与CPP编程

c++ 源码 C语言

现在后端都在用什么数据库存储数据?

读字节

MySQL 数据库 postgresql hadoop HBase

英特尔PK赛灵思,完美胜出!Agilex™ FPGA迎来大规模量产

新闻科技资讯

上架Google Play应用如何适配Android 11?

APICloud

你是否想要自由地构筑世界?51WORLD助力数字孪生开发者快速成长

51 WORLD

开发者工具 开发者关系 数字孪生 全要素场景

fil能超越以太坊吗?fil挖矿需要多少质押币?

v:IPFS456

fil能超越以太坊吗? fil挖矿需要多少质押币?

Vineyard 加入 CNCF Sandbox,将继续瞄准云原生大数据分析领域

阿里巴巴云原生

大数据 容器 开发者 云原生 存储

面试让HR都能听懂的MySQL锁机制详解

linux大本营

MySQL 数据库 Linux 后台开发

金三银四面试结束后,整理的1000道Java面试题及答案

云流

Java 程序员 架构 面试

Flink常见数据源

大数据技术指南

大数据 flink 5月日更

前端领域的数据状态统一管理机制

鲸品堂

前端 数据 流程图 state

英特尔Agilex FPGA大规模量产出货,正面硬杠赛灵思

新闻科技资讯

ipfs挖矿的gas费怎么计算?ipfs挖矿的gas费如何减少?

投资矿机v:IPFS1234

ipfs挖矿的gas费怎么计算 ipfs挖矿的gas费如何减少

Nextcloud一站式体验

白粥

NAS Nextcloud

百亿级图数据在快手安全情报的应用与挑战

Nebula Graph

图数据库 大厂实践

SpringCloudRPC远程调用核心原理:代理模式与RPC客户端实现类

小Q

Java 学习 架构 面试

由浅入深吃透容器云+微服务+K8S+MQ+阿里云内部实施手册

周老师

Java 编程 程序员 架构 面试

Springboot结合Netty实战聊天系统

Damon

音视频

音视频开发视频和视频帧:ffmpeg的RTMP推流

赖猫

音视频 ffmpeg 推流 RTMP RTSP

Rust从0到1-集合-Hash Map

rust hashmap 集合 Collections hash map

手撕友商7nm FPGA?英特尔“亲儿子”上阵

新闻科技资讯

消费者剩余:你愿意花多少钱买一件东西?

石云升

创业 产品 职场经验 5月日更

Redis后端之Redis持久化

赖猫

redis 后端 LinuxC/C++

Github星标81k!阿里独有的高并发实战笔记首次曝光

Crud的程序员

Java 编程 架构 高并发

Flutter开发:如何引入第三方库并安装使用

三掌柜

5月日更

看完这个刷题笔记与代码规范,距大厂又近了一步!值得收藏!

C语言与CPP编程

c++ 程序人生 算法 C语言 代码规范

领域驱动设计(DDD)

信码由缰

DDD

如何模拟弱网环境?

运维研习社

Linux 运维 网络 5月日更

全网首发20+互联网公司“Java面试考点大全”,应有尽有

Crud的程序员

Java spring 程序员 架构

技术为帆,纵横四海- Lazada技术东南亚探索和成长之旅

技术为帆,纵横四海- Lazada技术东南亚探索和成长之旅

运用四色建模法进行领域分析-InfoQ