一、领域驱动设计为何又焕发青春?
领域驱动设计(Domain Driven Design,DDD)确实已不再青春,从 Eric Evans 出版了划时代的著作《领域驱动设计》至今,已有将近十五年的时间,在软件设计领域中,似乎可以称得上是步入老年时代了。可惜的是,对于这样一个在国外 IT 圈享有盛誉并行之有效的设计方法学,国内大多数的技术人员却并不了解,也未曾运用到项目实践中,真可以说是知音稀少。DDD 似乎成了一门悄悄发展的隐学,它从来不曾大行其道,却依旧顽强地发挥着出人意料的价值。
直到行业内吹起微服务的热风,人们似乎才重新发现了领域驱动设计的价值,并不是微服务拯救了领域驱动设计,是因为领域驱动设计一直在坚硬的生长,然而看起来,确乎因为微服务,领域驱动设计才又焕发了青春。
我从 2006 年开始接触领域驱动设计,一开始我就发现了它的魅力并沉迷其间。从阅读 Eric Evans 的《领域驱动设计》入门,然后尝试在软件项目中运用它,也取得了一定成效。然而,我的学习与运用一直处于摸索之中,始终感觉不得其门而入,直到有机会拜读 Vaughn Vernon 出版的《实现领域驱动设计》一书,并负责该书的审校工作,我才触摸到了领域驱动从战略设计到战术设计的整体脉络,并了解其本质:领域驱动设计是一个开放的设计方法体系。
即使如此,许多困惑与谜题仍然等待我去发现线索和答案。设计总是如此,虽然前人已经总结了许多原则与方法,却不能像数学计算那样,按照公式与公理进行推导就一定能得到准确无误的结果。设计没有唯一的真相。
《实现领域驱动设计》:https://item.jd.com/11423256.html
二、为什么要学习领域驱动设计?
如果你已经能设计出美丽优良的软件架构,如果你只希望脚踏实地做一名高效编码的程序员,如果你是一位注重用户体验的前端设计人员,如果你负责的软件系统并不复杂,那么,你确实不需要学习领域驱动设计!
领域驱动设计当然并非“银弹”,自然也不是解决所有疑难杂症的“灵丹妙药”,请事先降低对领域驱动设计的不合现实的期望。我以中肯地态度总结了领域驱动设计可能会给你带来的收获:
领域驱动设计是一套完整而系统的设计方法,它能带给你从战略设计到战术设计的规范过程,使得你的设计思路能够更加清晰,设计过程更加规范。
领域驱动设计尤其善于处理与领域相关的高复杂度业务的产品研发,通过它可以为你的产品建立一个核心而稳定的领域模型内核,有利于领域知识的传递与传承。
领域驱动设计强调团队与领域专家的合作,能够帮助团队建立一个沟通良好的团队组织,构建一致的架构体系。
领域驱动设计强调对架构与模型的精心打磨,尤其善于处理系统架构的演进设计。
领域驱动设计的思想、原则与模式有助于提高团队成员的面向对象设计能力与架构设计能力。
领域驱动设计与微服务架构天生匹配,无论是在新项目中设计微服务架构,还是将系统从单体架构演进到微服务设计,都可以遵循领域驱动设计的架构原则。
三、学习领域驱动设计的秘诀
没有谁能够做到领域驱动设计的一蹴而就,一门课程也不可能穷尽领域驱动设计的方方面面,从知识的学习到知识的掌握,进而达到能力的提升,需要一个漫长的过程。所谓“理论联系实际”虽然是一句耳熟能详的老话,但其中蕴含了颠扑不破的真理。我在进行领域驱动设计培训时,总会有学员希望我能给出数学公式般的设计准则或规范,似乎软件设计就像拼积木一般,只要遵照图示中给出的拼搭过程,不经思考就能拼出期待的模型。——这是不切实际的幻想。
要掌握领域驱动设计,就不要被它给出的概念所迷惑,而要去思索这些概念背后蕴含的原理,多问一些为什么。同时,要学会运用设计原则去解决问题,而非所谓的“设计规范”。例如:
思考限界上下文边界的划分,实际上还是“高内聚、低耦合”原则的体现,只是我们需要考虑什么内容才是高内聚的,如何抽象才能做到低耦合?
是否需要提取单独的限界上下文?是为了考虑职责的重用,还是为了它能够独立进化以应对未来的变化?
在分层架构中,各层之间该如何协作?如果出现了依赖,该如何解耦?仍然需要从重用与变化的角度去思考设计决策。
为什么同样遵循领域驱动设计,不同的系统会设计出不同的架构?这是因为不同的场景对架构质量的要求并不一样,我们要学会对架构的关注点做优先级排列,从而得出不同的架构决策。
我强烈建议读者诸君要学会对设计的本质思考,不要只限于对设计概念的掌握,而要追求对设计原则与方法的融汇贯通。只有如此,才能针对不同的业务场景灵活地运用领域驱动设计,而非像一个牵线木偶般遵照着僵硬的过程进行死板地设计。
四、首个全面讲解 DDD 的原创课程
国内关于领域驱动设计(Domain Driven Design,DDD)的原创书籍少之又少,甚至可以说没有,我结合了十余年实践领域驱动设计的经验与心得,并糅合了 DDD 社区最新发展的理论知识与最佳实践,策划了《领域驱动设计实践》系列课程(https://link.zhihu.com/?target=https%3A//gitbook.cn/gitchat/column/5b3235082ab5224deb750e02),可以称得上是国内第一个全面讲解 DDD 的原创课程。
本系列课程拆分为两个课程,即《领域驱动战略设计实践》和《领域驱动战术设计实践》,分别对应领域驱动设计的战略设计阶段与战术设计阶段。
本课程是《领域驱动设计实践》系列课程的第一个课程,其全面覆盖了领域建模分析与架构设计的战略设计过程。从剖析软件复杂度的根源开始,引入了领域场景分析与敏捷项目实践,帮助需求分析人员与软件设计人员分析软件系统的问题域、提炼真实表达的领域知识、最终建立系统的统一语言。
本课程将主流架构设计思想、微服务架构设计原则与领域驱动设计中属于战略设计层面的限界上下文、上下文映射、分层架构结合起来,完成从需求到架构设计再到构建代码模型的架构全过程。
此外,本课程内容的每一个知识点都会结合项目实践案例来讲解,力求内容的深入浅出,并在讲解过程中介绍了诸多架构设计原则与模式,丰富了知识内涵,但又不仅只限于对领域驱动设计的覆盖。同时,本课程也可以作为软件架构设计的参考书。
为了让读者更容易掌握整个战略设计的全过程,最后还给出了一个真实的完整案例:EAS 系统,结合该案例来讲解如何在项目实践中进行领域建模分析、识别限界上下文,并最终构建整个系统的架构。
张逸的达人课:https://link.zhihu.com/?target=https%3A//gitbook.cn/gitchat/column/5b3235082ab5224deb750e02(可点击阅读原文跳转)
五、送给所有喜欢 DDD 读者的肺腑之言
如果我们能够走在迈向唯一真相的正确道路上,那么每前进一步,就会离这个理想的唯一真相更近一步,这正是我推出这门课的初衷。也并不是说我贴近了唯一真相,更不是说我已经走在了正确道路上,但我可以自信地说,对于领域驱动设计,我走在了大多数开发人员的前面,在我发现了更多新奇风景的同时,亦走过太多荒芜的分岔小径,经历过太多坎坷与陷阱。我尝试着解答领域驱动设计的诸多谜题,期望能从我的思考与实践中发现正确道路的蛛丝马迹。
我写的这门课程正是我跌跌撞撞走过一路的风景拍摄与路径引导,就好似你要去银河系旅游,最好能有一本《银河系漫游指南》在手一样,不至于迷失在浩瀚的星空之中,我期待这门课程能给你带来这样的指导。加油!
如果你对学习本课程有任何疑问,欢迎通过 GitChat 的读者圈功能与我交流互动,我会极可能及时回答每个人的问题。具体方式请关注微信号:GitChat
专家推荐
张逸不但拥有过硬的领域驱动设计实践经验,而且是一位能够深入浅出的阐释者。这两项特质保证大家能够收获满满!
——ThoughtWorks 咨询总监、精益敏捷专家,肖然
我做了多年大规模微服务架构,也见了许多微服务实施案例,其中做得好的无一例外对领域模型有了深入的分析,做得不好的往往只关注工具和框架而忽略了领域模型。张逸是国内 DDD 领域少有的专家,我向大家推荐他的《领域驱动设计实践》系列课程。
——阿里巴巴高级技术专家,许晓斌
国内同仁写的软件需求设计方面的图书,我都有收集,但能认真阅读的不多。张逸写的书是少数我认真阅读过的,推荐给大家。
——UMLChina 首席专家,潘加宇
作者简介:张逸,曾先后就职于中兴通讯、惠普 GDCC、中软国际、ThoughtWorks 等大型中外企业,任职角色为高级软件工程师、架构师、技术总监、首席咨询师。
精通包括 Java、Scala、Python、C#、JavaScript、Ruby 等多种语言,熟练掌握面向对象思想、测试驱动开发与重构、领域驱动设计、函数式编程、架构、大数据分析、敏捷与过程改进,并致力于大型软件企业的面向服务系统架构设计、大数据平台架构设计以及互联网 Web 系统架构设计。
著译作包括《软件设计精要与模式》、《Java 设计模式》、《恰如其分的软件架构》、《WCF 服务编程》、《人件》、《重构——改善既有代码设计》评注版、以及《架构之美(Beatiful Architecture)》评注版。
版权声明:本文及文中所涉及课程均为 GitChat 平台独家发布,未经授权不得转载。