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