模型驅動工程（MDE, Model-Driven Engineering）是軟體工程的一個分支，它將模型與建模拓展到軟體開發的所有方面，形成一個多維建模空間，從而將工程活動建立在這些模型的映射和轉換之上。
MDE 的基本原則是將模型視為第一實體，將所有軟體產物當做模型或模型要素。



背景

在計算機應用領域，「模型驅動」（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 遭遇的情景。



參考