DDD在B端营销系统的实践

如果无法正常显示,请先停止浏览器的去广告插件。
分享至:
1. DDD在B端营销系统的实践 何正 2022-08 美团到店事业部
2. 个人介绍 何正,美团技术专家, 10+ 年系统设计 与建设经验 2012 年加入美团,目前负责财务与营销 相关的技术研发工作
3. 目录 • • • • • • 背景介绍 基本概念 战略设计实践 战术设计实践 代码架构实践 总结
4. 背景介绍 • • • 通过营销活动实现客户/用户拉新,留存和促活是业界普遍采用的方法 在业务方多,用户量大,玩法多样的场景下,需要有营销系统的支持 从0到1构建了面向商户的营销系统,通过DDD来应对业务复杂度高,需求多变, 维护成本大等挑战
5. 目录 • • • • • • 背景介绍 基本概念 战略设计实践 战术设计实践 代码架构实践 总结
6. 基本概念 • 软件系统的复杂性 隐晦 抽象依赖观察视角 代码与现实世界脱节 统一语言,达成共识 代码:修改范围 耦合 模块:模块联动 划清边界,理清职责 系统:团队协作 变化 不同用户诉求不同 不同阶段需求不同 降低频率,缩小范围
7. 基本概念 • 领域驱动设计的难点 • 学习曲线陡峭,项目落地困难 [1][2]
8. 基本概念 • 历史 工具 早期 机器码/汇编 50年代 结构化语言 60年代 面向对象语言 方法 80年代 面向对象分析与设计 分类,抽象,构建类模型 方法论 2000年 领域驱动设计 分析业务,抽取概念,建立领域模型
9. 基本概念 • 什么是领域驱动设计 领域 领域驱动设计 • 领(领土)域(范围) • 组织的业务范围及其活动 • 围绕业务知识构建系统 • 知识:流程,规则,方法 领域内有什么
10. 基本概念 • 领域驱动设计的步骤
11. 目录 • • • • • • 背景介绍 基本概念 战略设计实践 战术设计实践 代码架构实践 总结
12. 战略设计实践 • 确定用例 :业务是怎么玩的 用例图 用户故事 交互原型 who,what,why 作为一名运营 我可以设置活动参与人群 从而实现活动精准投放 包含,扩展,泛化 • 史诗,主题,普通 产品设计,UED优化,UAT验收 事件风暴 (事件->命令->操作人,门槛比较高,适用于大型而复杂的业务分析)
13. 战略设计实践 • 确定用例: 营销活动的用例
14. 战略设计实践 • 统一语言 • • • • 抽取概念 明确含义 厘清关系 形成共识 抽象合并 去伪存真
15. 战略设计实践 • 统一语言 • • • • 抽取概念 明确含义 厘清关系 形成共识 规范取名 中英文对照 解释含义 术语 Term 含义 营销活动 campaign 为达成拉新,留存,提LTV等业务目的进行的一系列运营动作...... 目标人群 candidate 可以参与营销活动的商户...... 权益 benifit ...... 档位 gear ...... 库存 stock ...... 推送 push ...... 审批 approval ...... 结案报告 report ...... 代金券 coupon ...... 红包 redpack ...... ...... ...... ......
16. 战略设计实践 • 统一语言 • • • • 抽取概念 明确含义 厘清关系 形成共识 概念关系 关键属性
17. 战略设计实践 • 统一语言 • • • • 抽取概念 明确含义 厘清关系 形成共识 统一术语 达成共识 对外发布
18. 战略设计实践 • 划分边界 :复杂问题的解法 本源论 世界本质上是简单的 复杂问题拆解为简单问题 康威原理 系统架构受制于组织的沟通结构 优先确定系统边界(领域边界) 建立与系统边界适应的组织 Two Pizza Team:N=n*(n-1)/2 拆解问题 -> 划清边界 -> 组织分工
19. 战略设计实践 • 划分边界 :确定子域 • • 三个角度:用户相关性,问题相关性,解决方案相关性 依据业务特性进行权衡取舍 涉众域:用户诉求 CRM:市场,销售,客服 问题域:解决的关键问题 营销:人群,活动,权益 解决方案域:特定的产品/技术方案 客户主数据,流程引擎
20. 战略设计实践 • 划分边界(分) • • • 职责 关系 资源
21. 战略设计实践 • 划分边界(合) :上下文映射 • • 不同子域之间的协作 9种上下游映射关系 (Partnership,Open Host Service,Share Kernel......)
22. 战略设计实践 • 整体上下文关系
23. 战略设计实践 • 持续迭代 • • • • 用例精化 需求变更 方案选型 如何验证 • • 场景走查 业务预判
24. 目录 • • • • • • 背景介绍 基本概念 战略设计实践 战术设计实践 代码架构实践 总结
25. 战术设计实践 • • 目的:概念模型 -> 代码模型 编程范式 [3] • • • • • 事务脚本:围绕动词展开 表模式:介于事务脚本与面向对象之间 面向对象:实体,值对象,聚合根,领域服务 函数式:尝试 [4] 面向对象实现 • • • 从概念模型到对象模型 职责决定了封装粒度 封装粒度决定了聚合根大小
26. 战术设计实践 • 概念模型 -> 对象模型 • • • • • 概念分层 -> 类分层:营销活动分为充值送活动,消费返活动等 概念关系 -> 类关系:营销活动包含档位,库存 概念属性,行为 -> 类属性,行为:活动包括标题,开始时间,结束时间,审批,发布 概念状态 ->类的状态机 两类对象:实体(状态,唯一标识),值对象(无生命周期,无唯一标识)
27. 战术设计实践 • 业务逻辑封装(对象模型的职责范围):聚合根(封装的粒度) • • • 业务一致性: 数据完整性,状态一致性 技术限制: 技术能力限制了封装粒度 业务逻辑不灭 :在“业务封装”与“适度的职责边界”之间寻找平衡
28. 战术设计实践 • 聚合根
29. 战术设计实践 • 代码落地 • • • • 贫血模型(属性与行为分离) 充血模型(封装属性与行为) 领域服务:不适合放在聚合根里的逻辑 关键 • • 代码使用通用语言:类名,方法名 封装业务规则:CRUD -> 领域模型 //提交活动:校验完整性,发起审批流,状态->待审批 submitCampaign(...){...} updateStatus(...){...} //通过活动:完成审批流,通知运营 ,状态->审批通过 approveCampaign(...){...} //取消活动:触发通知,状态->取消 cancelCampaign(...){...}
30. 目录 • • • • • • 背景介绍 基本概念 战略设计实践 战术设计实践 代码架构实践 总结
31. 代码架构实践 • 几种架构 :核心是领域模型,外层依赖内层 [5][6][7] 六边形架构 整洁架构 洋葱架构
32. 代码架构实践 • 我们的实践
33. 目录 • • • • • • 背景介绍 基本概念 战略设计实践 战术设计实践 代码架构实践 总结
34. 总结 • Tips • • • • • Learn From The Best,借鉴概念体系 重视统一语言,没有统一语言就没有概念模型,没有概念模型就不会有靠谱的代码模型 领域驱动设计是团队工作 拥抱变化,持续迭代 常见误区 • • 陷入DDD的概念体系:在代码结构中生搬硬套,额外增加负担和理解成本 设计领域模型:领域模型不是设计出来的,而是通过战略设计的几个步骤(确定用例,抽取 概念,统一语言,划分边界)从业务中抽象出来的,战略设计的前提是业务理解 • 用了DDD就能产生好的领域模型:DDD是方法,知道造飞机的方法不等于造出飞机,但可 少走弯路
35. 总结 • 设计,在聊需求的那一刻就开始了
36. Reference • • • • • • [1] 《DDD 实战课》 欧创新 [2] 《领域驱动设计》 Eric Evans [3] 《企业应用架构模式》 Martin Fowler [4] https://ipu.sankuai.com/ipu/courseware-detail/44800/3071 [5]《实现领域驱动设计》Vaughn Vernon [6] 《The Clean Architecture》https://blog.cleancoder.com/uncle- bob/2012/08/13/the-clean-architecture.html Robert C. Martin • [7] 《The Onion Architecture》https://jeffreypalermo.com/2008/07/the- onion-architecture-part-1/ Jeffrey Palermo • • [8] https://carlalexander.ca/what-is-software-complexity/ [9] https://martinfowler.com/bliki/BoundedContext.html
37. Q&A
38. 招聘:XXX岗位 邮箱:XXX@meituan.com 更多技术干货 欢迎关注“美团技术团队”

Home - Wiki
Copyright © 2011-2024 iteam. Current version is 2.137.1. UTC+08:00, 2024-11-17 18:30
浙ICP备14020137号-1 $Map of visitor$