賈玉祥,昝紅英
(鄭州大學 計算機與人工智能學院,河南 鄭州 450001)
軟件體系結構(Software Architecture)又稱軟件架構,是指對系統(tǒng)進行推理所需的一組結構,包括軟件元素及其之間的關系和二者的屬性[1]。軟件架構涵蓋多種軟件結構,大致分為3 類:靜態(tài)結構、動態(tài)結構和分配(Allocation)結構。軟件架構設計就是在需求分析的基礎上對軟件高層結構進行建模(通常使用UML 工具),以指導后續(xù)的詳細設計等軟件開發(fā)活動。
軟件體系結構課程教學有一定難度[2-3],原因包括以下幾個方面:①教學內容比較抽象,軟件架構屬于早期設計階段,與編碼實現(xiàn)階段有一定距離,而學生對編碼更熟悉,也更感興趣;②軟件架構關注的是軟件質量屬性,只有在復雜度較高的項目中才能體現(xiàn)價值,而學生接觸到的項目多為課程設計類的小項目,且主要關注功能實現(xiàn),不關心質量屬性;③教材內容與業(yè)界主流技術脫節(jié),案例缺少源碼等配套資料,學生只能從用戶的角度來分析軟件架構。
近年來,高校在軟件體系結構課程教學方面進行了一系列探索。文獻[4]提出貫穿式案例實踐教學法,設計一套可貫穿軟件體系結構課程主要知識點的若干案例,組織學生分組實踐,設計軟件架構;文獻[5]將高等教育心理學中的學習遷移理論應用于軟件體系結構教學;文獻[6]針對應用型本科院校,提出將軟件體系結構課程教學內容整合為軟件體系結構原理和軟件體系結構設計兩部分,并利用案例驅動教學;文獻[7]從教學內容、課程實踐項目、教學效果評估3 個方面探討研究生軟件體系結構課程建設方案;文獻[8]提出將翻轉課堂教學模式應用于軟件體系結構課程教學,以任務驅動為主線,實現(xiàn)課程教學前、中、后3部曲操作。
引入開源項目[9-10]也是提高教學效果的一個有效手段,源碼可以展現(xiàn)軟件的靜態(tài)結構,也可以通過部署、運行、調試,體現(xiàn)軟件的動態(tài)結構。結合源碼可以對軟件架構有一個比較全面的了解,同時基于源碼的架構恢復也是軟件體系結構的一個研究方向[11-13]。因此,源碼為軟件體系結構教學與科研的結合提供了一個很好的切入點。
“案例+開源”將已有的案例教學法向前推進了一步,本文引入開源框架,提出“案例+開源+框架”教學法,除架構分析與設計外,進一步考慮了系統(tǒng)實現(xiàn)?;诳蚣艿能浖_發(fā)正是軟件體系結構的價值體現(xiàn)[14],是構件層面的軟件復用[15]?;谥髁鏖_源框架進行軟件體系結構教學,既具有開源項目的優(yōu)勢,又能使學生掌握框架的使用方法,為將來從事軟件開發(fā)工作打下一定基礎。本文采用Java生態(tài)中最流行的開源框架Spring,將教學內容與Spring 案例相結合,探索基于開源框架的軟件體系結構教學方法。
將軟件體系結構與Spring 相結合的一些最新實踐為本文教學方法提供了參考,《Software Architecture with Spring 5.0》[16]基于Spring 介紹了客戶服務器(Client-Server,CS)架構、模型—視圖—控制器(Model-View-Controller,MVC)架構、事件驅動架構、管道過濾器(Pipe-and-Filter)架構、微服務(Microservices)架構和無服務器(Serverless)架構共6 種架構風格。南京大學曹春教授[17]的軟件體系結構課程結合Spring 講授了基于構件的架構、分層架構、CS 架 構、MVC 架 構、RESTful(Representational State Transfer)架構、可擴展架構、管道過濾器架構、事件驅動架構、響應式(Reactive)架構、微服務架構、云計算架構及無服務器架構等10余種架構風格。
本課程面向軟件工程、計算機科學與技術專業(yè)的高年級本科生,教學內容及學時安排如表1 所示。將課程理論與實踐相結合,并安排討論課進行學習實踐結果的展示與驗收,課程主要內容包括:概述、軟件結構與視圖、軟件質量屬性及策略、軟件體系結構風格、軟件體系結構設計與評估。概述部分介紹軟件體系結構基本概念、軟件體系結構的作用,并引入思政元素;軟件結構與視圖是軟件架構的核心概念,是軟件在不同視角下所呈現(xiàn)的模樣;軟件質量屬性是軟件架構的決定因素,每一種質量屬性都有一定的架構策略;軟件體系結構風格是課程的主體內容,會介紹不同風格的軟件結構、質量屬性表現(xiàn)、優(yōu)缺點等內容,并結合Spring 進行實驗和案例分析;軟件體系結構設計與評估介紹屬性驅動的軟件體系結構設計方法(Attribute-Driven Design,ADD)以及基于場景的軟件體系結構評估方法。課程一共有48 學時,其中實驗環(huán)節(jié)16 個學時,軟件質量屬性及策略、軟件體系結構風格兩部分內容在主題選擇上具有很好的彈性,可以根據(jù)不同學時安排靈活選擇主題。
Table 1 Teaching contents and hour arrangement表1 教學內容及學時安排
(1)軟件結構與視圖。軟件結構可分為靜態(tài)結構、動態(tài)結構和分配結構。靜態(tài)結構主要是模塊(Module)結構,包括模塊的分解與使用、模塊的層次、類之間的結構、數(shù)據(jù)項之間的結構等;動態(tài)結構又稱為構件—連接件(Component &Connector,C&C)結構,是軟件運行時的結構,包括服務交互、進程/線程并發(fā)等;分配結構描述的是軟件與周圍環(huán)境的關系,如項目目錄結構描述模塊與文件的關系、部署結構描述軟件與硬件的關系、分工結構描述模塊與開發(fā)小組的關系等。
為軟件結構建立的模型又稱為視圖(View)。要完整地呈現(xiàn)一個軟件架構,往往需要多種結構對應的多個視圖,即多視圖模型。“4+1”視圖模型分別從4 種不同涉眾的角度,采用邏輯視圖、開發(fā)視圖、運行視圖和部署視圖來描述軟件架構,最后用用例視圖將不同視圖統(tǒng)一起來,每個視圖都可以用一種或多種UML 圖形來描述。
(2)軟件質量屬性及策略。軟件質量屬性是描述軟件質量好壞的指標,用來描述軟件的非功能性需求。常見的質量屬性指標有:可用性(Availability)、互操作性(Interoperability)、可修改性(Modifiability)、性能(Performance)、安全性(Security)、可測試性(Testability)及易用性(Usability)等,其中可用性、互操作性、性能、安全性、易用性為運行期質量屬性,可修改性、可測試性為開發(fā)期質量屬性。功能需求一般用用例(Usage Case)表示,而質量屬性需求一般用場景(Scenario)表示,每一個質量屬性都會有相應的策略保障需求達成,例如:大型網(wǎng)站性能相關策略有分庫分表、讀寫分離、動靜分離、緩存等,可用性相關策略有異地多活、服務降級、限流等。
(3)軟件體系結構風格。軟件無論大小都有架構,按照組成軟件的元素及其交互方式不同,可把軟件架構分為不同風格。分層風格是最常見的軟件架構風格,對應軟件的模塊結構,3 層架構是常見的應用軟件開發(fā)架構,根據(jù)構件與連接件的不同形成不同的架構風格;調用返回風格是過程之間的顯式調用;事件驅動風格是基于消息機制的隱式調用;管道與過濾器風格由傳輸數(shù)據(jù)的管道與加工數(shù)據(jù)的過濾器構成;MVC 風格將模型與表示分離,并通過控制器進行交互,是Web 應用的常見風格;客戶服務器風格的系統(tǒng)包括客戶端和服務器兩類構件,連接件采用“請求—響應”機制。瀏覽器服務器(Browser-Server,BS)架構可看作CS 架構的特例,為了提高系統(tǒng)之間的互操作性,提出面向服務的架構(Service Oriented Architecture,SOA)風格,系統(tǒng)之間的交互體現(xiàn)為服務的提供與消費,服務的注冊、發(fā)現(xiàn)及使用均有標準化的協(xié)議。Web Service 是SOA 在Web 上的實現(xiàn),采用WSDL、UDDI、SOAP等一系列基于XML 的標準。RESTful 風格把服務看作對資源的訪問,采用HTTP 的GET、POST、PUT、DELETE 等操作訪問資源,API 簡潔明了,數(shù)據(jù)可以采用輕量、高效的JSON 形式。
Spring 是當前最流行且開源的Java 開發(fā)框架,其首先是一個控制反轉(Inversion of Control,IOC)容器,負責管理對象的生命周期及對象之間的依賴關系,支持面向切面的編程(Aspect Oriented Programming,AOP)。Spring 為軟件開發(fā)提供一站式解決方案,包括Web 框架SpringMVC、持久層框架Spring Data、云計算框架Spring Cloud 等,也可以很方便地集成第三方框架,可以很好地支持Web 應用、事件驅動、響應式系統(tǒng)、微服務、云計算、無服務器架構、批處理等軟件系統(tǒng)開發(fā)。Spring Boot 的出現(xiàn)更是簡化了基于Spring的開發(fā)過程,實現(xiàn)了基于構件的軟件開發(fā)。
鄭州大學軟件工程、計算機科學與技術專業(yè)大四上學期開設了軟件體系結構課程,本文對2018 級計算機科學與技術專業(yè)的本科生進行框架使用情況問卷調查,回收有效問卷166 份,結果如表2 所示。由表2 可知,超過40%的學生使用過Spring 框架,大約1/4 的學生使用過SpringMVC,超過1/3 的學生使用過Spring Boot,說明Spring 有一定群眾基礎,且需要進一步普及,適合與軟件體系結構課程相結合。二者結合既有助于學生對軟件體系結構知識的理解,又有助于對Spring的掌握與應用。
Table 2 Proportion of framework usage表2 框架使用比例 %
Spring 官網(wǎng)有一系列公開的學習資料,其中Spring guides 中的案例就是很好的入門材料。如表3 所示,Spring guides 中的案例根據(jù)復雜程度分為3 種類型:Getting started guides 案例一般學習用時15~30min;Topical guides 案例一般學習用時60min;Tutorial 案例一般學習用時2~3h。因此,可根據(jù)課程內容選擇相應案例進行學習,如表4 所示。在學習一種架構風格時,可以基于Spring Boot 起步依賴從頭實現(xiàn)一個案例,每種風格的程序依賴構件不盡相同,例如:MVC、RESTful 風格依賴于Spring Web,SOA 風格依賴于Spring Web 與Spring Web Services,而Pipe-and-Filter 風格依賴于Spring Batch。
基于Spring 的開源項目非常多,尤其是Web 應用。Spring 官方在Github 上也維護著一些學習案例,其中spring-petclinic 是一個很有影響的基于MVC 架構的Web數(shù)據(jù)管理系統(tǒng)(Petclinic-V1)。在此基礎上,Spring petclinic community 給出了petclinic 其他架構風格的實現(xiàn),包括MVC 架構的改進版本spring-framework-petclinic(Petclinic-V2)、RESTful 風格的版本spring-petclinic-rest(Petclinic-V3)以及微服務風格的版本spring-petclinic-microservices等。
Table 3 Spring guides cases表3 Spring guides案例
Table 4 Cases of different architecture styles表4 不同架構風格的案例
表5 給出了MVC 架構及RESTful 架構相關的3 個版本的比較。Petclinic-V2 比Petclinc-V1 增加了一個service層,項目目錄結構與層次相對應且更加清晰,在數(shù)據(jù)持久化方面支持3 種持久化方案。在視圖和基礎框架方面,兩個版本在Thymeleaf 與JSP、Spring Boot 與Spring framework之間作出了不同選擇。Petclinic-V3 為RESTful 風格,實現(xiàn)了前后端分離,可以支持不同的前端實現(xiàn),如angular、angularjs、react 等。結合源代碼可以更細致地比較不同架構風格的區(qū)別,例如,對比MVC 可更清晰地看到RESTful 風格URL 的優(yōu)點。
Table 5 Case comparison of different architecture styles表5 不同架構風格案例比較
基于現(xiàn)有的petclinic 源碼,可以進一步完善功能、優(yōu)化性能。在功能方面:①可以完善數(shù)據(jù)管理功能。系統(tǒng)對owner、pet、petType、visit、vet、specialty 等數(shù)據(jù)進行管理,未建立visit 與vet 的關聯(lián),未對vet 相關數(shù)據(jù)進行增刪改處理,可對此進行完善;②可以增加用戶角色,進行權限管理。在性能調優(yōu)方面,則可以借鑒Julien Dubois 的調優(yōu)實踐進行性能監(jiān)測,調整組件或策略進行性能優(yōu)化。此部分內容可以作為軟件質量屬性中可修改性和性能方面相關策略的評估與實踐。
學生在大學前3 年里已經(jīng)獨自開發(fā)或合作開發(fā)了一些軟件系統(tǒng),這些系統(tǒng)以Java Web 居多,學生對該類系統(tǒng)最為熟悉。因此,每人選擇一個Java Web 系統(tǒng),結合軟件體系結構課程知識對系統(tǒng)進行架構分析,包括使用UML對軟件結構進行建模,分析軟件的質量屬性(采用了哪些保障質量屬性的策略,依據(jù)是什么?)與架構風格(采用了哪些架構風格,依據(jù)是什么?)?;趯浖軜嫷姆治?,使用Spring 對系統(tǒng)進行重構,MVC 架構采用SpringMVC(或替換Struts2),RESTful 架構采用SpringMVC(或替換CXF),持久層采用Spring Data JPA(或替換MyBatis)。學生對自己開發(fā)的項目非常熟悉,可以把更多精力放到基于構件的軟件開發(fā)方法上,體會軟件架構重用的價值。
在2021-2022 學年第一學期對2018 級計算機科學與技術專業(yè)的學生首次采用本文提出的教學方法(稱為教改后),在2020-2021 學年第一學期對2017 級計算機科學與技術專業(yè)的學生采用“基于一個復雜案例”的教學方法(稱為教改前)。學期末,學生通過學校教學質量管理平臺填寫調查問卷進行教學評價。教改前后評價結果如表6所示。
可見教改前此課程評分較低,低于同類課程的院系平均分和全校平均分。原因之一可能是課程采用的案例“基于移動互聯(lián)網(wǎng)的速遞物流跟蹤系統(tǒng)”復雜度較高,包括前后端分離、后端Spring/Hibernate/CXF 框架、Android 端、Web端、掃碼、定位、地圖等技術,與大四上學期學生面臨考研,沒有足夠的精力投入到課程中這一現(xiàn)實問題形成矛盾。
Table 6 Teaching evaluation scores by students before and after adopting the proposed teaching method表6 教改前后學生評教得分
與教改前相比,本文教學方法的評教得分提升了9.45個百分點,高于同類課程院系平均分3.09 個百分點,并高于同類課程全校平均分2.07 個百分點。學生評教具體指標如表7 所示,由此可見,本文提出的教學方法在所有指標上都高于同類課程院系平均分和全校平均分,尤其在課程資源、知識掌握、能力提升、素養(yǎng)提升等方面優(yōu)勢較為明顯。這在一定程度上反映了基于開源框架的軟件體系結構教學方法是可行、有效的。
本文針對軟件體系結構課程內容抽象、落地難的問題,探索了基于開源框架的“案例+開源+框架”教學方法。在教學內容選擇上突出實踐性,引入主流框架技術;以軟件質量屬性策略、軟件架構風格為綱組織內容,主題選擇彈性強,可以靈活適應不同的學時安排;采用Spring 開源案例和教學資料鍛煉學生基于源碼分析軟件架構的能力,同時鍛煉基于構件的軟件開發(fā)能力。一個學期的教學實踐結果顯示,采用本文提出的教學方法后,學生參與課程的積極性更高,學習效果也得到了提高。下一步將在突出課程實踐性的同時,兼顧知識體系的完整性與均衡性,加強軟件體系結構設計相關內容的學習,并增加大型系統(tǒng)常用的軟件中間件技術。
Table 7 Metrics of teaching evaluation by students表7 學生評教指標