专栏名称: 逸言
文学与软件,诗意地想念。
目录
相关文章推荐
OSC开源社区  ·  全球5万衍生模型,阿里通义造出开源雨林 ·  3 天前  
OSC开源社区  ·  倒计时三年:国产数据库100%替代走到哪了? ·  6 天前  
程序员小灰  ·  程序员的AI时代,如何用AI来增加副业收入 ·  1 周前  
程序员的那些事  ·  趣图:能遇到这种前辈是种幸福 ·  1 周前  
51好读  ›  专栏  ›  逸言

我的领域驱动设计心学

逸言  · 公众号  · 程序员  · 2024-09-22 17:24

正文

学习一门新的方法体系,最难做到的是知行合一。在软件研发领域,一个行之有效的方法体系,一定是提出者从“实践”中萃取出来的心得体会,糅合自己对软件研发“知识”的理解体悟,再广泛参考各种学说,才能完善为一套方法体系。然而,这个“实践”是提出者的实践,并非学习者的实践,“知识”也是提出者掌握的,而非学习者的收获,是以,彼之行非吾之行,彼之知亦非吾之知,中间隔了一层,认知与实践就难免出现极大的偏差。

王阳明的“知行合一”,要求即知即行,他常说:“知而不行,只是未知。”又说:“知行如何分得开?”「注1」因此,对知行合一的理解,也可以说是知行一体,知有实践的含义,若为知识,便是指可以实践的知识,行也可出真知,若为实践,也是能悟出知识的实践。二者合二为一,既不蹈空,也不虚无。

心学的“知”是良知,更注重修心以诚,德行如一,但也可延伸到学习领域。在德行方面,“人皆可以为尧舜「注2」”,即便是“愚夫愚妇”也能做到知行合一,这是因为阳明先生“认为即使是不懂性命之学的众人,也可接受教育,以启发他本有的良知,之后在世上勇敢又正直地做人。「注1」”。但在学习领域,知行合一就非初学者可以苛求,而是学习的最高境界,是寻常人难以企及的。

就以领域驱动设计来说,我对它的研究也算够深够细了,至今还是无法做到知行合一。归根结底,我对它的理解也仅限于我的“识见”,从而指导我的“实践”,这就必然受到我这个人的天资、素养、器识、努力程度、实践机会等诸多方面的影响和限制,推之于其他人,同样如此,这也就是领域驱动设计之所以难以成功的主要原因。

世上的任何一种学说都不可能一统天下,因为它根本就不能做到一统人心。即便圣贤如孔子,其孔门也有九流之说「注3」,不说别的,孟子和荀子各持性善性恶之论,到几千年之后的我们也还争执不休呢。再说王阳明的心学,在其去世之后,由其弟子传其衣钵,进而延伸出浙中王门、江右王门与泰州学派等分支衍说,各派对王阳明学说的理解,也可以说众说纷纭。

如此说来,Eric Evans虽然开创了领域驱动设计的“门派”,但他“传”下的这门方法体系出现各种纷争、分歧与争议,就是非常正常的了。

但与思想哲学不同,像领域驱动设计这样的软件设计方法,有一个检验的唯一标准,就是它到底能帮助我们解决什么样的软件设计问题?其实,不管有啥纷争、分歧与争议,只要都认同领域驱动设计这个方法,在推进落地的时候有不同变化,都是可以的。不管是黑猫,还是白猫,能抓到老鼠的就是好猫。软件设计方法也当如此,能解决软件问题的方法,就是好方法。

“知行合一”是阳明心学的重要观点,我很期望自己能以知行合一的方式推进和推广领域驱动设计。“知是行之始「注1」”,一开始,我们需要了解领域驱动设计的必要知识;“行是知之成「注1」”,紧接着的实践又能促进知识的积累,使其变为自己真正掌握的知识。如此周而复始。

想要在学习和实践过程中提升“认知”,就非得把握这门方法体系的本质不可。那么,什么才是领域驱动设计的本质,这可又要众说纷纭了。还是以王阳明的心学来说,要抓住心学的本质,就要弄明白“良知说”的本体与功夫,这就引出阳明心学的四句教:

无善无恶心之体,
有善有恶意之动,
知善知恶是良知,

为善去恶是格物。「注4」

虽说这四句教可谓阐释了心学本质,可对四句论述的解释同样很多,同样争论不休,甚至引出四有四无之争。我是心学的门外汉,无知者无畏,只管做大胆而浅显的蠡测。我把“心之体”解释为“本体目标”,“意之动”解释为“达成本体目标之原则”,“良知”是知,“格物”是行,然后将它们投射到领域驱动设计,就可得出:

控制复杂心之体

分治抽象意之动
领域驱动是良知

知识建模是格物

哈哈哈,这就是我的领域驱动设计心法。

让我进一步作阐释。

既然我将“心之体”解释为“本体目标”,那我们引入领域驱动设计的目标是什么呢?正如Eric Evans著作的副标题所言,就是控制软件开发的复杂度嘛,准确地说,是控制业务复杂度。毕竟,不是为了控制业务的复杂度,就没有必要引入领域驱动设计,那后面的内容也就无从谈起了。因此,控制复杂是心之体

意之动,本意可解释为“心的动作",既然心之体为控制复杂,要采取的动作就应该去控制复杂度。控制复杂度的整个过程可不是一两句话能说清楚的,要解决的问题空间不同,解题方法自然不同,因此在所谓”心法“里,只能去其枝蔓,抓其首领,即掌握控制复杂度的基本原则,那就是分治与抽象

领域驱动设计对分治的体现很明显,从问题空间到解空间,从顶层到细节,可概括为三个层次的分治:

  1. 问题空间的分治:划分为子领域,并区分为核心子领域、支撑子领域与通用子领域
  2. 解空间的分治:划分为限界上下文,并通过上下文映射指导限界上下文之间的协作
  3. 限界上下文的分治:单独提炼出领域层,以分解领域逻辑和技术实现,领域层内部划分为聚合,聚合之外形成领域对象的协作,聚合之内形成一个封闭的完整领域概念

领域驱动设计同样强调抽象,其核心是模型驱动设计,建模的过程,就是运用抽象的思想,把属于问题空间的各种领域概念抽象为领域模型。
是为分治抽象是意之动。
本体有了,原则也有了,接下来再谈知与行。虽说”知行本是一体”,不可分开,但在讲解一个方法论的时候,还是只能分开来讲。
知是认识,对于领域驱动设计而言,如果没有认识到整个设计过程是“领域驱动”的,也就不可能行了,至少,就不是采用领域驱动设计了。这里声明,领域驱动设计绝对不是银弹,也不是唯一行之有效的方法,因此这里所谓的“领域驱动是良知”,是就领域驱动设计这个前提与范畴而提的,绝对不是一种排他性结论,认为只有领域驱动才是良知。这是误解。
“领域驱动”就是将领域作为驱动力,也就是在控制业务复杂度时,需要从领域逻辑着手,设计方案需要处处体现对业务需求的响应。尤其在开展领域建模的过程中,需要领域模型优先,需要领域专家引导,需要尽可能做到与技术实现无关。这些认识都是实践领域驱动设计的前提,也就是“行之始”。
为什么说“知识建模是格物”呢?
所谓“格物”,按照朱熹的说法,是“致吾之知,在即物而穷其理也「注5」”。如果将“即物”理解为实践,也就是“行”,我认为是说得过去的。然而,方法即便只有一个,实践的路线却可以千千万万,只要殊途同归即可。
领域驱动设计的实践并不容易,真可谓知难行亦难。既然如此,也只有抓最重要的一点。领域驱动设计最核心的实践当然就是建模,根据什么来建模呢?简单说来,就是根据知识,更具体地说,就是领域知识。
我们看整个领域驱动设计的过程,强调交流,强调提炼统一语言,它表达的实则就是领域知识,在获得这些领域知识之后,再尝试把这些知识运用“分治抽象”的原则转换为子领域、限界上下文以及由聚合构成的领域设计模型。可以认为这个过程是在获得充分的领域知识后,先抽象,再细化,最后得到由文档、设计图和代码构成的领域模型。
在AI大行其道的当代,知识的重要性更加凸显,在对AI大模型进行足够的训练和微调后,学习后的大模型甚至能够理解领域驱动设计这个方法学的知识,也能够理解它要解决的问题空间的领域知识。两种知识的结合,在领域驱动设计过程的指导下,可以由复杂变简单,由抽象而具象,这同样是“知行合一”的一种体现。
知行合一没有发生在人身上,而是发生在AI智能,这是一个很有趣的话题。当然,起阳明先生于地下,大概要斥责这种魔改为“歪门邪说”了!

注1:引自周志文《阳明学十讲》

注2:《孟子》的《告子章句下》

注3:《汉书》艺文志:孔子死后,诸弟子各成一家之言,有儒、道、阴阳、法、名、墨、纵横、杂、农九家学派。

注4:王阳明及弟子《传习录》

注5:朱熹《四书集注》