模型驱动的开发模式真的能将开发效率提升一个数量级吗?
一
模型不需要解释,大家都知道模型是什么,小时候玩过汽车模型,飞机模型,中学上生物课看到过人体骨骼模型,工作后从事工程设计的人可能用过CAD软件进行模型的绘图设计。
波音777是首款没有制造原型机就开始量产的大型客机,这款机型的研制采用了2200台图形工作站和8台主机,实现了全机100%的数字化设计。工程设计人员在工作站屏幕上,使用三维交互式设计软件CATIA系统,直接做出彩色立体的三维图形,而且可以方便直观地修改设计方案。777上有超过13万种专门设计的零件,全机零件总数达300万件以上,它的全程“无纸化设计”标志着CAD/CAM技术的巨大成就。

波音777-200飞机
实物的模型,图纸上的模型,存在计算机里面的、数字化的模型,这些都是模型。
从概念上讲,一个工程模型是对某个系统的一种选择性表现形式,这种表现形式针对特定的关注点准确而简明地抓住了该系统的所有本质属性。
人类的大脑能力是有限的,模型使人类可以在更高的抽象层面上掌握一个复杂的东西,模型就是一种抽象,它把本质的、精髓的、目前最关注的东西呈现出来,模型是人类为了理解和把握复杂系统而设计出来的一种机制。
模型用于人与人之间的沟通,因为模型是对事物的一种高阶抽象,可以更清晰、更准确地传递关键信息。
软件开发人员所编写的软件代码,从本质来说,也是一种模型,它不是最终运行的系统,它需要通过编译器编译成机器可执行文件,有的代码,例如Java,C#,编译器仅仅编译出中间代码,最终执行的时候需要在虚拟机上将这些中间代码转换成可执行机器码。
可是软件代码用于人与人之间的沟通就显得非常困难,因为它的抽象程度不够,一个专业人员也无法很快掌握成千上万行不熟悉的代码。
当然,编程语言也在不断的向高阶抽象进化,需要写的代码越来越少,相应的,集成开发环境、辅助工具、编译器以及虚拟机变得越来越强大。
但这并没有改变“软件开发是以编程为主的活动”这一事实。
二
模型驱动开发(MDD)是软件开发的另一种方式,其主要工件是模型,通过自动化工具可以从这些模型生成代码和其他工件。MDD在上世纪80年代就已提出,主要目的是为了解决软件的两个根本危机:复杂性和变更能力,其基本思想是让软件开发的中心从编程转移到高级别的抽象中去,通过模型转成代码或其他工件来驱动自动化开发。
通常的软件项目都会有模型设计环节,不过,这些模型大多是用来传达系统某个方面的示意图,比如系统架构图,或用来描述在后续阶段会进行手工实现的详细设计的蓝图。
在通常的软件项目里模型主要是作为文档和规范存在的,这样就无法确保模型与最后的技术实现保持完全一致。经常发生的事情是,对技术实现进行了更新但并没有同步更新模型。在不准确的模型和完全没有模型之间,很难说哪个更有害。
严格意义上,这不能称作MDD。在MDD的项目里,模型必须是计算机可读的,可以通过工具将一个模型转换成其他模型,或将模型转换成代码。模型和模型之间,模型和代码之间必须保持一致性。
这就是描述性模型(Descriptive Model)和规定性模型(Prescriptive Model)之间的区别。
模型有很多类型,模型的类型是和问题领域对应的,在架构、分析、设计、实现等不同阶段都会存在多种模型,例如企业架构模型、技术架构模型、业务模型、UI模型、数据模型、业务规则模型、系统部署模型、测试模型等。
MDD开发方法有诸多好处,以下分别说明。
1. 提高开发效率
在MDD中开发的是更高层次的抽象模型,通过对模型的解释执行或产生的代码,抽象模型会自动转化为可工作的软件应用。因为模型具有更高的抽象层次,所以比相同实现的其他方式具有更小的代码量。换句话说,模型中的每个元素(符号或其它伪编程语言)可以代表多行代码,这样我们可以在相同的时间内实现更多的功能。
2. 降低开发成本
由于MDD开发效率更高,可以使用更少的开发人员,可以缩短软件产品或项目的交付日期。另外,在维护方面,阅读高抽象模型的应用程序行为更加容易。
3. 提高开发质量
在MDD中,应用程序使用高级的抽象模型,而模型由一个引擎执行或被解释成代码,避免了大量人工编程,因此应用程序的质量取决于执行引擎或解释器,而执行引擎或解释器一般是由一流软件公司和专家级程序员打造的。此外,好的MDD开发平台采用了软件开发方法的最佳实践并集成了优秀的开发工具,这进一步保障了应用程序的质量。
4. 提高可重用性
在MDD中,模型、架构和转换工具都是可以重用的。因为架构和技术问题已经解决,所以开发新功能的风险也降低了。高的重用性使得开发效率提高,开发周期缩短,开发成本降低。
5. 提高IT部门对业务部门的响应速度
因为在MDD中应用程序的开发效率更高,应用程序的改变更加容易,这就使得IT部门能够对业务部门的需求变化做出快速响应,如果业务需求和软件应用模型的关联足够明确,需求变化甚至可以自动传递到软件应用部分的变化中去。
6. 提高应对技术快速变化的能力
技术的更新与变化越来越快,MDD可以确保我们的应用程序模型在迁移到其他技术平台时不会发生变化,我们只需根据所变更的技术平台相应的改版代码编译器或解释器。更换解释器后,所有的程序模型将直接被编译成新平台的代码。
7. 改善业务部门和IT部门的交流
MDD可以消除业务和IT之间的隔阂,业务专家或业务分析人员可以直接的参与开发过程,软件的应用部分被定义为一个很高的抽象模型,这些模型无限接近业务概念中的描述和定义,业务和模型以及模型和IT系统之间的定义更加明确,这些都会极大地改善项目团队以及相关人员之间的沟通。
8. 可以推迟技术决策
项目早期的开发活动主要是建模,这样就可以推迟具体技术平台或软件产品的选择,直到有更多的信息可用时再选择。这在具有极长开发周期(例如,航空交通管制系统)的领域中十分重要,因为在开发开始时目标技术平台可能还不存在。
9. 使整体架构更加强壮
公司经常会定义架构标准,软件开发必须遵循这些标准。但是当所有代码都是手工创建时,如何去检查或执行这些架构标准呢?在MDD中,应用程序将遵循既定的架构标准,因为这些架构标准都定义在MDD工具中了。功能性的架构标准将指导功能设计,这些标准表现在所采用的DSL(领域特定语言)里面。在MDD中,架构标准指导功能设计,并将在代码编译器和解释器中得到体现。
10. 模型是一项长期资产
模型是企业或机构的一项核心资产,一个设计良好的模型是企业的业务专家和IT专家长期经验的结晶,代表企业经营的最佳实践。模型具有一定的稳定性和弹性,只在业务变更时才发生变更,眼花缭乱的技术更迭并不会太影响模型的稳定性。铁打的营盘流水的兵,一个企业或机构的模型是它的“铁打的营盘”的重要组成部分。
三
MDD真的可以将开发效率提升一个数量级吗?
2006年摩托罗拉的研究人员发表了一篇论文,他们对比分析了5个相似的电信系统网络元件应用的开发过程,其中三个应用采用的是传统的软件开发方法,另外两个采用的是模型驱动的软件开发方法。结果是开发效率相差十倍左右。

开发效率比较(F1-F5为5个相似的应用)
另外,该论文发现MDD开发的应用的质量也大大提高,表现在其缺陷密度相对于采用传统开发方法开发的应用低得多。

软件质量比较(F1-F5为5个相似的应用)
模型驱动方法能够提升开发效率一个数量级,大大提高软件质量,既然有这么多的好处,而且看来它的发展历史也不算短了,那么为什么MDD没有被大规模采用呢?
如果现在MDD还无法成为通用的软件开发模式,那么有哪些领域,哪些场景适合采用MDD呢?
缩写
1. CAD,Computer Aided Design,计算机辅助设计
2. CAM,Computer Aided Manufacturing,计算机辅助制造
3. CATIA,Computer Aided Three-dimensional Interactive Application 计算机辅助3D交互式应用
4. MDD,Model Driven Development,模型驱动开发
5. DSL,Domain Specific Language, 领域特定语言
引用
1. T. Weigert and F. Weil, “Practical Experiences in Using Model-Driven Engineering to Develop Trustworthy Computing Systems,” IEEE SUTC 2006