丁 箐
(中國(guó)科學(xué)技術(shù)大學(xué) 軟件學(xué)院,安徽 合肥 230051)
軟件體系結(jié)構(gòu)是軟件學(xué)院針對(duì)工程碩士開(kāi)設(shè)的一門(mén)專(zhuān)業(yè)類(lèi)高級(jí)課程,學(xué)生通過(guò)學(xué)習(xí)該課程,能夠掌握軟件項(xiàng)目開(kāi)發(fā)中的架構(gòu)設(shè)計(jì)知識(shí),了解一個(gè)軟件系統(tǒng)的各種非功能需求如何滿(mǎn)足。該課程必須通過(guò)實(shí)踐操作,才能讓學(xué)生更深入地理解和掌握。
目前,軟件工程實(shí)踐課程都采用傳統(tǒng)的瀑布模型進(jìn)行授課:首先教師進(jìn)行理論課程知識(shí)點(diǎn)的傳授,然后學(xué)生在實(shí)驗(yàn)課時(shí)內(nèi)根據(jù)上課時(shí)傳授的知識(shí)點(diǎn)進(jìn)行相應(yīng)的項(xiàng)目編程練習(xí),軟件產(chǎn)品的形態(tài)只有到了開(kāi)發(fā)后期才能看到,但是學(xué)生一般沒(méi)有開(kāi)發(fā)經(jīng)驗(yàn),很難一步到位完成任務(wù),而且學(xué)生普遍對(duì)撰寫(xiě)文檔不感興趣,導(dǎo)致教學(xué)效果不佳。敏捷軟件開(kāi)發(fā)以人為導(dǎo)向,主動(dòng)適應(yīng)項(xiàng)目需求的變化,因此本質(zhì)上來(lái)說(shuō)敏捷方法更加適合這類(lèi)課程的教學(xué)[1-4]。
敏捷開(kāi)發(fā)是目前在IT公司中使用最多的軟件開(kāi)發(fā)過(guò)程,其開(kāi)發(fā)模型適合中、小型軟件系統(tǒng),能在短時(shí)間內(nèi)開(kāi)發(fā)出可運(yùn)行的系統(tǒng),因此得到了廣泛的研究,例如唐涌等[1]討論了全球化開(kāi)發(fā)團(tuán)隊(duì)的敏捷開(kāi)發(fā)模式;季鐵等[2]通過(guò)對(duì)比以用戶(hù)為中心的設(shè)計(jì)和敏捷開(kāi)發(fā)存在的共性和特性,結(jié)合實(shí)際項(xiàng)目提出了將以人為中心的設(shè)計(jì)整合到敏捷開(kāi)發(fā)過(guò)程中的方法;榮國(guó)平等[3]通過(guò)調(diào)研和分析嵌入式系統(tǒng)開(kāi)發(fā)過(guò)程中敏捷方法的應(yīng)用狀況,研究如何通過(guò)擴(kuò)展和改進(jìn)敏捷方法,更好地適應(yīng)嵌入式系統(tǒng)開(kāi)發(fā);田曉盼[4]則關(guān)注敏捷思想的理念與用戶(hù)體驗(yàn)設(shè)計(jì)的結(jié)合,從而引出敏捷用戶(hù)體驗(yàn)設(shè)計(jì)的概念,并將之應(yīng)用到移動(dòng)APP的設(shè)計(jì)和開(kāi)發(fā)中。
在軟件工程實(shí)踐類(lèi)課程中,引入敏捷開(kāi)發(fā)方法可以更好地調(diào)動(dòng)學(xué)生的積極性,使學(xué)生能夠更好地適應(yīng)未來(lái)工作中開(kāi)發(fā)軟件產(chǎn)品的流程,增強(qiáng)學(xué)生的合作意識(shí)和團(tuán)隊(duì)精神,并且針對(duì)學(xué)生群體差異調(diào)整教學(xué)內(nèi)容。近年來(lái),不少教育工作者在如何將敏捷開(kāi)發(fā)方法應(yīng)用到計(jì)算機(jī)類(lèi)課程的教學(xué)中進(jìn)行了有益的探索,其中部分研究者集中于軟件工程課程。例如管林挺等[5]討論了當(dāng)前軟件工程在教學(xué)中遇到的問(wèn)題,提出了基于敏捷開(kāi)發(fā)組織教學(xué)內(nèi)容和教學(xué)實(shí)踐的方法,并分析了這種方法的優(yōu)點(diǎn);樸勇[6]通過(guò)分析傳統(tǒng)開(kāi)發(fā)過(guò)程和敏捷開(kāi)發(fā)過(guò)程在軟件工程課程教學(xué)中的不同特點(diǎn),提出了敏捷開(kāi)發(fā)的教學(xué)要點(diǎn)、相應(yīng)的支持工具;白魚(yú)秀等[7]針對(duì)傳統(tǒng)瀑布模型在軟件工程實(shí)踐課程教學(xué)中的不足,基于敏捷開(kāi)發(fā)方法提出一種適合軟件工程實(shí)踐課程的教學(xué)方法,并給出了相應(yīng)的實(shí)施方法。另一些學(xué)者則將敏捷方法應(yīng)用到其他的計(jì)算機(jī)領(lǐng)域課程的探索,如顧家銘[8]針對(duì)物聯(lián)網(wǎng)專(zhuān)業(yè)實(shí)踐課程中存在的問(wèn)題,采用敏捷開(kāi)發(fā)思想,引入Scrum開(kāi)發(fā)模式,并改革成績(jī)考核方式;肖小聰?shù)萚9]將敏捷開(kāi)發(fā)思想融入數(shù)據(jù)庫(kù)課程設(shè)計(jì)中,提出了基于敏捷開(kāi)發(fā)的數(shù)據(jù)庫(kù)課程設(shè)計(jì)的總體思路、實(shí)驗(yàn)框架以及具體實(shí)施辦法。然而,對(duì)于如何在軟件體系結(jié)構(gòu)課程中應(yīng)用敏捷方法目前還沒(méi)有相關(guān)文獻(xiàn)。
敏捷軟件開(kāi)發(fā)在實(shí)際應(yīng)用中有很多具體的實(shí)施方法,如極限編程(XP)、精益開(kāi)發(fā)(Lean Development)、Scrum等。在教學(xué)實(shí)踐上,首先需要選定一種方法作為實(shí)施工具。經(jīng)過(guò)多方比較,筆者選擇了Scrum,它是一個(gè)迭代增量框架,采用周期方式完成產(chǎn)品開(kāi)發(fā),周期性工作稱(chēng)為Sprint,因此課程內(nèi)容圍繞 Sprint的設(shè)計(jì)來(lái)開(kāi)展。
如表1,軟件體系結(jié)構(gòu)課程共50理論學(xué)時(shí),分為6個(gè)階段任務(wù)。每個(gè)Sprint開(kāi)始時(shí),項(xiàng)目團(tuán)隊(duì)從階段任務(wù)列表中選擇需要完成的項(xiàng)目,并在該Sprint結(jié)束前完成這些需求。Sprint期間團(tuán)隊(duì)成員簡(jiǎn)要匯報(bào)彼此的進(jìn)度,Sprint結(jié)束后,項(xiàng)目團(tuán)隊(duì)演示他們所做的工作,并且反饋需要融入下次Sprint的工作。課程關(guān)聯(lián)的項(xiàng)目是一個(gè)分布式系統(tǒng)里監(jiān)控系統(tǒng)機(jī)群的智能監(jiān)管系統(tǒng),不指定具體的開(kāi)發(fā)技術(shù),僅要求需要完成的功能以及需要滿(mǎn)足的各項(xiàng)非功能需求。課程的內(nèi)容以軟件體系架構(gòu)的各種視圖和質(zhì)量屬性為主,聯(lián)系J2EE框架的各個(gè)組成部分,學(xué)生在每個(gè)Sprint中可以選擇J2EE框架各層的相應(yīng)技術(shù)完成本階段的任務(wù)。Sprint3之前的開(kāi)發(fā)技術(shù)為必須完成的任務(wù),考慮到學(xué)生間差異較為明顯,Sprint4和Sprint5的相關(guān)技術(shù)為選做內(nèi)容,開(kāi)發(fā)進(jìn)度較快的學(xué)生可以采用這些技術(shù)對(duì)開(kāi)發(fā)項(xiàng)目進(jìn)行再次迭代,并比較不同技術(shù)對(duì)所開(kāi)發(fā)項(xiàng)目各種非功能需求的影響。
Scrum團(tuán)隊(duì)一般由產(chǎn)品負(fù)責(zé)人(Product Owner)、Scrum主管(Scrum Master)和開(kāi)發(fā)團(tuán)隊(duì)(Scrum Team)組成。產(chǎn)品負(fù)責(zé)人收集來(lái)自客戶(hù)、項(xiàng)目團(tuán)隊(duì)等各方面的需求信息,追求商業(yè)價(jià)值最大化,輸出需求優(yōu)先列表,該軟件在軟件體系結(jié)構(gòu)的教學(xué)中由任課老師擔(dān)任;開(kāi)發(fā)團(tuán)隊(duì)是軟件的實(shí)現(xiàn)者,決定最終提交產(chǎn)品的質(zhì)量,本案例中開(kāi)發(fā)團(tuán)隊(duì)的規(guī)模是4人左右,選擇一人作為Scrum主管,負(fù)責(zé)引導(dǎo)團(tuán)隊(duì)使用好Scrum;一般來(lái)說(shuō)軟件項(xiàng)目中的開(kāi)發(fā)團(tuán)隊(duì)包括分析師、開(kāi)發(fā)者、接口設(shè)計(jì)者、測(cè)試員等,案例中團(tuán)隊(duì)內(nèi)部的職責(zé)劃分由學(xué)生實(shí)施,但建議每名學(xué)生既承擔(dān)開(kāi)發(fā)任務(wù),又承擔(dān)測(cè)試任務(wù)。
整個(gè)課程的Scrum實(shí)施過(guò)程包括以下幾大部分。
1)開(kāi)始Scrum。
即Sprint0階段,教師介紹課程基本情況,列舉項(xiàng)目所有產(chǎn)品需求,根據(jù)全部需求明確優(yōu)先級(jí),形成產(chǎn)品訂單,開(kāi)始Sprint 迭代。
2)Sprint迭代。
即Sprint1到Sprint4階段,主要包括:
(1)開(kāi)展迭代會(huì)議。
Sprint計(jì)劃會(huì)議(Sprint planning meeting)要確定本次迭代結(jié)束按照優(yōu)先級(jí)順序需要提交的需求項(xiàng)以及評(píng)估小組在此次迭代中完成任務(wù)需要的時(shí)間,按優(yōu)先級(jí)分解為任務(wù),并在團(tuán)隊(duì)成員中分配。
站立會(huì)議中開(kāi)發(fā)團(tuán)隊(duì)成員匯報(bào)進(jìn)展和困難,更新完成每項(xiàng)任務(wù)的剩余時(shí)間,Scrum主管據(jù)此更新任務(wù)看板上的燃盡圖。
評(píng)審會(huì)議,評(píng)估本次Sprint完成情況,為進(jìn)入下一個(gè)Sprint做準(zhǔn)備,根據(jù)上次完成的結(jié)果修改產(chǎn)品訂單,重新確定優(yōu)先級(jí)。
反思會(huì)議要求每個(gè)小組必須每天進(jìn)行代碼回顧,及早發(fā)現(xiàn)問(wèn)題,通過(guò)對(duì)代碼進(jìn)行重構(gòu),反思得失。
(2)持續(xù)集成,小組每天進(jìn)行一次代碼集成。不同迭代階段涉及同一層上采用不同技術(shù)開(kāi)發(fā)的相同功能,在不影響程序正確性和功能的前提下,可以部分集成,并行開(kāi)發(fā)。
(3)技術(shù)講座,課程開(kāi)展過(guò)程中結(jié)合課程內(nèi)容會(huì)安排幾次講座,主要涉及目前流行的各種開(kāi)發(fā)框架,學(xué)有余力的學(xué)生可以嘗試采用這些框架在迭代中更換某些系統(tǒng)層。
(4)文檔編寫(xiě),采用敏捷開(kāi)發(fā)的教學(xué)也需要部分文檔的支持,本課程主要集中在軟件體系結(jié)構(gòu)中各種視圖的展現(xiàn),針對(duì)解決問(wèn)題的不同角度,
要求各小組在迭代的各個(gè)階段完成相應(yīng)的視圖。
表1 教學(xué)實(shí)踐案例框架表
3)發(fā)布產(chǎn)品。
各小組提交最終產(chǎn)品,進(jìn)行課程項(xiàng)目最終的考核評(píng)價(jià)。小組進(jìn)行項(xiàng)目答辯,小組項(xiàng)目考核分?jǐn)?shù)由教師評(píng)定分和其他小組評(píng)定分綜合決定。考核的依據(jù)主要是系統(tǒng)的完成程度和功能(40%)、項(xiàng)目的難度(20%)、文檔的正確性(20%)以及答辯表述(20%)。小組中每個(gè)學(xué)生的成績(jī)由項(xiàng)目小組的分?jǐn)?shù)和其在項(xiàng)目小組中的貢獻(xiàn)率綜合評(píng)定,最后結(jié)合課程理論考試的分?jǐn)?shù),得到該學(xué)生的最終成績(jī)。
針對(duì)軟件體系結(jié)構(gòu)這門(mén)軟件工程碩士專(zhuān)業(yè)的專(zhuān)業(yè)類(lèi)高級(jí)課程,由于涉及大量的架構(gòu)類(lèi)理論知識(shí),對(duì)沒(méi)有大量編程訓(xùn)練的學(xué)生來(lái)說(shuō),要想較好地理解這些概念具有很大的難度。因此,通常來(lái)說(shuō)該門(mén)課程需要增加項(xiàng)目練習(xí)來(lái)輔助學(xué)生理解概念。然而,采用傳統(tǒng)瀑布模型,學(xué)生很難一步到位圓滿(mǎn)地完成各個(gè)階段的任務(wù),導(dǎo)致教學(xué)質(zhì)量普遍欠佳。
通過(guò)調(diào)研敏捷開(kāi)發(fā)方式在軟件工程以及其他一些計(jì)算機(jī)課程中的應(yīng)用,筆者發(fā)現(xiàn)敏捷開(kāi)發(fā)是基于適應(yīng)的,通過(guò)主動(dòng)適應(yīng)項(xiàng)目需求的變化,從本質(zhì)上來(lái)說(shuō)更適合軟件體系結(jié)構(gòu)課程的教學(xué)。因此,根據(jù)課程的具體內(nèi)容,筆者采用Scrum精心設(shè)計(jì)了各個(gè)Sprint的階段任務(wù)、需要提交的內(nèi)容和對(duì)應(yīng)的理論知識(shí),并根據(jù)該課程的特點(diǎn)制定了相應(yīng)的實(shí)施方法,在實(shí)際的教學(xué)中起到了很好的效果,根據(jù)學(xué)生的反饋,對(duì)掌握該課程的各知識(shí)點(diǎn)有較大的幫助。
[1]唐涌, 馬振勇, 張道林. 全球化團(tuán)隊(duì)的敏捷開(kāi)發(fā)模式[J]. 東華理工大學(xué)學(xué)報(bào)(社會(huì)科學(xué)版), 2014, 33(1): 87-93.
[2]季鐵, 謝琪, 陳憲濤. 將以用戶(hù)為中心引入敏捷開(kāi)發(fā)的方法探究[J]. 包裝工程, 2013, 34(6): 50-54.
[3]榮國(guó)平, 劉天宇, 謝明娟, 等. 嵌入式系統(tǒng)開(kāi)發(fā)中敏捷方法的應(yīng)用研究綜述[J]. 軟件學(xué)報(bào), 2014, 25(2): 267-283.
[4]田曉盼. 基于敏捷開(kāi)發(fā)的移動(dòng)APP用戶(hù)體驗(yàn)設(shè)計(jì)研究[D]. 上海: 華東理工大學(xué), 2015.
[5]管林挺, 顧沈明. 基于敏捷軟件開(kāi)發(fā)的軟件工程教學(xué)研究[J]. 計(jì)算機(jī)時(shí)代, 2009(8): 45-46.
[6]樸勇. 敏捷過(guò)程在軟件工程課程中的教學(xué)實(shí)踐[J]. 計(jì)算機(jī)教育, 2015(24): 78-80.
[7]白魚(yú)秀, 鄭歡歡. 敏捷開(kāi)發(fā)在軟件工程實(shí)踐課程中的應(yīng)用[J]. 計(jì)算機(jī)時(shí)代, 2017(1): 85-86.
[8]顧家銘. 敏捷開(kāi)發(fā)在物聯(lián)網(wǎng)實(shí)踐教學(xué)中的探索[J]. 軟件導(dǎo)刊(教育技術(shù)版), 2016, 15(4): 19-21.
[9]肖小聰, 曹步清, 龔波. 基于敏捷開(kāi)發(fā)的數(shù)據(jù)庫(kù)系統(tǒng)課程設(shè)計(jì)教學(xué)研究與實(shí)踐[J]. 當(dāng)代教育理論與實(shí)踐, 2016, 8(1): 37-39.