雙向工程

雙向工程（Round-trip engineering）簡稱RTE，是同步二個或多個相關軟體工件（例如程式碼、模型、組態檔案及文件）的软件开发工具機能。要進行雙向工程的原因是因為相同的資料會出現在多份工件上，若只更新了其中一份工件的資料，另外工件中的對應資料沒有更新，就會有各工件不一致的問題。

雙向工程和傳統的软件工程作法有緊密的關係，例如順向工程（從已有的規格產生程式碼及軟體）、逆向工程（從已有的軟體產生程式碼及規格）及代码重构（瞭解程式碼並且修改）。常有人將雙向工程錯誤的定義為同時支援順向工程及逆向工程而已。雙向工程的主要特點可以是在一個已有軟體工件有變更時，同時的同步其他對應的工件，其作法是逐步的在其他工件中加入對應原工作修改的內容。順向工程可以視為是一種已有規格的特殊雙向工程，逆向工程則是可以視為是已有軟體的特殊雙向工程。許多reengineering的工作也可以視為是雙向工程，用之前逆向工程得到的規格，其中進行修改，再修改軟體，和規格同步。

雙向工程的另一個特點是自動偵測工件中的不一致，自動更新工件。若以這個定義來看，雙向工程就和順向工程及逆向工程不同了，順向工程及逆向工程可能是人工進行的，也可能是自動的（例如分析規格，自動產生程式碼）。自動更新的過程可以是即時的，也可以是在有需求時更新。若是即時的雙向工程，在工件變更之後其他工作的對應部份也都會自動更新。若是在有需求時更新的雙向工程，工件的作者們可能是同時變更這些工件，其中某個時間比較工件，識別不一致之處，選擇要保留的內容，並且避免可能出現的衝突。

雙向工程支援迭代式的開發流程。在模型和工件同步後，可以選擇繼續修改程式，或是修改模型。可以進行任意次數、任意方向的同步。

雙向工程的例子
最常見的雙向工程例子可能是在UML（统一建模语言）模型以及其對應程式碼之間的同步。許多商用軟體以及研究用的原型工具支援這類的雙向工程，例如、、ESS-Model、及Fujaba等，Fujaba軟體的文件中有提到軟體可以識別设计模式。一般而言，針對UML的類別圖，可以支援一定程度的雙向工程，不過像是關聯（association）及組合（containment）等UML概念，在許多程式語言中沒有直接對應的表示方式，因此限制了直接建立對應程式碼的能力，也影響程式碼分析的準確度（例如，不容易識別出程式中的組合概念）。2005年在Microsoft Visual Studio上的一本書中，有指出RTE工具的常見問題，其中一個是所留下的模型會和原有的模型不同，只有透過在工具中的許多標示後，才能讓兩者同步。UML有關行為的部份對雙向工程的挑戰更大。

另一種比較可以追蹤的雙向工程是在框架应用程序接口（API）下的雙向工程，有模型描述應用程式應用API的方式，會和應用程式的程式碼同步。此應用下，API規定了所有應用程式應用此框架的方式，可以準確及完整的偵測API的使用情式，並且合成實現此用法的程式。此領域的雙向工程軟體中，有二個主要的軟體，是及。

在对象管理组织（OMG）的模型驱动架构（MDA）中，要在不同模型之間維持一致，並且在模型和程式碼中維持一致，雙向工程是其中的關鍵。对象管理组织提出了（查詢/瀏覽/轉換）標準來處理MDA中要求的模型轉換。到目前為止，只實現了標準中的部份內容。

軟體工程中的例子
以统一建模语言（UML）為基礎的雙向工程需要三個基本的軟體開發元素

 程式碼編輯器
 針對屬性及方法的UML編輯器
 UML結構的視覺化表示

以下是一個以網站為基礎的開源簡易雙向工程工具：

 JavaScript Class Creator：可以整合JavaScript物件的雙向工程。可以用圖形函式庫JointJS產生统一建模语言的圖。而Javascript原始碼的編輯可以用ACE編輯器達成。

參考資料

软件工程
逆向工程