朱少民
摘要:在闡述了敏捷方法的特點(diǎn)以及引入軟件工程教學(xué)中所遇到的困難之后,基于過去兩年在同濟(jì)大學(xué)軟件工程課程的本科教學(xué)實(shí)踐及探索,提出適合軟件工程敏捷方法的實(shí)驗(yàn)框架。這個(gè)框架可將敏捷方法的理論教學(xué)和實(shí)驗(yàn)有效地結(jié)合起來,在本科教學(xué)中獲得良好的應(yīng)用效果,深受學(xué)生歡迎。
關(guān)鍵詞:軟件工程;敏捷方法;Scrum;實(shí)驗(yàn)教學(xué);框架
1 問題提出
過去的軟件工程課程大綱都是按照軟件開發(fā)過程的瀑布模型來設(shè)置課程內(nèi)容的先后次序,即在軟件工程基本概念介紹后,從需求分析與定義、系統(tǒng)總體設(shè)計(jì)、詳細(xì)設(shè)計(jì)、編程到測(cè)試這樣一個(gè)過程。其相應(yīng)的實(shí)驗(yàn)課,可以按照這個(gè)次序來安排其環(huán)節(jié),從需求、設(shè)計(jì)、編程到測(cè)試,主要內(nèi)容都被覆蓋了,一個(gè)學(xué)期正好完成一個(gè)完整的軟件開發(fā)過程,實(shí)驗(yàn)內(nèi)容容易和課堂教學(xué)保持同步,兩者銜接自然,這樣教學(xué)實(shí)驗(yàn)也比較容易實(shí)施。
目前業(yè)界流行敏捷開發(fā)方法(Agile Metho-dology),多數(shù)軟件公司已采用或正在采用敏捷開發(fā)方法。在軟件工程課程中,為了適應(yīng)這種新的變化,培養(yǎng)滿足企業(yè)實(shí)際需要的人才,有必要在軟件工程課程教學(xué)中引入敏捷開發(fā)方法。在引入敏捷方法過程中,理論教學(xué)遇到的問題會(huì)相對(duì)少些,而困難的地方是其實(shí)驗(yàn)教學(xué),無論在其設(shè)計(jì)還是具體實(shí)施時(shí)都面對(duì)很大的挑戰(zhàn)。
除了適應(yīng)業(yè)界新的需求,特別是移動(dòng)互聯(lián)網(wǎng)應(yīng)用開發(fā)的需求,將敏捷引入軟件工程本科教學(xué)中,也有非常有利的一面,有助于提高教學(xué)質(zhì)量,主要體現(xiàn)在以下幾個(gè)方面:①敏捷方法的小團(tuán)隊(duì)適合學(xué)生實(shí)踐,學(xué)生每個(gè)實(shí)驗(yàn)組一般是4-5個(gè)人。
②敏捷的趣味性也適合現(xiàn)在的學(xué)生,容易調(diào)動(dòng)學(xué)生參與實(shí)驗(yàn)的積極性。
③敏捷團(tuán)隊(duì)強(qiáng)調(diào)自我管理,沒有團(tuán)隊(duì)領(lǐng)導(dǎo),有利于培養(yǎng)每個(gè)學(xué)生的責(zé)任感和團(tuán)隊(duì)的榮譽(yù)感,提高每個(gè)學(xué)生自我管理的能力。
④敏捷更強(qiáng)調(diào)可工作產(chǎn)品本身的價(jià)值,符合學(xué)生的期望,他們更希望早一點(diǎn)看到自己開發(fā)的成功,早日獲得成就感,也是培養(yǎng)學(xué)生真正的核心實(shí)力——開發(fā)和測(cè)試的能力,而不是文檔的能力。
但是,如果引入敏捷方法,軟件工程課程的實(shí)驗(yàn)教學(xué),特別是實(shí)驗(yàn)內(nèi)容設(shè)計(jì)上,會(huì)遇到很大挑戰(zhàn),因?yàn)槊艚莘椒◤?qiáng)調(diào)快速迭代,一個(gè)迭代周期一般只有2-4周。如果只讓學(xué)生完成一個(gè)迭代的實(shí)驗(yàn),“迭代”實(shí)質(zhì)上就沒有發(fā)生,和原來的瀑布模型就非常相似,學(xué)生對(duì)迭代的理解就比較困難。為了讓學(xué)生能夠理解迭代,進(jìn)而更好地理解敏捷方法,有必要讓學(xué)生在一個(gè)學(xué)期的實(shí)踐過程中,完成3~4個(gè)迭代,交付多個(gè)版本,親自踐行軟件開發(fā)的較完整的敏捷過程。但是,如果學(xué)生在軟件工程實(shí)踐中完成多個(gè)迭代,其實(shí)驗(yàn)設(shè)計(jì)難以和課堂理論教學(xué)內(nèi)容銜接起來,因?yàn)榻虒W(xué)內(nèi)容不會(huì)按迭代來安排重復(fù)幾次。這是筆者要解決的問題之一,就是如何做到軟件工程課堂理論教學(xué)內(nèi)容和實(shí)驗(yàn)環(huán)節(jié)同步起來。
第二個(gè)問題是如何讓基于敏捷方法的軟件工程實(shí)驗(yàn)達(dá)到良好的實(shí)踐效果?,F(xiàn)在所經(jīng)過的軟件過程包含了多個(gè)迭代,每個(gè)迭代周期時(shí)間短,學(xué)生在這樣一個(gè)非常短的周期內(nèi)完成若干個(gè)用戶故事(即幾個(gè)需求點(diǎn)或功能特性)的實(shí)現(xiàn),包括這些功能特性的詳細(xì)設(shè)計(jì)、代碼編寫和測(cè)試等工作。但在做這些工作的同時(shí),還要處理系統(tǒng)整體的架構(gòu)設(shè)計(jì)、界面設(shè)計(jì)、數(shù)據(jù)庫設(shè)計(jì)等工作,還要持續(xù)維護(hù)產(chǎn)品需求表,這對(duì)缺乏工作經(jīng)驗(yàn)的學(xué)生來說,無疑會(huì)面臨巨大的挑戰(zhàn)。如果實(shí)驗(yàn)環(huán)節(jié)設(shè)計(jì)不合理、指導(dǎo)方法不妥,那么實(shí)驗(yàn)效果可能會(huì)很差。
第三個(gè)問題是如何為基于敏捷方法的軟件工程實(shí)驗(yàn)提供一個(gè)理想的環(huán)境。過去軟件工程課程的實(shí)驗(yàn)環(huán)境都是基于瀑布模型建設(shè)的,不能適應(yīng)敏捷方法的實(shí)踐要求。例如,對(duì)于敏捷方法的Serum過程模式,許多工程元素的表達(dá)、操作和處理的方式都不一樣。
①Scrum的需求是通過用戶故事(UserStory)、Product Backlog等進(jìn)行描述。
②任務(wù)工作量通過小組成員玩敏捷估算撲克來進(jìn)行估算。
③進(jìn)度通過將“任務(wù)帖子”從“To do”移到“In progress”“Testing”“Done”等欄目下進(jìn)行控制,即依賴燃盡圖(Bumdown Chart)來控制。
還有更多具有鮮明特點(diǎn)的敏捷實(shí)踐,如測(cè)試驅(qū)動(dòng)開發(fā)(Test Driven Development,TDD)、結(jié)對(duì)編程、持續(xù)集成、持續(xù)測(cè)試等,這也需要相適應(yīng)的軟件開發(fā)環(huán)境來支撐。
最后,就是在實(shí)踐中,如何讓學(xué)生更好地理解敏捷宣言所主張的理念,體現(xiàn)在以下幾點(diǎn):
①個(gè)人與協(xié)作勝于流程與工具。
②可工作的軟件勝于完備的文檔。
③客戶合作勝于客戶談判。
④響應(yīng)變化勝于遵循計(jì)劃。
特別是如何讓學(xué)生不要忘記宣言最后一句話:“也就是說,盡管右項(xiàng)有其價(jià)值,我們更重視左項(xiàng)的價(jià)值”,右邊項(xiàng)“流程、文檔、工具、計(jì)劃”等還是有價(jià)值的。
2 目前研究現(xiàn)狀
在2001年敏捷宣言發(fā)布之前,大家對(duì)敏捷沒有統(tǒng)一的認(rèn)識(shí),但敏捷方法已存在,而最早敏捷方法的代表之一則是極限編程(eXtremeProgramming,XP)。KentBeck在1996年3月成為C3(Chrysler Comprehensive Compensation System)項(xiàng)目負(fù)責(zé)人,開始對(duì)項(xiàng)目的開發(fā)方法學(xué)進(jìn)行改善。之后他寫了一本關(guān)于改善后的方法學(xué)的書《極限編程解析》,并于1999年10月出版,意味著極限編程的誕生。敏捷方法引起業(yè)界廣泛關(guān)注,還是在敏捷宣言發(fā)布之后,這方面的研究文章從2001年開始就逐漸多起來了,討論如何將敏捷方法引入軟件工程教育中,要落后于業(yè)界的研究,最早研究出現(xiàn)在2003年,之后開始有比較多的研究。剛開始還是集中整體考慮如何在軟件工程相關(guān)課程中引入敏捷方法。直到2-3年后,人們開始關(guān)注其實(shí)踐或?qū)嶒?yàn)環(huán)節(jié),而且側(cè)重討論極限編程、TDD(測(cè)試驅(qū)動(dòng)開發(fā))的引入。而目前流行的敏捷方法,是以Scrum為代表,而不是極限編程,對(duì)Scrum的研究相對(duì)要落后得多,這方面的論文不多見。在國(guó)內(nèi),關(guān)于如何在軟件工程引入敏捷方法的論文也不多,主要因?yàn)閲?guó)內(nèi)業(yè)界在采用敏捷方法的時(shí)間,相對(duì)國(guó)外也遲得多。其次,國(guó)內(nèi)大學(xué)和業(yè)界之間的交流和協(xié)作相對(duì)國(guó)外也比較少。當(dāng)然,更重要的原因是,敏捷方法沒有得到官方IEEE-CS/ACM計(jì)算教程指南(Guidelines for Computing Curricula)以及國(guó)內(nèi)軟件工程教學(xué)指導(dǎo)委員會(huì)的明確支持。endprint
3 敏捷方法的實(shí)驗(yàn)框架
軟件工程課程是一門實(shí)踐性很強(qiáng)的課程,需要實(shí)驗(yàn)的支撐,只有理論聯(lián)系實(shí)際,才能達(dá)到良好的教學(xué)效果。例如,在同濟(jì)大學(xué),設(shè)置了一門與軟件工程課程并行教學(xué)的實(shí)驗(yàn)課程:軟件工程設(shè)計(jì)。這樣,實(shí)驗(yàn)教學(xué)就是“強(qiáng)制要求的”。
同濟(jì)大學(xué)用一學(xué)期完成軟件工程課程教學(xué)及其實(shí)驗(yàn),敏捷方法采用Scrum過程框架。在國(guó)內(nèi)大學(xué),一個(gè)學(xué)期時(shí)間為4個(gè)月,將一個(gè)學(xué)期的時(shí)間分為4個(gè)階段,每一階段為1個(gè)月。第1階段為軟件開發(fā)的前期準(zhǔn)備階段,包括產(chǎn)品定義、基本需求分析、數(shù)據(jù)流及其數(shù)據(jù)結(jié)構(gòu)分析、系統(tǒng)架構(gòu)設(shè)計(jì)和產(chǎn)品發(fā)布計(jì)劃(Release Planning)等工作。而第2、3、4階段,對(duì)應(yīng)敏捷開發(fā)的3個(gè)迭代周期,即Scrum過程模式中sprint。后面3個(gè)階段才是學(xué)生真正動(dòng)手實(shí)踐的階段。
除了完成產(chǎn)品的開發(fā),我們還是要將分析與需求定義、相關(guān)的設(shè)計(jì)技術(shù)、持續(xù)構(gòu)建與集成、單元測(cè)試、功能測(cè)試和非功能測(cè)試等內(nèi)容融入到迭代過程,還要讓學(xué)生理解軟件工程思想、質(zhì)量管理、配置管理等內(nèi)容,所以在設(shè)計(jì)實(shí)驗(yàn)框架時(shí),要考慮上述內(nèi)容的難易程度、不同的優(yōu)先級(jí)和相互依賴性,分別對(duì)待,有先有后,有輕有重。根據(jù)這樣的思想,第一個(gè)迭代要盡量簡(jiǎn)單,每個(gè)Serum環(huán)節(jié)過一遍就可以了,然后在第2、3個(gè)迭代中逐步增加內(nèi)容(如結(jié)對(duì)編程、單元測(cè)試、持續(xù)集成、TDD或ATDD等),逐步加強(qiáng)實(shí)驗(yàn)環(huán)節(jié)。
從敏捷本身來看,也可以分為思想、原則、流程、方法和工具、實(shí)踐等,先要理解敏捷產(chǎn)生的背景、思想和原則,其中對(duì)開源軟件運(yùn)動(dòng)、軟件即服務(wù)(Software as a Service)等對(duì)軟件開發(fā)模式的影響也是要講解的要點(diǎn)。例如,SaaS模式發(fā)生后,產(chǎn)品發(fā)布即刻就能部署到公司內(nèi)部的服務(wù)器上,用戶幾乎同時(shí)就能使用服務(wù)。相對(duì)發(fā)布包裝盒產(chǎn)品,SaaS的交付速度快得多、交付成本忽略不計(jì),這也大大降低了修復(fù)缺陷的成本,使之持續(xù)交付成為可能?;诿艚菟枷牒驮瓌t,指導(dǎo)學(xué)生運(yùn)用敏捷流程和方法,指導(dǎo)學(xué)生開展具體的活動(dòng),但同時(shí),通過敏捷過程、敏捷實(shí)踐更好地幫助學(xué)生理解敏捷的思想和原則。這些敏捷的要素相輔相成,貫穿整個(gè)實(shí)驗(yàn)過程。
根據(jù)上述分析,最終形成如表1所示的基于敏捷方法的軟件工程課程實(shí)驗(yàn)的框架,以階段來安排,通過任務(wù)分層展開,并通過交付內(nèi)容來考核實(shí)驗(yàn)效果。同時(shí),在設(shè)計(jì)時(shí),保持和理論教學(xué)的同步,實(shí)驗(yàn)和理論教學(xué)兩邊都要做相應(yīng)的調(diào)整,達(dá)到教學(xué)和實(shí)驗(yàn)的目標(biāo)。
4 具體實(shí)施
對(duì)于基于敏捷的軟件工程實(shí)驗(yàn)環(huán)節(jié),缺乏可參考的優(yōu)秀實(shí)踐,更需要教師和助教更多的投入,參與到每個(gè)團(tuán)隊(duì)的實(shí)驗(yàn)過程中。理想情況下,每個(gè)學(xué)生實(shí)驗(yàn)團(tuán)隊(duì),在其中一個(gè)迭代中能全程得到教師或助教的示范作用。如果做不到這點(diǎn),至少在其中一個(gè)迭代的各個(gè)關(guān)鍵環(huán)節(jié)(如發(fā)布計(jì)劃、Spring計(jì)劃、某天的站立晨會(huì)、產(chǎn)品review會(huì)議、反思會(huì))中,教師或助教至少出現(xiàn)一次。教師參加學(xué)生實(shí)驗(yàn)組的各種會(huì)議時(shí),也可以觀察員身份參加,不參與討論。但發(fā)現(xiàn)問題時(shí),會(huì)及時(shí)指出或給予示范。如果把時(shí)間錯(cuò)開,教師和學(xué)生可以支持12個(gè)組,以每組4~5個(gè)學(xué)生計(jì)算,最多支持60個(gè)學(xué)生。所以在基于敏捷的軟件過程課程教學(xué)中,應(yīng)該有更多的教師參與教學(xué),每個(gè)教師教30個(gè)學(xué)生為佳。
敏捷方法體現(xiàn)以人為本的知識(shí)管理,更重要的是體現(xiàn)敏捷團(tuán)隊(duì)“自我組織或自我管理”的特點(diǎn)。所以,在其實(shí)驗(yàn)管理中,也盡量相信學(xué)生、尊重學(xué)生,以更開放的態(tài)度對(duì)待學(xué)生的實(shí)驗(yàn),培養(yǎng)學(xué)生積極參與管理過程,提高學(xué)生自我管理的意識(shí)。筆者嘗試的有益做法主要有:
(1)以前多數(shù)是教師命題,而現(xiàn)在鼓勵(lì)學(xué)生自主命題,自己定義待開發(fā)的產(chǎn)品,可以是web應(yīng)用系統(tǒng),也可以是移動(dòng)App應(yīng)用,還可以在上個(gè)年級(jí)的遺留系統(tǒng)上進(jìn)行二次開發(fā)。這不僅可以提高學(xué)生實(shí)驗(yàn)的積極性,更重要的是培養(yǎng)他們的責(zé)任感,兌現(xiàn)自己的承諾。
(2)以前每個(gè)成員貢獻(xiàn)是由組長(zhǎng)給出百分比,但在敏捷情況下,沒有組長(zhǎng),采用每個(gè)學(xué)生給自己團(tuán)隊(duì)的各個(gè)組員(包括自己)打分,最后選擇合適公式如[(Max+4×Average+Min)/6]算出各組員所得的分?jǐn)?shù)。
(3)實(shí)驗(yàn)答辯的成績(jī)?cè)u(píng)定也讓學(xué)生參加。例如,第一個(gè)組答辯成績(jī)由第2、3、4組評(píng)定,第2組由第3、4、5組評(píng)定,以此類推,最后一組由第1、2、3組評(píng)定。最后學(xué)生評(píng)分占總分35%,教師和助教評(píng)分占65%。
在過去兩年的軟件工程教學(xué)過程中,還嘗試了一些其他敏捷開發(fā)的實(shí)驗(yàn)方法,經(jīng)過檢驗(yàn),達(dá)到了預(yù)期效果,例如:
(1)構(gòu)建一個(gè)集軟件開發(fā)過程管理、配置管理和項(xiàng)目管理為一體的平臺(tái)來支撐課程實(shí)驗(yàn),有利于教師全程跟蹤和管理實(shí)驗(yàn)過程,并營(yíng)造一個(gè)真實(shí)的企業(yè)環(huán)境,使學(xué)生的實(shí)驗(yàn)更規(guī)范、更貼近業(yè)界的實(shí)際操作。這里推薦開源系統(tǒng)Redmine(http:∥www.redmine.org/)。
(2)學(xué)生分組人數(shù)一般4~5人,但以前實(shí)驗(yàn)團(tuán)隊(duì)是由學(xué)生自由、自愿組合而成,現(xiàn)在可以考慮隨機(jī)產(chǎn)生,團(tuán)隊(duì)成立前,組員之間關(guān)系不能保證融洽。這樣會(huì)增加學(xué)生溝通的困難性,更有利于培養(yǎng)學(xué)生的團(tuán)隊(duì)意識(shí),提高學(xué)生的溝通能力。
(3)為了讓每個(gè)學(xué)生得到全面的訓(xùn)練,在每個(gè)迭代中學(xué)生可以扮演不同的角色。在Scrum里總共有3個(gè)角色:ScrumMaster、Product Owner和團(tuán)隊(duì)一般成員,這樣一個(gè)組有4~5人,在3輪迭代中,每個(gè)學(xué)生都有機(jī)會(huì)扮演不同的角色。
5 結(jié)語
從事軟件工程課程的教學(xué)已有兩年了,感覺這門課程教學(xué)不容易,其實(shí)驗(yàn)就更不容易,對(duì)教師很有挑戰(zhàn)。教師不僅需要深刻理解軟件工程敏捷思想的真諦,熟悉敏捷方法的各個(gè)要素,還需要能夠通過具體示例、神諭等說明敏捷開發(fā)的原則,才能使學(xué)生真正理解敏捷方法。教師還要熟知從需求、設(shè)計(jì)、代碼、測(cè)試、部署到項(xiàng)目管理等各個(gè)方面,而且能把這些內(nèi)容整合起來,前后貫通,形成可實(shí)踐、可應(yīng)用的實(shí)驗(yàn)體系。
要教好軟件工程這門課程,應(yīng)結(jié)合學(xué)生特點(diǎn)和能力,精心設(shè)計(jì)整個(gè)教學(xué)過程,使學(xué)生能夠?qū)W中做、做中學(xué),理論和實(shí)踐交替進(jìn)行,達(dá)到良好的教學(xué)效果。endprint
參考文獻(xiàn):
[1]Dingsoyr T,Nerur S,Balijepally V,et a1.A decade of agile methodologies:towards explaining agile software development[J].The Journal of Systems and Software,2012,85(6):1213-1221.
[2]Highsmith J,CockbumA.Agile software development:thebusiness of irmovation[J].Computer,2011,34(9):120-122.
[3]Hedin G,Bendix L,Magnusson B.Introducing software engineering by means 0f extreme programming[C]∥Boris Magnusson. International Conference on Software Engineering.Springer,2003-05-03:586-593.
[4]Hazzan O.Teaching a software development methodology:the ease of extreme programming[C]∥Soffware Engineering Education and Training,2003.IEEE,2003-03-20:176-184.
[5]LeJeune N F.Teaching software enfmeering practices wish extreme programming[J].JCSC,2006(21):3.
[6]RicoDE SayaniHH.Use of agilemethodsin software engineering education[C]#2009AgileConference.IEEE,2009:174-179.
[7]林曉宇,鐘一文,黃世國(guó),等.基于Scrum敏捷方法的軟件工程實(shí)踐教學(xué)探索[J].電腦知識(shí)與技術(shù):學(xué)術(shù)交流,2011(19):4762-4764.
[8]李中華.倪明濤,敏捷開發(fā)模式在本科計(jì)算機(jī)科學(xué)與技術(shù)專業(yè)教學(xué)中的應(yīng)用探索[J].科技信息,2010(21):137-138.
[9]Vladan D,Milenkovic S R.Teaching agile software development:a case study[J].IEEE Transactions on Education,2011,54(2):273.
(見習(xí)編輯:劉麗麗)endprint