共计 3970 个字符,预计需要花费 10 分钟才能阅读完成。
你好,我是这门课的编辑小新。
人不知; 鬼不觉,咱们的课程曾经靠近序幕,很快乐看到有些同学曾经在工作里试着应用 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》