龔蘭蘭,凌興宏,2
(1. 蘇州大學(xué) 文正學(xué)院,江蘇 蘇州 215006;2. 蘇州大學(xué) 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,江蘇 蘇州 215006)
Web 應(yīng)用開發(fā)實(shí)踐需綜合前端、數(shù)據(jù)庫(kù)、程序設(shè)計(jì)語(yǔ)言和框架等多門課程知識(shí),是計(jì)算機(jī)專業(yè)學(xué)生進(jìn)行完整系統(tǒng)開發(fā)的實(shí)踐課程。目前項(xiàng)目實(shí)踐的內(nèi)容都是以較為傳統(tǒng)的JSP+Javabean+Servlet 形式進(jìn)行,缺乏對(duì)行業(yè)流行框架技術(shù)的理解和應(yīng)用。另外,在系統(tǒng)開發(fā)過程中,采用傳統(tǒng)的瀑布開發(fā)模型,效率較低,流程不規(guī)范,缺乏有效的管理和質(zhì)量控制手段。本文將SSM 輕量級(jí)框架引入Web 應(yīng)用實(shí)踐,進(jìn)行系統(tǒng)開發(fā),同時(shí)采用敏捷開發(fā)模式進(jìn)行開發(fā)流程的管理,指導(dǎo)學(xué)生通過規(guī)定環(huán)節(jié)循序漸進(jìn)地完成項(xiàng)目的開發(fā)。
SSM 是Spring、Spring MVC 和MyBatis 集成的框架,是目前比較主流的Java EE 企業(yè)級(jí)框架,適用于搭建各種企業(yè)級(jí)應(yīng)用系統(tǒng)[1]。Spring 是一個(gè)輕量級(jí)的控制反轉(zhuǎn)(IoC)和面向切面(AOP)的容器框架[2]。它可以裝載bean,利用這個(gè)機(jī)制,就不需要在每次使用某個(gè)類的時(shí)候進(jìn)行初始化,很少用到關(guān)鍵字new[3]。Spring MVC 分離了控制器、模型、分發(fā)器以及處理程序?qū)ο蟮慕巧?,這種分離讓它們更容易進(jìn)行定制。MyBatis 是一個(gè)基于Java 的持久層框架, 是對(duì)jdbc 的封裝,它讓數(shù)據(jù)庫(kù)底層操作變得透明[4]。MyBatis 使用XML 或注解用于配置和原始映射,通過配置文件關(guān)聯(lián)到各實(shí)體類的Mapper 文件,Mapper文件中配置了每個(gè)類對(duì)數(shù)據(jù)庫(kù)所需進(jìn)行的sql 語(yǔ)句映射[5]。可以說,MyBatis 是一個(gè)用來幫助管理數(shù)據(jù)增刪改查的框架。
SSM 是標(biāo)準(zhǔn)的MVC 模式,將整個(gè)系統(tǒng)劃分為View 層、Controller 層、Service 層和DAO 層4 層[3],用Spring MVC 負(fù)責(zé)請(qǐng)求的轉(zhuǎn)發(fā)和視圖管理,用Spring實(shí)現(xiàn)業(yè)務(wù)對(duì)象管理,用MyBatis 作為數(shù)據(jù)對(duì)象的持久化引擎[5]。由于DAO、Service 兩層之間的低耦合特性,在開發(fā)時(shí)要獨(dú)立進(jìn)行;由于Controller、View 兩層之間的高耦合特性,在開發(fā)時(shí)需要關(guān)聯(lián)進(jìn)行。
SSM 框架是迄今頗為主流的企業(yè)級(jí)架構(gòu)方案,其簡(jiǎn)便易懂的特點(diǎn)是被許多公司廣泛使用的重要原因。
傳統(tǒng)的軟件開發(fā)一般采用瀑布模型,需求文檔是架構(gòu)設(shè)計(jì)的主要依據(jù),前期定下需求和設(shè)計(jì)后,進(jìn)行編碼實(shí)現(xiàn),開發(fā)過程中按照前期的設(shè)計(jì)進(jìn)行。這種開發(fā)模式將開發(fā)過程和用戶的需求分割開來,面對(duì)后期用戶需求的改變,變更成本和復(fù)雜度較大。
敏捷開發(fā)(agile development)是一種以用戶需求為核心,采用迭代、循序漸進(jìn)的思路進(jìn)行軟件開發(fā)的方法[6],它的核心思想在于快速、增量式地交付可工作的軟件。
常用的敏捷開發(fā)有XP 和Scrum 兩種方法,本文采用Scrum 方法進(jìn)行敏捷開發(fā)。Scrum 是一個(gè)包括一系列實(shí)踐和預(yù)定義角色的過程骨架,是一種流程、計(jì)劃、模式,用于有效率地開發(fā)軟件[7-8]。
圖1 是敏捷開發(fā)方法Scrum 的流程。項(xiàng)目的功能需求被分解成若干個(gè)用戶故事(user story),整個(gè)項(xiàng)目分幾個(gè)迭代周期來完成,每個(gè)迭代周期(sprint)在制定計(jì)劃時(shí)選擇實(shí)現(xiàn)其中一個(gè)或兩個(gè)user story。每個(gè)user story 又被拆分成若干個(gè)迭代任務(wù)(task),開發(fā)人員每天完成其中的幾個(gè)task。經(jīng)過2~6 周的迭代過程,具備可視、可集成、可工作的特征,形成可交付的軟件增量,團(tuán)隊(duì)成員每天討論前一天完成的工作和當(dāng)天的任務(wù)。
圖1 Scrum 開發(fā)流程
在敏捷開發(fā)中,需求按迭代式進(jìn)行收集,把原先軟件過程前期的架構(gòu)設(shè)計(jì),分散到整個(gè)敏捷開發(fā)軟件過程中。
采用Scrum 循序漸進(jìn)的迭代式開發(fā),降低了開發(fā)難度,對(duì)于沒有開發(fā)經(jīng)驗(yàn)的學(xué)生來說,更有利于引導(dǎo)他們規(guī)范、有序地進(jìn)行項(xiàng)目開發(fā),有利于他們掌握系統(tǒng)的開發(fā)流程。
在Web 應(yīng)用開發(fā)實(shí)踐中,使用SSM 框架進(jìn)行校友管理系統(tǒng)項(xiàng)目開發(fā),采用Scrum 敏捷開發(fā)模式對(duì)整個(gè)開發(fā)流程進(jìn)行管理,期望達(dá)成以下目標(biāo):(1)理解和掌握SSM 框架,使用框架對(duì)Web 系統(tǒng)進(jìn)行設(shè)計(jì)和實(shí)現(xiàn);(2)參與完整的系統(tǒng)開發(fā)流程,從需求分析、用戶界面設(shè)計(jì)到業(yè)務(wù)邏輯和數(shù)據(jù)存儲(chǔ);(3)養(yǎng)成良好的專業(yè)素養(yǎng),遵循軟件開發(fā)規(guī)范,能夠利用各種開發(fā)工具輔助編程、糾錯(cuò)和測(cè)試等;(4)掌握迭代開發(fā)的方法,學(xué)會(huì)將復(fù)雜系統(tǒng)分解成可執(zhí)行的子任務(wù),迭代實(shí)現(xiàn)分期目標(biāo);(5)提升團(tuán)隊(duì)組織和協(xié)作能力。
校友管理系統(tǒng)主要包括:前臺(tái)的校友信息采集、電子校友卡的注冊(cè)和生成、活動(dòng)報(bào)名等功能;后臺(tái)的校友信息查詢、審核、活動(dòng)發(fā)布和統(tǒng)計(jì)等功能。
項(xiàng)目采用SSM 的4 層架構(gòu)進(jìn)行開發(fā),將系統(tǒng)劃分為View 層、Controller 層、Service 層和DAO 層。
其中View 層采用較流行的BootStrap 框架進(jìn)行界面設(shè)計(jì),Dao 層由Mapper 文件實(shí)現(xiàn),Controller 層、Service 層、Dao 層之間的數(shù)據(jù)以Pojo 對(duì)象進(jìn)行封裝傳遞(見圖2)。
圖2 SSM 框架流程
在實(shí)現(xiàn)的過程中,具體編寫流程如圖3 所示。其中View 層(JSP 頁(yè)面)和Controller 層之間相互關(guān)聯(lián),在編譯開發(fā)時(shí),兩者必須同時(shí)進(jìn)行。
在Scrum 開發(fā)流程中,整個(gè)軟件產(chǎn)品的需求被拆分為若干個(gè)用戶故事(user story,簡(jiǎn)寫為US),每個(gè)user story 主要描述:作為某一角色我需要做什么,以達(dá)到什么目的(as a ……I need to……so that……),即從用戶的角度描述不同角色對(duì)于產(chǎn)品功能的具體需求。按照這樣的拆分原則,我們將校友信息管理系統(tǒng)拆分為若干個(gè)用戶故事,如表1 所示。
圖3 SSM 各層開發(fā)流程
表1 產(chǎn)品用戶故事
使用Scrum 方法,整個(gè)項(xiàng)目開發(fā)分成幾個(gè)迭代周期(sprint)來完成。在開發(fā)過程中,需求分析也是迭代進(jìn)行的,每個(gè)迭代周期針對(duì)當(dāng)前的目標(biāo)需求進(jìn)行設(shè)計(jì),隨著每次迭代的進(jìn)行,逐步調(diào)整架構(gòu)設(shè)計(jì)。
每個(gè)迭代可以選擇一到兩個(gè)user story 來完成。在校友系統(tǒng)中,每個(gè)sprint 選擇一個(gè)user story 為目標(biāo)來進(jìn)行開發(fā),整個(gè)系統(tǒng)共分為4 個(gè)sprint 來完成。下面以其中的第一個(gè)sprint 為例,制定迭代計(jì)劃,進(jìn)行任務(wù)分解。一般由Scrum master 來負(fù)責(zé)迭代計(jì)劃的制定,這里可以由教師或小組長(zhǎng)來負(fù)責(zé)。
為了使學(xué)生更好地理解和進(jìn)行Scrum 開發(fā),克服畏難心理,增強(qiáng)成就感,在進(jìn)行任務(wù)分解時(shí),應(yīng)盡可能使每個(gè)任務(wù)task 較小,可執(zhí)行性較強(qiáng),一般每個(gè)task預(yù)估完成時(shí)間最好在1~3 h。
制定第一個(gè)迭代計(jì)劃時(shí),根據(jù)SSM 框架的開發(fā)流程,將普通校友功能的開發(fā)工作分解為11 個(gè)task(編號(hào)為100-110),并且預(yù)估了每個(gè)任務(wù)的完成時(shí)間,如圖4 所示。然后由開發(fā)團(tuán)隊(duì)的成員進(jìn)行任務(wù)認(rèn)領(lǐng),或由Scrum master 進(jìn)行任務(wù)分配。每個(gè)task 都可能處于待做(to do)、進(jìn)行中(in progress)、審查(review)、測(cè)試(user test)、完成(done)和 待定(pending)等狀態(tài)之一。
圖4 迭代計(jì)劃
開發(fā)人員開始做某個(gè)task 的時(shí)候,要把狀態(tài)更新到in progress,做完后由開發(fā)組長(zhǎng)(助教或教師)負(fù)責(zé)代碼審查(code review),然后進(jìn)行功能測(cè)試,測(cè)試完成后可以更改為done 狀態(tài)。其中,在審查或測(cè)試階段發(fā)現(xiàn)任何問題,可以暫停狀態(tài)更新,并創(chuàng)建issue提醒相應(yīng)的開發(fā)人員解決問題,暫時(shí)解決不了或者無(wú)法確定的更新為pending 狀態(tài)。
在迭代開發(fā)過程中,團(tuán)隊(duì)成員每天開例會(huì),討論前一天完成的任務(wù)和當(dāng)天要做的任務(wù),以及開發(fā)過程中遇到的問題。在校友系統(tǒng)開發(fā)過程中,其他幾個(gè)sprint 對(duì)應(yīng)的迭代計(jì)劃制定過程類似,不再一一敘述。
在團(tuán)隊(duì)開發(fā)的過程中,尤其是在Scrum 開發(fā)流程下,為了更好地進(jìn)行項(xiàng)目管理和過程控制,以下幾個(gè)問題必須解決:(1)任務(wù)進(jìn)度的管理;(2)開發(fā)人員代碼的提交、合并;(3)版本的控制。為解決這些問題并有效提高開發(fā)流程的管理效率,必須借助一些工具。
TFS 或者Jira 是目前采用較多的兩種項(xiàng)目管理與事務(wù)跟蹤工具,被廣泛應(yīng)用于缺陷跟蹤、客戶服務(wù)、需求收集、流程審批、任務(wù)跟蹤、項(xiàng)目跟蹤和敏捷管理等工作領(lǐng)域[9]。借助這些管理工具,能方便我們制定迭代計(jì)劃、進(jìn)行任務(wù)分解和任務(wù)狀態(tài)跟蹤等,將大大提高管理和開發(fā)的效率。校友管理系統(tǒng)使用Jira 作為Scrum 開發(fā)流程管理工具。
代碼的版本控制問題是所有開發(fā)團(tuán)隊(duì)都不得不面臨和必須解決的,即使不采用敏捷開發(fā)流程,即使沒有其他項(xiàng)目管理工具,版本控制都是必不可少的。目前版本控制工具很多,本系統(tǒng)開發(fā)主要使用較為主流的Git作為版本控制工具,使用Gitlab 搭建代碼庫(kù)。
在以往的項(xiàng)目開發(fā)過程中,由于學(xué)生缺乏開發(fā)經(jīng)驗(yàn)、沒有形成良好的代碼編寫習(xí)慣,又缺乏統(tǒng)一的標(biāo)準(zhǔn)和過程管理,往往導(dǎo)致項(xiàng)目的代碼質(zhì)量較差,難于維護(hù)[10]。
Scrum 開發(fā)流程比較重視質(zhì)量控制。要求開發(fā)人員每天開始新的開發(fā)工作前,先從代碼庫(kù)拿取最新代碼與自己本地代碼合并,然后進(jìn)行開發(fā)工作。完成一個(gè)task 后提交自己的代碼到代碼庫(kù)之前,一定要確保提交的代碼是可以運(yùn)行的,沒有任何bug,否則會(huì)影響其他開發(fā)人員的開發(fā)工作和整個(gè)系統(tǒng)的運(yùn)行。
在迭代過程中,可以采用以下步驟來保證和提高整個(gè)項(xiàng)目的代碼質(zhì)量:統(tǒng)一編碼規(guī)范、代碼樣式;靜態(tài)代碼分析(static code review);單元測(cè)試;持續(xù)集成;代碼評(píng)審和重構(gòu)(review & refactor)[11]。
在系統(tǒng)開發(fā)過程中,為了保證代碼質(zhì)量,要求學(xué)生遵守良好的編碼規(guī)范、代碼樣式,使用靜態(tài)代碼分析工具FindBugs 檢測(cè)Java 代碼質(zhì)量。FindBugs 不需要運(yùn)行代碼,可直接對(duì)Java 文件和Class 文件進(jìn)行分析,通過一些檢查條件的設(shè)置,即可快速找到代碼中的錯(cuò)誤和潛在缺陷[12]。
另外,在迭代計(jì)劃中設(shè)有專門的評(píng)審環(huán)節(jié),主要是對(duì)提交后的代碼做評(píng)審(code review),檢查提交是否規(guī)范,是否存在其他問題。在code review 過程中發(fā)現(xiàn)問題后,可以建立相應(yīng)的issue 或task,分派給對(duì)應(yīng)的開發(fā)人員進(jìn)行代碼重構(gòu),待問題解決后可以更新task 的狀態(tài)到用戶測(cè)試。
在測(cè)試過程中,一方面是通過寫單元測(cè)試案例對(duì)代碼功能進(jìn)行測(cè)試,借助測(cè)試工具檢查代碼覆蓋率;另一方面是用戶測(cè)試,主要是從界面操作對(duì)系統(tǒng)的功能進(jìn)行測(cè)試。其間發(fā)現(xiàn)任何問題、需求變動(dòng)或產(chǎn)生新的需求,都可以在迭代計(jì)劃中建立對(duì)應(yīng)的task,進(jìn)行迭代需求分析和設(shè)計(jì)。
傳統(tǒng)的項(xiàng)目考核一般是在項(xiàng)目結(jié)束后驗(yàn)收軟件作品,學(xué)生進(jìn)行展示和答辯,作為對(duì)學(xué)生最終考核的依據(jù)。采用敏捷開發(fā)流程后,考核涉及整個(gè)開發(fā)流程的多方面內(nèi)容: (1)完成的任務(wù)數(shù)量和難度。在項(xiàng)目管理工具Jira 里制定的迭代計(jì)劃,每個(gè)任務(wù)的執(zhí)行人和預(yù)估時(shí)間都是公開的;(2)提交(commit)的信息。在版本庫(kù)Gitlab 里面可以看到每次commit 的時(shí)間、人員等信息。(3)代碼質(zhì)量。可根據(jù)代碼評(píng)審時(shí)發(fā)現(xiàn)的問題數(shù)量及利用代碼靜態(tài)分析工具時(shí)的評(píng)分等作為考核參考。(4)項(xiàng)目進(jìn)度。實(shí)際花費(fèi)時(shí)間和預(yù)估時(shí)間的差,在Jira 系統(tǒng)中可通過燃盡(burn out)圖體現(xiàn)。(5)軟件功能實(shí)現(xiàn)情況。
通過以上5 個(gè)方面的考核,對(duì)每個(gè)開發(fā)小組進(jìn)行評(píng)分,在考慮小組整體完成情況條件下,針對(duì)每個(gè)學(xué)生具體完成任務(wù)的數(shù)量、代碼質(zhì)量和開發(fā)時(shí)間等分別評(píng)分。
將SSM 輕量級(jí)框架引入Web 應(yīng)用開發(fā),以校友系統(tǒng)為例進(jìn)行任務(wù)驅(qū)動(dòng)的案例式教學(xué),旨在使學(xué)生學(xué)習(xí)和掌握目前流行的企業(yè)級(jí)架構(gòu)框架,對(duì)多門專業(yè)課程進(jìn)行綜合理解、應(yīng)用,提升專業(yè)知識(shí)水平和系統(tǒng)開發(fā)技術(shù)。
系統(tǒng)開發(fā)采用敏捷開發(fā)的Scrum 流程,通過用戶故事分解、迭代計(jì)劃制定、任務(wù)分解等過程,將一個(gè)復(fù)雜的項(xiàng)目分成幾個(gè)子項(xiàng)目來迭代完成。每一個(gè)迭代周期只針對(duì)當(dāng)前的目標(biāo)進(jìn)行需求分析、設(shè)計(jì)和實(shí)現(xiàn),引導(dǎo)學(xué)生循序漸進(jìn)地完成一個(gè)系統(tǒng)的開發(fā),降低了完整系統(tǒng)開發(fā)的難度,提高了學(xué)生的開發(fā)興趣和開發(fā)能力。
讓學(xué)生體驗(yàn)了企業(yè)真實(shí)的開發(fā)流程,學(xué)習(xí)和掌握了除編程以外的過程控制、質(zhì)量控制等技術(shù)手段和工具使用,提高了開發(fā)效率和軟件質(zhì)量,掌握了企業(yè)主流的技術(shù)工具,實(shí)現(xiàn)了與行業(yè)及市場(chǎng)的接軌,提高了理論知識(shí)應(yīng)用能力。
總體來說,引入企業(yè)級(jí)應(yīng)用框架技術(shù)及敏捷開發(fā)流程進(jìn)行實(shí)踐教學(xué),使學(xué)生更加貼近企業(yè)真實(shí)開發(fā)環(huán)境,激發(fā)了學(xué)生的學(xué)習(xí)興趣和積極性,從整體上提升了他們對(duì)工程問題的分析能力和解決能力。