复杂软件设计之道:领域驱动设计全面解析与实战
上QQ阅读APP看书,第一时间看更新

2.3 通过领域故事或流程发现有界上下文

领域故事(Domain Storytelling)是由Stefan Hofer在https://domainstorytelling.org提出的一种非常轻量级的工作坊形式,通过讲述故事的方式,专注于领域知识,通过领域语言来探索和理解用户流程、工作程序和整个业务流程与规则。

它的特点是能够按照字面意思,逐字逐句地“观察”和“改进”领域语言。当软件工程师和领域专家一起开会时,他们之间的沟通与交流其实存在很大问题,因为两种人群思考问题空间的维度是不同的,如果没有一种“语言警察”的精神实际很难达成统一认识。领域故事注重语言的语法及其语义,例如一个句子总是由主谓宾组成,表达“什么人在什么地方什么时候对什么做了什么事情”,如果使用这种基本语法形式表达想法,也许更有助于形成统一语言。

假设分析航空货运运输的领域系统,技术人员会与相关管理人员或领域专家交谈。

● 问:“你的工作做什么的?”

● 答:“进行货运计划调度”

● 问:“具体怎么回事?”

● 答:“举个例子,客户需要托运一批货物,然后需要让路线小组规划路线,机场小组再分配计划,最后指定机位。”

最后一句回答中的“客户需要托运一批货物”,主语是“客户”,谓语动词是“托运”,宾语是“货物”,可以使用不同颜色表示它们:黄色表示主语,粉红色表示谓语,蓝色表示宾语,具体颜色取决于自己,当然也可以参考“四色原型”中的四种颜色分类。

最后一句回答中的三句话其实代表了航空公司的内部流程。

1)路线小组进行旅程路线计算(主谓宾)。

2)机场小组进行分配计划(主谓宾)。

3)机组小组指派机组和机位(主谓宾)。

参会者使用这种讲故事的对话方式,然后将对话结果使用主谓宾的颜色便签贴到墙上,随着时间推移,整个墙面可能被铺满。这时会看到整个领域的一个大流程图,用这种方式应对复杂枯燥的业务领域相当有效。

将领域中的流程全部分类标识以后,会发现流程涉及的各个环节与步骤,在这些步骤中隐藏着业务能力,因为需要这些业务能力,所以流程才会转到具有这些业务能力的环节。例如,路线小组的职责是负责路线计划,这是其强项,是其专业能力的体现,而货运托运当然是需要路线规划这个能力的。

当然,能力通常与组织机构对应。路线小组是组织机构,其能力是进行路线规划,如果航空公司进行机构重组,能力和权力下放,将路线规划能力下放到机场小组,那么路线小组这个机构会裁撤了,因此,能力由组织机构实施,但是能力不等同于组织机构,组织机构容易变化、重组,但是需要做的事情不变,能力不易变化,如果只根据组织机构划分有界上下文,可能会造成系统设计非常脆弱,无法应对变化的组织机构,根据能力进行上下文的划分就更加健壮。

以请假流程为例,使用流程标准语言BPMN表达如图2-8所示。BPMN其实是和颜色标签非常类似的一种分类法。

图2-8 请假流程

这个请假流程中涉及三个步骤:审核请假、发送email和修改请假。按照主谓宾来健全这种表达方式,结果如下。

1)经理审核请假(主谓宾)。

2)系统发送邮件(主谓宾)。

3)请假人修改请假(主谓宾)。

通过这种主谓宾形式,会发现主语一般是组织机构名称或人员角色名称,这里不能根据这些主语表达的组织机构去划分上下文,但是如果这样做会怎样?经理是部门经理,如果管理改革,将请假审核的权力和能力改编到人事部门,那么主语就变成人事部了,这样上下文就不同了。如果根据能力进行划分,也就是谓语动作进行分析,“审核请假”代表一种能力或权力,权力是一种很强的能力,当然职责也是能力,那么这里就划分“审核”能力为一个有界上下文,无论组织流程怎么变,请假单总是需要被审核的,因此,这个审核上下文的生存周期会更强一些,也代表这样设计的生存能力更强。

这种能力和组织机构的对应问题在大型系统中特别明显,再列举两个例子。第一个例子是一家大型公司的IT生产制造ERP系统,整个生产制造流程为:销售、计划、采购、生产制造、交货和服务。一个大型公司为了实现这个流程涉及的各个能力,会形成相应的组织机构,组织机构为:销售部门、产品计划部门、采购部门、生产厂商、仓储物流、服务监控部门等。随着市场变化,销售部门可能会改为客户执行部,它们完成的能力还是销售与市场所需要的能力,但是部门名称和工作重点不同了,会变得更加面向客户需求,导致业务策略和规则可能与先前不同,但是负责改变业务规则是高级管理人员或领导的事情,无论规则或流程怎么样,还是需要原来的业务能力来支撑新的流程与规则,能力甚至可以碎片到个人身上,只要某个人有能力,他的能力会在新的上下文中发挥作用。因此,能力是比规则与流程更细分、更小的元素。

第二个例子是社保系统。社会保险可以说是社会福利的标志,也是政府的一个重要功能,每个人都必须参与社会保险,那么这个领域具体是什么样呢?参加社保的职工需要每个月按时缴纳社保费用,交满一定年限后(各个地区不一样),退休后就可以每个月领取退休工资了。如果是在职职工,单位人事会去社保局代为办理社保事宜,那么这个办事流程是什么呢?有的地方可能只要到市民中心去办理即可,这些都是组织机构深化改革的结果,面向参保者的办事流程可能变得简单,一窗式或一站式各种新名词很多,但是提供社保服务的领域流程是什么样的?这可以使用简单的主谓宾表达。

1)A部门负责社保关系管理。

2)B部门负责缴费申报和缴费核定。

3)C部门负责资金征集。

4)D部门负责费用记录和账户管理。

5)E部门负责待遇核定和发放。

6)F部门负责社保待遇的发放。

7)G部门负责流程审核、监控、稽查。

从这个主谓宾的领域故事中,可以理解社保系统的内部流程,这些部门在机构管理改革中会有不同的变化,例如医保原来属于社保范畴,后来政府专门成立了医保局,那么是不是上述流程会变化呢?也有可能,但是不根据主谓宾中的主语去定位组织机构,而是根据谓语动词的能力去分析:社保关系是否需要管理?这个能力需要吗?社保关系类似保险公司的保险关系合同制定,确认社保关系好像是必需的,但是如果在一个全民参保的制度上下文下,每个人只要满18岁,就必须参加社保,因此,这种社保关系管理的能力可能有点多余。如果缴费是直接通过税务局扣税,没有社保关系是否能扣税缴费呢?当然深入研究,某些城市的退休工资要高一些,社保关系其实也体现了一种户口性质,因此,从其能力职责来看是必需的,这项能力有可能被分配到社保局或市民中心,只要抓住谓语动词背后的能力即可。

这里只是浅显地分析了社保关系,其他不再做详细分析,这是社保专家等领域专家研究的专业领域知识,举例只是希望表明:根据能力划分上下文比根据组织机构划分更健壮,当然没有组织机构作为主语,也难以发现谓语动词的能力,因为人类思维的特点是主语思维,这可能涉及传统哲学和海德格尔哲学的区别,有兴趣者可深入研究。

以上讨论了如何通过领域故事或业务流程发现有界上下文。用讲故事的方式阐述领域知识是一种易于让人理解的方式,如同前面阐述的两个例子一样。这两个例子通过一种讲故事的方式将领域知识表达出来,注重主谓宾严谨用语。讲故事一般按照业务流程的方式叙述,因此,领域故事和业务流程常常是相关的,关键是需要从中找到不容易变化的业务能力,根据业务能力划分有界上下文的边界。

DDD专家Nick Tune提倡使用填写表格的方式来逐步划分上下文边界,其表格内容如下。

1)有界上下文名称:例如资产税务注册(下面的内容举例都有关资产税务注册领域)。

2)业务策略分类:分为核心、通用、支持和其他几个类别,例如公平合法地提供重要服务。

3)描述:例如有一份目录详细说明了过去20年中每一家企业缴纳的物业税金额以及用于确定金额的标准。

4)业务规则:例如公布日期规则、确认规则、相同地区比较。

5)统一语言:例如估价、非国内、遗传、修正案。

6)能力和职责:例如导入调查表、发布年度报告、评估下一年价值、记录修正。

7)依赖:与其他上下文或服务的依赖关系。

从中可以看出,其内容基本是前面讨论的各项指标,当对一个有界上下文形成共识时,将相关研究设计证据填写在表格中,这样也表示了一种设计思考过程,记录着有界上下文和领域模型是怎么来的,让初学者理解起来也很方便。

这样的表格填写不是一蹴而就的,需要反复迭代,通过讲故事的形式反复和领域专家确认,注意其主谓宾用法,捕捉其语义中的业务策略、业务规则和能力,通过反复召开的头脑风暴会议最终确认。下一节将介绍另外一种头脑风暴会议,它主要着重于寻找领域中的活动或事件,它们的一致点都是按时间线发现流程中的动词:动作行为、活动或事件。