龔蘭蘭,凌興宏,2
(1. 蘇州大學 文正學院,江蘇 蘇州 215006;2. 蘇州大學 計算機科學與技術學院,江蘇 蘇州 215006)
Web 應用開發實踐需綜合前端、數據庫、程序設計語言和框架等多門課程知識,是計算機專業學生進行完整系統開發的實踐課程。目前項目實踐的內容都是以較為傳統的JSP+Javabean+Servlet 形式進行,缺乏對行業流行框架技術的理解和應用。另外,在系統開發過程中,采用傳統的瀑布開發模型,效率較低,流程不規范,缺乏有效的管理和質量控制手段。本文將SSM 輕量級框架引入Web 應用實踐,進行系統開發,同時采用敏捷開發模式進行開發流程的管理,指導學生通過規定環節循序漸進地完成項目的開發。
SSM 是Spring、Spring MVC 和MyBatis 集成的框架,是目前比較主流的Java EE 企業級框架,適用于搭建各種企業級應用系統[1]。Spring 是一個輕量級的控制反轉(IoC)和面向切面(AOP)的容器框架[2]。它可以裝載bean,利用這個機制,就不需要在每次使用某個類的時候進行初始化,很少用到關鍵字new[3]。Spring MVC 分離了控制器、模型、分發器以及處理程序對象的角色,這種分離讓它們更容易進行定制。MyBatis 是一個基于Java 的持久層框架, 是對jdbc 的封裝,它讓數據庫底層操作變得透明[4]。MyBatis 使用XML 或注解用于配置和原始映射,通過配置文件關聯到各實體類的Mapper 文件,Mapper文件中配置了每個類對數據庫所需進行的sql 語句映射[5]。可以說,MyBatis 是一個用來幫助管理數據增刪改查的框架。
SSM 是標準的MVC 模式,將整個系統劃分為View 層、Controller 層、Service 層和DAO 層4 層[3],用Spring MVC 負責請求的轉發和視圖管理,用Spring實現業務對象管理,用MyBatis 作為數據對象的持久化引擎[5]。由于DAO、Service 兩層之間的低耦合特性,在開發時要獨立進行;由于Controller、View 兩層之間的高耦合特性,在開發時需要關聯進行。
SSM 框架是迄今頗為主流的企業級架構方案,其簡便易懂的特點是被許多公司廣泛使用的重要原因。
傳統的軟件開發一般采用瀑布模型,需求文檔是架構設計的主要依據,前期定下需求和設計后,進行編碼實現,開發過程中按照前期的設計進行。這種開發模式將開發過程和用戶的需求分割開來,面對后期用戶需求的改變,變更成本和復雜度較大。
敏捷開發(agile development)是一種以用戶需求為核心,采用迭代、循序漸進的思路進行軟件開發的方法[6],它的核心思想在于快速、增量式地交付可工作的軟件。
常用的敏捷開發有XP 和Scrum 兩種方法,本文采用Scrum 方法進行敏捷開發。Scrum 是一個包括一系列實踐和預定義角色的過程骨架,是一種流程、計劃、模式,用于有效率地開發軟件[7-8]。
圖1 是敏捷開發方法Scrum 的流程。項目的功能需求被分解成若干個用戶故事(user story),整個項目分幾個迭代周期來完成,每個迭代周期(sprint)在制定計劃時選擇實現其中一個或兩個user story。每個user story 又被拆分成若干個迭代任務(task),開發人員每天完成其中的幾個task。經過2~6 周的迭代過程,具備可視、可集成、可工作的特征,形成可交付的軟件增量,團隊成員每天討論前一天完成的工作和當天的任務。

圖1 Scrum 開發流程
在敏捷開發中,需求按迭代式進行收集,把原先軟件過程前期的架構設計,分散到整個敏捷開發軟件過程中。
采用Scrum 循序漸進的迭代式開發,降低了開發難度,對于沒有開發經驗的學生來說,更有利于引導他們規范、有序地進行項目開發,有利于他們掌握系統的開發流程。
在Web 應用開發實踐中,使用SSM 框架進行校友管理系統項目開發,采用Scrum 敏捷開發模式對整個開發流程進行管理,期望達成以下目標:(1)理解和掌握SSM 框架,使用框架對Web 系統進行設計和實現;(2)參與完整的系統開發流程,從需求分析、用戶界面設計到業務邏輯和數據存儲;(3)養成良好的專業素養,遵循軟件開發規范,能夠利用各種開發工具輔助編程、糾錯和測試等;(4)掌握迭代開發的方法,學會將復雜系統分解成可執行的子任務,迭代實現分期目標;(5)提升團隊組織和協作能力。
校友管理系統主要包括:前臺的校友信息采集、電子校友卡的注冊和生成、活動報名等功能;后臺的校友信息查詢、審核、活動發布和統計等功能。
項目采用SSM 的4 層架構進行開發,將系統劃分為View 層、Controller 層、Service 層和DAO 層。
其中View 層采用較流行的BootStrap 框架進行界面設計,Dao 層由Mapper 文件實現,Controller 層、Service 層、Dao 層之間的數據以Pojo 對象進行封裝傳遞(見圖2)。

圖2 SSM 框架流程
在實現的過程中,具體編寫流程如圖3 所示。其中View 層(JSP 頁面)和Controller 層之間相互關聯,在編譯開發時,兩者必須同時進行。
在Scrum 開發流程中,整個軟件產品的需求被拆分為若干個用戶故事(user story,簡寫為US),每個user story 主要描述:作為某一角色我需要做什么,以達到什么目的(as a ……I need to……so that……),即從用戶的角度描述不同角色對于產品功能的具體需求。按照這樣的拆分原則,我們將校友信息管理系統拆分為若干個用戶故事,如表1 所示。

圖3 SSM 各層開發流程

表1 產品用戶故事
使用Scrum 方法,整個項目開發分成幾個迭代周期(sprint)來完成。在開發過程中,需求分析也是迭代進行的,每個迭代周期針對當前的目標需求進行設計,隨著每次迭代的進行,逐步調整架構設計。
每個迭代可以選擇一到兩個user story 來完成。在校友系統中,每個sprint 選擇一個user story 為目標來進行開發,整個系統共分為4 個sprint 來完成。下面以其中的第一個sprint 為例,制定迭代計劃,進行任務分解。一般由Scrum master 來負責迭代計劃的制定,這里可以由教師或小組長來負責。
為了使學生更好地理解和進行Scrum 開發,克服畏難心理,增強成就感,在進行任務分解時,應盡可能使每個任務task 較小,可執行性較強,一般每個task預估完成時間最好在1~3 h。
制定第一個迭代計劃時,根據SSM 框架的開發流程,將普通校友功能的開發工作分解為11 個task(編號為100-110),并且預估了每個任務的完成時間,如圖4 所示。然后由開發團隊的成員進行任務認領,或由Scrum master 進行任務分配。每個task 都可能處于待做(to do)、進行中(in progress)、審查(review)、測試(user test)、完成(done)和 待定(pending)等狀態之一。

圖4 迭代計劃
開發人員開始做某個task 的時候,要把狀態更新到in progress,做完后由開發組長(助教或教師)負責代碼審查(code review),然后進行功能測試,測試完成后可以更改為done 狀態。其中,在審查或測試階段發現任何問題,可以暫停狀態更新,并創建issue提醒相應的開發人員解決問題,暫時解決不了或者無法確定的更新為pending 狀態。
在迭代開發過程中,團隊成員每天開例會,討論前一天完成的任務和當天要做的任務,以及開發過程中遇到的問題。在校友系統開發過程中,其他幾個sprint 對應的迭代計劃制定過程類似,不再一一敘述。
在團隊開發的過程中,尤其是在Scrum 開發流程下,為了更好地進行項目管理和過程控制,以下幾個問題必須解決:(1)任務進度的管理;(2)開發人員代碼的提交、合并;(3)版本的控制。為解決這些問題并有效提高開發流程的管理效率,必須借助一些工具。
TFS 或者Jira 是目前采用較多的兩種項目管理與事務跟蹤工具,被廣泛應用于缺陷跟蹤、客戶服務、需求收集、流程審批、任務跟蹤、項目跟蹤和敏捷管理等工作領域[9]。借助這些管理工具,能方便我們制定迭代計劃、進行任務分解和任務狀態跟蹤等,將大大提高管理和開發的效率。校友管理系統使用Jira 作為Scrum 開發流程管理工具。
代碼的版本控制問題是所有開發團隊都不得不面臨和必須解決的,即使不采用敏捷開發流程,即使沒有其他項目管理工具,版本控制都是必不可少的。目前版本控制工具很多,本系統開發主要使用較為主流的Git作為版本控制工具,使用Gitlab 搭建代碼庫。
在以往的項目開發過程中,由于學生缺乏開發經驗、沒有形成良好的代碼編寫習慣,又缺乏統一的標準和過程管理,往往導致項目的代碼質量較差,難于維護[10]。
Scrum 開發流程比較重視質量控制。要求開發人員每天開始新的開發工作前,先從代碼庫拿取最新代碼與自己本地代碼合并,然后進行開發工作。完成一個task 后提交自己的代碼到代碼庫之前,一定要確保提交的代碼是可以運行的,沒有任何bug,否則會影響其他開發人員的開發工作和整個系統的運行。
在迭代過程中,可以采用以下步驟來保證和提高整個項目的代碼質量:統一編碼規范、代碼樣式;靜態代碼分析(static code review);單元測試;持續集成;代碼評審和重構(review & refactor)[11]。
在系統開發過程中,為了保證代碼質量,要求學生遵守良好的編碼規范、代碼樣式,使用靜態代碼分析工具FindBugs 檢測Java 代碼質量。FindBugs 不需要運行代碼,可直接對Java 文件和Class 文件進行分析,通過一些檢查條件的設置,即可快速找到代碼中的錯誤和潛在缺陷[12]。
另外,在迭代計劃中設有專門的評審環節,主要是對提交后的代碼做評審(code review),檢查提交是否規范,是否存在其他問題。在code review 過程中發現問題后,可以建立相應的issue 或task,分派給對應的開發人員進行代碼重構,待問題解決后可以更新task 的狀態到用戶測試。
在測試過程中,一方面是通過寫單元測試案例對代碼功能進行測試,借助測試工具檢查代碼覆蓋率;另一方面是用戶測試,主要是從界面操作對系統的功能進行測試。其間發現任何問題、需求變動或產生新的需求,都可以在迭代計劃中建立對應的task,進行迭代需求分析和設計。
傳統的項目考核一般是在項目結束后驗收軟件作品,學生進行展示和答辯,作為對學生最終考核的依據。采用敏捷開發流程后,考核涉及整個開發流程的多方面內容: (1)完成的任務數量和難度。在項目管理工具Jira 里制定的迭代計劃,每個任務的執行人和預估時間都是公開的;(2)提交(commit)的信息。在版本庫Gitlab 里面可以看到每次commit 的時間、人員等信息。(3)代碼質量。可根據代碼評審時發現的問題數量及利用代碼靜態分析工具時的評分等作為考核參考。(4)項目進度。實際花費時間和預估時間的差,在Jira 系統中可通過燃盡(burn out)圖體現。(5)軟件功能實現情況。
通過以上5 個方面的考核,對每個開發小組進行評分,在考慮小組整體完成情況條件下,針對每個學生具體完成任務的數量、代碼質量和開發時間等分別評分。
將SSM 輕量級框架引入Web 應用開發,以校友系統為例進行任務驅動的案例式教學,旨在使學生學習和掌握目前流行的企業級架構框架,對多門專業課程進行綜合理解、應用,提升專業知識水平和系統開發技術。
系統開發采用敏捷開發的Scrum 流程,通過用戶故事分解、迭代計劃制定、任務分解等過程,將一個復雜的項目分成幾個子項目來迭代完成。每一個迭代周期只針對當前的目標進行需求分析、設計和實現,引導學生循序漸進地完成一個系統的開發,降低了完整系統開發的難度,提高了學生的開發興趣和開發能力。
讓學生體驗了企業真實的開發流程,學習和掌握了除編程以外的過程控制、質量控制等技術手段和工具使用,提高了開發效率和軟件質量,掌握了企業主流的技術工具,實現了與行業及市場的接軌,提高了理論知識應用能力。
總體來說,引入企業級應用框架技術及敏捷開發流程進行實踐教學,使學生更加貼近企業真實開發環境,激發了學生的學習興趣和積極性,從整體上提升了他們對工程問題的分析能力和解決能力。