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