前言
最近两年,以“事件风暴(Event Storming)”为代表的“领域驱动设计(Domain Driven Design,以下简称DDD)”分析建模方法红遍大江南北。伴随着按照DDD思想指导微服务拆分的流行,“搞微服务必用DDD,用DDD必做事件风暴,写代码必用六边形架构”的做法已几乎成为了某种所谓的“最佳实践”。
虽然我们一边反复强调“DDD不是银弹,事件风暴也不是DDD”,但是还是眼睁睁的看着DDD被用成了银弹,用了事件风暴也被等同于做了DDD。
这两年,我也做了不少DDD的实践和咨询服务,也写过一些文章和组织过DDDChina峰会上的工作坊。但是在持续的解决不同的客户需求的过程中,确实经历了一个从“忽视到真香,再从真香到疑惑”的过程。其中在使用DDD和事件风暴的过程中,经常困惑的一些典型案例(也是经常被问到的问题)包括:
- 数据类应用的设计和开发如何应用DDD思想?
- 客户交易系统和GIS这样的系统,DDD应用上有何区别?
- 很明显的流程类功能或系统适合DDD吗?还是用个工作流引擎就完了?
- 以上这些系统的分析建模都能应用事件风暴吗?还是说可以用其它方法?
如果一定要收敛一下以上的问题,那就是经常会被大家问到的一句话:
问:“DDD到底在什么情况下适用什么情况下适用?”
答:“业务逻辑复杂的系统。”
DDD的这个回答就很诡异了——到底什么是业务逻辑?到底什么是复杂?这回答面对上述4个问题基本就等于什么都没讲。
虽然我在之前的实践中,尝试过进行更加明确的说明,但是在业务和复杂性的关键定义上,基本上没有质的变化。我的相关解释请参看:《领域驱动实战思考(二):用分段思想改进那些混乱的战略设计和战术设计》
换句话说,我认为DDD并没有真正的清晰定义和解答什么是“软件核心复杂性”,而是绕过了这个关键点,认为“问题都需要澄清和定义”,然后在所谓“战略设计”和“战术设计”的包装下,打着“澄清问题”的旗号,直接切进了“统一语言”和“协作设计”,以及系统架构和实现细节——有一种“别问,问就是需要澄清”的甩锅嫌疑。
而遗憾的是,在持续多年的修修补补之下,DDD的这个核心问题却丝毫未被解决。
那么,到底有没有什么方法能对于以上问题(业务、领域、复杂性)做出相对更加清晰的澄清和解答呢?
幸运的是,在和ThoughtWorks中国区CTO徐昊一起推动本公司工程效能变革的过程中,我了解并学习到了一套基于徐昊对于软件工程和架构设计多年的实践和思考,由他总结沉淀的,从“四色建模”所发展出来的,被称之为“8x Flow”的业务建模方法,有效的解答了我的困惑。
在此,我将利用一系列文章,将相关的思想、方法和配套的工程效能实践分享给大家,希望能够对大家有所帮助,同时也希望得到更多的碰撞和反馈。