沈瑩 張林
摘 要:軟件體系結(jié)構(gòu)課程是軟件工程知識(shí)領(lǐng)域的重要組成部分,銜接需求分析和概要設(shè)計(jì)兩個(gè)階段,教學(xué)內(nèi)容要求緊密?chē)@該領(lǐng)域的最新研究成果展開(kāi),難度很大,不容易組織。文章從內(nèi)容、課程實(shí)踐項(xiàng)目、教學(xué)效果評(píng)估3方面對(duì)這門(mén)課程的建設(shè)方案進(jìn)行全面闡述。
關(guān)鍵詞:軟件體系結(jié)構(gòu);質(zhì)量屬性驅(qū)動(dòng);軟件架構(gòu)設(shè)計(jì);軟件架構(gòu)文檔;軟件架構(gòu)評(píng)估
1 背 景
軟件體系結(jié)構(gòu),又稱軟件架構(gòu),是軟件工程領(lǐng)域一個(gè)非常重要的組成部分。人們目前一般認(rèn)為軟件開(kāi)發(fā)過(guò)程包含需求分析、概要設(shè)計(jì)、詳細(xì)設(shè)計(jì)、編碼、測(cè)試、維護(hù)等幾個(gè)階段。在需求分析階段,開(kāi)發(fā)人員得到一組關(guān)于系統(tǒng)功能的用例;到了概要設(shè)計(jì)階段,開(kāi)發(fā)人員需要為每個(gè)用例確定對(duì)應(yīng)的函數(shù)以及參數(shù)名稱和個(gè)數(shù)。對(duì)于開(kāi)發(fā)一個(gè)很小的系統(tǒng)來(lái)說(shuō),由于用例數(shù)量少,函數(shù)間的調(diào)用關(guān)系簡(jiǎn)單,從用例過(guò)渡到函數(shù)實(shí)現(xiàn)相對(duì)容易,但是目前新出現(xiàn)的軟件規(guī)模越來(lái)越大(如Visual Studio 2017安裝包就有3G,而MATLAB 2016 b有6G),功能越來(lái)越復(fù)雜,安全性/實(shí)時(shí)性要求越來(lái)越高。開(kāi)發(fā)大型軟件時(shí),開(kāi)發(fā)人員需要對(duì)系統(tǒng)進(jìn)行合理的模塊劃分,設(shè)計(jì)子系統(tǒng),確定軟件各模塊調(diào)用邏輯,避免出現(xiàn)代碼冗余、代碼膨脹、后期難以修改等致命的問(wèn)題,這些內(nèi)容則屬于軟件架構(gòu)設(shè)計(jì)的范疇。軟件架構(gòu)設(shè)計(jì)是軟件工程不可或缺的一部分,連接了需求分析和概要設(shè)計(jì)兩個(gè)階段,如圖1所示。
雖然軟件架構(gòu)設(shè)計(jì)的地位非常重要,但是目前開(kāi)設(shè)這門(mén)課程的高校卻不多。為了滿足軟件工程專業(yè)的培養(yǎng)要求,同濟(jì)大學(xué)軟件學(xué)院于2014年開(kāi)設(shè)了軟件體系結(jié)構(gòu)這門(mén)課程,旨在教授學(xué)生如何設(shè)計(jì)軟件架構(gòu)、編寫(xiě)架構(gòu)文檔、對(duì)軟件架構(gòu)進(jìn)行評(píng)估等知識(shí)和方法。為了使學(xué)生對(duì)軟件架構(gòu)有一個(gè)完整的認(rèn)識(shí),教師可以卡內(nèi)基·梅隆大學(xué)軟件工程學(xué)院(software engineering institute, SEI)編寫(xiě)的教材[1]為基礎(chǔ),綜合目前流行的軟件架構(gòu)模式和多方面資料,制訂相應(yīng)的學(xué)習(xí)內(nèi)容[2];同時(shí),每部分理論知識(shí)應(yīng)對(duì)應(yīng)有課程實(shí)踐,學(xué)生能夠通過(guò)完成作業(yè)和項(xiàng)目,最終掌握相應(yīng)的知識(shí)點(diǎn)。
2 課程內(nèi)容
2.1 軟件質(zhì)量屬性
質(zhì)量屬性需求在設(shè)計(jì)軟件架構(gòu)過(guò)程中起決定性作用,因此本知識(shí)點(diǎn)旨在教授學(xué)生熟悉軟件的質(zhì)量屬性以及每種質(zhì)量屬性的具體例子。在本知識(shí)點(diǎn)中,軟件質(zhì)量屬性包含可用性(availability)、可修改性(modifiability)、安全性(security)、性能(performance)、可移植性(portability)、可擴(kuò)展性(portability)、可測(cè)試性(testability)等方面。
學(xué)生學(xué)習(xí)使用場(chǎng)景的形式表示每種質(zhì)量屬性。可用性的概要場(chǎng)景和具體場(chǎng)景[1]如圖2所示。一個(gè)場(chǎng)景包含6個(gè)部分:source of stimulus、stimulus、artifact、environment、response和response measure。采用場(chǎng)景表示法能夠統(tǒng)一不同質(zhì)量屬性的表示方式,有利于理解項(xiàng)目需求,幫助架構(gòu)師分析、設(shè)計(jì)合適的軟件架構(gòu)。
2.2 軟件架構(gòu)策略和模式
軟件架構(gòu)策略(tactics)是一些能保證系統(tǒng)達(dá)到所需質(zhì)量屬性要求的技術(shù)總稱,如可用性的策略包括備份策略、時(shí)間戳策略、回滾策略、模塊監(jiān)控策略等。策略可以提高軟件某一個(gè)屬性方面的質(zhì)量,軟件架構(gòu)模式則由一系列的策略組成,是在不同軟件質(zhì)量屬性間作出的一種權(quán)衡(tradeoff)。之所以稱為權(quán)衡,是因?yàn)檐浖|(zhì)量屬性之間存在著沖突,如采用備份策略增強(qiáng)系統(tǒng)勢(shì)必影響到系統(tǒng)的性能(因?yàn)樾枰〞r(shí)間完成備份間的同步)。常用的軟件架構(gòu)包括分層模式(layered pattern)、代理人模式(broker pattern)、MVC模式、管道過(guò)濾器模式(pipe-and-filter pattern)、P2P模式、CS架構(gòu)等。文獻(xiàn)[3]中又總結(jié)了另外3種架構(gòu)模式:事件驅(qū)動(dòng)架構(gòu)(event-driven architecture)、微內(nèi)核架構(gòu)(microkernel architecture)和微服務(wù)架構(gòu)(microservice architecture)。
軟件架構(gòu)策略和模式具有很強(qiáng)的經(jīng)驗(yàn)性,簡(jiǎn)單地要求學(xué)生記住各種軟件架構(gòu)模式的特點(diǎn)是很難做到的。為了讓學(xué)生深入理解各種策略和模式,可在課程內(nèi)容中引入KWIC系統(tǒng)(該系統(tǒng)的詳細(xì)說(shuō)明見(jiàn)3.2節(jié)),以說(shuō)明根據(jù)不同架構(gòu)模式設(shè)計(jì)出的軟件有什么樣的特點(diǎn),另外還可引入示波器軟件,說(shuō)明如何根據(jù)需求找出合適的架構(gòu)模式并加以修改,直至最終設(shè)計(jì)出合適的軟件架構(gòu)。
2.3 質(zhì)量屬性驅(qū)動(dòng)的軟件架構(gòu)設(shè)計(jì)
如何挑選和設(shè)計(jì)軟件架構(gòu)需要架構(gòu)師的經(jīng)驗(yàn),但是從系統(tǒng)的質(zhì)量屬性出發(fā)設(shè)計(jì)軟件架構(gòu)是一個(gè)很好的實(shí)踐方法。質(zhì)量屬性驅(qū)動(dòng)法(ADD)根據(jù)用戶的需求輸出一系列的架構(gòu)視圖以及視圖中每個(gè)模塊的功能和相互作用關(guān)系。這些輸出結(jié)果是軟件架構(gòu)的原型,根據(jù)這個(gè)原型能夠很快得到最終的軟件架構(gòu)。ADD方法包括3個(gè)步驟:①找出要分析的對(duì)象模塊;②分析該模塊的需求,設(shè)計(jì)該模塊的架構(gòu)模式,分解模塊并分配需求和功能,定義子模塊的接口;③重復(fù)第2步直至模塊無(wú)法分解。
2.4 軟件架構(gòu)文檔編寫(xiě)
軟件架構(gòu)文檔是用于記錄軟件架構(gòu)的重要工具,一方面描述了軟件架構(gòu)師在設(shè)計(jì)系統(tǒng)架構(gòu)時(shí)作出哪些重要決策,另一方面是一種對(duì)后期代碼實(shí)現(xiàn)的約束。架構(gòu)文檔是會(huì)議討論和信息傳遞的基礎(chǔ),一個(gè)清晰完整的架構(gòu)文檔對(duì)所有參與的人員都有重要意義。本知識(shí)點(diǎn)包括:①如何選擇適合的結(jié)構(gòu)作為架構(gòu)文檔的內(nèi)容;②如何根據(jù)模板撰寫(xiě)架構(gòu)文檔。學(xué)生需要學(xué)習(xí)根據(jù)模板將合適的結(jié)構(gòu)寫(xiě)入架構(gòu)文檔中。
2.5 軟件架構(gòu)評(píng)估
架構(gòu)師設(shè)計(jì)好軟件架構(gòu)并且撰寫(xiě)架構(gòu)文檔后,項(xiàng)目參與人員需要對(duì)該架構(gòu)進(jìn)行評(píng)估以確認(rèn)是否符合項(xiàng)目需求。軟件開(kāi)發(fā)前期的架構(gòu)評(píng)估可以避免系統(tǒng)出現(xiàn)致命且難以修改的錯(cuò)誤,提高軟件開(kāi)發(fā)的成功率。SEI提供了一種架構(gòu)評(píng)估的方法,即體系結(jié)構(gòu)權(quán)衡分析方法(architecture tradeoff analysis method,ATAM)。該方法包含9個(gè)步驟,如圖3所示,基于軟件架構(gòu)文檔和需求文檔,參與ATAM討論的人員通過(guò)提問(wèn)的方式向架構(gòu)師確認(rèn)設(shè)計(jì)的軟件架構(gòu)能夠滿足所有功能需求和質(zhì)量屬性方面的需求。如果該架構(gòu)不能滿足某些重要的需求,那么架構(gòu)師需要修改軟件架構(gòu)和文檔直至滿足要求為止。endprint
3 課程實(shí)踐項(xiàng)目
3.1 ICDE系統(tǒng)的質(zhì)量屬性分析
為了使學(xué)生更好地理解不同質(zhì)量屬性的含義,教師可以通過(guò)一個(gè)具體的項(xiàng)目(ICDE系統(tǒng))需求演示該軟件需要具有哪些質(zhì)量屬性。ICDE系統(tǒng)是一個(gè)小型系統(tǒng),用于記錄客戶端用戶的所有操作,如瀏覽頁(yè)面的網(wǎng)址、搜索的字符串等,這些信息將被ICDE系統(tǒng)保存在數(shù)據(jù)庫(kù)里,供第三方工具分析使用,如圖4所示。項(xiàng)目需求顯示該系統(tǒng)要求記錄用戶每個(gè)操作的時(shí)間不超過(guò)0.1秒;另外,該系統(tǒng)要求能同時(shí)將150個(gè)用戶的操作保存至數(shù)據(jù)庫(kù)中。
課堂實(shí)踐中,學(xué)生從性能、可擴(kuò)展性、可修改性、安全性、可用性、集成性6方面具體分析ICDE系統(tǒng)的質(zhì)量屬性。基于場(chǎng)景表示法,學(xué)生需要根據(jù)需求為ICDE系統(tǒng)的每個(gè)質(zhì)量屬性找出一個(gè)具體場(chǎng)景,并明確指出Source of stimulus、Stimulus、Artifact、Environment、Response和Response measure分別是什么。
3.2 KWIC系統(tǒng)的實(shí)現(xiàn)
KWIC系統(tǒng)是一個(gè)關(guān)鍵字檢索系統(tǒng),包含兩個(gè)基本功能:①將用戶輸入的字符串(一般為電影名稱)進(jìn)行移位操作并將移位后的字符串保存至數(shù)據(jù)庫(kù);②按照用戶輸入的關(guān)鍵字在數(shù)據(jù)庫(kù)中查找相關(guān)電影。課堂上學(xué)生將分析4種架構(gòu)模式下KWIC系統(tǒng)的實(shí)現(xiàn)方式,包括數(shù)據(jù)共享架構(gòu)、管道過(guò)濾器架構(gòu)、面向?qū)ο蟮某橄髷?shù)據(jù)類型架構(gòu)和事件驅(qū)動(dòng)的隱式調(diào)用架構(gòu)。每種架構(gòu)都有各自的優(yōu)缺點(diǎn),通過(guò)表格對(duì)比,學(xué)生能夠?qū)W習(xí)到以下幾點(diǎn):①架構(gòu)設(shè)計(jì)跟需求有關(guān),只有適合/不適合的架構(gòu),沒(méi)有絕對(duì)好的架構(gòu);②軟件架構(gòu)模式包含多種策略,是在多個(gè)軟件質(zhì)量屬性方面作出的折衷性決策集合。
學(xué)生在課堂上需要了解KWIC系統(tǒng)的需求,并對(duì)4種不同架構(gòu)的特點(diǎn)進(jìn)行分析。在課下實(shí)踐中,學(xué)生需要下載4種架構(gòu)下實(shí)現(xiàn)好的代碼,根據(jù)每種架構(gòu)特點(diǎn)對(duì)系統(tǒng)已有的功能進(jìn)行修改,如給系統(tǒng)增加新的功能、改變數(shù)據(jù)類型等。通過(guò)該實(shí)踐項(xiàng)目,學(xué)生可以親身體會(huì)不同架構(gòu)對(duì)可能發(fā)生的修改會(huì)產(chǎn)生怎樣的影響。
除此之外,學(xué)生還要回答一系列問(wèn)題,如修改系統(tǒng)功能時(shí)需要修改哪些模塊?該架構(gòu)是否支持這種修改?最后學(xué)生需要將答案整理成報(bào)告提交給教師。
3.3 利用ADD方法的軟件架構(gòu)設(shè)計(jì)
該實(shí)踐項(xiàng)目首先讓學(xué)生學(xué)習(xí)ADD方法如何運(yùn)用在車(chē)庫(kù)門(mén)控制系統(tǒng)的架構(gòu)設(shè)計(jì)中。車(chē)庫(kù)門(mén)控制系統(tǒng)允許用戶通過(guò)開(kāi)關(guān)按鈕、遙控器和家庭信息系統(tǒng)3種方式控制車(chē)庫(kù)門(mén)的開(kāi)閉;另外家庭信息系統(tǒng)可以診斷車(chē)庫(kù)門(mén)控制系統(tǒng)出現(xiàn)的問(wèn)題;最后該系統(tǒng)能夠在多種處理器上運(yùn)行。可以提取出4個(gè)質(zhì)量屬性方面的需求:①檢測(cè)到障礙物時(shí),門(mén)需要在0.1s內(nèi)停止;②車(chē)庫(kù)門(mén)的開(kāi)閉命令;③支持多種處理器;④多種操作界面。從質(zhì)量屬性出發(fā),軟件架構(gòu)增加了虛擬機(jī)模塊和時(shí)間調(diào)度模塊機(jī)制,保證實(shí)現(xiàn)的系統(tǒng)滿足以上需求。第一輪迭代結(jié)果[1]如圖5所示。
繼續(xù)迭代第2個(gè)步驟直至每個(gè)模塊不能繼續(xù)劃分為止,這樣就可以得到一個(gè)軟件架構(gòu)原型。通過(guò)車(chē)庫(kù)門(mén)控制系統(tǒng),學(xué)生可以掌握ADD方法的步驟,學(xué)會(huì)在實(shí)際項(xiàng)目開(kāi)發(fā)中設(shè)計(jì)合適的軟件架構(gòu)。
在課下實(shí)踐中,學(xué)生需要挑選一個(gè)項(xiàng)目進(jìn)行需求分析,找出功能性需求、非功能性需求和約束,利用課堂上講授的ADD方法設(shè)計(jì)出合適的軟件架構(gòu)。該實(shí)踐項(xiàng)目一般需要學(xué)生結(jié)合實(shí)際經(jīng)驗(yàn),對(duì)做過(guò)的項(xiàng)目重新進(jìn)行分析和設(shè)計(jì),觀察利用ADD方法設(shè)計(jì)出的架構(gòu)與自己之前實(shí)現(xiàn)的架構(gòu)有什么區(qū)別,從而體會(huì)兩種架構(gòu)分別有何優(yōu)缺點(diǎn)。
3.4 ATAM的課堂實(shí)踐
課堂教學(xué)中,一部分學(xué)生作為評(píng)估團(tuán)成員提問(wèn),一名學(xué)生作為架構(gòu)師對(duì)自己設(shè)計(jì)的架構(gòu)進(jìn)行講解和回答問(wèn)題。通過(guò)親身實(shí)踐ATAM的9個(gè)步驟,學(xué)生能夠?qū)φ麄€(gè)評(píng)估過(guò)程有更深的理解。
4 教學(xué)效果評(píng)估
4.1 教學(xué)經(jīng)驗(yàn)總結(jié)
在課堂教學(xué)中,學(xué)生對(duì)老師講授的知識(shí)點(diǎn)會(huì)結(jié)合實(shí)際經(jīng)驗(yàn)提出自己的問(wèn)題,如傳統(tǒng)的MVC架構(gòu)如何演化到目前流行的MVP架構(gòu),兩者的區(qū)別有哪些,分別適應(yīng)于何種需求。此外,學(xué)生對(duì)一些策略的具體應(yīng)用很感興趣,如如何應(yīng)用運(yùn)行時(shí)注冊(cè)(runtime registration)、動(dòng)態(tài)查找(dynamic lookup)等策略提高軟件的可修改性;學(xué)生對(duì)云服務(wù)和云計(jì)算的框架也非常感興趣。多年授課經(jīng)驗(yàn)表明,學(xué)生更喜歡基于開(kāi)發(fā)經(jīng)驗(yàn)理解軟件架構(gòu)的基本概念,而不是簡(jiǎn)單地背誦書(shū)上的知識(shí)點(diǎn);在課堂上就所講知識(shí)和教師進(jìn)行實(shí)時(shí)交流,要求教師隨時(shí)解釋不懂的問(wèn)題。總體來(lái)說(shuō),通過(guò)課堂教學(xué),學(xué)生不僅了解了軟件架構(gòu)的基本概念和相關(guān)方法,還學(xué)會(huì)了設(shè)計(jì)軟件架構(gòu)和撰寫(xiě)架構(gòu)文檔以及如何進(jìn)行架構(gòu)評(píng)估。
在課程實(shí)踐中,學(xué)生基于項(xiàng)目實(shí)例進(jìn)一步理解軟件架構(gòu)相關(guān)知識(shí)和設(shè)計(jì)方法。在設(shè)計(jì)ICDE系統(tǒng)時(shí),學(xué)生先在教師的帶領(lǐng)下自己分析該系統(tǒng)包含哪些質(zhì)量屬性的需求,然后參考答案總結(jié)自己遺漏的地方,并且共同分析自己的結(jié)果和課件答案產(chǎn)生差別的原因。在學(xué)習(xí)KWIC系統(tǒng)時(shí),學(xué)生感受到不同的軟件架構(gòu)最終生產(chǎn)出具有不同質(zhì)量的軟件。在課堂上,學(xué)生會(huì)對(duì)每種軟件架構(gòu)的設(shè)計(jì)過(guò)程提出問(wèn)題,如如何根據(jù)需求對(duì)軟件模塊進(jìn)行劃分、每個(gè)模塊的功能如何定義等。在學(xué)習(xí)利用ADD方法設(shè)計(jì)車(chē)庫(kù)門(mén)控制系統(tǒng)時(shí),學(xué)生對(duì)ADD方法的設(shè)計(jì)過(guò)程表現(xiàn)出很大興趣。由于以前從未使用過(guò)類似的軟件架構(gòu)設(shè)計(jì)方法,因此學(xué)生會(huì)發(fā)現(xiàn)ADD方法設(shè)計(jì)出的軟件架構(gòu)和自己設(shè)計(jì)的架構(gòu)有很大不同。學(xué)生針對(duì)ADD方法中的每一步對(duì)模塊功能的細(xì)化提出很多問(wèn)題,體現(xiàn)出積極思考的過(guò)程。在利用ATAM方法進(jìn)行架構(gòu)質(zhì)量評(píng)估時(shí),學(xué)生在課堂上展開(kāi)了熱烈討論。作為架構(gòu)師的學(xué)生對(duì)評(píng)估團(tuán)成員的提問(wèn)一一作答,有時(shí)會(huì)被問(wèn)題問(wèn)住,繼而發(fā)現(xiàn)軟件架構(gòu)中存在的問(wèn)題并加以改正。通過(guò)實(shí)踐,學(xué)生更加熟悉了ATAM方法的整個(gè)流程。
最后,學(xué)生結(jié)合自己做過(guò)的項(xiàng)目,利用ADD方法進(jìn)行架構(gòu)設(shè)計(jì),如有的學(xué)生設(shè)計(jì)了安全房屋系統(tǒng)的架構(gòu),有的學(xué)生為在線旅游網(wǎng)站設(shè)計(jì)了軟件架構(gòu)。對(duì)于每個(gè)項(xiàng)目,學(xué)生都認(rèn)真考慮和仔細(xì)分析,充分將課堂上所學(xué)的知識(shí)轉(zhuǎn)化到實(shí)踐中。
4.2 教學(xué)中遇到的問(wèn)題
軟件體系結(jié)構(gòu)這門(mén)課程包含的內(nèi)容很多,從相關(guān)理論到實(shí)際應(yīng)用,每一點(diǎn)都需要教師閱讀大量材料并且積累豐富的開(kāi)發(fā)經(jīng)驗(yàn)。在課堂教學(xué)中,學(xué)生會(huì)從各個(gè)角度提問(wèn),有時(shí)甚至需要教師課下查閱資料才能回答學(xué)生的問(wèn)題。教師在授課過(guò)程中也需要不斷積累學(xué)生的問(wèn)題,通過(guò)總結(jié)分類發(fā)現(xiàn)學(xué)生關(guān)注的焦點(diǎn),針對(duì)這些問(wèn)題作好充分準(zhǔn)備,才能滿足學(xué)生的求知欲望。
在課程實(shí)踐項(xiàng)目中,ICDE系統(tǒng)和KWIC系統(tǒng)的需求有些過(guò)時(shí),跟目前各種新型項(xiàng)目(如基于移動(dòng)平臺(tái)的項(xiàng)目開(kāi)發(fā)、包含人工智能的項(xiàng)目開(kāi)發(fā)等)的需求差別較大,導(dǎo)致學(xué)生通過(guò)課程實(shí)踐獲得的經(jīng)驗(yàn)還需要花時(shí)間移植到目前流行的架構(gòu)設(shè)計(jì)中,因此未來(lái)需要對(duì)課程實(shí)踐項(xiàng)目進(jìn)行改進(jìn),以滿足當(dāng)下的項(xiàng)目開(kāi)發(fā)需求。
5 結(jié) 語(yǔ)
經(jīng)過(guò)4年的教學(xué)實(shí)踐,同濟(jì)大學(xué)軟件學(xué)院開(kāi)設(shè)的軟件體系結(jié)構(gòu)這門(mén)課形成了完整的體系結(jié)構(gòu),既有知識(shí)點(diǎn)教學(xué),又有課程實(shí)踐,囊括了軟件架構(gòu)的基本知識(shí)。學(xué)生表示在課堂上既學(xué)到了軟件架構(gòu)的基礎(chǔ)理論,又動(dòng)手寫(xiě)代碼解決問(wèn)題,理解了每個(gè)知識(shí)點(diǎn)的實(shí)際應(yīng)用。在以后的教學(xué)中,我們將繼續(xù)關(guān)注當(dāng)前流行的軟件架構(gòu)模式和發(fā)展趨勢(shì),及時(shí)更新課程內(nèi)容,努力使學(xué)生接觸最新的技術(shù),讓學(xué)生具有更強(qiáng)的能力和競(jìng)爭(zhēng)力。
參考文獻(xiàn):
[1] Bass L, Clements Kazman R. Software architecture in practice[M]. 3rd ed. Upper Saddle River: Addison-Wesley, 2012: 1-2.
[2] Software Architecture(Spring 2017)[EB/OL]. [2017-05-07]. http://sse.tongji.edu.cn/yingshen/course/SA2017Spring/index.html.
[3] Richards M. Software architecture patterns[M]. Sebastopol: OReilly Media, 2015: 45-46.
(編輯:宋文婷)endprint