0.输出即学习
事件风暴
事件风暴抓准了企业软件开发中协作困难这个痛点,以事件为核心允许不同背景的利益相关方开展对话,并超越各自的专业背景界限,借助白板与各色便利贴,重视头脑风暴的可视化,尽可能让所有参与者充分咀嚼领域知识,从而深刻高效地挖掘与传递业务知识,形成业务全景图,减少信息孤岛等偏差存在,有效降低复杂软件的需求分析与传递成本。
这是学习笔记第一篇:《捕获需求的利器——领域驱动设计中的事件风暴》
领域建模
领域驱动设计的核心是领域建模,领域建模创造性地解决了软件分析与设计割裂的历史遗留问题,通过领域模型关联业务需求与软件实现,达成需求与交付的一致性,通过可视化模型快速消化业务知识,建立统一语言,简化认知统一认知指导开发,为业务人员与技术人员搭建起沟通与监督的桥梁。
这是学习笔记第二篇:《业务与技术沟通的桥梁——领域驱动设计中的领域建模》
数据库设计
领域驱动设计改变了表结构设计优先的思维惰性,领域建模优先保障了数据库设计与领域模型一致,从数据驱动到领域驱动是软件生产方式的变革,为领域模型与软件实现的统一奠定基础。
这是学习笔记第三篇:《从数据驱动到领域驱动——领域驱动设计中的数据库设计》
分层架构
领域驱动设计中分层架构与六边形架构结合的最大魅力是保持了领域模型作为核心的稳定性,核心思想是分离关注点,设计原则是依赖倒置,从而使得不依赖用户交互与持久化机制的领域模型独立演进成为可能。
这是学习笔记第四篇:《分离关注点构建领域核心——领域驱动设计中的分层架构》
代码实现
面向多种编程范式更适合于当今企业级软件应用开发,结合领域驱动设计提供的诸多最佳实践模式,代码实现质量有所保障,通过事件风暴、领域建模、数据库设计、分层架构和代码实现完成了领域驱动设计的最小闭环。
这是学习笔记第五篇:《Show Me Code——领域驱动设计中的代码实现》
1.即刻出发
听闻领域驱动设计(Domain Driven Design,DDD)也有几年了,知道是一套自成体系的软件开发设计方法集合,致力于解决复杂软件的设计与实现问题,可以帮助提高软件的可维护性。但可能也仅限于知道,并没有真正地道的使用过,对一些概念还是一知半解,软件复杂度的解决办法也并没有显著提高。
随着开发能力的提升以及对于软件价值的理解,经历过诸多大泥球一般的工程迭代后,越来越意识到软件设计的重要性,不论是对于软件本身还是个人专业素质的提升。虽说对于软件设计与质量的重视程度会因企业与项目而异,但毋庸置疑的是,它的确能够提升个人与团队的作战能力。
DDD 在国内一直处于方兴未艾的状态,宣传者众,落地者寡。DDD 甚至被奉为圭臬,究竟是怎样,缺少求证。原著,无论是 DDD 还是 IDDD 都不够“具体”,对于大部分开发者而言很容易看得云里雾里。
很巧,极客时间出了 DDD 专栏。作者是钟敬老师,就是老马(Martin Fowler)《分析模式》的中文译者,同在 Thoughtworks 工作(国内的 DDD 著作几乎是绕不开 TW 的)。原生地道的 DDD 实践学习渠道就有了。
好了,就在此时此刻。总想系统学习下 DDD 求证下它的治理方法,现在有了入门机会,就跟着钟老师(江湖人称 老钟医 )一起实际操练起来。
我想,只有真正实践到,才能是叫知行合一,也就有了这一系列文章。
2.学习前先定调
不论是像构建 DDD 话语体系的 Evans 这样的大佬,还是像成为 DDD 布道师的钟敬老师这样的领域专家,无一例外可在细节觉察他们的功力。魔鬼在细节,尤其是像本人一样初入 DDD 的同学,一定不能眼高手低,切身实践才有真正领悟。
看到只能吸收三成营养,动手实践可达五成,重新表达能达七成,不断锤炼才能入门。 不论是在模型建立阶段,还是模型实现阶段,亲自去画画图、编编码,自然能发现 DDD 的力量,体会到那些 隐喻 。
这也是为什么这一系列文章中,不直接使用这些作者的示例,而是重新拉出来一个虚拟项目演示建模过程的原因。 在考虑能不能翻过这道墙的时候,先把自己的帽子丢到墙的另一边,自然会想办法过去的。 通过一个新的开发背景, 重新演绎 DDD 过程,能收获的更多。
3.笔记的重新演绎
极客时间的专栏质量可以讲是当前国内头一档的,不仅因为大部分作者水平都是行业翘楚,而且专栏设计充分考虑了教育过程。就像原来的内容负责人小盖(现墨问西东首席内容官)所言,做付费专栏的本质就是做教育。需要知识结构,有大纲有教学计划有总结;需要课堂氛围,有讨论有评价有解答;需要学习闭环,有学习目标有出题问答等等。这样,教育有了代入感,用户体验自然会好起来。
而这个专栏,钟老师与编辑充分参考了柔性设计。没有像很多材料一样一股脑堆进来 DDD 的许多概念,而是选取了最小集合,通过一个例子演绎 DDD 的落地过程,从而实现 最小闭环 。这也是专栏第一个迭代的脉络。
佩服,是专家,不仅精通还善教学,不愧老钟医。
于是,在最小闭环的脉络下,我也形成了这一系列笔记。在笔记基础上重新演绎形成了这一系列文章。重新演绎包括:
- 在专栏举例之外使用其他的案例作为实践对象
- 动手实践,所有绘图与编码落到实处
- 在反复研读专栏基础上,除去专栏的经典概括,尽量通过自己语言回溯
- 时间允许,参考专栏之外的著作文章
- 在每篇文章结束后,自己用一小段话表达它的核心思想与价值(方便后续分享与向上汇报)
能力与时间有限,除专栏外主要参考资料包括:
- DDD,Eric Evans 的原典《Domain-Driven Design》,中文译作《领域驱动设计——软件核心复杂性应对之道》
- IDDD,Vaughn Vernon 同样出名的《Implementing Domain-Driven Design》,中文译作《实现领域驱动设计》
- UML 和模式应用,Craig Larman 的 UML 著作,中文译作的原书第三版
- 还有一些其他的 web 与博客文章,比如事件风暴工作坊等
再补充下使用的工具:
- 笔记与文章编辑,Typora,国产体验良好的 MD 编辑器
- 电子白板,BoardMix,同样是国产,包括事件风暴、类图、流程图、表结构等都比较轻量的支持
- IDE,生产力工具,IDEA Community
- 语言无关,自己熟悉 Java 框架就选了 SpringBoot 一套
4.努力与成就
软件设计学习与钢琴练习其实很像,没有系统训练的话挑战是巨大的,但是努力作为变量能起到决定性作用。钢琴曲目练五十遍与练五遍的效果就是不同,设计思维也是如此,重新演绎与过目即忘有着天壤之别。至于成就,一定会从自我认知开始,弹的好不好,设计的优雅与否自己就是第一个观众。
将自己的技能打造成自己的产品,出自 Google 的名言「自己吃自己的狗粮」。相信我才是我的目的,来对抗刻意练习中的枯燥。有成就便会有更大动力迎接新的挑战,一个正向循环就此诞生。
构成的是一个 挑战-努力-成就 的铁三角,也就是罗胖为什么说这可以是人生的内核,可以延绵许久,支撑一件事做一辈子的缘由。
不多不少,跟着钟老师一起学习完了第一个迭代,有了最前面的五篇小文章。虽然吭哧吭哧,对于 DDD 入门来说是一定有满足感的。答疑解惑之间也感受到了技术人的纯粹,钟老师是不多见的技艺精湛而又性格温和的。
最后,也把这个专栏分享给大家,还在犹豫要不要翻墙,就先把帽子丢到到墙的另一边吧,定不负所愿。