DDD很难,学不会怎么办?

你好,我是这门课的编辑小新。 ** ** 不知不觉,我们的课程已经接近尾声,很高兴看到有些同学已经在工作里试着使用DDD,着手重构、优化自己手里项目。不过也有一些同学因为畏难心理掉了队,打起了退堂鼓。 ** ** 为此,我们特别安排了这期“相对轻松”的话题,邀请钟老师分享一下自己是怎样和DDD结缘的,说不定老师的学习经历和思考感悟,能给你一些启发。 ** ** 下面是钟老师的分享。

你好,我是钟敬。今天主要谈一下自己学习 DDD 的几点心得体会。

DDD 来源于两个基础,一个是面向对象的方法学,一个是敏捷软件开发。我先结合这两条线,分享一下自己的学习经历。

我的学习经历

当年我在读大学的时候,学校里教的不是面向对象,而是早期的结构化软件开发方法学。后来有一次,在大学的图书馆里面,我看到了两本很薄的小册子,一本叫做《面向对象分析》,另一本叫《面向对象设计》,是 Coad 和 Yourdon 两位专家写的。

看了以后,其实我也没真正学会,但里面的思想一下就让我震撼了。后来我就到处找面向对象方面的书。那时候,国内讲面向对象编程的书还是有一些的,主要是 C++ 和 Java 方面的,而讲面向对象方法学的书却很少。

工作后,有一段时间,我经常往返北京、广州两地。我跑遍了这两个地方的各大图书馆和书店,也很难找到这样的书。偶尔会看到某些国内“专家”出的二手资料,多数写得都是浅尝辄止,驳而不纯。那时候学术也不规范,通常这种书都没有注明出处,就好像是专家们自己写的。

而 2000 年是一个分水岭。2000年以后,面向对象方法学的书,就如雨后春笋一般涌现出来。我是如鱼得水,也在自己的影响范围之内,按照面向对象的方法做了一些实践。不过周围的同道还是很少。

到了大概 2006 年,我第一次接触敏捷,这是第二次让我感到震撼。但那时候也很孤独,国内公司做这些的人很少。直到 2012 年,我才在之前的公司全面地推动敏捷。

大概也就在这个时间前后,我从 InfoQ 上读到了一本电子书,叫做《领域驱动设计(精简版)》。这本书很精练,科普了 DDD 的主要概念。现在我们仍然可以免费下载到(从这里可以获取)。

一看这本书,我就觉得——哎哟,这个好!它好像就是面向对象方法学,但好像又不太一样,而且还结合了敏捷的思路。之后,我才读了 Eric Evans 的《领域驱动设计》原著,后来又读了《实现领域驱动设计》。

到了 2015 年前后,我遇到了一个大项目,开发团队有100多人,是一个保险核心系统。作为架构师,我开始推 DDD。那个项目里,我觉得在建模、数据库设计等方面做得还行,但项目最终的工期拖了一倍,为什么会这样呢?

这是因为当时项目经理非常保守,不肯采用敏捷,而是沿用瀑布模型。最终的结果就是,这个项目犯了瀑布模型所能犯的所有错误。所以说尽管架构、建模、数据库设计方面还可以,但是整体上做得不理想,但我还是由此积累了一些经验和教训(主要是教训)。

后来到了 Thoughtworks 做咨询工作,帮助客户一起推动软件开发方法的改进,这样就有机会接触更多公司和不同的业务领域,看到了形形色色的项目。在和客户落地 DDD 的过程中,慢慢发现了很多规律性、共性的东西。不论哪个具体的业务领域,很多痛点、错误和最佳实践都是相通的。

前两年,我还重新翻译了Martin Fowler的《分析模式》。

这本书出得比《领域驱动设计》要早几年。《领域驱动设计》在一定程度上受到了这本书的影响。《领域驱动设计》的第 11 章就是“应用分析模式”,就连《领域驱动设计》的序言都是《分析模式》的作者 Martin Fowler 写的。其实,如果只是读了 《领域驱动设计》,还是不知道真正复杂的领域模型到底长什么样,而《分析模式》刚好回答了这个问题。

我在很多年前就读过《分析模式》早期的中文版。不过当时的翻译嘛,只能说有待改进吧。所以后来又买了一本英文版慢慢啃。当时怎么也没想到,后来自己竟然成了这本书的译者。

去了 Thoughtworks 以后,发现周围很多人都在写书、译书,自己心里也就有了想法。后来机缘巧合,得到了翻译这本书的机会。而在翻译的过程中,又学到了很多东西。可见环境确实能影响人。

说完自己的学习经历,我还想分享对几个问题的看法,包括如何消除学习 DDD 的畏难情绪,学习 DDD 要树立的基本观念以及 DDD 技能的分级。

问题一:听说DDD很难,我学不会怎么办?

很多同学顾虑的第一个问题是:听说 DDD 很难,学不会怎么办?

我们可以拿数学来打个比方。数学难不难呢?如果从整体来看,数学很难。哪怕数学里的一个分支,比如说数论,就已经特别难了。

但是,是不是由于数学整体上很难,我们一般人就不能学数学了呢?

当然不是。我们在小学一年级就开始学数学了。而且只要学了最初级的算术,就已经可以解决很多实际问题了。咱们多数人,在日常生活中,有中学数学的水平就够了,不用非要到数学博士的水平才能运用。

DDD 也是这样,虽然整体上有一定难度,但我们可以是由初级到高级、循序渐进地学。掌握了基础技能,就可以完成一些日常的开发任务了,然后再学中级、高级的。一步一步来,每一步都能取得成效,这样就不容易被畏难情绪劝退了。

而且,DDD虽然有些难度,但它绝对没有数学那么难。

问题二:初学 DDD 的基本观念

接下来要说的问题是,在一开始学习 DDD 的时候,要树立哪些基本的观念?

我觉得最主要有两点:一个是以模型为中心,另一个要重视业务

首先是模型,这里主要指领域模型。

专栏的第一个迭代里,我已经为你演示了从理解业务到建立领域模型,再到数据库设计和编写代码的最小闭环。

以模型为中心的开发方式,就是 DDD 里说的 “模型驱动设计”。这样做的好处是,更容易和业务专家对齐领域知识,更容易避免违反数据库设计范式,更容易写出可理解、可维护的代码。最终达到业务、数据库和代码三者的一致。

为了实现模型驱动设计,我就要强调第二个观念,就是必须重视对业务或者说领域知识的学习

我们开发人员都很喜欢钻研技术,新语言、新框架、新工具等等。这些当然是必要的,但是,如果开发的目标不明,方向不对,那么再好的技术也是无用功。要想把某个业务落地,就需要多跟业务人员聊,多理解业务,才不会跑偏。我听到一些开发人员说,自己比业务人员还懂业务。其实,很多情况下这是错觉。每天敲代码的人,很难比每天做业务的人更懂业务。

问题三:DDD的技能怎么分级?

聊完学习 DDD 的基本观念。我们回过头来再想一下,前面说过,可以由初级到高级,逐步掌握DDD,那么具体来说怎么区分“小学”“中学”和“大学”水平呢?

首先看看什么是小学水平

这还要分两种情况,一种是“理想”情况,另一种是更加“现实”的情况。

这里说的理想情况,指的是你的团队里有精于此道的老师傅带你。这时候,可以由老师傅把领域模型建好。而你不需要关注模型是怎么建立的,只需要在老师傅的指导下,对着模型写代码。

如果你的代码能够保持和模型一致,并且整洁规范,那么就算是小学毕业了。而且,在这个阶段,尽管你没有刻意学习建模,但是由于编码过程中必然要理解模型,所以已经潜移默化地对领域建模有所理解了,为下一步的学习奠定了基础。

不过,“现实”情况是,多数学我们课程的同学,在自己的团队里并没有熟悉 DDD 的师傅带你。你自己反而就是在你的团队里第一个推 DDD 的。

这时候,你就只能按照我们的课程从建模学起。但是,在第一个阶段,不要学得大而全,而是掌握最基本的建模技能,接着马上学习模型的实现,掌握最小的开发闭环,然后在项目中实践。

如果能够利用 DDD 的技能,优化手头项目中的一小部分,或者新开发一个不大的功能,从而落地最小的 DDD 闭环,那么也算是小学毕业了。等到你的水平提高了,那么将来倒是可以按照上面说的理想情况引导其他同事入门了(DDDD = 带带弟弟)。

那么什么是中学水平呢?

  • 在小学毕业的基础上,不断地实践,深化对统一语言、模型驱动、分层架构等知识的理解。
  • 再进一步掌握聚合、值对象、限定等更深入的技术,初步掌握泛化的使用。
  • 能够独立完成一个中小规模系统的建模和设计,并指导团队一起实现。
  • 在实现过程中,能够回答同事们常见的有关 DDD 的疑问。

这样就算达到中学水平了。这里所谓中小规模,一般就是几十张数据库表的规模。

那么什么是大学水平呢?

用 DDD 的术语来说,在中学阶段,你已经能开发和维护单个“限界上下文”的系统了。而到了大学水平,则应该能够负责跨多个限界上下文的系统的分析设计工作了。

这个阶段,我们一方面要继续深化之前的知识,另一方面要学习限界上下文等“战略设计”的技能。这时候你往往要带领多个中级水平的架构师一起协作,还要更多地和领域专家打交道,所以也要提高沟通协作的软技能。

此外,到了这个阶段,你更要明白解决同样的问题,往往没有唯一正确的方案,而是要懂得在多种方案中进行权衡,做出决策。还要随时准备对模型和系统进行演进。

最后,结合我们的课程,我把 DDD 知识分级整理成了后面这张图,供你参考。

学完整个课程,你会发现,这些知识在我们的三个迭代里几乎都有体现。

顿悟时刻

最后,再用我的一个学习心得来收尾吧。

学习一个东西,常常会有一个顿悟时刻。比如说,学骑自行车,一开始总是歪歪扭扭、蹬不起来。但是只要反复练,到了某个时刻,忽然间就能骑几步了。虽然还不太稳,但起码可以保持基本的平衡,继续往下练了。

学技术的道理也是一样的。开始的时候,我们可能看了很多书,知道了很多理论,但还是觉得似懂非懂,找不到感觉。但是如果我们反复思考、不断实践,有一天,就会“啪”地一下开窍了。你可能会说:“哦,原来就是这样,这么简单呀”。从此以后,这个问题对你来说就不是事儿了。

顿悟不会凭空出现,而是在不断实践和思考的基础上产生的。希望这门课程,能给你播下 DDD 的“种子”,也期待你在未来实践里,多一些这样的“顿悟时刻”。

文章来源:极客时间《手把手教你落地 DDD

猜你喜欢

转载自blog.csdn.net/m0_68101999/article/details/129648928