谈到领域驱动设计(DDD),人们很容易想到如下这张图,那么是不是你的软件做了如下的分层设计就是领域驱动设计的了?显然不是,以下分层只能说明的软件做了分层架构,领域驱动设计的核心在领域模型,领域模型的核心在业务知识。如果能够采用面向对象思维将业务抽象为恰当的模型,不管用什么架构都称得上领域驱动设计。
在大学期间学了很多GIS的专业课程。其中《GIS原理与应用》,原理讲什么?就是现实世界如何抽象为计算机数据。应用讲什么?就是如果应用抽象的计算机数据服务与现实世界。整书的目标就是讲清楚GIS领域如何建模,如果应用领域模型服务于生产。其中《GIS空间分析理论与方法》,空间分析是什么?就是GIS领域模型如何解决问题,抽象为计算机语言,就是模型应该拥有什么哪些方法并且如何实现。
GIS应该是计算机相关专业,是用计算机的方法去存储、查询、分析和现实地理数据的专业,培养的是地理和计算机兼顾的人才。我想还有很多其他的计算机相关专业也类似,同时学习专业理论知识和计算专业知识。然而科班出生的人,更多的是纯粹的学习计算机理论方法,面向对象只是众多计算机理论中的一方面,从而并不一定引起多大的关注。
相对而言计算机技术是相对不变的东西,而业务是千变万化的,从研发人员自身角度出发,给自己创造价值的是编码,而不是业务,特别是在互联网行业,产品和研发分离,业务成了产品混饭吃的家伙,而对于研发,写的一手好代码,才是硬本事。可能很少有软件工程师从业务角度去思考计算机的价值,事实上计算机应该是作为一个工具而为业务服务,是一个将业务信息化的工具,从而提高业务生产率。
所以若想领略领域驱动设计的精髓,首先要精通业务,在《领域驱动设计:软件核心复杂性应对之道》一书中大量篇幅讲到了领域专家一职。作为一个初学者阅读该书是也可能会觉得懊恼,这不是一本讲软件架构的书吗?为什么有那么大的篇幅讲解我们该如何去沟通,如何去获取业务知识,如何去做业务建模。作为一个有追求的软件工程师,在不断提升软件开发技能的同时,必须能够有足够的认识,精通业务知识才是我们做好软件设计开发的首要条件。