这些年,我在给开发团队讲授分析和设计技能时,常会有学员质疑:老师,你讲的类、状态机,这些都太难太细了,我最想要了解的是如何拆分系统,能不能给一个简单明了的方法?
有的同学在开始咨询时甚至发过来一个DDD圈子人士的课纲,你看,人家说了怎么拆分系统,咱这边有嘛?
还有的同学受DDD圈子毒害太深,甚至和我“探讨”:如果把大的系统拆分成很小很小的小块,小到不用分析,这不就不用UML了吗,而且还可以多个团队并行开发!
**********
首先说我的观点
(1)(以真正获得收益为目的)分解系统是一件非常非常复杂的事情
(2)DDD圈子的各种“简单易行”的方法等同于瞎蒙
(3)稍微靠谱一点的分解依据可能是状态机,但这需要全面的建模技能
(4)警惕用“大道至简”来炮制骗子话术
一、(以真正获得收益为目的)分解系统是一件非常非常复杂的事情
【如果把大的系统拆分成很小很小的小块,小到不用分析,这不就不用UML了吗,而且还可以多个团队并行开发!】
啊,这可太妙了——怎么做呢?
其实类似的话,很多年前有一位计算机科学的博士说过。在《软件方法》第1章中,我谈到了这个问题:
★《软件方法》第1章:口号、方法、染色,https://mp.weixin.qq.com/s/Dr9t4Py1jHS62IBwYx_TJw
我也来模拟一下:
怎样将大象放进冰箱?分三步:(1)打开冰箱门(2)放入大象(3)关上冰箱门
怎样拥有一个亿存款?分三步:(1)赚一个亿(2)选一家银行(3)把钱存起来。
怎样才能本周末中奖双色球?分三步:(1)挑出本周末的中奖号码(2)去往彩票店(这得亲自买,可别委托别人!)(3)按号码买彩票。
怎样敏捷制造10纳米光刻机?分三步:(1)把光刻机拆解成10万个零件(2)发动1000万人组成10万个团队并发造零件(3)把零件组装起来
DDD圈子这样的话术可笑吗,可笑,但他们就是靠这个话术来筛选出“目标客户”——很多人喊着“受用”呢!
这方面,我在《软件方法》中已有揭露:
★《软件方法》1.5 警惕和揭秘伪创新,https://mp.weixin.qq.com/s/RSYrDZp1_dsr5beRmDUo_w
花絮:还真有DDD圈子的文章正儿八经地把这个当成“大问题拆成小问题”的例子,而不是调剂的笑料:
二、DDD圈子的各种“简单易行”的方法等同于瞎蒙。
如果只是为了分解而分解,那可太容易了,100个人有100个做法。如果要真的获得收益,而不是像“《软件方法》1.5 警惕和揭秘伪创新,https://mp.weixin.qq.com/s/RSYrDZp1_dsr5beRmDUo_w”里面说的一样骗人骗己,就变得非常困难了。
要真有这个秘诀,放在什么时候都是大杀器,难道之前的复杂系统不需要分解吗?像Dijkstra那样得个图灵奖妥妥的。根本不用等到现在,拿“微服务”(这也是一个造词)之类的作为理由。
我在《你的医书是假的》一文中说过,微服务经常被DDD圈子用来作为遮掩自己能力不足的遮羞布。
★你的医书是假的,https://mp.weixin.qq.com/s/PbzMuEXhf1iuAWF5n4ezTQ
以见过的DDD圈子产出来看,所举的例子,类不超过5个,有时甚至是1-2个。连精确定义领域逻辑的能力都没有,就敢教别人怎样“切分系统”?
★《软件方法》强化自测题-总纲(3),https://mp.weixin.qq.com/s/6kct6Z9EQ6vzSNx7Qzry5Q
**********
如果一个人去看医生,被怀疑有恶性肿瘤,从这一刻开始的过程是很麻烦和痛苦的:
先对重点部位做影像;
医生看过影像后,认为可能性较大,安排活检,即从该部位切下一小块肉,送去做病理;
病理报告确认恶性肿瘤后,可能还需要做全身的PET/CT,观察其他部位是否有病灶;
对重点部位做进一步的影像和检查,各种抽血检验更是家常便饭;
前期化疗;
外科手术或放疗去除重点部位的病灶;
继续N个疗程的化疗和靶向药治疗,期间反复做影像和检查;
初步治疗结束,出院;
定期做免疫治疗,并影像和验血复查;
一旦有事,又回去住院重复之前的过程。
这一套下来,患者的生存时间会多几年。
嫌麻烦?医院门口有很多“神医”摆摊,家里七大姑八大姨也有民间偏方!
**********
目前DDD圈子“切分系统”的手段可能有这么几种,见下图:
只要抛开系统内部的复杂性不谈,把焦点左移,方法就变得和“神医”、“七大姑八大姨”一样简单易行了。
★你的医书是假的,https://mp.weixin.qq.com/s/PbzMuEXhf1iuAWF5n4ezTQ
**********
注意:
伪创新往往并不会直接说自己简单易行,而是会说自己很高深。宣传中往往带有“艺术”、“禅”、“道”等字眼,有意无意地朝宗教、艺术、玄学方向引导——比起枯燥的数学理论和逻辑推理,这些东西可是太好下嘴了。
开发人员一开始以为很难很深奥,上手一学,发现其实不难!可以说是:投资少,见效快,产量高,门槛低,而且仪式感十足。最妙的是,不用走出舒适区辛苦学习,就得到了“方法学”,这可太对胃口了!开发人员立刻有捡到了便宜的感觉,心中豪气顿生——不愧是我!别整三岁的,有能耐你整四岁的!
另外,伪创新还会声明“领域驱动设计不是银弹”之类,也是为了进一步塑造形象。我都诚实地说了我不是满分,所以我前面塑造的90分的形象应该是真的。
我就不贴图了,读者感兴趣可以自行搜索,关键词:领域驱动设计、不是银弹、道、艺术……。
三、稍微靠谱一点的分解依据可能是状态机,但这需要全面的建模技能
在我看来,稍微靠谱的分解系统的依据可能是:尽量维护复杂状态机的完整性。
关于状态机的叙述,我之前写过的文章:
★评“状态和事件本质相同”,https://mp.weixin.qq.com/s/QhAhSdET5psZQEEW6f9KoA
★关于《评“状态和事件本质相同”》的6个疑问,https://mp.weixin.qq.com/s/e8XSGrS2bfnnliW34zZnbA
只要愿意,可以为每个概念找出它的各种状态,但某个特定系统是围绕某些概念的状态变化而展开的,同时忽略其他一些概念的状态。
例如,当前的绝大多数信息系统中,和现实中有生命的“人”对应的类,其状态机并不复杂——可以比较“顾客”和“订单”,“操作员”和“设备”。当然,如果这个信息系统就是专门管人的,例如通讯录,可能“人”的状态机已经是该系统中最复杂的。
不过,如果在信息系统中,“人”的状态机非常仔细,那就意味着人的各种自然属性、社会属性以及行为规则都被信息系统掌握。这到底是福是祸,参见Westworld(西部世界)、The Matrix(黑客帝国)等影视作品的探讨。
花絮:N年前我还见过这样的DDD文章,大意是说顾客是人,会思考,所以应该首选顾客作为聚合根。现在搜不着了,也懒得翻存档的存档的存档。如果读者有印象,麻烦贴到评论区。
这就需要各种建模技能,这些技能是DDD圈子所没有的——前面已经说过,如果一个人掌握了这些技能,他根本也就不会相信这些粗陋和错误的东西。
(1)类建模技能
状态机是类的状态机,首先你这个类得正确吧?
DDD圈子基本没有用类图(或类似表达)来正确建模各种领域概念和关系的能力,他们的产出绝大多数是画两个框框意思一下,甚至就是简单罗列一下词汇。
可能有的同学说,人家可是给出了类的代码的!——这可太简单了,同一个问题,100个人可以给出100份代码,很多代码拼拼凑凑也能用,这有什么门槛?这些代码背后造成了多少狼狈不堪的场面?
而且,DDD圈子给出的代码很多是:
只有1-2个实体类,然后就开始讨论项目的包结构、Repository、DTO、六边形架构……
甚至连实体类都没有,类的名称结尾是er、or、器、策略、Strategy、Policy、规则、Rule、算法、Algorithm……
(2)状态机建模技能
啥状态机?要啥自行车啊?事件风暴那种一一对应,就已经是DDD圈子的脑力极限了。
**********
《软件方法》第1章揭露了拍脑袋写代码,然后以“代码”为依据来拼凑ABC的场景:
★《软件方法(第3版)》第1章,https://mp.weixin.qq.com/s/BcRAWyLuPyM49CN14TjKfw
“有代码”相当于考试的时候答题交卷了,但能考几分,你心里没数吗?有的人还标榜自己交卷交得快——“敏捷”!
四、警惕用“大道至简”来炮制骗子话术
“大道至简”的意思是基本规律的表达是很简洁的,这是一个信仰,是否为真不知道。
我们就权当它为真,在此基础上展开讨论。
(1)简洁不等于易学
像下面这些够“简洁”,但并不“易学”。
线性方程组有解<-->系数矩阵与增广矩阵有相同的秩
方程存在根式解<-->方程的群存在因子全为素数的子群系
伪创新经常混淆两者,嚷嚷“大道至简”,其实背后意思是“不动脑子也能学会的才是好方法”,这也是筛选“目标客户”的手段。
★《软件方法》1.5 警惕和揭秘伪创新,https://mp.weixin.qq.com/s/RSYrDZp1_dsr5beRmDUo_w
(2)“大道至简”不等于“简即大道”
伪创新的另一个偷换概念就是:我的粗陋内容有“简”的特征,“大道”也有“简”的特征,因此,我的粗陋内容就是大道。
这个手法归纳起来就是:
如何证明A和B相同?找一个集合,使得A和B都成为该集合的元素,由此证明A和B相同。
学霸没考满分,学渣也没考满分,两者都属于“非满分学生”,因此,学霸=学渣。
**********
不管大道小道,首先得是“道”,能解决问题的“道”。
上面列举的数学规律、物理规律是能解决问题的,可以算我们已经发现的“大道至简”。
但还有很多地方,我们还没有发现“至简”的大道,只有繁琐的“小道”、“中道”,像下面这个物理学的“标准模型”(摘自https://www.math.fsu.edu/~marcolli/PopTalkSlidesFinal.pdf):
很繁琐吧,但没办法,目前只能认识到这个地步,看起来更“简”的弦、超弦还是猜测。
没找到“大道”的时候,也只能老老实实将就繁琐的“小道”、“中道”,不能因为它繁琐就改信伪创新炮制的“简”。
这个和前面治疗癌症的道理是一样的,目前没求到大道,就是这么繁琐,要不,就去信神医炮制的“大道”。
也许将来求到“大道”,治疗癌症一颗药搞定——古代的很多“绝症”今天不已经被“大道至简”轻松治愈了嘛。