DDD 事件风暴实战:3小时工作坊产出电商订单领域模型(附完整贴纸图)
DDD 事件风暴实战3小时工作坊产出电商订单领域模型1. 为什么你需要这场高强度事件风暴工作坊想象一下这样的场景你的团队正在开发一个电商系统产品经理、开发工程师和业务专家围坐在会议室里每个人对订单状态流转的理解都不尽相同。开发团队认为取消订单应该直接删除记录业务方坚持需要保留取消原因前端工程师设计的订单列表字段和后端返回的数据结构总是对不上——这种认知偏差每天都在消耗团队宝贵的开发时间。传统需求文档和会议讨论的局限性在于信息衰减业务知识在传递过程中丢失关键细节视角单一各角色只关注自己负责的部分反馈延迟问题往往在开发后期才暴露事件风暴工作坊通过可视化协作和时间盒约束解决了这些问题。我们设计的3小时高强度工作坊包含gantt title 3小时事件风暴工作坊时间分配 dateFormat HH:mm section 准备阶段 场地布置 :00:00, 30m 规则讲解 :00:30, 15m section 核心流程 识别领域事件 :00:45, 45m 构建命令模型 :01:30, 30m 划定聚合边界 :02:00, 30m section 收尾阶段 模型可视化 :02:30, 20m 复盘与改进 :02:50, 10m关键提示工作坊成功的前提是确保所有核心角色全程参与包括至少1名能拍板的业务专家2. 工作坊前的精准准备清单2.1 物料准备电商订单场景示例物料类型规格要求用途说明电商订单示例橙色便利贴7.5cm×7.5cm正方形记录领域事件订单已支付、库存已扣减蓝色便利贴7.5cm×7.5cm正方形记录决策命令提交订单、取消订单黄色便利贴7.5cm×12.5cm长方形标识聚合根订单聚合、支付聚合紫色便利贴5cm×7.5cm长方形标记热点问题跨境税费计算规则不明确绿色便利贴7.5cm×7.5cm正方形表示读模型订单详情视图白板墙至少4米宽贴便利贴的平面按时间线排列事件计时器手机或专用计时器控制每个环节时间每环节严格计时2.2 人员配置黄金比例# 工作坊参与者计算器适用于中型电商项目 def calculate_participants(team_size): domain_experts max(2, team_size // 5) # 20%业务专家 tech_leads max(1, team_size // 6) # 技术决策者 developers team_size - domain_experts - tech_leads return { 业务专家产品/运营: domain_experts, 技术负责人架构师: tech_leads, 开发测试人员: developers } # 示例12人团队配置 print(calculate_participants(12))输出结果{ 业务专家产品/运营: 3, 技术负责人架构师: 2, 开发测试人员: 7 }2.3 场地布置关键细节拆除会议桌椅迫使参与者保持站立状态提升专注度分区规划左侧业务流程图区域用户旅程中部核心建模区事件风暴右侧问题停车场收集争议点设备检查确保空调温度适宜建议22-24℃准备高像素手机/相机记录白板内容测试无线投屏设备如需远程参与3. 工作坊核心流程拆解3.1 领域事件识别45分钟操作步骤主持人讲解规则用过去时态描述业务事件如订单已创建采用1-2-All技术1分钟个人思考2分钟小组讨论3人一组全员贴出事件卡片事件归类垂直轴表示时间顺序水平轴表示业务模块订单、支付、物流等电商订单典型事件序列1. 购物车已生成 2. 订单已创建 3. 支付已发起 4. 库存已预留 5. 支付已成功 6. 订单已确认 7. 物流单已生成 8. 商品已出库 9. 订单已送达 10. 订单已完成常见陷阱避免将技术事件如数据库已更新与业务事件混淆3.2 命令与聚合识别30分钟命令-事件映射表命令蓝色触发事件橙色聚合黄色提交购物车购物车已生成购物车聚合创建订单订单已创建订单聚合发起支付支付已发起支付聚合扣减库存库存已预留库存聚合确认收货订单已完成订单聚合聚合设计原则检查清单[ ] 每个聚合是否有明确的根实体[ ] 聚合间的引用是否通过ID而非对象[ ] 聚合边界是否与业务一致性边界匹配[ ] 单个聚合能否在1秒内完成加载3.3 处理争议热点实战技巧当团队对订单取消是否应该立即释放库存产生分歧时5分钟计时辩论正反方各陈述理由业务专家裁决明确业务规则记录决策依据在紫色便利贴上注明决策取消订单时异步释放库存 原因避免高并发下库存超卖 责任人张伟架构师4. 可视化成果输出4.1 电商订单领域模型图例[用户] --(提交订单)-- [订单聚合] --(订单已创建)-- [支付聚合] | v (订单已取消) --[库存聚合] --(释放库存)4.2 上下文映射关系# 使用PlantUML生成上下文映射图示例 startuml package 订单上下文 { [订单服务] -- [支付服务] [订单服务] -- [库存服务] } package 支付上下文 { [支付服务] -- [第三方支付网关] } package 物流上下文 { [物流服务] -- [仓储系统] } enduml4.3 工作坊产出物清单领域模型图Visio/Lucidchart格式事件流文档Markdown格式待解决问题列表Excel表格术语表包含中英文对照5. 避坑指南我们踩过的三个坑坑1业务专家中途离场现象讨论支付流程时财务负责人提前离开解决方案现在我们会提前锁定关键人物时间准备业务专家替补人选录制关键决策过程坑2陷入技术实现细节现象争论是否使用MQ实现事件总线应对策略def handle_technical_discussion(): if discussion.level ModelDesign: print([主持人] 这个问题记入停车场会后由技术组专项讨论) move_to_parking_lot() else: continue_workshop()坑3时间失控错误示范某个环节超时导致模型不完整我们的改进配备专职时间管理员使用沙漏增加时间压迫感对超时环节设置加时投票6. 工作坊后的跟进动作48小时内发送会议纪要给所有参与者确认第3天召开1小时的技术设计会将模型转化为服务划分方案API接口定义数据模型设计第5天生成领域模型与代码的映射文档例如// 订单聚合根示例 public class Order { private OrderId id; private ListOrderItem items; private OrderStatus status; public void cancel(String reason) { this.status OrderStatus.CANCELLED; registerEvent(new OrderCancelled(id, reason)); } }这场高强度事件风暴的魔力在于当业务专家看着满墙的便利贴突然说原来我们的订单流程这么复杂而开发工程师同时惊呼我终于明白为什么要这些字段时——你知道团队已经建立了真正的统一语言。这不是终点而是持续领域精炼的开始。