一. 什么是模型驱动开发
我们从一张网上找的图片来开始:

模型驱动开发Model Driven Development (MDD) 是一种以模型作为主要工件的高级别抽象的开发方法,模型在工具的支持下,被作为核心资产被转换成代码或者可运行配置。
MDD代表了一套理论和工业化软件开发的方法框架,在软件开发全生命周期中系统的使用模型作为主要工件,它主要为了解决软件的两个根本危机:复杂性和变更能力。
以上是摘自互联网上的定义,具体的详细内容,大家可以网上搜索MDD以及相关内容来了解,这里不再赘述,本文仅是介绍一些对模型驱动的自我认识。
二. 模型驱动的思考
2.1 软件与建筑
软件与建筑有颇多的相似之处,甚至像设计模式Design Pattern这样众所周知的术语也是源自于建筑领域,软件称之为工程,所以与建筑工程也有许多相似,包括过程的管理、质量的控制等等。
在这里,我们参考一下建筑工程的基本流程:
- 项目建议书阶段
- 可行性研究阶段
- 初步设计阶段
- 施工图设计阶段
- 建设准备阶段
- 竣工验收阶段
- 后评价阶段
从以上流程可以看出,软件工程同样是具备这样的阶段,但是,别着急,再仔细看看,其中的初步设计阶段及施工图设计阶段,我们暂且合起来称之为设计阶段,其输出的最终产品是施工图纸,这是指导整个建筑的唯一的源头,按软件的说法,我们可以称之为图纸驱动建筑,这个图纸其实就可以称之为模型。
再想想咱们做的软件,大部分情况下做了产品设计(关于页面及交互)、数据库设计(关于存储),但是对软件最核心的代码却没有过多的设计,更多的是依赖于开发人员自身。
所以,我们就好像拿着不完整的图纸在盖房子,不可避免的会面临许多的问题,这一切,源于我们没有真正做好驱动软件工程的这张图纸(即模型),也是源于此,OMG(对象管理组织)与2002年提出了模型驱动架构(MDA)的概念,期望软件能像建筑一样,用完善的模型来驱动,从根本上解决软件研发中的各种问题。
2.2 模型驱动
模型驱动Model Driven(MD),是以模型为唯一源头,来驱动具体的行为,这是一个很模糊的词汇,“驱动”比较好理解,这里最核心的是“模型”,不同的人、不同的文章,其实都没有进行清晰的说明。
模型:通过主观意识借助实体或者虚拟表现构成客观阐述形态结构的一种表达目的的物件(物件并不等于物体,不局限于实体与虚拟、不限于平面与立体)(摘自百度百科)
在软件领域,存在着多种模型:
- 表单模型:表单驱动的aPaaS平台有很多,包括以前的一些建站系统,也都有类似的思想,即用户通过在线创建表单(定义表单字段),来驱动后续的开发过程;
- 数据库模型:一般来讲,所说的模型驱动的aPaaS平台,就是指数据库模型,用户通过平台创建实体-关系图(ER图),来驱动开发过程;
- UML中的模型:统一建模语言(UML)是一整套对软件进行抽象的模型,其主要有三个组成部分:
- 事物:定义结构、行为、分组、注释等
- 关系:事物之间的各种关系,包括:依赖、协作、泛化、实现等
- 图:事物和关系的可视化表现,包括功能模型、业务模型和数据模型
- 领域模型:是对领域内的概念类或现实世界中对象的可视化表示。不同的领域可以抽象不同的模型。通常说的领域驱动设计DDD中的领域模型,是类似于UML一样抽象出来的一套业务模型来驱动,实际上,更准备的理解是:任何领域都可以抽象出自己的领域模型,使用过Visio的人可以回忆一下,其实画图的各种图例,就是领域模型。
其实还有各种各样的模型,甚至读者自己也可以抽象出自己的模型,但是,模型的好坏直接决定了驱动整个过程质量,所以在选择模型的时候,一定要谨慎。
三. 几种模型驱动的对比
aPaaS(Application Platform as a Service)平台是最近比较火的,元型也是一个以业务模型(扩展自UML)驱动的aPaaS平台,这里对比一下各种驱动方式的aPaaS平台的优劣势:

(此图来自元型外宣材料)
表单驱动能很好的构建一些简单的流程性系统,但是对于复杂点的系统,就比较难以实现,而且其数据结构化、系统集成、需求变更等方面都有着很大的制约。
数据模型驱动是针对大中型软件的,无论是aPaaS平台,还是传统的软件团队开发软件,大部分都是数据模型驱动的,即先画出ER图,然后开始写代码,这里面最大的一个隐患就是:数据模型是为了存储的,ER图是面向关系型数据库而非面向对象的,由存储结构来驱动整个软件,可想而知后续会面临多少的隐患,换句话讲:我们不能因为仓库是什么样就决定卖什么,而要根据卖什么来设计仓库。
综上,使用业务模型来驱动,会避免许多的隐患,同时,业务模型也能很好的与业务人员沟通,达成共识,从而让开发的软件更符合业务的需求,在后续的需求变更中也能更快更好的响应。
四. 怎样做好模型驱动
对于模型驱动的介绍,本文无法详述,元型团队10多年来一直在这个领域不断的尝试、实践,最终成型,要研发好一款软件,要做好模型驱动,根据元型的最佳实践,大家可以遵循以下原则:
- 使用业务模型来驱动开发
- 选择完善的有共识性的业务模型
- 将业务模型转换为平台相关的文件,包括物理模型、代码、文档、脚本、数据库等
- 模型生成文件需要可重复执行、可升级,要求有良好的非侵入式扩展方法
- 尽量集成自动化工具,包括但不仅限于CI/CD
根据我们在数十个项目中的实践,可以节省70%的软件总成本,希望您也可以去尝试一下,这将完全改变您对软件研发的认知。