劉志鵬 段衛(wèi)華
摘要:“軟件工程”課程由于缺乏合適的教學(xué)案例等原因,授課效果往往不盡如人意。學(xué)生對(duì)軟件開(kāi)發(fā)規(guī)律、經(jīng)驗(yàn)缺乏實(shí)踐認(rèn)識(shí),缺乏興趣。分析當(dāng)前國(guó)際國(guó)內(nèi)解決該課程授課困境所采用的方法,設(shè)計(jì)了開(kāi)源軟件的實(shí)際案例、重構(gòu)現(xiàn)有代碼和設(shè)計(jì)性實(shí)驗(yàn)三個(gè)環(huán)節(jié),提高了學(xué)生的學(xué)習(xí)興趣、動(dòng)手能力和分析、設(shè)計(jì)能力,取得了較好的授課效果。
關(guān)鍵詞:軟件工程;教學(xué)改革;開(kāi)源軟件
中圖分類號(hào):G642.0 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1007-0079(2014)33-0089-02
“軟件工程”是計(jì)算機(jī)專業(yè)和軟件工程專業(yè)重要的基礎(chǔ)課程之一。[1]20世紀(jì)60年代,為了應(yīng)對(duì)“軟件危機(jī)”,軟件工程作為一門(mén)學(xué)科迅速發(fā)展。隨著軟件工程方法、工具的不斷完善,軟件產(chǎn)業(yè)已經(jīng)成為信息時(shí)代最大的產(chǎn)業(yè)。據(jù)預(yù)測(cè),軟件工程專業(yè)將成為獨(dú)立學(xué)科,其地位與計(jì)算機(jī)科學(xué)專業(yè)相同。然而,由于軟件工程概念繁多,學(xué)生實(shí)踐經(jīng)驗(yàn)匱乏,大多數(shù)高?!败浖こ獭闭n程的教學(xué)工作均在一學(xué)期內(nèi)完成,導(dǎo)致學(xué)生對(duì)“軟件工程”課程內(nèi)容缺乏興趣,教學(xué)效果不佳。為了在有限的學(xué)時(shí)中得到更好的教學(xué)效果,筆者從“軟件工程”課程教學(xué)的實(shí)際情況入手,嘗試了一系列的探索和研究。
一、“軟件工程”教學(xué)內(nèi)容目前存在的問(wèn)題
目前,“軟件工程”課程教學(xué)最主要的問(wèn)題是缺乏適合教學(xué)的軟件案例。本校“軟件工程”課程使用國(guó)外著名的《軟件工程:實(shí)踐者的研究方法(第七版)》作為教材。[2]教學(xué)實(shí)踐過(guò)程中的教學(xué)瓶頸是教學(xué)內(nèi)容概念繁多,本科階段的學(xué)生缺乏大型項(xiàng)目的開(kāi)發(fā)經(jīng)驗(yàn),難以形成理性認(rèn)識(shí),課堂內(nèi)容只能以概念介紹為主。該教材采用SafeHome作為教學(xué)實(shí)例,實(shí)例基于當(dāng)前十分熱門(mén)的智能安保系統(tǒng),但教學(xué)過(guò)程中存在如下問(wèn)題:
一是實(shí)踐性內(nèi)容分散。教材以場(chǎng)景對(duì)話的方式,展現(xiàn)了SafeHome項(xiàng)目在開(kāi)發(fā)過(guò)程中遇到的各種問(wèn)題。場(chǎng)景對(duì)話分散在各個(gè)章節(jié)之中,如果在每章授課過(guò)程中針對(duì)SafeHome項(xiàng)目開(kāi)展講解和討論,會(huì)造成學(xué)生對(duì)該案例內(nèi)容理解的碎片化。如果集中講授SafeHome項(xiàng)目的內(nèi)容,往往涉及到的知識(shí)面較寬,必須要到學(xué)期快結(jié)束時(shí)才能引入。此時(shí)教學(xué)過(guò)程中已堆砌了大量概念,學(xué)生對(duì)實(shí)例研究早已失去興趣。
二是缺乏示例代碼。該實(shí)例雖然內(nèi)容先進(jìn),但教材終究以介紹基本概念為主,并未提供SafeHome示例相關(guān)的源代碼。很多學(xué)生認(rèn)為教學(xué)示例空洞,沒(méi)有具體編程實(shí)例佐證教學(xué)。
三是內(nèi)容過(guò)于專業(yè)。SafeHome項(xiàng)目很多概念和知識(shí),學(xué)生僅有所耳聞,沒(méi)有實(shí)際的編程操作經(jīng)驗(yàn),如傳感器。傳感器的很多特性,本科同學(xué)沒(méi)有深入的認(rèn)識(shí),難以理解傳感器模塊的功能設(shè)計(jì),如傳感器數(shù)據(jù)有效性判定等,給教學(xué)工作造成了很大的困難。
市場(chǎng)上國(guó)外其他配有實(shí)例的“軟件工程”教材,往往實(shí)例的代碼量均在3000行以內(nèi)。這種數(shù)量級(jí)的代碼,已經(jīng)足以應(yīng)付軟件測(cè)試、代碼重構(gòu)等工作。但是對(duì)于軟件體系架構(gòu)等概念講解而言,其涉及的內(nèi)容和知識(shí)點(diǎn)略顯單薄。國(guó)內(nèi)教材采用的案例系統(tǒng)往往是圖書(shū)管理系統(tǒng)或電梯管理系統(tǒng)等。這些軟件案例已經(jīng)有十分成熟的產(chǎn)品,且同類教材內(nèi)容重復(fù)、老舊、陳詞濫調(diào)。同樣難以引起學(xué)生的廣泛興趣愛(ài)好。
其他學(xué)?!败浖こ獭闭n程的教學(xué)開(kāi)展有如下2種方法:第一,不再設(shè)置“軟件工程”導(dǎo)論課程,將其中涉及到的概念分散設(shè)置到“軟件需求”“人機(jī)交互”等具體課程中。這種教學(xué)改革涉及到大量專業(yè)課程的重新設(shè)置和調(diào)整,工作量十分巨大。第二,教師自己開(kāi)發(fā)教學(xué)案例。這些教學(xué)案例往往與實(shí)際的軟件開(kāi)發(fā)項(xiàng)目相結(jié)合,將本專業(yè)學(xué)生所需要掌握的知識(shí)融入其中。這涉及到項(xiàng)目案例的編寫(xiě)工作。該項(xiàng)工作執(zhí)行難度較大,開(kāi)發(fā)周期較長(zhǎng),案例本身往往需要幾個(gè)教師協(xié)作完成。隨著教學(xué)工作的不斷開(kāi)展,項(xiàng)目案例必須要不斷修改,適應(yīng)新形勢(shì)的發(fā)展。雖然這種方法對(duì)本專業(yè)學(xué)生培養(yǎng)最為有利,但案例構(gòu)建工作大大增加了教師的授課負(fù)擔(dān)。
二、“軟件工程”課程的教學(xué)改革
針對(duì)以上的分析,主要從以下幾個(gè)方面進(jìn)行“軟件工程”教學(xué)的探索和改革:
1.補(bǔ)充案例教學(xué)
首先,從開(kāi)源軟件代碼庫(kù)或從著名的開(kāi)源軟件項(xiàng)目中查找適合學(xué)生閱讀的程序代碼。著名的開(kāi)源代碼庫(kù)網(wǎng)站包括SourceForge、Google Code、Bounty Source、Tigris.org及berlios.de等。項(xiàng)目必須涵蓋面向過(guò)程程序設(shè)計(jì)技術(shù)和面向?qū)ο蟪绦蛟O(shè)計(jì)技術(shù)。其中,涵蓋面向過(guò)程程序設(shè)計(jì)技術(shù)的項(xiàng)目最好采用C語(yǔ)言開(kāi)發(fā),而涵蓋面向?qū)ο蟪绦蛟O(shè)計(jì)技術(shù)的項(xiàng)目最好采用Java語(yǔ)言開(kāi)發(fā)。雖然很多優(yōu)秀開(kāi)源軟件采用Python、Perl或Ruby這類編程語(yǔ)言實(shí)現(xiàn),但是從學(xué)生已經(jīng)學(xué)習(xí)的編程知識(shí)角度出發(fā),盡量不要增加學(xué)生學(xué)習(xí)編程語(yǔ)言的額外負(fù)擔(dān)。經(jīng)過(guò)仔細(xì)的甄別,筆者選出三個(gè)教學(xué)案例:一是Linux虛擬文件系統(tǒng)VFS。該文件系統(tǒng)的設(shè)計(jì)很好地體現(xiàn)了軟件工程中面向?qū)ο笤O(shè)計(jì)的開(kāi)閉原則及其他很多設(shè)計(jì)方法。文件系統(tǒng)是操作系統(tǒng)中較為重要、且用戶最容易理解的模塊之一。[3]二是SQLite嵌入式數(shù)據(jù)庫(kù),運(yùn)行時(shí)只占用很低的系統(tǒng)資源。目前在很多嵌入式產(chǎn)品,例如安卓系統(tǒng)中使用。[4]三是rsync,是類UNIX系統(tǒng)下的數(shù)據(jù)鏡像備份工具。[5]
其次,教師通過(guò)閱讀、分析源代碼和相關(guān)文檔,從整體上把握開(kāi)源軟件實(shí)例的體系結(jié)構(gòu)。并結(jié)合課堂教學(xué),從不同角度出發(fā),給學(xué)生分配代碼閱讀任務(wù)。因?yàn)椴糠纸虒W(xué)案例,如SQLite等,涉及到多方面的學(xué)科知識(shí),如數(shù)據(jù)庫(kù)、編譯原理等,需要指導(dǎo)學(xué)生有針對(duì)性地閱讀其中某一部分源代碼。在此期間,要牢記以能夠幫助理解軟件工程理論知識(shí)為主要目的。否則,學(xué)生容易陷入海量代碼閱讀和具體的學(xué)科知識(shí)學(xué)習(xí)中,忽略了閱讀代碼的根本目的。
第三,通過(guò)課堂講解和課后閱讀兩種方式相結(jié)合,結(jié)合具體的評(píng)分機(jī)制,鼓勵(lì)學(xué)生閱讀源代碼,布置合理的代碼閱讀作業(yè),鼓勵(lì)學(xué)生使用軟件工程方法閱讀、管理源代碼,做到既促進(jìn)學(xué)生通過(guò)閱讀源代碼加深理論知識(shí)的理解,又能夠?qū)W以致用。了解軟件的開(kāi)發(fā)過(guò)程和開(kāi)發(fā)方法,又不至于占用過(guò)多的時(shí)間影響其他課程的學(xué)習(xí)。
第四,在閱讀源代碼的基礎(chǔ)上,了解各個(gè)軟件不同版本間的功能更新、完善和改進(jìn)。以rsync為例,其源代碼從0.1版本一直到當(dāng)前最新的3.1.1版本和補(bǔ)丁包,按照時(shí)間順序進(jìn)行整理、總結(jié)。通過(guò)該過(guò)程的實(shí)踐,幫助學(xué)生理解完善軟件的過(guò)程以及軟件版本控制的概念及方法。這是學(xué)生通過(guò)努力可以做到的,是必須完成的學(xué)習(xí)任務(wù)。另外,鼓勵(lì)學(xué)生在現(xiàn)有源代碼閱讀基礎(chǔ)上,對(duì)當(dāng)前軟件項(xiàng)目提出需求改進(jìn)、項(xiàng)目設(shè)計(jì)、軟件體系架構(gòu)和功能擴(kuò)充等提出自己的修改意見(jiàn)。在時(shí)間允許的范圍內(nèi),鼓勵(lì)學(xué)生實(shí)現(xiàn)自己的想法。從該過(guò)程中體會(huì)到軟件設(shè)計(jì)的一些基本要求,如可擴(kuò)充性、高內(nèi)聚低耦合等概念。訓(xùn)練學(xué)生提出優(yōu)秀需求的思維能力。同時(shí)與項(xiàng)目發(fā)展現(xiàn)狀相結(jié)合,對(duì)軟件需求進(jìn)行取舍,并按照優(yōu)先級(jí)進(jìn)行排序。培養(yǎng)學(xué)生的設(shè)計(jì)模式觀念,以及重構(gòu)代碼的能力,但這并不是必須要完成的學(xué)習(xí)任務(wù)。因?yàn)榻?jīng)過(guò)國(guó)外同行實(shí)踐教學(xué)表明,大多數(shù)同學(xué)難以對(duì)軟件提出新的改進(jìn)。其中原因包括學(xué)生缺乏行業(yè)實(shí)踐經(jīng)驗(yàn),另一方面,對(duì)該軟件的理解難以超越設(shè)計(jì)者。
2.重構(gòu)現(xiàn)有項(xiàng)目
目前,很多高校采取“項(xiàng)目驅(qū)動(dòng)、從頭做起”的方法,讓學(xué)生動(dòng)手實(shí)踐項(xiàng)目。這些項(xiàng)目課題往往由教師指定,學(xué)生查找資料,從頭做起,設(shè)計(jì)實(shí)現(xiàn)。在實(shí)踐中,筆者鼓勵(lì)學(xué)生重構(gòu)現(xiàn)有項(xiàng)目。這些現(xiàn)有項(xiàng)目的來(lái)源主要包括:學(xué)生在先修實(shí)踐類課程中累積的作業(yè);來(lái)自于因特網(wǎng)上學(xué)生感興趣、并自己深入學(xué)習(xí)過(guò)的開(kāi)源項(xiàng)目。這樣做的好處是:第一,學(xué)生對(duì)需要重構(gòu)的項(xiàng)目有足夠的了解,不會(huì)因?yàn)橹R(shí)儲(chǔ)備不足,需要重新學(xué)習(xí)技術(shù)知識(shí)等原因而停滯不前;第二,照顧能力差異和知識(shí)結(jié)構(gòu)差異,避免教師指定課題的一刀切做法,保證每個(gè)學(xué)生都能動(dòng)手。第三,由于學(xué)習(xí)時(shí)間有限,從現(xiàn)有項(xiàng)目做起,可以多思考、多規(guī)劃,而非僅僅為了完成代碼量,忽略了在軟件開(kāi)發(fā)過(guò)程中理解和運(yùn)用軟件工程知識(shí)的初衷。
在重構(gòu)項(xiàng)目的過(guò)程中,使用subversion集中管理學(xué)生的軟件開(kāi)發(fā)版本。教師查看subversion的日志信息了解學(xué)生的項(xiàng)目進(jìn)度及活躍度等。采用敏捷開(kāi)發(fā)方法,使用“結(jié)對(duì)編程,小組間相互提需求,相互測(cè)試”等具體策略,鼓勵(lì)組內(nèi)和組間交流。提出優(yōu)秀的需求,幫助其他同學(xué)改進(jìn)軟件,與開(kāi)發(fā)自己的軟件同等重要。最后的提交報(bào)告包括:源代碼變更及對(duì)應(yīng)的功能描述;subversion構(gòu)建證據(jù);代碼變更的UML圖形表示;代碼變更的測(cè)試信息;團(tuán)隊(duì)成員的詳細(xì)學(xué)習(xí)日志等。報(bào)告中不但要說(shuō)明已經(jīng)完成的功能點(diǎn),還需要說(shuō)明可以從哪些方面進(jìn)一步完善該軟件。組內(nèi)的每位同學(xué)必須詳細(xì)列出在組內(nèi)的貢獻(xiàn),以及對(duì)其他小組的貢獻(xiàn)。學(xué)生可以得到多個(gè)方面的鍛煉,提升自己的綜合素質(zhì)。可以同時(shí)鍛煉需求分析、編碼、測(cè)試等多個(gè)方面的綜合能力。
3.提升設(shè)計(jì)眼界
軟件設(shè)計(jì)是比代碼閱讀和項(xiàng)目重構(gòu)更為高級(jí)的活動(dòng)。其中包含項(xiàng)目立項(xiàng)目標(biāo)和動(dòng)機(jī)、價(jià)值判斷、選擇確定、可行性研究與效益分析等活動(dòng)。其中涉及到需求分析、系統(tǒng)設(shè)計(jì)、軟件設(shè)計(jì)等方方面面的活動(dòng)。軟件設(shè)計(jì)能力的培養(yǎng),不能以最終實(shí)現(xiàn)的軟件系統(tǒng)作為評(píng)判標(biāo)準(zhǔn)。筆者不要求學(xué)生實(shí)現(xiàn)該系統(tǒng),最大程度地激發(fā)學(xué)生的創(chuàng)造性,目的是提升軟件設(shè)計(jì)的眼界。軟件設(shè)計(jì)考驗(yàn)前瞻性和先進(jìn)性,最好給出多種設(shè)計(jì)方案,且該過(guò)程也需要反復(fù)迭代,逐步求精。以SafeHome為例,學(xué)生以前的設(shè)計(jì)大多采用PC機(jī)和SQL Server作為服務(wù)器和數(shù)據(jù)庫(kù)。通過(guò)教師啟發(fā)和學(xué)生自主查閱資料,在設(shè)計(jì)中出現(xiàn)了云計(jì)算服務(wù)器和VoCore嵌入式芯片設(shè)計(jì)。雖然學(xué)生不一定清楚技術(shù)細(xì)節(jié),但是從軟件設(shè)計(jì)角度而言,具備一定的先進(jìn)性。
“軟件工程”課程平時(shí)分評(píng)分標(biāo)準(zhǔn)有三部分組成:一是完成課堂提及的教學(xué)案例的代碼閱讀任務(wù)。該項(xiàng)任務(wù)占平時(shí)成績(jī)的30%。二是完善和重構(gòu)現(xiàn)有項(xiàng)目。該項(xiàng)任務(wù)占平時(shí)成績(jī)的40%。三是完成一份優(yōu)秀、具備多種可選方案的軟件設(shè)計(jì)。該項(xiàng)任務(wù)占平時(shí)成績(jī)的30%。
三、實(shí)踐環(huán)節(jié)教學(xué)效果
1.課堂教學(xué)效果
通過(guò)課堂講授案例、重構(gòu)代碼和軟件設(shè)計(jì)等三個(gè)不同層次的學(xué)習(xí)鍛煉,大多數(shù)學(xué)生能端正學(xué)習(xí)態(tài)度,充分認(rèn)識(shí)到軟件工程理論知識(shí)來(lái)源于軟件生產(chǎn)實(shí)踐,并對(duì)軟件實(shí)踐有重大指導(dǎo)意義。通過(guò)制訂合理的實(shí)踐任務(wù),每個(gè)學(xué)生都能動(dòng)手編寫(xiě)程序。通過(guò)動(dòng)手實(shí)踐,加深了對(duì)軟件工程相關(guān)知識(shí)點(diǎn)的理解。
2.教學(xué)效果反饋
本次共有87名學(xué)生參加“軟件工程”課程的學(xué)習(xí),每個(gè)學(xué)生需要獨(dú)立完成3份實(shí)驗(yàn)報(bào)告。結(jié)果統(tǒng)計(jì)表明,閱讀代碼的積極性、代碼編寫(xiě)的規(guī)范性和軟件設(shè)計(jì)的先進(jìn)性等均有很大程度的提升。未完成實(shí)踐任務(wù)的同學(xué)主要集中在重構(gòu)現(xiàn)有項(xiàng)目部分。很多原始項(xiàng)目由于缺乏合理的軟件架構(gòu),很多學(xué)生采取重新設(shè)計(jì)和編寫(xiě)的方案,耽誤了很多時(shí)間。
總之,“軟件工程”作為計(jì)算機(jī)專業(yè)和軟件工程專業(yè)重要的基礎(chǔ)課程,介紹了大規(guī)模軟件開(kāi)發(fā)的重要經(jīng)驗(yàn),應(yīng)用范圍非常廣泛。本文分析了“軟件工程”教學(xué)中目前存在的一些問(wèn)題,積極探索和嘗試新的教學(xué)方式,在一定程度上調(diào)動(dòng)了學(xué)生的積極性,但對(duì)于課程體系的建設(shè)等后續(xù)問(wèn)題,仍然需要開(kāi)展進(jìn)一步的研究。
參考文獻(xiàn):
[1]Pierre Bourque,等.SWEBOK v3.0 [DB/OL].http://www.computer.org/
portal/web/swebok/v3guide.
[2]普雷斯曼.軟件工程:實(shí)踐者的研究方法[M].第7版.北京:機(jī)械工業(yè)出版社,2011.
[3]博韋.深入理解LINUX內(nèi)核[M].北京:中國(guó)電力出版社,2008.
[4]SQLite源代碼[DB/OL].http://www.sqlite.org/2014/sqlite-amalgama
tion-3080500.zip
[5]rsync源代碼[DB/OL].http://rsync.samba.org/ftp/rsync/src/
[6]D. Carrington, S. K. Kim. Teaching software design with open source software[A]. Frontiers in Education[C].Berlin:Springer,2003.
(責(zé)任編輯:王意琴)