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