模型驱动工程

背景

在计算机应用领域，“模型驱动”（model-driven）概念在国际上的广泛关注，主要是在对象管理组织（OMG）2002年提出的“模型驱动架构”(MDA)及相关的“模型驱动开发”（MDD）等概念之后。更广阔的背景，可追溯到20世纪1980-90年代各种建模技术的蓬勃发展。其中，面向对象建模最为活跃，“统一建模语言”（UML）是其中最具代表性的成果。这一时期，尤其1997年OMG正式采纳UML 1.1作为建模语言标准以来，软件领域无论是业界/技术开发领域还是理论/学术研究领域，大多数与软件建模有关的研究，都围绕着UML或与之相关。MDA正是在这样的背景下提出的。而UML则是MDA方案中的核心要件。
这种技术与实践领域的发展，同时也推动了它背后的原理与学术研究。在近十多年，除了OMG的MDA，人们对于模型在软件开发中的应用，有着更广阔的研究，对于模型与建模的重视一直在增强。在这个背景之下，关于软件及相关领域的建模与模型方面的各种思想、方法也愈加活跃起来。从近年的情况看，MDA对软件领域的建模与模型的重视与研究起了很大的促进作用，但它并非这些理念或技术（例如模型驱动）的源头，这也是毫无疑问的。其实，早在1980年代，曾经受到广泛重视的“计算机辅助软件工程”（CASE）就在基于建模与模型的软件开发技术方面做了大量的探索。以“信息系统”为主题的数据与信息建模、概念建模等，则始终是有关建模的研究方面一个重要的传统领域。
围绕模型在软件开发中的作用，除了广泛使用的“模型驱动”（model-driven）概念，还有“基于模型”（model-based）、面向模型（model-oriented）、以模型为中心（model-centric）等等，但“模型驱动”似乎已经得到了更多的认同。“模型驱动工程”（Model-Driven Engineering, MDE）大致就是在这样的背景上出现并逐渐活跃的。它并不是新出现的一种特定的技术，而是软件开发领域各种围绕模型与建模的技术的一种自然的聚集或综合，它的立场和层次，更接近于基本的软件工程。

MDE与MDA/MDD

与OMG的MDA相比，MDE具有更中性的立场和更广阔、全面的范围，MDA可以看作是MDE的一种具体和部分的实现途径。众所周知，OMG是软件产业最有影响的商业企业组成的标准化组织之一，推动MDA是2002年以来OMG的主要战略，MDA,MDD等都被OMG保留为注册商标。与更加中立的国际标准化组织以及学术性机构相比，它的背后的动机、目标、范围等，是相对狭隘的。MDA同样如此。而“模型驱动”背后隐藏和关联的原理、技术，无疑有着更广泛而深刻的背景和应用空间，也不是某种团体或企业的专利。“模型驱动工程”（MDE）这个中性的概念，是对这一广阔领域的一个较好概括。这也许是MDE这个专门词组近年渐趋活跃的某种因素之一，但我认为更主要的因素，还是应当归诸于这个领域自身的存在性，其独特价值与聚合力。
另一方面，尽管MDE更加中立和广阔，但现有的重要成果，大多都是与MDA关联的（或者是由MDA的相关研究中提出的），例如“模型驱动”这个概念在国际上的流行，就是在MDA的背景下发生的。还有MOF和元建模层次，以及对提升软件开发的抽象层次的特别强调等。可以说，近年国际IT领域出现的MDE，是在MDA的带动下发展起来的，它一方面，客观呈现为是MDA/MDD相关研究的扩大和延伸，一方面也是软件开发领域种种围绕“模型与建模”的实践、技术与理论的自然融合。

基本观念与目标

作为一个新兴的实践、技术与研究领域，MDE似乎还没有一个公认的、严格意义上的定义。它可以看作是一种软件工程范式（虽然从原理的角度，这里大部分基本理念，都可以在更广泛的背景例如“系统”概念下展开）。MDE尤其强调各种模型及其相互的转换在整个软件工程过程中的运用。MDE的基本观点是，整个软件开发（甚至包括所谓的“维护”）过程，都是某种围绕模型进行的活动：建模、模型转换、模型的“执行”或“解释”以及代码生成、基于模型的往复/逆向工程，等等。将模型放在空前重要，“至高无上”的位置上，是当前MDE最明显的标志之一。Bézivin (2004)将这一原则概括为“一切皆为模型”（everything is a model），与面向对象领域的“一切皆为对象”（everything is an object）形成对照。
需要强调，MDE并不是一个单纯的新概念或理念（比如与MDA/MDD,UML，DDD等相比），而更多地是对软件开发领域种种围绕“模型与建模”的实践与理论的概括或泛指，以一个较新的专用词组指向一个初步涌现的对知识、技术的汇聚领域（甚至迈向学科）。在这种理解下，所有软件开发方面的建模理论、技术等，都可以归纳为它的具体内容。比如领域建模与领域模型驱动开发（DDD）、领域专用模型与语言（DSM/DSL），以及许多计算机语言特别是语义方面的工作，包括本体工程等等，都可以从这种MDE的立场或视角给予解释或更好的定位。例如，从MDE的立场看，MDA与MDD，就是MDE的一种部分的、特定的实现途径。
从更广阔的软件工程立场上看，有必要回答为什么要发展模型驱动工程，或者它能够带来哪些独特的、新的好处。Atkinson与Kühne（2002）针对MDD，提出了两种不同的目标：第一种，是改进开发者的短期生产效率，即从所交付功能数量的方面提升基本软件产品的价值。第二种是改进开发者的长期生产效率，即提升软件产品的寿命（降低其过时的速率）。现有的工具与方法，多数都是针对上述第一层目标的。例如通过建模和从模型自动生成代码，改进软件的生产率。一旦这样所产生的软件需要再次改变，就涉及模型、软件（代码）的更新与同步问题，例如所谓“往返工程”难题。早期CASE的不尽人意，同样也涉及类似的原因（参考Schmidt, 2006）。第二个层次目标的提出，主要是针对“软件变更”的需求，其重点是降低软件产品对于变化的敏感度。“变化”具体可能来自开发人员变更、需求变更、开发平台变更、发布平台变更四个方面。MDE概念活跃的倡导者之一Johan Haan认为以上两个方面就是MDE的主要目标。

其它相关发展

以UML为代表的软件工程领域模型与建模方面的发展，也被借鉴到或启发了传统的系统工程（SE）领域。近年来基于模型的系统工程（MBSE）得到长足的发展，其基本思想和方法，与MDE有许多共同之处。作为一种系统工程方法，MBSE通过创造和利用模型作为工程师的基本交流手段，代替基于文档的信息交流。基于模型的思想还有另一个基本的应用方向，就是模型驱动应用（MDApps）。与MDE/MDA/MDD着眼于开发过程的思路不同，MDApps将模型作为系统运行期的基本组件，使系统的功能或行为直接基于可以在运行期创建和改变的应用目标事物模型。

问题

在2011年的研讨会上，欧洲MDE领军人物Jean Bézivin指出，MDE已陷入停顿，错过了最好的发展时机，至少是暂时失败了。 虽然在产业界、学术界都曾经被基于厚望，盛极一时，但最终结果令人失望，无法得到预期的接受。这种困境很象80年代CASE遭遇的情景。