致想给遗留系统写自动化单元测试的开发团队——事件风暴之父的工作坊实录之二:软件开发设计

一家大型企业的关键业务代码已经年久失修成为了难以维护的遗留代码,有着硅谷高科技企业软件开发管理经验的高管决定在企业内部搞编写单元测试和重构的极限编程实践。这需要为企业遗留系统的代码编写自动化单元测试。那么编写自动化单元测试该从哪里入手呢?

上文所提到的“领域驱动设计中国峰会2017”大会Event Storming 之父 Alberto Brandolini授课一天的“事件风暴工作坊”下午的“软件开发设计”(Software Design)环节,可以让开发团队了解系统应该具备的领域模型及其交互关系,为编写单元测试进而驱动重构提供指导。

“领域驱动设计中国峰会2017”大会“事件风暴工作坊”下午的“软件开发设计”环节

以下是实施步骤:

  1. 完成了“探索业务全景”环节。

  2. 确定要建模的需求
    在上午探索培训机构的业务的基础上,下午的任务是要为“替换Eventbrite在线应用“这个需求进行领域建模。假设你是Eventbrite的开发团队且想了解如果入手编写单元测试,那么可以把Eventbrite视作遗留系统,用以下步骤来为其建模。

  3. 了解领域模型之间的业务逻辑链
    从需求的起源来看,用户的需求来自于真实世界和 Read Model,并根据它们来进行 Decision Command(决策命令)。比如培训课程的听众根据“课程、价格、日期、讲师、城市、是否有空”这些 Read Model 来决定是否去报名参加培训。
    用户做了 Decision Command后,就会通过 Aggregate (像个状态机)或 External System (外部系统)来产生一个 Event(领域事件)。
    这些事件又可能会通过一个 Policy (业务规则)来触发下一个 Decision Command。


    用户做了 Decision Command后,就会通过 Aggregate 或 External System 来产生一个 Event,而这又可能会通过一个 Policy 来触发下一个 Decision Command

    我照着上图又画了一个版本
三种事件风暴领域模型
  1. 用7种报事贴来贴领域模型并梳理业务逻辑链
    • Read model: 浅绿
    • User: 黄色小报事贴
    • Decision Command: 浅蓝
    • Aggregate: 黄色大报事贴
    • Event: 橙色
    • External System: 浅粉大报事贴
    • Policy: 紫色大报事贴
      按照从左到右的时间顺序来贴:


      用7种报事贴来贴领域模型并梳理业务逻辑链

下面其中一组同学贴出的培训课程报名订票的业务逻辑链(报名者根据培训日期订票,通过一个未起名的 Aggregate 生成了 Ticket Booked 事件,这个事件又经由 Purchase Policy 触发了 Reserve Payment 的命令):


培训课程报名订票

事件风暴之父的忠告

  • 领域建模达成一致是很困难的,要有充分的心理准备。

  • 要邀请领域专家和团队所有成员,贴报事贴的空间要足够大。


    贴报事贴的空间要足够大
  • 在团队贴报事贴时,要观察不同业务部门的人的活动范围(比如财务人员不会跑到左边“培训课程准备子域”来贴报事贴,这很正常),这能启发你识别核心业务子域。有些核心业务子域是长长的一条,像泳道。有些则集中在一处,有些则会出现在一头一尾,这也很正常。


    有些核心业务子域是长长的一条,像泳道。有些则集中在一处,有些则会出现在一头一尾,这也很正常
  • 事件风暴领域模型聚集的方式有点像楼房——一片一片地出现。


    一片一片地出现
  • 开发团队不要盲目相信业务人员编写的用户故事,要合理地向业务人员 challenge 这些用户故事后面发生的事情。


    不要盲目相信业务人员编写的用户故事
  • 业务中的分支和开关会让你备受折磨,你需要衡量它们的全局价值成效来做取舍。


    需要衡量业务分支的全局价值成效来做取舍
  • Aggregate 和 Policy 的名字很难起,可以以后再起名。

  • Policy 是一种响应式的业务逻辑,它一旦接收到 Event,就会触发一个 Decision Command。

  • 有时候 Event 会通过"人工"的 Policy 来触发一个 Decision Command,但有时事实并不是这样的……


    有时事实并不是这样的……
  • 要识别那些“千夫所指”的业务瓶颈,首先消除这些最大的障碍,才能有效提升全局优化的成效。


    首先消除这些最大的障碍,才能有效提升全局优化的成效

我的一些理解及 Brandolini 的回复

  • Aggregate 可以理解为“数据完整性的维护者”。
  • “千夫所指”的业务瓶颈可以作为编写自动化测试的第一个测试用例。
  • 我试图把 Brandolini 的上述7种事件风暴领域模型与 Evans 的 Model-driven design 中谈到的7种领域模型按下面的方式对应起来,但Brandolini给了令我惊叹的回复:
    • 我试图两者对应起来:
      • Read model(浅绿)可以对应 Entities 和 Value Objects,而后两者可以用 Factory 来创建,其中 Entities 可以保存在 Repositories 里面。
      • User(黄色小报事贴)没有对应。
      • Decision Command(浅蓝,可以对其编写自动化测试)可以对应 Aggregates、Entities 或 Value Objects 里面的行为。
      • Aggregate(黄色大报事贴,可以对其编写自动化测试)可以对应 Aggregates ,而 Aggregates 可以由 Factory 来创建,之后可以保存在 Repositories 里面。
      • Event(橙色)可以对应 Domain Events。
      • External System(浅粉,可以对其编写自动化契约测试)可以对应 Services。
      • Policy(紫色,可以对其编写自动化测试)可以对应 Aggregates、Entities 或 Value Objects 里面的行为。
        Evans 的 Model-driven design 中谈到的7种领域模型

        Brandolini 的7种事件风暴领域模型
    • Brandolini 的回复:
      • Eric Evans的领域模型出现在CQRS之前。虽然这些模型目前仍然有效,但是CQRS的影响力更大。
      • Read Model 如今是(DDD领域中的)一等公民。而将其对应到 Entities 和 Repositories 曾经是以前那些做法的薄弱环节。
      • Policies 其实是被漏掉了。Eric 从来没有说过领域模型的搜集工作已经完成了。所以对于这一点没有所谓的官方建议。一些人创建了代表进程的聚合,另外一些人则将大量的逻辑推向了 Application Services(这通常让领域模型变得贫血)。 Greg Young 曾指出在这些方面应该有所变化。
      • 我偏好于“对称性”的领域建模,即将 Aggregates 将 Commands 转化为 Events,而 Policies 对 Events 作出响应并调度 Commands 来进行工作。

总结
对于要为企业遗留系统的代码编写自动化单元测试的开发团队,可以在进行了“探索业务全景”环节之后,使用“软件开发技术”环节中的识别7种事件风暴领域模型的技术,来优先梳理那些“千夫所指”的有业务瓶颈的业务的逻辑链,然后可以开始对其中的 Decision Command、Aggregate 和 Policy 编写自动化单元测试。用这些单元测试来驱动遗留系统代码的重构,让遗留系统的代码变得易于维护。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,324评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,356评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,328评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,147评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,160评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,115评论 1 296
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,025评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,867评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,307评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,528评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,688评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,409评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,001评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,657评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,811评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,685评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,573评论 2 353

推荐阅读更多精彩内容