记一次事件风暴工作坊实践&总结

起因:

项目遇到的问题?
随着团队&项目的发展,团队的业务复杂度增加。

  • 代码本身复杂度变高,维护难度变大,改动容易引发没想到的错误;
  • 单体服务越来越大,测试、构建、部署的时间越来越长,开发部署效率降低;同时测试成本变高;
  • 业务上的改动在代码层因为高耦合导致难以修改;
  • 项目复杂度导致的沟通成本增加,尤其是业务人员与技术人员之间,经常出现沟通反复确认的情况;

对于上述问题,期望通过领域驱动设计的方式:

  • 对于代码中的类、模块等,进行设计与拆分;
  • 通过将单体服务拆分为微服务,降低测试、构建、部署的时间,提高开发效率,同时享有微服务带来的一系列优势;
  • 通过与业务人员&领域专家一同建模的方式,从业务出发进行类似于面向对象的建模;最后产出高内聚,低耦合的多个独立的服务,每个服务专注在自己独立的业务上。
  • 通过合作建模,制定项目不同上下文之间,的通用语言。

人员:

项目中的主要业务&技术成员:包括PM, PO,BA, UX,TL, DEV,QA
(基于团队对行业的理解,并未邀请专门的领域专家)

主要产出物:

  • 识别系统的核心域,以及多个子域。
  • 系统的聚合
  • 系统的多个 限界上下文 以及 限界上下文地图

准备阶段:

  • 时间:根据业务复杂度以及业务场景数量;平均一个比较复杂的业务场景花了半天(4h非6h)
  • 场地:带墙面的足够容纳多人的会议室
  • 人员:确保团队关键角色参与(至少有一个能代表领域专家、业务专家、以及技术专家的人员)
  • 其他物料:4色以上便利贴,笔
  • 基本概念的拉齐: 毕竟通用语言是DDD的核心,如果在做DDD的workshop之前团队通用语言都没拉齐,那不是逗我? 包括关于DDD的认知拉齐、事件风暴方法论的拉齐
  • Persona(业务方输入): 明确产品的目标用户是什么样的一群人
  • 电梯演讲(业务方输入):明确项目愿景。明确用户、需求,产品名称、定位、竞争对手、解决问题、卖点。可以快速定义产品的核心域(卖点)和其他子域(现成方案或者与对手差不多的地方)。

电梯演讲模板:
For (Target User)
Who (Statement of needs or opportunity)
The (Product/Service name)
Is a (Product/Service category)
That (Statement of benefit)
Unlike (primary competitive alternative)
Our product (statement of primary differentiation)

事件风暴工作坊流程

团队核心概念的拉齐

  • DDD的概念包括:问题域、解决方案域、通用语言、限界上下文、核心域、子域、领域事件、领域命令、上下文地图、领域模型、聚合、实体、值对象。
  • 业务输入包括上面提到的:Persona,电梯演讲。主要目的是确保大家的项目愿景一致。

事件风暴

  • 什么是事件
    领域专家关心的,业务上真实发生的事情。例如:订单已提交,密码已锁定


    事件
  • 为什么用事件
    通过事件的方式对过去发生的事情进行溯源。能够让领域专家与其他按参与者一起梳理出什么领域模型发生了什么改变

  • 如何确定事件

  1. 确定业务场景,最好是单一且清晰;不要同时梳理过多业务场景
  2. 用“xx 已 xx”的格式在便利贴上写下事件,所有人就事件要达成一致;
  3. 时间顺序将事件贴在白板上;
  4. 事件梳理中的可以用不同颜色便利贴记录问题点
  5. 走查关联关系,确保事件的完整性,防止遗漏。

命令风暴

  • 什么是命令
    命令产生了事件。比如提交订单 -> 订单已提交


    命令
  • 为什么是命令
    命令与事件对应输入输出 (如果了解Redux的,跟Redux中的Action与State有点异曲同工)

  • 如何进行命令风暴

  1. 常见的有:用户的UI操作、定时任务触发、外部系统触发
  2. 一个命令可以产生多个事件
  3. 可以区分发出命令的是人还是外部系统

寻找聚合

  • 什么是聚合
    一组相关领域模型的结合,封装业务的不变性,确保关联关系紧密的领域模型能够内聚在一起。

  • 为什么要做聚合
    封装业务的不变性,同时强迫大家尽可能的简化领域模型之间的关联关系。在业务层面进行高内聚低耦合的设计

  • 如何寻找聚合

  1. 按照事件顺序提问:
    这个事件会改变的领域模型是什么?明确领域模型。(简单理解就是事件中涉及的业务名词)
    这个领域模型是否可以独立访问? 能就是聚合
    不能独立访问的话需要通过哪个领域模型来访问?
  2. 基于聚合的原则来回顾与验证上面划分的聚合,并进行调整。

聚合的原则

  • 聚合根执行业务规则
  • 聚合根有全局标识,边界内实体只有局部标识。
  • 边界外的对象只能访问聚合根,边界内的对象可以持有外部的聚合根
  • 删除聚合根时候边界内的资源都会被删除
  • 只有聚合根能直接从持久化系统查询得到,边界内实体访问只能从聚合根导航
Aggregate Pattern示例

划分限界上下文

  • 什么是限界上下文?
    某个场景下的业务边界
  • 为什么要限界上下文?
    随着业务扩展,软件也变得庞大复杂,业务人员与技术人员的沟通成本也变高且容易误解出bug。所以需要通过限界上下文明确定义模型范围与职责。
    例如:
    在一个电商中,“商品”的概念在订单中、商品列表中、库存中都不大一样。订单中的商品是购买时候的商品信息,那个点的优惠、价格、描述等等;而商品列表中是商品的实时被卖家更新的信息;而库存中不关心价格描述等等,只关心一个库存数量信息;
    还有账户信息,在个人信息上下文可能是个人的基础信息;在认证上下文可能是认证信息。也有可能是第三方登录(比如微信登录),那么微信在这里是一个提供身份的第三方系统
  • 如何划分限界上下文?
  1. 根据前面的聚合和领域模型,他们是否解决同一个业务问题?是则在一个限界上下文,不是就不在;
  2. 如果一个聚合在多个不同业务问题中使用,则可以进行拆分,拆分后划分到不同的限界上下文中。(概念、用法、系统依赖等等)
  3. 问题的大小划分、细节是否要考虑等等,需要和领域专家共同讨论

TIPS && 踩到过的坑

  • 不要事件风暴中同时处理多个复杂业务场景。
    事件风暴并不合适这么用,因此在第一次事件风暴的时候,建议只挑选核心域中的部分业务场景;否则会看到整面墙的业务流程;
  • 不要在事件风暴中引入过量细节。同时业务场景中非核心的部分可以先不关注。
    模型是对现实的抽象,只关注需要关注的细节,不然会陷入泥潭无法自拔。
  • 不要过度追求模型的准确性而花大量时间进行非常精细的设计
    模型本身也是演进式的。再牛x的领域专家也无法在前期预测到软件的走向;再精细的设计随着时间推移也有可能腐化。
  • workshop中可以关注成员的参与程度,确保成员充分发声。
  • 用英文建模有利于通用语言的达成。不然写代码写成英文还得翻译一遍,可能最后叫法又不一样了。
  • 事件风暴之后,注意journey中的逻辑完整,能够形成闭环。避免有关键事件丢失;
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,904评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,581评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,527评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,463评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,546评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,572评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,582评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,330评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,776评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,087评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,257评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,923评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,571评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,192评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,436评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,145评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352

推荐阅读更多精彩内容