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