馬曉星,劉譞哲,謝 冰,余 萍,張 天,卜 磊,李宣東
1(計(jì)算機(jī)軟件新技術(shù)國(guó)家重點(diǎn)實(shí)驗(yàn)室(南京大學(xué)),江蘇 南京 210023)
2(南京大學(xué) 計(jì)算機(jī)科學(xué)與技術(shù)系,江蘇 南京 210023)
3(北京大學(xué) 信息科學(xué)技術(shù)學(xué)院 軟件研究所,北京 100871)
4(高可信軟件技術(shù)教育部重點(diǎn)實(shí)驗(yàn)室(北京大學(xué)),北京 100871)
隨著計(jì)算機(jī)技術(shù)的飛速發(fā)展,軟件的使能空間得到了廣泛和持續(xù)的拓展,軟件系統(tǒng)的規(guī)模和復(fù)雜性也隨之不斷增大,人類正在進(jìn)入“軟件無(wú)處不在、軟件定義一切、軟件使能一切”的時(shí)代.開發(fā)和演化軟件系統(tǒng),成為人類創(chuàng)造財(cái)富、延續(xù)文明的重要需求和途徑.
軟件是人類制造的最復(fù)雜的一類制品,是人類大腦思維活動(dòng)的體現(xiàn).開發(fā)和演化軟件系統(tǒng)需要方法,軟件開發(fā)方法一般指“軟件開發(fā)過程需要遵循的辦法和步驟”[1](軟件開發(fā)方法在英文中常使用兩個(gè)不同的術(shù)語(yǔ)“Software Development Method”和“Software Development Methodology”,后者亦常翻譯為軟件開發(fā)方法學(xué).后者傳統(tǒng)上更強(qiáng)調(diào)某種特定的覆蓋整個(gè)軟件開發(fā)周期的完整過程和技術(shù)體系,近年甚至常被誤用為軟件開發(fā)過程“Software Development Process”的同義詞.本文在較寬泛的意義下討論軟件開發(fā)方法,并使用前一英譯).長(zhǎng)期以來,軟件開發(fā)方法的發(fā)展和演變歸納起來主要與3個(gè)方面相關(guān)聯(lián).
· 其一是外在因素,包括運(yùn)行環(huán)境(硬件、網(wǎng)絡(luò)、外設(shè)的發(fā)展和普及)的驅(qū)動(dòng)、應(yīng)用需求的牽引、信息領(lǐng)域技術(shù)浪潮(例如近年來涌現(xiàn)的大數(shù)據(jù)、云計(jì)算、物聯(lián)網(wǎng)、虛擬現(xiàn)實(shí)、人工智能等等)的推動(dòng);
· 其二是內(nèi)在動(dòng)力,包括效率、質(zhì)量和成本.解決軟件系統(tǒng)規(guī)模和復(fù)雜性所導(dǎo)致的問題,從而高效、高質(zhì)量、低成本地開發(fā)和演化軟件系統(tǒng),一直是學(xué)術(shù)界和工業(yè)界追求的共同目標(biāo);
· 其三是人本屬性.人是開發(fā)和演化軟件系統(tǒng)的主體,軟件開發(fā)和演化方法一方面要遵循人的認(rèn)識(shí)規(guī)律,另一方面要能夠充分激發(fā)、調(diào)動(dòng)和管理人力資源.
自 20世紀(jì) 60年代末提出軟件工程概念至今已有 50年,其間,軟件開發(fā)方法取得了長(zhǎng)足的發(fā)展,本文回顧50多年來軟件開發(fā)方法發(fā)展過程中的重要里程碑,包括基本方法(結(jié)構(gòu)化程序設(shè)計(jì)、模塊化方法)、面向?qū)ο蠓椒?、?gòu)件化方法、面向方面方法、模型驅(qū)動(dòng)的方法、服務(wù)化方法等,進(jìn)而對(duì)“軟件無(wú)處不在、軟件定義一切、軟件使能一切”時(shí)代下軟件開發(fā)方法的發(fā)展趨勢(shì)進(jìn)行展望.
究其本質(zhì),軟件乃是以計(jì)算為工具實(shí)現(xiàn)應(yīng)用目標(biāo)的解決方案.不同于一般物品,軟件是一種人工制品[2],同時(shí)也是一種純粹的邏輯制品[3].作為一種人工制品,其需以適應(yīng)其所處環(huán)境的方式完成應(yīng)用目標(biāo);作為邏輯制品,其困難不在于物理限制而在于邏輯構(gòu)造.因此,軟件開發(fā)活動(dòng)本質(zhì)上不同于傳統(tǒng)工程制造.
· 后者在于“造物”;前者可謂“擬人”——即表達(dá)人腦思維形成的問題解決方案;
· 后者可有規(guī)模效應(yīng);而對(duì)前者而言,每一個(gè)軟件系統(tǒng)都是獨(dú)一無(wú)二的創(chuàng)造.
軟件開發(fā)方法所討論的是如何高效、低成本地構(gòu)造高質(zhì)量的軟件,這也是軟件工程學(xué)科的基本科學(xué)問題.Wirth教授在回顧軟件工程發(fā)展歷史時(shí)寫到:“如果我們能從過去學(xué)到什么的話,那就是計(jì)算機(jī)科學(xué)實(shí)際上是一門方法論學(xué)科”[4].Brooks在其“沒有銀彈”的經(jīng)典演講[5]中指出:究其本質(zhì)而言,軟件開發(fā)是一項(xiàng)困難的任務(wù),而困難可區(qū)分為實(shí)質(zhì)性的(essential)和附屬性的(accidental).可以認(rèn)為,前者來自于軟件所要解決問題本身所固有的復(fù)雜性和多變性,而后者源自解決問題時(shí)所用技術(shù)手段和過程步驟方面的不妥.軟件開發(fā)方法旨在消除附屬性困難,并幫助開發(fā)者理解和駕馭問題本身的實(shí)質(zhì)性困難.
軟件開發(fā)方法給出構(gòu)造軟件所需的系統(tǒng)化的過程步驟和技術(shù)手段.這種過程和技術(shù)的背后是用于指導(dǎo)軟件開發(fā)這種創(chuàng)造性活動(dòng)的思維模式.如前所述,軟件是人腦力的替代,若把軟件比擬為人,則開發(fā)方法的思維模式可比擬為軟件系統(tǒng)的“世界觀”和“方法論”.
· 所謂世界觀是指軟件如何抽象其所處環(huán)境和應(yīng)用目標(biāo);
· 所謂方法論是指軟件本身的范型抽象,包括:結(jié)構(gòu)模型,即軟件的組成元素、組合方式等靜態(tài)構(gòu)成形式;運(yùn)行機(jī)理,即軟件各組成元素動(dòng)態(tài)運(yùn)行及其間交互的機(jī)制和原理;構(gòu)造方式,即如何通過層次化的問題分解和步驟分解來使系統(tǒng)構(gòu)造成為高效可行的任務(wù);質(zhì)量保障,即如何定義并改善所構(gòu)造軟件滿足目標(biāo)的程度.
縱觀 50年來軟件開發(fā)方法研究和實(shí)踐的發(fā)展?fàn)顩r,可以說對(duì)軟件開發(fā)和使用中各方面復(fù)雜性的應(yīng)對(duì)是其一個(gè)不變的主題.早期的結(jié)構(gòu)化程序設(shè)計(jì)和模塊化方法主要針對(duì)的是軟件程序本身的復(fù)雜性,而后的面向?qū)ο蠓椒ㄔ谄浠A(chǔ)上增強(qiáng)了應(yīng)對(duì)應(yīng)用領(lǐng)域問題復(fù)雜性的能力.進(jìn)而,面向方面的方法又增強(qiáng)了面向?qū)ο蠓椒ㄔ谔幚戆踩⑷罩镜蓉灤┬缘姆枪δ軐傩苑矫娴哪芰?此外,軟件復(fù)用與構(gòu)件化方法通過重復(fù)使用已有的軟件部件來消除重復(fù)開發(fā)的復(fù)雜性;模型驅(qū)動(dòng)的方法則力圖通過提高解決問題的抽象層次來應(yīng)對(duì)軟件系統(tǒng)日益增長(zhǎng)的復(fù)雜性;服務(wù)化的方法通過中立的訪問協(xié)議和顯式的服務(wù)契約解耦服務(wù)的提供者和使用者,應(yīng)對(duì)開放異構(gòu)的互聯(lián)網(wǎng)環(huán)境所帶來的復(fù)雜性,并簡(jiǎn)化了軟件的獲取和使用方式.這些方法的基本思想和實(shí)現(xiàn)技術(shù)成為當(dāng)前軟件開發(fā)實(shí)踐的主流依托,也是本文回顧的重點(diǎn).需要說明的是:這些方法之間并非是相互競(jìng)爭(zhēng)排斥的關(guān)系,其歷史進(jìn)程上也未必是線性發(fā)展的.本文回顧的順序組織只是為了便于理解的需要.除以上提及的軟件開發(fā)方法外,還有一系列的方法從人本屬性角度、在軟件組織與管理的層面被提出來并產(chǎn)生重要影響,比如原型方法、敏捷方法、運(yùn)維一體化方法(DevOps)等,由于在本期特刊中另有論文專門討論,本文不再贅述.
當(dāng)前,互聯(lián)網(wǎng)的不斷拓展和深化也促成了一種人機(jī)物三元融合的發(fā)展態(tài)勢(shì),軟件日益成為信息化社會(huì)的基礎(chǔ)設(shè)施,其復(fù)雜程度持續(xù)提高.本文亦將在此背景下展望軟件開發(fā)方法進(jìn)一步的發(fā)展趨勢(shì).
20世紀(jì)50年代末誕生的高級(jí)程序設(shè)計(jì)語(yǔ)言在很大程度上提高了軟件的開發(fā)效率,從而進(jìn)一步催生了對(duì)軟件系統(tǒng)的需求,軟件系統(tǒng)的規(guī)模和復(fù)雜性也隨之增大,各類軟件開發(fā)方法開始出現(xiàn)并不斷發(fā)展.軟件開發(fā)方法是指軟件開發(fā)過程需要遵循的辦法和步驟,早期人們一般性地認(rèn)為軟件開發(fā)過程主要包括問題定義、需求分析、設(shè)計(jì)、編碼、測(cè)試、維護(hù)等階段,而軟件開發(fā)方法起步于解決軟件設(shè)計(jì)階段的問題.軟件設(shè)計(jì)又分為概要設(shè)計(jì)和詳細(xì)設(shè)計(jì)兩個(gè)不同抽象階段(分別建立軟件結(jié)構(gòu)和程序過程),與之對(duì)應(yīng)的基本方法分別是模塊化設(shè)計(jì)方法和結(jié)構(gòu)化程序設(shè)計(jì).
結(jié)構(gòu)化程序設(shè)計(jì)關(guān)注軟件詳細(xì)設(shè)計(jì)階段的程序過程(代碼)描述.1968年,Dijkstra提出了程序中無(wú)條件轉(zhuǎn)移語(yǔ)句(goto)有害的觀點(diǎn)[6],從而引起了大范圍的學(xué)術(shù)討論.經(jīng)過討論,人們得到共識(shí):goto語(yǔ)句使得程序的靜態(tài)結(jié)構(gòu)與程序的動(dòng)態(tài)執(zhí)行不一致,從而使得程序難以理解和調(diào)試.在此基礎(chǔ)上,進(jìn)一步形成了結(jié)構(gòu)化程序設(shè)計(jì)的主要思想.
結(jié)構(gòu)化程序設(shè)計(jì)的主要思想是:使用(僅使用)順序、選擇和重復(fù)這3種結(jié)構(gòu)表示程序過程.由于這3種結(jié)構(gòu)具有單入口和單出口特性,因而能夠降低程序的復(fù)雜性,易于程序理解和維護(hù),提高了可靠性.
模塊化方法關(guān)注軟件概要設(shè)計(jì)階段的軟件體系結(jié)構(gòu)表示.面對(duì)大規(guī)模的復(fù)雜問題,人們通常的解決辦法是分而治之,把大問題看成是若干小問題的集合、把復(fù)雜問題看成是若干簡(jiǎn)單問題的集合.軟件開發(fā)也是如此,與之對(duì)應(yīng)的是模塊化方法.
軟件概要設(shè)計(jì)就是要把軟件系統(tǒng)的需求(功能)對(duì)應(yīng)到軟件系統(tǒng)的各個(gè)組成部分,這些組成部分稱為模塊.模塊化是指把軟件系統(tǒng)劃分成獨(dú)立命名和可獨(dú)立訪問的模塊,每個(gè)模塊完成一個(gè)子功能,它們集成到一起滿足軟件的整體功能需求.實(shí)現(xiàn)模塊化的手段是抽象和信息隱蔽:抽象是指抽出事物的本質(zhì)特性而暫時(shí)不考慮它們的細(xì)節(jié);信息隱蔽意指應(yīng)該這樣設(shè)計(jì)和確定模塊,使得一個(gè)模塊內(nèi)包含的信息(過程和數(shù)據(jù))對(duì)于不需要這些信息的模塊來說是不可訪問的.模塊化方法強(qiáng)調(diào)模塊獨(dú)立性,模塊獨(dú)立是指開發(fā)具有獨(dú)立功能并且與其他模塊之間沒有過多相互作用的模塊;模塊獨(dú)立的意義在于功能分割、簡(jiǎn)化接口、易于測(cè)試和維護(hù)、易于多人合作開發(fā)同一系統(tǒng).
復(fù)雜性是軟件開發(fā)過程中所固有的特質(zhì)[7],而軟件開發(fā)方法的核心在于幫助開發(fā)者駕馭這種復(fù)雜性.結(jié)構(gòu)化程序設(shè)計(jì)和早期的模塊化方法圍繞功能構(gòu)造系統(tǒng),其本質(zhì)是功能分解、過程抽象、自頂向下、逐步求精.這種方法有助于幫助開發(fā)者駕馭軟件設(shè)計(jì)和實(shí)現(xiàn)的復(fù)雜性,但在應(yīng)對(duì)應(yīng)用需求的復(fù)雜性方面考慮不多.隨著軟件應(yīng)用范圍的拓展和復(fù)雜程度的提高,以及軟件需求變化導(dǎo)致的軟件演化日益頻繁,面向?qū)ο蟮能浖_發(fā)方法逐漸成為主流.
面向?qū)ο蟮能浖到y(tǒng)通過一組對(duì)象的交互來完成系統(tǒng)的功能.對(duì)象是數(shù)據(jù)及其所允許操作的封裝體,是應(yīng)用領(lǐng)域現(xiàn)實(shí)實(shí)體的軟件抽象.面向?qū)ο蟮能浖?gòu)造乃是基于系統(tǒng)所操作之對(duì)象類型,而非系統(tǒng)需實(shí)現(xiàn)之功能,來架構(gòu)系統(tǒng)的途徑[8].面向?qū)ο蠓椒ǖ膶?shí)施步驟包含了面向?qū)ο蠓治?、面向?qū)ο笤O(shè)計(jì)和面向?qū)ο髮?shí)現(xiàn)等.
· 面向?qū)ο蠓治鲋饕ㄗR(shí)別應(yīng)用領(lǐng)域應(yīng)被抽象的對(duì)象,并分類組織這些對(duì)象,形成對(duì)象概念模型;刻畫這些對(duì)象的內(nèi)部行為和外部交互,以及系統(tǒng)功能目標(biāo)何以因之達(dá)成,形成用例模型;
· 面向?qū)ο蟮脑O(shè)計(jì)要在系統(tǒng)各種實(shí)施條件的約束下,給出上述概念模型和用例模型的實(shí)現(xiàn)方案,包括確定對(duì)象模型的操作、設(shè)計(jì)實(shí)現(xiàn)操作的算法、優(yōu)化數(shù)據(jù)的訪問、調(diào)整類結(jié)構(gòu)以提高繼承性等,形成面向?qū)崿F(xiàn)的類模型、對(duì)象交互模型、對(duì)象狀態(tài)模型和存儲(chǔ)模型等;
· 面向?qū)ο髮?shí)現(xiàn)通常使用面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言和對(duì)象持久化設(shè)施等將上述設(shè)計(jì)具體地加以實(shí)現(xiàn).
在應(yīng)對(duì)需求復(fù)雜性方面,面向?qū)ο蟮能浖_發(fā)方法通過建立與現(xiàn)實(shí)世界中的實(shí)體、概念、關(guān)系和結(jié)構(gòu)直接對(duì)應(yīng)的軟件抽象來刻畫需求,并支持該軟件抽象在需求、設(shè)計(jì)、實(shí)現(xiàn)之間的無(wú)縫過渡,有助于彌合問題空間與解空間之間的語(yǔ)義鴻溝.在應(yīng)對(duì)需求變化方面,結(jié)構(gòu)化方法下功能的變化將導(dǎo)致如此設(shè)計(jì)的系統(tǒng)結(jié)構(gòu)發(fā)生較大的變化.而應(yīng)用領(lǐng)域的概念和結(jié)構(gòu)遠(yuǎn)比應(yīng)用功能更穩(wěn)定.因此,較之結(jié)構(gòu)化方法,面向?qū)ο蠓椒ㄩ_發(fā)的軟件具有更好的結(jié)構(gòu)穩(wěn)定性、可修改性和可復(fù)用性.
面向?qū)ο蠓椒ǖ暮诵臋C(jī)制包括封裝、繼承和多態(tài).
· 數(shù)據(jù)抽象提供了面向?qū)ο笥?jì)算的起點(diǎn),即定義數(shù)據(jù)類型和施加于該類型對(duì)象上的操作,并限定了對(duì)象的值只能通過使用這些操作才能修改和觀察,從而自然地形成模塊封裝和信息隱藏.面向?qū)ο笸ㄟ^類比發(fā)現(xiàn)對(duì)象間的相似性,即對(duì)象間的共同屬性,是構(gòu)成對(duì)象類的依據(jù);
· 繼承是類與類之間的一種層次關(guān)系,是實(shí)現(xiàn)利用可復(fù)用軟件構(gòu)件構(gòu)成系統(tǒng)的有效語(yǔ)言機(jī)制.相比過程復(fù)用,面向?qū)ο笫菍?duì)數(shù)據(jù)及其上操作的整體復(fù)用,而非僅復(fù)用操作功能.對(duì)象間的相互聯(lián)系是通過傳遞“消息”來完成的.通過對(duì)象之間的消息通信驅(qū)動(dòng)對(duì)象執(zhí)行一系列的操作,從而完成某一任務(wù);
· 多態(tài)性是指相同的操作或函數(shù)、過程可作用于多種類型的對(duì)象上并獲得不同的結(jié)果.不同的對(duì)象收到同一消息可以產(chǎn)生不同的結(jié)果.多態(tài)性增強(qiáng)了軟件的靈活性和可復(fù)用性.綜上,面向?qū)ο蟮脑O(shè)計(jì)可以進(jìn)一步總結(jié)為把軟件系統(tǒng)構(gòu)作成類(或謂抽象數(shù)據(jù)類型實(shí)現(xiàn))的結(jié)構(gòu)化集合[9].
為了使開發(fā)的軟件具有能夠快速適應(yīng)變化的敏捷性,必須遵循面向?qū)ο蟮脑O(shè)計(jì)原則[10].其中,
· 開放封閉原則是面向?qū)ο笤O(shè)計(jì)的核心,即:對(duì)擴(kuò)展開放,對(duì)修改封閉[8].Liskov提出的替換法則指出,子類應(yīng)該可以在任何地方替換它的父類[11];
· 依賴倒置原則要求面向?qū)ο蟮脑O(shè)計(jì)要對(duì)結(jié)構(gòu)化的方法進(jìn)行倒置,即高層模塊不應(yīng)依賴低層模塊,兩者都應(yīng)依賴于抽象.依賴關(guān)系的倒置正是好的面向?qū)ο笤O(shè)計(jì)的標(biāo)志所在;
· 單一職責(zé)原則要求類的職責(zé)單一,引起類變化的原因單一,這是實(shí)現(xiàn)軟件靈活性的前提;
· 接口隔離原則強(qiáng)調(diào)接口的高內(nèi)聚和低耦合;
· 迪米特原則要求控制對(duì)象之間的信息流量、流向及信息的影響,即注意信息的隱藏;
· 組合/聚合復(fù)用原則指出:相比于使用繼承來實(shí)現(xiàn)復(fù)用,更應(yīng)優(yōu)先使用組合/聚合的復(fù)用方式.通過對(duì)象的組合/聚合,可以在運(yùn)行時(shí)動(dòng)態(tài)地配置新對(duì)象的功能,并防止類層次規(guī)模的爆炸性增長(zhǎng).
盡管MIT的一些學(xué)者早在20世紀(jì)60年代初就開始使用對(duì)象這一概念,公認(rèn)的面向?qū)ο蟮乃枷胝厥加贒ahl和Nygaard設(shè)計(jì)的Simula 67語(yǔ)言[12],該語(yǔ)言已完整提出了對(duì)象、類、繼承、多態(tài)等面向?qū)ο蟪绦蛟O(shè)計(jì)的核心概念.并不令人意外,Simula語(yǔ)言原本用于計(jì)算機(jī)模擬離散事件系統(tǒng),其基本理念被廣泛用于通用的程序設(shè)計(jì)和軟件開發(fā)仍有賴于此后二三十年間的軟件思想、方法和技術(shù)進(jìn)展的推動(dòng).20世紀(jì)70年代,Parnas提出了模塊化與信息隱蔽的基本思想[13];Hoare和Liskov等人引領(lǐng)了數(shù)據(jù)抽象和抽象數(shù)據(jù)類型的研究[14,15];Chen發(fā)表了著名的實(shí)體關(guān)系模型的論文[16],推動(dòng)了對(duì)應(yīng)用領(lǐng)域現(xiàn)實(shí)世界的概念建模;Kay領(lǐng)導(dǎo)開發(fā)的Smalltalk-80[17]推動(dòng)了面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言的發(fā)展和廣泛應(yīng)用.
隨著面向?qū)ο蟪绦蛟O(shè)計(jì)的日益普及,20世紀(jì)80年代末和90年代初涌現(xiàn)了一批面向?qū)ο蟮能浖治龊驮O(shè)計(jì)方法,其中包括:Booch于1990年提出的Booch方法[7];1989年,Coad和Yourdon提出的Coad方法[18,19];1991年,由Rumbaugh等5人提出的OMT方法[20];Jacobson于1992年提出的OOSE方法[21]等.此后,統(tǒng)一建模語(yǔ)言(UML)不僅統(tǒng)一了Booch、Rumbaugh和Jacobson的表示方法,而且對(duì)其作了進(jìn)一步的發(fā)展,并最終統(tǒng)一為大眾所接受的標(biāo)準(zhǔn)建模語(yǔ)言.UML不僅支持面向?qū)ο蟮姆治雠c設(shè)計(jì),還支持從業(yè)務(wù)建模、需求獲取、分析、設(shè)計(jì)、實(shí)現(xiàn)、測(cè)試到部署的不斷迭代軟件開發(fā)活動(dòng),在此基礎(chǔ)上,形成了所謂統(tǒng)一的軟件開發(fā)過程[22].
在面向?qū)ο笤O(shè)計(jì)技術(shù)發(fā)展方面,對(duì)微觀對(duì)象式設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)和升華形成了設(shè)計(jì)模式,而對(duì)宏觀系統(tǒng)架構(gòu)的關(guān)注催生了對(duì)軟件體系結(jié)構(gòu)研究.1994年,Gamma、Helm、Johnson和 Vlissides的著作《Design Patterns:Elements of Reusable Object-Oriented Software》共總結(jié)了三大類型(創(chuàng)建型、結(jié)構(gòu)型和行為型)共計(jì)23種設(shè)計(jì)模式[23].設(shè)計(jì)模式代表了面向?qū)ο笤O(shè)計(jì)和實(shí)現(xiàn)的最佳實(shí)踐,正確應(yīng)用設(shè)計(jì)模式可以使得系統(tǒng)實(shí)現(xiàn)更易復(fù)用、更易理解、更易維護(hù),并且更加可靠.軟件體系結(jié)構(gòu)從比類更大的粒度、更高的抽象層次上刻畫系統(tǒng)的構(gòu)件組成、構(gòu)件之間的關(guān)聯(lián)結(jié)構(gòu)及其交互行為,并給出這種宏觀設(shè)計(jì)的動(dòng)機(jī),即其在功能、非功能目標(biāo)以及各種制約因素之間的權(quán)衡取舍[24].
在面向?qū)ο笮枨蠓治龇矫?隨著軟件應(yīng)用的日益深入,軟件本身亦應(yīng)被考慮為現(xiàn)實(shí)世界的重要組成部分.因而,僅通過模擬現(xiàn)實(shí)世界實(shí)體的結(jié)構(gòu)和行為不足以指導(dǎo)軟件的構(gòu)造.為此,必須考慮包括軟件本身在內(nèi)的整個(gè)系統(tǒng)如何共同滿足組織機(jī)構(gòu)的應(yīng)用目標(biāo).這些應(yīng)用目標(biāo)不限于通常的面向?qū)ο蠓治鏊瞄L(zhǎng)的功能性需求,也包含用戶體驗(yàn)、經(jīng)濟(jì)性、安全性、適應(yīng)性等非功能需求.在這方面,目標(biāo)導(dǎo)向的需求工程給出了面向?qū)ο蠓治龅难a(bǔ)充[25].目標(biāo)導(dǎo)向的需求工程考慮應(yīng)用目標(biāo)的層次分解,分析不同目標(biāo)選擇,管理目標(biāo)之間協(xié)同和沖突關(guān)系,最終將應(yīng)用目標(biāo)落實(shí)到面向?qū)ο蠓治隹蓱?yīng)對(duì)的具體需求上.
隨著軟件系統(tǒng)規(guī)模的擴(kuò)大,其復(fù)雜性也急速增長(zhǎng)且難以控制.以日志、安全等為典型代表的非功能性屬性在常規(guī)的面向?qū)ο箝_發(fā)當(dāng)中分布于業(yè)務(wù)邏輯的各個(gè)角落,難以有效統(tǒng)一處理,給軟件的理解與維護(hù)帶來較大障礙.面向方面方法作為面向?qū)ο蠓椒ǖ囊粋€(gè)有效補(bǔ)充,將相關(guān)屬性統(tǒng)一為橫切關(guān)注點(diǎn)進(jìn)行理解與整理,并將其抽象為“方面”這一概念,從而可以一體化設(shè)計(jì)與實(shí)現(xiàn),大幅度增加了代碼的可理解性與可維護(hù)能力.
隨著軟件系統(tǒng)規(guī)模的快速擴(kuò)大,軟件開發(fā)過程中,程序開發(fā)人員頻繁遇到特定屬性散布于多個(gè)功能模塊,導(dǎo)致難以統(tǒng)一維護(hù)、更新與管理的情況.以系統(tǒng)級(jí)關(guān)注點(diǎn)為例,如日志記錄、安全檢測(cè)等,它們與系統(tǒng)基本任務(wù)屬性之間是橫切的關(guān)系,分布在各個(gè)功能模塊之中.
傳統(tǒng)的面向?qū)ο蟪绦蛟O(shè)計(jì)(object-oriented programming,簡(jiǎn)稱 OOP)方法主要著眼于系統(tǒng)核心業(yè)務(wù)需求,將數(shù)據(jù)和對(duì)應(yīng)操作緊密地連結(jié)并封閉在一起.因此,使用面向?qū)ο蠓椒▽?shí)現(xiàn)上文所述的日志記錄、安全檢測(cè)等任務(wù),自然就會(huì)將其與相關(guān)對(duì)象封裝在各自的類中,從而導(dǎo)致處理這些關(guān)注點(diǎn)的代碼在程序中多次重復(fù)出現(xiàn).可以想象,這些關(guān)注點(diǎn)的代碼實(shí)現(xiàn)其實(shí)是高度類似甚或一致的.同樣的代碼在整個(gè)系統(tǒng)中散落且頻繁出現(xiàn),會(huì)很容易降低程序的可理解性,而在面對(duì)后期潛在的需求變更時(shí),其維護(hù)性也會(huì)受到很大影響,進(jìn)而影響系統(tǒng)的質(zhì)量.這也就是所謂的代碼分散(code scattering)現(xiàn)象[26].相對(duì)應(yīng)地,另一個(gè)廣為人知的問題則是代碼纏結(jié)(code tangling)[26],即同一個(gè)模塊的代碼中要同時(shí)處理安全、功能、性能等各類關(guān)注點(diǎn).可想而知,這樣的代碼,其可讀性和可維護(hù)性也自然會(huì)存在較大問題.
上述問題由來以久,Dijkstra就曾在《A Discipline of Programming》一書中提到“關(guān)注點(diǎn)分離(separation of concern)”的概念,即每次處理某一個(gè)特定的關(guān)注點(diǎn)相關(guān)部分.而隨著系統(tǒng)規(guī)模的快速擴(kuò)大,代碼分散與代碼纏結(jié)等問題使得“關(guān)注點(diǎn)分離”更加必要且迫切.針對(duì)這一問題,Kiczales等人在 1997年歐洲面向?qū)ο缶幊檀髸?huì)(ECOOP’97)上提出了面向方面的程序設(shè)計(jì)(aspect oriented programming,簡(jiǎn)稱AOP)[27,28]這一思想.相比于OOP,AOP把系統(tǒng)關(guān)注點(diǎn)分為核心關(guān)注點(diǎn)與橫切關(guān)注點(diǎn)(crosscutting concern)兩類:核心關(guān)注點(diǎn)即業(yè)務(wù)處理中主要商業(yè)邏輯與流程;而橫切關(guān)注點(diǎn)則是分布在各核心關(guān)注點(diǎn)內(nèi)的共享關(guān)注點(diǎn),如上文所提到的日志、安全等.
AOP將上文中這些影響了多個(gè)類的橫切關(guān)注點(diǎn)封裝到一個(gè)可重用模塊,命名為“Aspect”,即方面.在此基礎(chǔ)上,進(jìn)一步提供了類和方面的自動(dòng)編織(weave)機(jī)制,將橫切關(guān)注點(diǎn)對(duì)應(yīng)的方面編織到特點(diǎn)的連接點(diǎn)(join point)位置,實(shí)現(xiàn)代碼整合.通過對(duì)這些“方面”的封裝以及方面與類的自動(dòng)編織來減少系統(tǒng)的重復(fù)代碼,降低模塊間的耦合度,并有利于未來的可操作性和可維護(hù)性.
顯然,AOP是在OOP的基礎(chǔ)上針對(duì)“關(guān)注點(diǎn)分離”這一目標(biāo)的一個(gè)有力補(bǔ)充.在OOP處理核心關(guān)注點(diǎn)及其業(yè)務(wù)邏輯的基礎(chǔ)上,AOP以一種模塊化的方式來理解、封裝與處理橫切關(guān)注點(diǎn)相關(guān)“方面”.然后,在運(yùn)行或編譯時(shí)應(yīng)用這些方面,從而實(shí)現(xiàn)與原核心業(yè)務(wù)邏輯的結(jié)合.這一機(jī)制使橫切關(guān)注點(diǎn)的實(shí)現(xiàn)更加模塊化,降低了代碼的理解和維護(hù)難度,并提高了系統(tǒng)適應(yīng)不斷變化的需求的能力.
長(zhǎng)期以來,AOP思想一直受到了學(xué)術(shù)界和工業(yè)界的共同關(guān)注,其思想已被引入了需求分析、代碼實(shí)現(xiàn)、測(cè)試維護(hù)等各個(gè)階段,并衍生出面向方面軟件開發(fā)(aspect-oriented software development,簡(jiǎn)稱AOSD)、面向方面需求工程(aspect-oriented requirement engineering,簡(jiǎn)稱 AORE)等多個(gè)方向及子研究領(lǐng)域.同時(shí)也出現(xiàn)了以AspectJ[28]、AspectC[29]及 AspectC++[30]等為代表的面向方面程序設(shè)計(jì)語(yǔ)言.其中,AspectJ是目前使用得最為廣泛的AOP語(yǔ)言,其是對(duì)Java程序設(shè)計(jì)語(yǔ)言面向方面的擴(kuò)展,經(jīng)編譯后生成的類文件可以直接在Java虛擬機(jī)上執(zhí)行,因此,其也得到了相關(guān)領(lǐng)域的廣泛應(yīng)用與實(shí)踐.在軟件開發(fā)的各個(gè)階段,如需求分析、建模、測(cè)試與驗(yàn)證、重構(gòu)與應(yīng)用等方面,AOP的相關(guān)思想和技術(shù)也得到不斷的發(fā)展.
· 面向方面需求分析
需求分析是軟件開發(fā)的首要步驟,只有在得到正確需求的情況下才可以進(jìn)行后續(xù)開發(fā).AOP的主要出發(fā)點(diǎn)即橫切關(guān)注點(diǎn)提取,因此,如何提取與表達(dá)橫切關(guān)注點(diǎn)是 AOP相關(guān)領(lǐng)域的重點(diǎn)關(guān)注問題.在橫切關(guān)注點(diǎn)提取方面,如何對(duì)需求文檔進(jìn)行分析并自動(dòng)提取是一個(gè)熱點(diǎn)方向.EA-Mine[31]是一個(gè)采用自然語(yǔ)言技術(shù)尋找橫切點(diǎn)的代表性工具.類似地,文獻(xiàn)[32]采用詞匯鏈分析技術(shù)來識(shí)別文本需求中的 Aspect.而在表達(dá)橫切關(guān)注點(diǎn)方面,則存在基于狀態(tài)機(jī)的表達(dá)[33,34]、基于用例圖擴(kuò)充[35]等多種方法來具體描述相關(guān)橫切需求.這部分內(nèi)容將在下面的面向方面建模中進(jìn)一步展開討論.
· 面向方面建模
以 UML為代表的建模工具主要關(guān)注的是系統(tǒng)的核心業(yè)務(wù)邏輯,對(duì)于橫切關(guān)注點(diǎn)缺乏必要的支撐.因此,如何對(duì)UML進(jìn)行擴(kuò)展[36]以支持橫切關(guān)注點(diǎn)建模,是相關(guān)領(lǐng)域的研究熱點(diǎn)所在.相關(guān)擴(kuò)展可分為輕量級(jí)、重量級(jí)兩類:所謂輕量級(jí)即利用UML所提供的Stereotype、Tagged Value、Constraint等擴(kuò)展機(jī)制進(jìn)行模型擴(kuò)展,如文獻(xiàn)[37,38]等,其優(yōu)點(diǎn)在于可直接利用 UML建模工具進(jìn)行建模;而重量級(jí)擴(kuò)展則主要在元模型層面進(jìn)行直接擴(kuò)展,給出Aspect建模的新型建模元素[39].這種方法所建立的模型更加直觀,但卻需要對(duì)應(yīng)的工具支撐.相關(guān)方向存在大量工作分布在狀態(tài)機(jī)圖、用例圖、順序圖、交互概觀圖乃至活動(dòng)圖以及 Petri網(wǎng)等多種建模語(yǔ)言上.受篇幅所限,此處不再贅述.感興趣的讀者可以閱讀Wimmer等人的綜述[40],對(duì)其發(fā)展進(jìn)行詳細(xì)的了解.
· 面向方面測(cè)試與驗(yàn)證
系統(tǒng)正確性測(cè)試與驗(yàn)證是保障系統(tǒng)質(zhì)量的重要手段.面向方向方法也給相關(guān)問題帶來了新的挑戰(zhàn),如橫切關(guān)注點(diǎn)實(shí)現(xiàn)的正確性、一致性等.當(dāng)然,直接把經(jīng)過編織后的代碼當(dāng)作常規(guī)代碼進(jìn)行測(cè)試[41]是一種可行手段.除此之外,也仍有大量工作從AOP的問題特性出發(fā)去研制對(duì)應(yīng)的測(cè)試方法,包括面向方面的單元測(cè)試[42]、集成測(cè)試[43]、回歸測(cè)試[44,45]等,并研發(fā)了相關(guān)工具,如 Wrasp[41]、Raspect[46]、EAT[47]、Rambutans[48]等.在驗(yàn)證方向上,也有系列工作采用模型檢驗(yàn)技術(shù)驗(yàn)證集成后模型與需求的一致性[49],以及驗(yàn)證編織后系統(tǒng)中是否含有死鎖等不希望行為等[50].
· 面向方面的重構(gòu)與應(yīng)用
除了上述幾個(gè)方向之外,將面向方面的思想利用到系統(tǒng)重構(gòu)領(lǐng)域,特別是針對(duì)Aspect來基于橫切關(guān)注點(diǎn)進(jìn)行重構(gòu),是相關(guān)領(lǐng)域的熱點(diǎn)所在[51].其中的主要問題自然就關(guān)注在兩個(gè)層面:如何發(fā)現(xiàn)與識(shí)別橫切關(guān)注點(diǎn)、如何基于相關(guān)橫切點(diǎn)進(jìn)行重構(gòu)等[52-54].
在上述系列開發(fā)工作的基礎(chǔ)上,AOP思想也在各類領(lǐng)域得到了大量的實(shí)際應(yīng)用,如安全[55,56]、數(shù)據(jù)存儲(chǔ)[57,58]、云計(jì)算[59]、競(jìng)爭(zhēng)檢測(cè)[60]等.國(guó)內(nèi)相關(guān)研究者也在操作系統(tǒng)[61]、構(gòu)件化開發(fā)[62]、軌道計(jì)算[63]等領(lǐng)域上展開了面向方面思想的應(yīng)用與嘗試.受篇幅所限,以上工作僅為相關(guān)應(yīng)用的一小部分,近幾年仍然可以持續(xù)看到AOP思想在各類領(lǐng)域的新型應(yīng)用持續(xù)出現(xiàn).感興趣的讀者可對(duì)相關(guān)問題進(jìn)一步加以關(guān)注.
復(fù)用是提高效率的基本途徑,軟件復(fù)用是指重復(fù)使用已有軟件的構(gòu)件.長(zhǎng)期以來,復(fù)用一直是軟件技術(shù)和產(chǎn)業(yè)發(fā)展的重要關(guān)注點(diǎn),軟件復(fù)用不僅能夠提高開發(fā)效率,而且由于使用的越多就越容易發(fā)現(xiàn)錯(cuò)誤,所以能夠保障質(zhì)量.一般而言,重復(fù)使用最為核心的構(gòu)件是軟件代碼.程序語(yǔ)言大都提供了使用外部構(gòu)件的能力,匯編語(yǔ)言的子程序(subroutine)、結(jié)構(gòu)化程序設(shè)計(jì)中的函數(shù)模塊(function)以及面向?qū)ο蟪绦蛑械念?class),都是可以復(fù)用的基本構(gòu)件.1968年,Mcllroy在NATO軟件工程會(huì)議上發(fā)表的論文“大量生產(chǎn)的軟件構(gòu)件”提出了大規(guī)模復(fù)用的考慮[64].早期具有代表性的工作是美國(guó)自然科學(xué)基金會(huì)組織構(gòu)建的數(shù)學(xué)函數(shù)庫(kù),在20世紀(jì)80年代中期,基本上完成了所有可能的數(shù)學(xué)函數(shù)的子程序,使得在程序中應(yīng)用各種類數(shù)學(xué)函數(shù)都可以直接復(fù)用.從 20世紀(jì) 90年代中期開始,伴隨著面向?qū)ο蠹夹g(shù)開發(fā)技術(shù)的成熟,類(class)因其直接對(duì)應(yīng)客觀世界的實(shí)體特性,更易于成為復(fù)用的組織單元,而類間結(jié)構(gòu)和聯(lián)系也體現(xiàn)出了客觀實(shí)體的關(guān)聯(lián)關(guān)系.可以說,面向?qū)ο蠓治鲈O(shè)計(jì)方法的成熟,使得軟件復(fù)用可以在更全面的范圍內(nèi)得以實(shí)施.
軟件復(fù)用被視為解決軟件危機(jī)、提高軟件生產(chǎn)效率和軟件質(zhì)量的現(xiàn)實(shí)可行的途徑[65,66].一般而言,軟件開發(fā)中都會(huì)考慮復(fù)用以前的工作基礎(chǔ),例如復(fù)用部分程序代碼、使用相同領(lǐng)域有過開發(fā)經(jīng)驗(yàn)的人員等等.系統(tǒng)化的軟件復(fù)用則特指將軟件復(fù)用全過程、全技術(shù)緊密結(jié)合的開發(fā)過程,使軟件復(fù)用從早期的關(guān)注代碼復(fù)用逐步發(fā)展到基于復(fù)用的軟件開發(fā)全過程,可以包括3個(gè)主要階段.
1)有目的地開發(fā)為復(fù)用而做的軟件(development for reuse);
2)管理已有的可復(fù)用軟件(management for reuse);
3)復(fù)用已有的軟件開發(fā)新軟件(development by reuse).
這時(shí)的軟件復(fù)用體現(xiàn)了其核心思想,即:軟件系統(tǒng)的開發(fā)以現(xiàn)有的工作為基礎(chǔ),充分利用以往軟件系統(tǒng)開發(fā)過程中積累的知識(shí)和經(jīng)驗(yàn)進(jìn)行新的軟件系統(tǒng)的開發(fā).
基于構(gòu)件的軟件開發(fā)(component based software development)便是一種典型的軟件復(fù)用形式.基于構(gòu)件的軟件開發(fā)將軟件的生產(chǎn)模式從傳統(tǒng)的軟件編碼工作轉(zhuǎn)換為以軟件構(gòu)件為基礎(chǔ)的系統(tǒng)集成和組裝.軟件構(gòu)件充當(dāng)基本復(fù)用對(duì)象的角色,軟件構(gòu)件技術(shù)是軟件復(fù)用技術(shù)的核心和基礎(chǔ).構(gòu)件是指軟件系統(tǒng)中具有相對(duì)獨(dú)立功能、可以明確辨識(shí)、接口由契約指定、與語(yǔ)境有明顯依賴關(guān)系、可獨(dú)立部署且多由第三方提供的可組裝軟件實(shí)體[67].構(gòu)件模型是構(gòu)件本質(zhì)特征及構(gòu)件間關(guān)系的抽象描述.構(gòu)件模型中,實(shí)際包括軟件體系結(jié)構(gòu)(software architecture)和構(gòu)件(component)兩部分的定義.
在基于構(gòu)件的軟件復(fù)用中,著重研究了3方面的技術(shù).
· 一是如何識(shí)別可以復(fù)用的成分:針對(duì)特定領(lǐng)域來分析領(lǐng)域的共性需求及其實(shí)現(xiàn),而非僅針對(duì)單獨(dú)的項(xiàng)目需求進(jìn)行開發(fā),有利于開發(fā)出有復(fù)用價(jià)值的構(gòu)件.這部分形成了領(lǐng)域工程研究方向;
· 二是如何組織管理可復(fù)用的軟件:對(duì)軟件構(gòu)件進(jìn)行描述、分類、存儲(chǔ),提供簡(jiǎn)單且準(zhǔn)確的檢索機(jī)制.這部分形成了軟件構(gòu)件庫(kù)研究方向;
· 三是如何組裝已有構(gòu)件形成新的系統(tǒng):設(shè)計(jì)適當(dāng)?shù)臉?gòu)件模型,將軟件代碼封裝成為可以單獨(dú)使用的成分,基于構(gòu)件模型的接口進(jìn)行集成組裝.這部分形成了應(yīng)用工程研究方向.
代表性的基于構(gòu)件軟件復(fù)用方法是卡內(nèi)基?梅隆大學(xué)(CMU)提出的軟件產(chǎn)品線方法(software product line Conf.,簡(jiǎn)稱 SPLC)和歐洲提出的產(chǎn)品家族工程(product family engineering).一個(gè)產(chǎn)品線是共享一組共同設(shè)計(jì)及標(biāo)準(zhǔn)的產(chǎn)品族,從市場(chǎng)角度來看,是在某市場(chǎng)片斷中的一組相似的產(chǎn)品.產(chǎn)品線基于保證最大限度復(fù)用的產(chǎn)品族可復(fù)用構(gòu)件而建立.產(chǎn)品線方法可以通過各種可復(fù)用軟件構(gòu)件,如需求、需求規(guī)約、構(gòu)架、代碼構(gòu)件、文檔、測(cè)試策略和計(jì)劃、測(cè)試案例和數(shù)據(jù)、開發(fā)人員的知識(shí)和技能、過程、方法及工具等,支持系統(tǒng)化的軟件復(fù)用.北京大學(xué)楊芙清教授提出的軟件工業(yè)化生產(chǎn)模式及其對(duì)應(yīng)的青鳥軟件生產(chǎn)線系統(tǒng)則提出了完整的支持復(fù)用全過程的開發(fā)平臺(tái)以及基于構(gòu)件/構(gòu)架的軟件復(fù)用開發(fā)方法.
從1990年代中期開始,軟件工程界出現(xiàn)了軟件復(fù)用的研究和實(shí)踐熱潮.這一時(shí)期出現(xiàn)了兩個(gè)專業(yè)的軟件復(fù)用學(xué)術(shù)會(huì)議:Int’l Conf.on Software Reuse(ICSR)和 The Software Product Line Conf.(SPLC).在產(chǎn)業(yè)界,基于復(fù)用、基于構(gòu)件以及產(chǎn)品線工程的實(shí)踐成為主要軟件企業(yè)的技術(shù)提升途徑.
軟件復(fù)用的基本單元從程序代碼開始,發(fā)展到了面向?qū)ο蟮念愐约胺庋b的構(gòu)件,包括運(yùn)行態(tài)的構(gòu)件(如CORBA、EJB、DCOM 等分布式運(yùn)行構(gòu)件)一直在向大粒度方向進(jìn)化,為的是復(fù)用的粒度大,效益更為明顯.21世紀(jì)開始的Web服務(wù)(Web service)及其面向服務(wù)的架構(gòu)分析設(shè)計(jì)技術(shù)(service-oriented architecture,簡(jiǎn)稱SOA)提供了互聯(lián)網(wǎng)上可訪問的服務(wù)實(shí)體,這使得軟件復(fù)用的研究和應(yīng)用領(lǐng)域擴(kuò)展到了互聯(lián)網(wǎng)的軟件實(shí)體中.針對(duì)Web服務(wù)的選擇、服務(wù)質(zhì)量(QoS)預(yù)測(cè)和服務(wù)組裝的研究,成為軟件復(fù)用領(lǐng)域的技術(shù)和應(yīng)用新擴(kuò)展.
開源軟件的發(fā)展,則為軟件復(fù)用提供了更加廣闊的空間.軟件復(fù)用的關(guān)鍵因素在于要有大量可以復(fù)用的軟件資源.開源軟件的海量資源,成就了軟件復(fù)用新的發(fā)展空間:一方面,信息檢索技術(shù)的發(fā)展為查詢合適的可復(fù)用軟件提供了一種可行的機(jī)制;另一方面,程序語(yǔ)言及開發(fā)環(huán)境中支持復(fù)用的機(jī)制有所發(fā)展,如Python語(yǔ)言等能夠更為容易地嵌入已有構(gòu)件.開源軟件的發(fā)展不僅僅是代碼庫(kù)的積累和開放,大量涉及開發(fā)技術(shù)細(xì)節(jié)的文獻(xiàn)、信息也被開放在互聯(lián)網(wǎng)上,更大程度地帶來了開發(fā)社區(qū)和生態(tài)的新環(huán)境.在開發(fā)社區(qū)中,開發(fā)的需求討論、缺陷修改的方案等都被郵件信息、缺陷報(bào)告工具、版本管理工具等記錄.在開發(fā)生態(tài)系統(tǒng)中,Stackoverflow這樣的技術(shù)問答網(wǎng)站直接為用戶回答技術(shù)細(xì)節(jié)問題.這些技術(shù)文獻(xiàn)的搜集、組織和應(yīng)用,形成了當(dāng)前的軟件復(fù)用的主要可復(fù)用資源池.
開源軟件的開放源代碼是復(fù)用的基本資源.不同于傳統(tǒng)的基于構(gòu)件的復(fù)用中爭(zhēng)取代碼封裝以備組裝使用的專門技術(shù)方案,開源軟件的代碼復(fù)用更多地是通過代碼直接調(diào)用程序接口(API)來實(shí)現(xiàn)的,這對(duì)提供高質(zhì)量、廣泛代表性的使用樣例(或使用示例)提出了更高的要求,從而也帶來了開源軟件中軟件包關(guān)聯(lián)過于復(fù)雜、龐大的系列問題.開源軟件的另一主要復(fù)用機(jī)制則是代碼框架的廣泛使用,取代傳統(tǒng)軟件體系結(jié)構(gòu)的專門定義,代碼框架成為復(fù)用中的體系結(jié)構(gòu).在框架中增補(bǔ)相對(duì)應(yīng)的軟件代碼,成為整體協(xié)同定制和發(fā)展的基礎(chǔ)技術(shù).以往的軟件復(fù)用主要是針對(duì)企業(yè)局域、小規(guī)模的領(lǐng)域和組織,其數(shù)據(jù)內(nèi)容、可復(fù)用資源數(shù)量有限,主要依托工程化方法實(shí)施.從開源軟件的海量復(fù)用資源以及復(fù)用機(jī)制的轉(zhuǎn)變來看,開源軟件復(fù)用的核心問題已轉(zhuǎn)變?yōu)樵诨ヂ?lián)網(wǎng)廣域環(huán)境下,面對(duì)軟件大數(shù)據(jù)基礎(chǔ),如何高效實(shí)現(xiàn)大規(guī)模群體敏捷化開發(fā)的問題.
我們認(rèn)為,知識(shí)驅(qū)動(dòng)的軟件開發(fā)方法(knowledge-driven software development,簡(jiǎn)稱KDSD)已成為當(dāng)前軟件復(fù)用的主要研究方向.可復(fù)用的軟件實(shí)體仍然包括了代碼片段、API、軟件包、Web服務(wù)、框架等軟件基礎(chǔ)資源.復(fù)用的核心關(guān)注點(diǎn)則轉(zhuǎn)變?yōu)橐攒浖R(shí)為核心關(guān)注點(diǎn),研究如何基于特定的知識(shí)結(jié)構(gòu)以及認(rèn)知方法和機(jī)制來描述、理解和利用可復(fù)用的軟件實(shí)體.這其中,主要涉及的問題包括:
· 知識(shí)的表示:采用語(yǔ)義網(wǎng)絡(luò)(semantic network)知識(shí)圖譜(knowledge graph)等技術(shù)來表達(dá)豐富的軟件開發(fā)知識(shí)和領(lǐng)域知識(shí);
· 知識(shí)的來源:可從軟件代碼獲取高度結(jié)構(gòu)化、精簡(jiǎn)、準(zhǔn)確的領(lǐng)域知識(shí)體系,也可從豐富的軟件相關(guān)信息中獲取自然語(yǔ)言表達(dá)的知識(shí);
· 知識(shí)的語(yǔ)義關(guān)聯(lián):建立軟件代碼知識(shí)和自然語(yǔ)言知識(shí)的關(guān)聯(lián),形成領(lǐng)域的語(yǔ)義模型.
在此基礎(chǔ)上,軟件開發(fā)工具能夠以智能推薦的方式為開發(fā)人員提供幫助;更進(jìn)一步地,可能部分實(shí)現(xiàn)基于自然語(yǔ)言需求描述自動(dòng)生成對(duì)應(yīng)的程序.當(dāng)代的知識(shí)表示、信息檢索和機(jī)器學(xué)習(xí)技術(shù)為這方面的發(fā)展提供了全新的技術(shù)途徑.我們可以期望未來出現(xiàn)一種軟件開發(fā)的智能化方法,盡可能準(zhǔn)確地提供代碼推薦和生成,從而使得軟件復(fù)用方法的研究和實(shí)踐從面向復(fù)用的對(duì)象轉(zhuǎn)向基于知識(shí)驅(qū)動(dòng)的智能化開發(fā)方法.
如何高效、低成本地開發(fā)優(yōu)質(zhì)的軟件產(chǎn)品,一直是計(jì)算機(jī)軟件領(lǐng)域重點(diǎn)關(guān)注和研究的問題[68].伴隨著信息化進(jìn)程的迅猛發(fā)展,軟件的復(fù)雜度在不斷提高.同時(shí),軟件的演進(jìn)形態(tài)也日益多樣化[69].在這種情況下,如何有效地解決上述問題成為學(xué)術(shù)和工業(yè)界共同關(guān)注的焦點(diǎn).模型驅(qū)動(dòng)方法正是在這樣的背景下逐漸受到重視,被認(rèn)為是可以應(yīng)對(duì)“高效、低成本地開發(fā)優(yōu)質(zhì)軟件”的一條有效途徑.而這一認(rèn)識(shí)也伴隨著實(shí)踐不斷得到深化,經(jīng)歷了從統(tǒng)一建模語(yǔ)言(unified modeling language,簡(jiǎn)稱UML)到模型驅(qū)動(dòng)架構(gòu)(model-driven architecture,簡(jiǎn)稱MDA)、從模型驅(qū)動(dòng)架構(gòu)到模型驅(qū)動(dòng)工程(model-driven engineering,簡(jiǎn)稱 MDE)、從模型驅(qū)動(dòng)(model-driven)到基于模型(model-based)的過程.
在軟件開發(fā)的長(zhǎng)期摸索過程中,人們逐漸認(rèn)識(shí)到,“提高解決問題的抽象層次”是有效利用抽象手段解決軟件開發(fā)問題的一個(gè)非常具體而實(shí)用的途徑(與軟件技術(shù)發(fā)展密切相關(guān)的3個(gè)要素是計(jì)算機(jī)平臺(tái)、人的思維模式和問題的基本特征[2].文中出現(xiàn)的“提高解決問題的抽象層次”中的“提高”指的就是向著更接近于人的思維模式方向上的提高).Mellor在21世紀(jì)初曾指出[70]:過去的50多年里,人們利用“提高解決問題的抽象層次”處理軟件開發(fā)的問題已經(jīng)取得了兩個(gè)較為顯著的進(jìn)展:(1) 開發(fā)出了具有較高抽象層次的程序設(shè)計(jì)語(yǔ)言;(2) 能夠在更高抽象層次上實(shí)現(xiàn)軟件復(fù)用.
然而這個(gè)發(fā)展道路也并非一帆風(fēng)順,在面向?qū)ο蟮恼Z(yǔ)言、方法和技術(shù)逐漸成為主流的過程中,Booch、Jacobson和Rumbaugh各自創(chuàng)建的Booch、OOSE和OMT方法都獲得了工業(yè)界的支持,并形成了互不兼容的3種模型和方法體系.不同的工業(yè)應(yīng)用在這 3種不同的體系下形成了彼此之間難以理解和復(fù)用的軟件制品,這讓當(dāng)時(shí)原本就不成熟的軟件行業(yè)更是雪上加霜.如何形成一個(gè)能夠支撐從需求到實(shí)現(xiàn)的軟件行業(yè)標(biāo)準(zhǔn),成為當(dāng)時(shí)擺在軟件發(fā)展道路上的一個(gè)亟需解決的問題.在這種情況下,3位面向?qū)ο蠓椒▽W(xué)的大師走到一起,融合了他們的3種軟件開發(fā)方法和模型表示法,形成了統(tǒng)一建模語(yǔ)言(unified modeling language,簡(jiǎn)稱UML),通過非盈利的國(guó)際標(biāo)準(zhǔn)化組織對(duì)象管理組(object management group,簡(jiǎn)稱OMG)發(fā)布為建模規(guī)范,并最終在2005年被國(guó)際標(biāo)準(zhǔn)組織(Int’l Organization for Standardization,簡(jiǎn)稱ISO)采納為工業(yè)標(biāo)準(zhǔn).
由于UML設(shè)計(jì)者和OMG的共同影響力,UML從20世紀(jì)90年代開始構(gòu)造起就受到工業(yè)界的關(guān)注,在1997年發(fā)布1.0草案版時(shí)已經(jīng)獲得了工業(yè)界的普遍支持,并反過來引起學(xué)術(shù)界的研究熱情,再歷經(jīng)1.1~1.3版本的演化,最終在1.4版本時(shí)成為ISO工業(yè)標(biāo)準(zhǔn),更是奠定了UML在整個(gè)軟件行業(yè)中的毋容置疑的通用建模標(biāo)準(zhǔn)的地位,這也形成了面向?qū)ο蠓椒▽W(xué)發(fā)展道路上的一個(gè)重要的里程碑.
有了這樣的技術(shù)積累,人們開始嘗試在更高的抽象層次上開發(fā)軟件,中間件的形成與發(fā)展也正是在這樣的背景下逐步明晰和受到重視的.商家往往能夠最早嗅探到技術(shù)發(fā)展背后的商機(jī),并善加利用以推動(dòng)自身的發(fā)展.于是,J2EE、.NET等中間件技術(shù)開始各自占據(jù)市場(chǎng),又仿佛當(dāng)年Booch、OOSE和OMT方法之間的爭(zhēng)斗.在這種情況下,OMG再次提出了以模型為中心的軟件開發(fā)框架性標(biāo)準(zhǔn)——模型驅(qū)動(dòng)體系結(jié)構(gòu)(model driven architecture,簡(jiǎn)稱MDA)[71],又一次得到了來自學(xué)術(shù)界和工業(yè)界的普遍關(guān)注.盡管MDA提出的直接動(dòng)因是為了解決異構(gòu)中間件(middleware)平臺(tái)的互操作障礙問題[71],但是由它所倡導(dǎo)的以模型為中心進(jìn)行軟件開發(fā)的思想很快得到了廣泛支持,迅速成為研究熱點(diǎn).MDA整合了OMG在建模語(yǔ)言、模型存儲(chǔ)以及模型交換等方面的一系列標(biāo)準(zhǔn),形成了一套基于模型技術(shù)的軟件系統(tǒng)開發(fā)方法和標(biāo)準(zhǔn)體系.
隨著 MDA研究熱潮的迅速興起,模型驅(qū)動(dòng)軟件開發(fā)這個(gè)詞語(yǔ)逐漸被越來越多的學(xué)者所使用.此間,與模型相關(guān)的不同字眼也不斷出現(xiàn)在不同的學(xué)術(shù)機(jī)構(gòu)和社區(qū)(community)中,如 model-driven、model-based、modelrelated、model-engineering等等.2005年,模型驅(qū)動(dòng)軟件開發(fā)領(lǐng)域最重要的年會(huì)之一——UML Series(Int’l Conf.on the Unified Modeling Language)正式更名為 MoDELS/UML Series(Int’l Conf.on Model Driven Engineering Languages and Systems),這開始引起了人們對(duì)模型驅(qū)動(dòng)軟件開發(fā)領(lǐng)域自身術(shù)語(yǔ)使用上的關(guān)注.2007年,模型驅(qū)動(dòng)工程MDE這個(gè)術(shù)語(yǔ)正式出現(xiàn)在第29屆ICSE年會(huì)的FoSE(the Future of Software Engineering)分會(huì)上[72],標(biāo)志著MDE成為模型驅(qū)動(dòng)軟件開發(fā)領(lǐng)域的代名詞.
模型驅(qū)動(dòng)工程以模型為首要軟件制品(software artifact),通過建模為問題域構(gòu)造軟件系統(tǒng)的業(yè)務(wù)模型(business model),然后依靠模型轉(zhuǎn)換(model transformation)驅(qū)動(dòng)軟件開發(fā),(半)自動(dòng)地產(chǎn)生最終完備的應(yīng)用程序[73].可見,MDE下的一切工作都是圍繞著模型展開的.模型對(duì)于模型驅(qū)動(dòng)工程而言,就如同對(duì)象對(duì)于面向?qū)ο筌浖_發(fā)一樣,是基本的開發(fā)元素,這也就是為什么稱其為“模型驅(qū)動(dòng)”的原因之一.模型驅(qū)動(dòng)使軟件開發(fā)的抽象層次進(jìn)一步提高到模型這個(gè)層次.有學(xué)者認(rèn)為:模型驅(qū)動(dòng)的思想,或者說以模型為中心的軟件開發(fā)思想,正是抽象層次提高到一定程度的一個(gè)自然而然的結(jié)果[74].
在 MDE中,模型指的是為了分析或解決問題而對(duì)系統(tǒng)某些方面的抽象描述.從廣義上講,它涵蓋了軟件系統(tǒng)的任意部分[75],包括需求、設(shè)計(jì)、文檔、代碼、部署、配置和測(cè)試用例等.代碼也可以看作軟件系統(tǒng)的模型,這是因?yàn)榇a反映了軟件程序被執(zhí)行時(shí)的行為.然而,通常所指的 MDE下的模型,更多的是狹義上的“設(shè)計(jì)草圖”[76],即今天的開發(fā)模型(development models).如文獻(xiàn)[77]中提到,模型是用來對(duì)問題域進(jìn)行求解的手段;文獻(xiàn)[78,79]認(rèn)為:模型是針對(duì)實(shí)際問題或者業(yè)務(wù)邏輯構(gòu)造,而抽象層次高于可執(zhí)行代碼或最終完備的應(yīng)用程序的軟件制品.
圍繞著模型展開的一系列工作實(shí)際上也就構(gòu)成了 MDE中的各項(xiàng)研究工作.2007年的國(guó)際軟工大會(huì)上,France等人[72]將目前這些工作中最重要和亟待解決的問題歸結(jié)為如下幾類挑戰(zhàn).
· 建模語(yǔ)言的挑戰(zhàn):這一類挑戰(zhàn)主要來自于如何使建模語(yǔ)言支持在問題層面上進(jìn)行建模,以及如何對(duì)模型進(jìn)行嚴(yán)格的分析.
· 關(guān)注點(diǎn)劃分的挑戰(zhàn):這一類挑戰(zhàn)來源于對(duì)同一系統(tǒng)進(jìn)行多視圖建模的結(jié)果.由于不同側(cè)面的模型可能是基于異構(gòu)的語(yǔ)言開發(fā)的,而模型間又存在相互重疊的部分,因而很容易出現(xiàn)不一致等問題.
· 對(duì)模型操縱和管理的挑戰(zhàn):這一類挑戰(zhàn)包括:(1) 對(duì)模型轉(zhuǎn)換的定義、分析和使用;(2) 維護(hù)模型元素間的可追溯性,以支持模型演化(model evolution)和雙向工程(roundtrip engineering);(3) 維護(hù)不同視點(diǎn)(viewpoint)之間的一致性;(4) 版本追蹤;(5) 在運(yùn)行期使用模型.
其中,前兩類是針對(duì)建模的問題,最后一類主要是轉(zhuǎn)換的問題.可以看出,模型驅(qū)動(dòng)思想的核心就是建模和模型轉(zhuǎn)換,它們也是完成 MDE開發(fā)的兩個(gè)最主要的過程.并且,建模過程和模型轉(zhuǎn)換過程又是相互交織的,建模過程涵蓋了一系列不同抽象層次模型的構(gòu)造過程,而相應(yīng)的轉(zhuǎn)換過程也包括了不同抽象層次間以及相同抽象層次上的轉(zhuǎn)換.
近年來,隨著MoDELS國(guó)際會(huì)議影響力的不斷擴(kuò)大,軟工領(lǐng)域的各個(gè)研究分支也在不斷將工作發(fā)表在該會(huì)議上,這在很大程度上推動(dòng)了整個(gè)軟工領(lǐng)域?qū)Α澳P汀备鼮樯钊氲乃伎?最開始的那種以“模型”為中心來驅(qū)動(dòng)軟件開發(fā)的想法也慢慢演化為如何將模型作為有效的抽象手段來刻畫軟件的某些重要性質(zhì),從而更好地支撐在不同研究領(lǐng)域的應(yīng)用,如測(cè)試、驗(yàn)證、推薦、復(fù)用等等.在這種背景下,“Model-Driven”的含義慢慢向“Model-Based”靠近.
模型驅(qū)動(dòng)(model-driven)的術(shù)語(yǔ)主要是從MDA中產(chǎn)生出來,其最初的含義是強(qiáng)調(diào)系統(tǒng)的構(gòu)造是通過以模型為中心來完成的,也就是說,模型的主要用來“驅(qū)動(dòng)”軟件從需求開始向?qū)崿F(xiàn)過渡的這個(gè)過程.而隨著 MDE研究領(lǐng)域的逐漸形成,模型的價(jià)值在整個(gè)軟工更大范圍內(nèi)得到關(guān)注,模型的概念也從最早的 UML這個(gè)具象的對(duì)應(yīng)體,慢慢回歸到作為軟件系統(tǒng)的“抽象描述”這樣的本質(zhì)上來.因而,基于模型(model-based)這個(gè)說法就成為更能夠表達(dá)其寬泛含義的術(shù)語(yǔ),在 MDE領(lǐng)域得到了更多的應(yīng)用,如基于模型的軟件開發(fā)(model-based software development)、基于模型的測(cè)試(model-based testing)、基于模型的規(guī)約(model-based specification)等等.
這樣一來,大大拓寬了MDE研究領(lǐng)域的范圍,也極大地增強(qiáng)了軟件工程各個(gè)研究分支與MDE的融合.其中,在最近幾年比較受關(guān)注的研究熱點(diǎn)有模型對(duì)運(yùn)行時(shí)的支持,模型資產(chǎn)庫(kù)的構(gòu)造與應(yīng)用,模型與人工智能、機(jī)器學(xué)習(xí)的結(jié)合以及更加寬泛的建模IDE的研究等.
· 模型對(duì)運(yùn)行時(shí)的支持主要是通過預(yù)先定義或者動(dòng)態(tài)獲得的系統(tǒng)行為模型,對(duì)軟件系統(tǒng)在運(yùn)行時(shí)的行為進(jìn)行監(jiān)控,從而預(yù)判甚至是干預(yù)和調(diào)整系統(tǒng)動(dòng)態(tài)行為;
· 模型資產(chǎn)庫(kù)的構(gòu)造與應(yīng)用是近來備受關(guān)注的工作,特別是隨著互聯(lián)網(wǎng)上開源軟件的急劇增加,可以被直接獲得的軟件資產(chǎn)已經(jīng)形成了相當(dāng)?shù)囊?guī)模.如何有效地使用這些軟件資產(chǎn),引起了學(xué)術(shù)界和工業(yè)界的格外關(guān)注.模型作為軟件的抽象描述,可以從不同的視角和維度展示軟件的語(yǔ)義信息,進(jìn)而形成海量軟件資產(chǎn)的“索引”,極大地提高了對(duì)開源軟件的理解和復(fù)用能力;
· 模型與人工智能、機(jī)器學(xué)習(xí)結(jié)合的研究,是最近人工智能和機(jī)器學(xué)習(xí)熱潮下的一個(gè)趨勢(shì).雖然具體的研究?jī)?nèi)容還沒有得到普遍共識(shí),但總的來講,一方面是研究基于模型的人工智能和機(jī)器學(xué)習(xí),另一方面是將人工智能和機(jī)器學(xué)習(xí)技術(shù)用到MDE研究中.目前來看,后者的研究工作更多一些.
建模IDE的研究一直都是MDE領(lǐng)域的一個(gè)重要研究方向,而且具有很好的實(shí)用價(jià)值.但與之前研究工作不同的是,目前建模IDE的研究不僅僅是UML家族或者M(jìn)DA框架下的模型概念,更加泛化的模型是目前的一個(gè)趨勢(shì),甚至是手繪草圖、形式化模型等都被逐漸納入到所討論的范疇中.
隨著以互聯(lián)網(wǎng)為主干,電信網(wǎng)、移動(dòng)網(wǎng)、傳感網(wǎng)等多種網(wǎng)絡(luò)正在不斷滲透融合,軟件系統(tǒng)的運(yùn)行環(huán)境正在逐步從靜態(tài)、封閉、固定的單機(jī)環(huán)境轉(zhuǎn)變?yōu)閯?dòng)態(tài)、開放、多變的網(wǎng)絡(luò)環(huán)境.為了應(yīng)對(duì)網(wǎng)絡(luò)環(huán)境中各類分布式資源的共享和集成對(duì)計(jì)算機(jī)軟件技術(shù)的挑戰(zhàn),軟件服務(wù)得到了學(xué)術(shù)界和工業(yè)界的廣泛關(guān)注[80].
軟件服務(wù)是指將軟件的功能以服務(wù)的形式通過互聯(lián)網(wǎng)來交付,可以被使用者(最終用戶或者第三方客戶端程序)直接使用的獨(dú)立的基本單元.就其形態(tài)而言,軟件服務(wù)一般基于可共享和集成的應(yīng)用系統(tǒng)和資源來構(gòu)建,對(duì)外則表現(xiàn)為一組相對(duì)獨(dú)立的業(yè)務(wù)功能單元(通常是可供外部直接調(diào)用的應(yīng)用編程接口,即API),更加方便使用者直接使用.軟件服務(wù)的一個(gè)重要目標(biāo)是屏蔽開放網(wǎng)絡(luò)環(huán)境帶來的異構(gòu)性問題,因而一般具有較高的抽象級(jí)別和獨(dú)立性.這種獨(dú)立性也帶來了軟件服務(wù)之間更加松散的耦合關(guān)系,從而使得使用者可以靈活選擇服務(wù)并進(jìn)行組裝來生成增值服務(wù).特別地,由于開放環(huán)境下存在大量類似的資源,使用者可以在量大面廣、推陳出新的多個(gè)相同或相似服務(wù)中不斷選擇最合適的服務(wù).
目前,軟件服務(wù)不僅成為網(wǎng)絡(luò)環(huán)境下最為重要的一種軟件形態(tài),也改變了傳統(tǒng)的軟件交付方式,使得軟件產(chǎn)業(yè)開始從“以產(chǎn)品為中心的制造業(yè)”向“以用戶為中心的服務(wù)業(yè)”轉(zhuǎn)變.軟件由服務(wù)的運(yùn)營(yíng)商負(fù)責(zé)運(yùn)維,用戶無(wú)需擁有軟件的本地拷貝,也不必考慮軟件的維護(hù)和升級(jí),還可以按需定制和購(gòu)買軟件.軟件服務(wù)使其使用者能夠在不擁有軟件產(chǎn)品的前提下,直接使用軟件的功能,從而實(shí)現(xiàn)“即拿即用”的效果[81].這種“只求使用,不求擁有”的特性,也只有通過互聯(lián)網(wǎng)和軟件的組合才可能實(shí)現(xiàn).進(jìn)一步地,軟件服務(wù)的使用者可以更加靈活地進(jìn)行服務(wù)組裝以生成增值服務(wù),并能不斷地選擇最優(yōu)服務(wù)來滿足適應(yīng)性的需求.
一般而言,基于服務(wù)的軟件開發(fā)主要包含3類主要角色,即服務(wù)提供者、服務(wù)使用者和服務(wù)代理.其中,
· 服務(wù)提供者按照服務(wù)契約(service contract)實(shí)現(xiàn)了提供業(yè)務(wù)功能的軟件模塊.從業(yè)務(wù)角度看,它是服務(wù)的擁有者;從體系結(jié)構(gòu)看,它是訪問服務(wù)的平臺(tái).對(duì)于提供同一業(yè)務(wù)功能的服務(wù),可以有多種不同的服務(wù)提供者;
· 服務(wù)使用者(即服務(wù)的用戶)調(diào)用服務(wù)提供者所實(shí)現(xiàn)的服務(wù),以完成特定的業(yè)務(wù)需求.從業(yè)務(wù)角度看,它是請(qǐng)求特定功能的業(yè)務(wù);從系統(tǒng)體系看,它是尋找并調(diào)用服務(wù)或啟動(dòng)與服務(wù)交互的應(yīng)用.服務(wù)請(qǐng)求者可以是用戶通過客戶端應(yīng)用程序(如瀏覽器或智能手機(jī))實(shí)現(xiàn),也可以是沒有用戶界面的程序?qū)崿F(xiàn)(如另一個(gè)服務(wù));
· 服務(wù)代理是一個(gè)可搜索的第三方注冊(cè)機(jī)構(gòu),如 UDDI等.服務(wù)提供者將服務(wù)描述發(fā)布給服務(wù)代理,服務(wù)請(qǐng)求者在服務(wù)代理處查找服務(wù)并進(jìn)行綁定(可分為靜態(tài)綁定和動(dòng)態(tài)綁定)和調(diào)用.
某種程度上看,軟件服務(wù)可以看成是軟件構(gòu)件在網(wǎng)絡(luò)環(huán)境下的進(jìn)一步延伸和發(fā)展.圍繞軟件服務(wù)的開發(fā)過程可以分為如下幾個(gè)[82].
· 服務(wù)封裝和生成.服務(wù)提供者將軟件系統(tǒng)中需要開放的功能和數(shù)據(jù)按照一定的標(biāo)準(zhǔn)(如Web服務(wù))進(jìn)行封裝并發(fā)布.服務(wù)的生成一般是對(duì)已有的軟件系統(tǒng)的功能和數(shù)據(jù)進(jìn)行封裝,也可以是服務(wù)提供者新開發(fā)的功能和數(shù)據(jù);
· 服務(wù)查找和選擇.服務(wù)使用者查找并選擇滿足其功能和非功能需求的服務(wù).服務(wù)查找既可以通過統(tǒng)一的服務(wù)代理(如UDDI),也可以通過搜索引擎來進(jìn)行;
· 服務(wù)組裝.服務(wù)使用者對(duì)若干服務(wù)進(jìn)行組裝來形成新的增值服務(wù)應(yīng)用.組裝的過程既可以按照預(yù)先定義的規(guī)則(如業(yè)務(wù)流程規(guī)約 WS-BPEL或 WSCI)及其引擎自動(dòng)/半自動(dòng)地完成,也可以根據(jù)當(dāng)前的情境以人機(jī)協(xié)同的方式來完成(如Web Mashups);
· 服務(wù)演化.由于每個(gè)軟件服務(wù)是相對(duì)獨(dú)立的實(shí)體,其功能和質(zhì)量均可能發(fā)生演化.相應(yīng)地,通過服務(wù)組裝而成的應(yīng)用也會(huì)隨之發(fā)生演化,可表現(xiàn)為服務(wù)的升級(jí)/降級(jí)、增加、退出和替換等.
· 面向服務(wù)的體系結(jié)構(gòu)和Web服務(wù).
軟件服務(wù)的思想可以追溯到20世紀(jì)90年代中期出現(xiàn)的“應(yīng)用服務(wù)提供商(application service provider,簡(jiǎn)稱ASP)”.21世紀(jì)的前 10年,軟件服務(wù)開始成為學(xué)術(shù)界和工業(yè)界的研究實(shí)踐熱點(diǎn),其代表為面向服務(wù)的體系結(jié)構(gòu)(service oriented architecture,簡(jiǎn)稱SOA)及其主要的實(shí)現(xiàn)技術(shù)——Web服務(wù)的興起[82].圍繞Web服務(wù)互操作協(xié)議、發(fā)現(xiàn)、組裝、語(yǔ)義、管理和質(zhì)量保障等問題,已經(jīng)有了大量的工作.從實(shí)際應(yīng)用情況看,在互聯(lián)網(wǎng)上,基于SOAP(簡(jiǎn)單對(duì)象訪問協(xié)議)的Web服務(wù)數(shù)量還比較少,且大多只提供相對(duì)簡(jiǎn)單的數(shù)據(jù)查詢功能(如天氣、股票查詢等),Web服務(wù)之間也很少構(gòu)成復(fù)雜的業(yè)務(wù)邏輯.這里既有 Web服務(wù)技術(shù)體系存在自身缺陷的原因,如廣域網(wǎng)中基于SOAP協(xié)議的消息傳輸性能較差、服務(wù)質(zhì)量難以保障等,也有一些非技術(shù)的因素,如Web服務(wù)相關(guān)的技術(shù)標(biāo)準(zhǔn)過于繁雜難以統(tǒng)一、面向互聯(lián)網(wǎng)的服務(wù)注冊(cè)中心(UDDI)難以管理和維護(hù)等.
· RESTful服務(wù).
2004年前后,隨著Web 2.0的興起,對(duì)數(shù)據(jù)/內(nèi)容開放共享、多方協(xié)同、用戶交互體驗(yàn)的需求不斷增加,越來越多的 Web系統(tǒng)所有者均開始關(guān)注如何將自身的功能和數(shù)據(jù)以服務(wù)的形式開放出來.由于傳統(tǒng)的基于 SOAP的Web服務(wù)在互聯(lián)網(wǎng)環(huán)境下難以進(jìn)行規(guī)模化應(yīng)用,于是,基于REST(representational state transfer)體系結(jié)構(gòu)風(fēng)格的軟件服務(wù)技術(shù)得到了廣泛關(guān)注和使用.REST由 Roy Fielding(Roy Fielding是 HTTP 1.1規(guī)范的起草者和Apache Web服務(wù)器的開發(fā)者,并且倡導(dǎo)創(chuàng)建了Apache開源軟件基金會(huì))于2000年左右提出[83],是WWW架構(gòu)最為核心的應(yīng)用軟件體系結(jié)構(gòu)風(fēng)格.與 SOAP相比,REST體系結(jié)構(gòu)風(fēng)格提供了一種相對(duì)輕量的應(yīng)用協(xié)議,通過描述資源狀態(tài)變化的方式而不是遠(yuǎn)程過程調(diào)用(remote procedure call)的方式來使用軟件服務(wù),更加適合萬(wàn)維網(wǎng)環(huán)境.特別地,2007年起,云計(jì)算開始成為互聯(lián)網(wǎng)環(huán)境下最為重要的應(yīng)用模式[84],基于REST體系結(jié)構(gòu)風(fēng)格的軟件服務(wù)成為云計(jì)算的基礎(chǔ)使能技術(shù)之一.幾乎所有的主流軟件服務(wù)提供商(主要是互聯(lián)網(wǎng)公司,如谷歌、亞馬遜、Facebook、Salesforce.com、百度、騰訊等),都開始采用遵循REST的Web API來發(fā)布軟件服務(wù)供用戶在線使用[85].此外,基于 REST的 Web服務(wù)功能也不僅限于簡(jiǎn)單的數(shù)據(jù)查詢,應(yīng)用的業(yè)務(wù)范圍更廣,如谷歌的 Gmail服務(wù)、Salesforce.com的 CRM(客戶關(guān)系管理)服務(wù)和亞馬遜的存儲(chǔ)服務(wù)等,都是基于REST的 Web服務(wù).當(dāng)然,在云計(jì)算環(huán)境下,軟件服務(wù)仍有很多問題需要解決,包括對(duì)“黑盒”形態(tài)的遺產(chǎn)系統(tǒng)“解耦”和“安全”的服務(wù)化封裝、服務(wù)的交付與展現(xiàn)、服務(wù)動(dòng)態(tài)組裝、服務(wù)的跨域安全性、服務(wù)資源管理等.
· 微服務(wù)和開發(fā)運(yùn)行一體化.
近年來,“微服務(wù)”得到軟件服務(wù)研究實(shí)踐者的廣泛關(guān)注[86].微服務(wù)是一種基于一組獨(dú)立部署運(yùn)行的小型服務(wù)來構(gòu)建應(yīng)用的方法.與傳統(tǒng)的面向服務(wù)體系結(jié)構(gòu)SOA應(yīng)用相比,這些小型服務(wù)主要圍繞應(yīng)用系統(tǒng)業(yè)務(wù)能力來構(gòu)建,采用盡量去中心化的機(jī)制管理,使用不同技術(shù)棧開發(fā),通過輕量級(jí)通信機(jī)制交互.圍繞微服務(wù)架構(gòu),一些新的研究正在不斷涌現(xiàn),如面向主流編程語(yǔ)言并支持微服務(wù)架構(gòu)的軟件開發(fā)框架、事件驅(qū)動(dòng)的開發(fā)運(yùn)行一體化(如DevOps)基礎(chǔ)設(shè)施架構(gòu)[87]、細(xì)粒度基礎(chǔ)資源及其狀態(tài)監(jiān)控、在線測(cè)試和快速部署、容錯(cuò)等關(guān)鍵技術(shù)等.
縱觀軟件開發(fā)方法和技術(shù)的發(fā)展歷史,新方法與技術(shù)體系的誕生總是由軟件基礎(chǔ)支撐平臺(tái)和相應(yīng)的應(yīng)用需求的重大變化來驅(qū)動(dòng)的.宏觀來說,軟件開發(fā)就是給定待解的應(yīng)用問題,由軟件開發(fā)者通過智力活動(dòng)過程構(gòu)造出能夠在所提供的平臺(tái)上有效運(yùn)行的、能夠解決問題的軟件.因而,軟件開發(fā)方法的 3個(gè)宏觀要素可抽象概括為平臺(tái)空間、認(rèn)知空間、問題空間.軟件方法與技術(shù)體系的發(fā)展過程就是在平臺(tái)和需求變化驅(qū)動(dòng)力的推動(dòng)之下,對(duì)這3個(gè)空間的認(rèn)識(shí)不斷深化并在其間有效協(xié)同的過程[88],從而幫助駕馭軟件開發(fā)的復(fù)雜性.即:盡量避免引入附屬性的復(fù)雜性,更好地理解和應(yīng)對(duì)本質(zhì)性的復(fù)雜性.例如:前文所述的結(jié)構(gòu)化方法乃是由于20世紀(jì)70年代計(jì)算機(jī)基礎(chǔ)能力(計(jì)算、存儲(chǔ)與外設(shè))的快速發(fā)展和軟件危機(jī)的出現(xiàn)而導(dǎo)致人們對(duì)基礎(chǔ)的程序設(shè)計(jì)方法與語(yǔ)言的科學(xué)思考而產(chǎn)生的,它較好地協(xié)同了軟件開發(fā)的平臺(tái)空間與認(rèn)知空間;面向?qū)ο蠓椒ㄅc技術(shù)體系則進(jìn)一步發(fā)展了從宏觀角度控制復(fù)雜性的手段,如關(guān)注分離、信息隱蔽、模塊化等,并強(qiáng)調(diào)將問題空間納入軟件設(shè)計(jì)的范疇,提出了與問題結(jié)構(gòu)具有良好對(duì)應(yīng)關(guān)系的面向?qū)ο蟪绦蚰P偷母拍钆c支撐機(jī)制,從而協(xié)調(diào)了軟件設(shè)計(jì)平臺(tái)空間、認(rèn)知空間以及問題空間[88].然而,經(jīng)典的結(jié)構(gòu)化和對(duì)象化方法與技術(shù)體系誕生于靜態(tài)、封閉、可控的環(huán)境,難以完全適應(yīng)像Internet這樣開放、動(dòng)態(tài)與難控的環(huán)境和多變的用戶需求,為此,需要探索新的軟件方法與技術(shù)體系.
21世紀(jì)以來,Internet的快速發(fā)展與普及為軟件方法技術(shù)的發(fā)展帶來新的驅(qū)動(dòng)力:其基礎(chǔ)平臺(tái)從Mainframe經(jīng)過網(wǎng)絡(luò)化、微型化、并行化而逐步形成一個(gè)所謂的Global Ubiquitous Computer[89];其應(yīng)用方式從經(jīng)典封閉應(yīng)用模式經(jīng)過資源化、普適化與服務(wù)化,逐步形成了以X-Computing(grid computing,cloud computing,service computing,pervasive computing等)、X-Systems(embedded system,hybrid system,cyber-physical system 等)和XData(very large scale data,massive data,big data)為代表的多樣化開放式應(yīng)用模式.于是,計(jì)算平臺(tái)空間已經(jīng)從單個(gè)或多個(gè)可控計(jì)算機(jī)向開放的 Internet平臺(tái)發(fā)展,其主要作用已開始從“計(jì)算為主”逐步向“通信連接為主”的方面轉(zhuǎn)變;認(rèn)知空間已開始從“面向個(gè)體程序員”開始向“群體化和服務(wù)化方式”過渡,其關(guān)注點(diǎn)在面向?qū)ο蟮摹捌脚_(tái)?程序員?問題”的基礎(chǔ)上,開始向關(guān)注“個(gè)體?群體開發(fā)者?大量使用者”的方面過渡;問題空間已從確定環(huán)境下的單個(gè)問題求解,到開放開發(fā)環(huán)境下的群體問題求解,開始向非確定環(huán)境下如何為大量最終用戶提供優(yōu)質(zhì)服務(wù)的方面發(fā)展,其關(guān)注點(diǎn)已從求解問題轉(zhuǎn)變到開放環(huán)境下資源的共享與協(xié)同[88].
為此,人們從不同角度對(duì)面向 Internet的軟件方法和技術(shù)[90]進(jìn)行了探索,例如自適應(yīng)軟件系統(tǒng)[91]、面向Agent的軟件工程[92]、面向 IoT的程序設(shè)計(jì)[93]、自組織系統(tǒng)[94]等等.而網(wǎng)構(gòu)軟件是中國(guó)學(xué)者提出的一種面向Internet的新軟件范型[95-97].網(wǎng)構(gòu)軟件范型針對(duì)前述Internet計(jì)算平臺(tái)和應(yīng)用模式的特點(diǎn),強(qiáng)調(diào)軟件的自治性,即軟件系統(tǒng)由分布于網(wǎng)絡(luò)中自主獨(dú)立的實(shí)體構(gòu)成;協(xié)同性,即這些自治實(shí)體通過動(dòng)態(tài)聯(lián)盟協(xié)作共同達(dá)成應(yīng)用目標(biāo);適應(yīng)性,即軟件系統(tǒng)自主感知環(huán)境和需求變化并主動(dòng)適應(yīng)之;演化性,即軟件系統(tǒng)的結(jié)構(gòu)和行為能夠動(dòng)態(tài)演化從而長(zhǎng)期生存;激發(fā)性(emergent),即軟件系統(tǒng)可能呈現(xiàn)由自主實(shí)體交互而激發(fā)的非預(yù)設(shè)行為;以及可信性,即以應(yīng)用目標(biāo)和用戶體驗(yàn)為導(dǎo)向的軟件質(zhì)量保障.為支持網(wǎng)構(gòu)軟件范型,研究者從軟件的架構(gòu)模型、構(gòu)造方法、運(yùn)行支撐以及質(zhì)量保障等方面展開了一系列研究.例如,在架構(gòu)模型方面提出了基于動(dòng)態(tài)體系結(jié)構(gòu)的模型[98]和環(huán)境驅(qū)動(dòng)的模型[99]等;在構(gòu)造方法方面,提出了以體系結(jié)構(gòu)為中心方法[100]和基于環(huán)境本體的能力規(guī)約[101]等;在運(yùn)行支撐方面,提出了基于雙向轉(zhuǎn)換的運(yùn)行時(shí)體系結(jié)構(gòu)技術(shù)、動(dòng)態(tài)軟件更新技術(shù)等;在質(zhì)量保障方面,研究了服務(wù)化網(wǎng)構(gòu)軟件的時(shí)序性質(zhì)的規(guī)約與監(jiān)控[102]、特征驅(qū)動(dòng)的需求依賴分析[103]等.
當(dāng)前,Internet網(wǎng)絡(luò)互聯(lián)不斷拓展和深化,它已從計(jì)算機(jī)的網(wǎng)絡(luò)拓展到無(wú)處不在的物理世界中的各種傳感和執(zhí)行設(shè)備.同時(shí),它也深入支撐并改造了人類用戶的各種社會(huì)關(guān)系,形成一種人機(jī)物一體融合的綜合發(fā)展態(tài)勢(shì).這或許孕育著對(duì)軟件開發(fā)方法和技術(shù)體系的革命性挑戰(zhàn)和機(jī)遇.
人機(jī)物融合中的所謂“機(jī)”,主要是指軟件的基礎(chǔ)平臺(tái)支撐,它經(jīng)歷了從計(jì)算機(jī)經(jīng)過計(jì)算平臺(tái)到計(jì)算思維的轉(zhuǎn)變.在此過程中,計(jì)算機(jī)開始從以工具為主要形態(tài)演變?yōu)榕c機(jī)器形態(tài)無(wú)關(guān)的平臺(tái)概念,然后上升為計(jì)算思維的概念,變?yōu)槿祟惓碚撆c實(shí)驗(yàn)之外認(rèn)識(shí)世界的第3種手段.所謂“物”,主要是指面向現(xiàn)實(shí)世界的信息化空間.在宏觀上,它經(jīng)歷了從個(gè)體化空間經(jīng)過社會(huì)化空間逐步向自然化空間的轉(zhuǎn)變,預(yù)示信息化技術(shù)不斷從個(gè)體化機(jī)構(gòu)化的應(yīng)用逐步向人類社會(huì)與自然界的拓展與深入.所謂“人”,即是信息化社會(huì)的主要載體,經(jīng)歷了從信息化的工作人與娛樂人經(jīng)過網(wǎng)絡(luò)支持的虛擬社會(huì)人到各類信息及時(shí)支撐的自然化超人的轉(zhuǎn)變,其在自然界與人類社會(huì)的能力越來越強(qiáng),但其對(duì)信息技術(shù)的依賴也越來越大.
如果從前述(平臺(tái)空間、認(rèn)知空間、問題空間)三要素的觀點(diǎn)看,這三者大致對(duì)應(yīng)于上述機(jī)、人和物.但這里的平臺(tái)空間也包括了人和物在計(jì)算思維下的抽象.要支持這種抽象,構(gòu)造新型軟件所運(yùn)行的平臺(tái),必須要有新的技術(shù)手段.軟件定義(software-defined,簡(jiǎn)稱 SD)[104]的思路和技術(shù)給出了一種可能的途徑.這里的問題空間與傳統(tǒng)軟件應(yīng)用有很大的不同:傳統(tǒng)軟件只是負(fù)責(zé)現(xiàn)實(shí)世界業(yè)務(wù)過程中的信息處理環(huán)節(jié),而現(xiàn)在的軟件日益成為信息化了的現(xiàn)實(shí)世界中的應(yīng)用的價(jià)值觀的主要載體.這里,認(rèn)知空間的主要問題就成為如何支持所謂自然化超人.這種以人為本的軟件構(gòu)造需要不同于傳統(tǒng)的基于規(guī)約的軟件構(gòu)造,需要新的方法和技術(shù)的支持.
人機(jī)物三者的綜合與協(xié)同發(fā)展是信息技術(shù)進(jìn)步的主題,也是推動(dòng)軟件方法與技術(shù)不斷發(fā)展的動(dòng)力.例如,(人:信息化工作人,機(jī):Wintel模式,物:信息化工作空間,理念:人人一臺(tái)PC)、(人:被信息化服務(wù)人,機(jī):Google模式,物:信息化服務(wù)空間,理念:人人可以使用全世界的信息)、(人:虛擬社會(huì)人,機(jī):Web As a Platform,物:虛擬化社會(huì)空間,理念:我為人人與人人為我)等均代表了信息技術(shù)發(fā)展的不同模式與發(fā)展階段.在此意義下,當(dāng)前正在發(fā)展與追求的主要目標(biāo)是(人:自然化與信息化結(jié)合的超人,機(jī):物聯(lián)網(wǎng)/云計(jì)算/大數(shù)據(jù)/CPS,物:智慧校園/智慧城市/智慧地球,理念:Anytime,Anywhere,AnyService).在這樣一個(gè)發(fā)展過程中,將推動(dòng)軟件方法與技術(shù)體系逐步從封閉獨(dú)立軟件系統(tǒng)到開放協(xié)同軟件系統(tǒng),從靈活好用的軟件系統(tǒng)到智能可信軟件系統(tǒng)的重大轉(zhuǎn)型,進(jìn)而推動(dòng)軟件方法與技術(shù)體系從“經(jīng)典的面向?qū)ο筌浖椒ㄅc技術(shù)體系”經(jīng)過“面向Internet軟件方法與技術(shù)體系”逐步向“面向人機(jī)物融合的軟件方法與技術(shù)體系”的跨越.