领域驱动设计拆分系统和“大道至简”话术

DDD领域驱动设计批评文集

做强化自测题获得“软件方法建模师”称号

《软件方法》各章合集


这些年,我在给开发团队讲授分析和设计技能时,常会有学员质疑:老师,你讲的类、状态机,这些都太难太细了,我最想要了解的是如何拆分系统,能不能给一个简单明了的方法?

有的同学在开始咨询时甚至发过来一个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): 

图片

很繁琐吧,但没办法,目前只能认识到这个地步,看起来更“简”的弦、超弦还是猜测。

没找到“大道”的时候,也只能老老实实将就繁琐的“小道”、“中道”,不能因为它繁琐就改信伪创新炮制的“简”。

这个和前面治疗癌症的道理是一样的,目前没求到大道,就是这么繁琐,要不,就去信神医炮制的“大道”。

也许将来求到“大道”,治疗癌症一颗药搞定——古代的很多“绝症”今天不已经被“大道至简”轻松治愈了嘛。

基于STM32的循迹避障小车资料源码(高分项目),个人大四的毕业设计、经导师指导并认可通过的高分设计项目,评审分99分,代码完整确保可以运行,小白也可以亲自搞定,主要针对计算机相关专业的正在做毕设的学生需要项目实战练习的学习者,也可作为课程设计、期末大作业。 基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(
内容概要:本文详细介绍了SSM框架(Spring、SpringMVC、MyBatis)的相关知识,涵盖Maven项目管理工具、前端开发技术、HTTP协议及Tomcat服务器等内容。文章首先讲解了SSM框架的组成,包括Spring的IOC、DI、AOP等功能,SpringMVC的请求处理流程以及MyBatis的数据操作。接着介绍了Maven作为项目管理工具的作用,如依赖管理项目构建,并详细描述了Maven的配置文件pom.xml的使用方法。此外,还探讨了HTTP协议的特点、请求响应格式,以及Web服务器Tomcat的基本概念工作原理。最后,文章对前端开发技术进行了概述,包括HTML、CSS、JavaScript等基础知识,并简要介绍了Ajax技术。 适合人群:具备一定编程基础,特别是Java开发经验的研发人员,尤其是那些正在学习或使用SSM框架进行Web开发的工程师。 使用场景及目标:①理解SSM框架的工作原理及其各组成部分的功能;②掌握Maven的使用,包括项目创建、依赖管理、生命周期等;③熟悉HTTP协议的请求响应机制,能够处理常见的HTTP请求响应;④掌握前端开发技术,如HTML、CSS、JavaScript等,能够进行简单的前端页面开发;⑤了解Tomcat服务器的工作原理及其配置方法。 阅读建议:本文内容丰富,涵盖了从后端到前端的多个方面,建议读者在学习过程中结合实际项目进行实践,尤其是在Maven项目管理SSM框架的具体应用上,多动手操作,加深理解。同时,对于HTTP协议前端开发技术,可以通过实际的网络请求页面开发来巩固所学知识。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值