陳 昊 明 仲
文章編號:1672-5913(2009)10-0148-03
摘要:針對Java語言實驗課程的教學現狀,本文探討了該課程實驗教學方面的改革。通過在課程中引入敏捷方法和自動單元測試,來激發學生的學習興趣,提高學生的編程能力、溝通能力和團隊合作能力,改善學生編寫程序的質量。
關鍵詞:Java;敏捷方法;結對編程
中圖分類號:G642
文獻標識碼:A
1引言
Java自1995年由Sun公司正式推出,就迅速成為全球主流與應用廣泛的開發語言,其跨平臺的技術優勢為網絡計算帶來了劃時代的變革,從一種編程語言發展成為全球第一大領先開發平臺。為了適用人才培養的需要,各高校紛紛開設了Java程序設計語言的課程,該語言也逐漸成為計算機科學與技術專業和軟件工程專業學生需掌握的一門面向對象程序設計語言。我校軟件工程專業培養方案中將該課程安排在“面向對象程序設計(C++)”之后開設,即二年級上學期。在實際的教學過程中,該課程教學大多仍沿用傳統的教學模式,主要強調個體的動手實踐,而忽視了溝通與交互,導致學生學習興趣不高、理解不夠深入、開發效率較低。且大多數同學習慣于編寫“基本正確的程序”,而不是致力于編寫“盡量正確的程序”,結果所編程序的質量不高。
敏捷方法首次提出來是在上世紀90年代后期,其目的是為了在需求和技術不斷變化的過程中實現快速的軟件開發。敏捷的價值觀是:個體和交互勝過過程和工具;可以工作的軟件勝過面面俱到的文檔;客戶合作勝過合同談判;響應變化勝過遵循計劃。敏捷方法強調應加強開發人員之間的交互,加強與客戶的交互,注重有可工作的軟件和完善、不過分的文檔,積極、快速應對客戶的需求變化,而不是回避。近年來,敏捷方法已經受到工業界和學術界的越來越多的關注。其中一些方法,如結對編程等已經被實踐證明能有效提高軟件設計質量,并應用于程序設計和軟件開發等課程的教學過程中,取得良好的教學效果。
在分析Java語言課程的特點和學生的實踐背景的基礎上,針對該課程傳統實驗教學過程中的一些局限性,通
過引入敏捷方法和自動單元測試,來提高學生動手實踐能力,取得了較好的教學效果。
2本課程特點
“Java語言程序設計”是軟件工程專業的一門非常重要的專業選修課,主要講授面向對象的Java語言程序設計及應用。在選修本課程之前,學生已經修過“面向對象程序設計(C++)”,具有C++的基本知識,并對面向對象思想有一定的了解。通過本課程的學習,學生能夠在一定程度上掌握面向對象的思維方式,理解Java語言特有的一些屬性,能夠明白Java語言與其他面向對象編程語言的區別,使用Java語言有能力編寫有實際意義的應用程序。但是在實際的教學過程中,學生學習興趣不大,編程的質量不高。其主要原因有:
(1) 學生雖然已經學過C++,但是不夠熟練,且對面向對象思想理解不深,在學習Java語言的初期有不少疑惑。如經常有同學提出“Java 到底有什么用?”,“我已經學了C++,為什么還要學Java?”以及“Java怎么感覺與C++有很大的不同?”等問題。如果不能及時解決學生的疑惑,將導致學生在隨后的學習過程中缺乏興趣,散失信心。因此在這個階段,教師在實驗教學中應通過比較Java與C++的異同來展示Java的基本語法和一些特性,使學生充分了解學習Java的必要性,從而激發學習興趣。
(2) 在教學過程中,主要強調通過實例來展示Java的特性,并要求學生模仿實例來使用這些特性編寫應用程序,但是忽略了程序的質量,甚至有些實例代碼本身就不夠嚴謹。因此學生所編寫程序的質量很難得到保證。
(3) 學生獨立性較強,不善于團隊合作和溝通。在之前的程序設計等先修課程中主要是培養學生獨立的邏輯思考和編程能力,而忽視了溝通、交互與團隊合作。
從以往選修該課程的學生反饋來看,不少同學反映對Java語言掌握得不好,并且在今后兩年的學習和實踐過程中很少采用Java技術。然而這將導致學生在今后就業時失去不少機會。因此,在Java語言實驗教學中,應該對教學內容和教學手段進行適當調整。通過引入結對編程這一敏捷方法和自動單元測試,來培養學生實際編程能力和溝通能力。
3實驗教學改革及實施過程
通過分析Java語言課程的特點和敏捷方法的主要特征,在實驗教學環節中引入敏捷方法有助于綜合培養學生的編程能力、溝通能力和團隊合作能力,改善學生所編寫程序的質量。因此,首先,教師通過比較Java與C++的異同來展示Java的基本語法和一些特性,使學生充分了解學習Java的必要性,從而激發學習興趣,加快入門過程。從中期開始,在實驗教學中,教師要求學生以結對編程的形式完成實驗,并全程指導如何有效地應用結對編程。在后期,教師介紹JUnit測試框架,并要求在實驗中編寫測試代碼,從而進行自動單元測試。
具體實施包括以下三個環節:利用對比加快入門、引入結對編程和自動單元測試。
3.1利用對比加快入門
對比的目的是理解隱藏在程序語言背后的設計哲理,使我們知道對于一個問題的解決,為什么在此語言中是這樣一種解決方案,而在彼語言中又是那樣一種解決方案?這樣思考會讓我們更好地掌握編程語言的精髓。
通過與C++的對比,學生可以更好地理解Java的語法特點和設計原理,明白Java是如何做的,并進一步知道Java“為什么”這么做。通過對比性實驗來學習,不僅效率很高,而且充滿樂趣,加深學生對Java的理解。
在初期,教師并未引入結對編程,因為學生剛開始接觸Java,對語言不熟悉,而且在此期間布置的實驗題目較簡單。如果匆忙要求學生采用結對編程,可能操之過急,無法體現其優越性。所以,在實驗教學初期,要求學生獨立完成實驗,而且教師在實驗過程中全程指導,糾正學生在使用Java編程時的一些不良習慣,幫助他們形成較好的編程風格。
3.2引入結對編程
結對編程是敏捷方法中最重要的實踐之一。結對編程的通俗含義指的是兩個程序員在同一臺計算機上進行編程活動,一個同伴使用鼠標和鍵盤來編碼,另一個同伴關注整體。基本上,所有的開發環節都一齊肩并肩地、平等地、互補地進行,它的核心在于兩名成員緊密合作,時刻交流。采用結對編程進行合作的學生能更有效地交流,相互學習和傳遞經驗;能提供更好的設計質量和代碼質量;能訓練更強的問題解決能力。同時,采取結對編程的學生更容易樹立信心,從工作中獲取更多的滿足感。
從中期開始,教師在實驗課上要求學生自由組成結對來完成實驗內容。學生剛開始感到很新奇,并樂意組成結對來完成實驗,但是在隨后的實踐過程中,教師發現了一些問題,并進行針對性的指導。
(1) 有些結對中一直固定由某個學生編碼,而在旁的另一個學生雖然仍在關注,但注意力有些不集中。教師立即要求學生們根據實驗中上機題來輪換角色,這樣不至于使某個學生因長時間擔任某一角色而出現疲憊狀況或產生厭倦情緒,且使得學生們能得到全面鍛煉的機會。
(2) 也有些結對中出現了一些指責和埋怨。教師應及時指出,在結對中,盡量不要用“你的設計有問題”或“這個錯誤是你引起的”之類的話語。結對成員應共同承擔責任,不能相互指責,兩人意見不同時,可以協商解決,雙方應互相關心和體諒。
(3) 在個別結對中,某位同學總是處于強勢,而他的搭檔沒有機會發表自己的意見。在這種情況下,教師應強調公平結對。即使一方比另一方更有經驗,也不要讓另一方感覺自己不重要。在結對中,每一方都有平等的機會,表達自己的觀點,雙方對代碼的控制權是平等的。
此外,在剛開始引入結對編程的幾周內,鼓勵輪換結對。這樣可以使學生有機會考慮性格融合和技術互補等因素來調整結對。
在實踐過程中,有不少學生反映在實驗室進行結對編程時效果較好,而課后缺乏合適的環境。針對這種情況,教師建議可以首先在同宿舍的同學中找到合適的搭檔。另外,可以在學生的個人計算機中安裝支持分布式協作開發的軟件來支持分布式結對編程。比如,Eclipse通訊框架(Eclipse Communication Framework——ECF)可以作為Eclipse IDE的插件,給使用Eclipse的團隊提供了實時通訊和協作特性。比如P2P(peer-to-peer)文件共享、遠程打開Eclipse視圖、屏幕截圖共享、以及實時共享編輯。該框架還提供一套通訊API和框架,建立在已有協議(如Google Talk、XMPP、SSH、HTTP/HTTPS、Rendevous、IRC及其他協議)之上,使得開發者可以給自己的基于Equinox的插件增加通訊和消息傳遞功能,或者自定義及擴展ECF應用。組成結對的學生使用Eclipse IDE作為Java開發工具,且安裝了ECF插件后,再配上Google Talk或Skype等即時通訊工具,就可以進行文字、語音以及視頻通訊、屏幕截圖共享、視圖共享,更重要的是可以實時共享編輯,可以相互實時關注對方編程,并發表觀點。
引入結對編程是為了培養學生的溝通能力和團隊合作能力,讓學生在溝通與合作中相互學習,共同進步,從而提高開發效率。從實驗結果的質量和學生的反饋來看,結對編程的引入有利于編程效率的提高、代碼質量的明顯改進和培養學生的團隊合作精神。
3.3引入自動單元測試
在Java語言實驗教學實踐中,許多學生在程序開發過程中忽視了程序質量。隨著學習的深入,實驗布置的編程題目越來越復雜,學生們所編寫的程序中所暴露出來的質量問題也越來越嚴重。主要是由于他們對軟件測試不夠重視,沒有針對實際問題設計出足夠全面的測試用例,此外對軟件測試的手段和技術了解很少,無法為有些代碼設計相應的測試用例。
針對這一現象,可以通過讓學生掌握基本的自動單元測試技術來改善程序質量。回歸測試框架JUnit提供了基于API的自動測試方法,可以在測試代碼中調用這個框架來進行斷言檢查,檢查條件是否滿足,并報告錯誤的數量和類型。在后期,教師在實驗教學環節中介紹如何使用JUnit編寫自動測試代碼來進行自動單元測試。
通過引入自動單元測試,學生們在隨后的實驗中大多采用JUnit框架進行單元測試,代碼質量較之前有了明顯的提高。
4結束語
目前,在軟件工程專業的“Java語言程序設計”課程實驗教學中已經進行了上述的改革實踐。通過利用對比學習Java,學生能較快地從C++編程過渡到Java編程,并逐漸對Java語言感興趣。當引入結對編程之一敏捷方法后,學生普遍反映結對編程這一方式促進了同學之間的溝通與學習,激發了學習興趣,提高了編程和團隊合作能力。后期的實驗教學中所引入的自動單元測試增強了學生們的程序質量意識,大大改善了代碼的質量。
在實踐過程也出現了一些個別現象,比如有極少數編程能力較強且個性較孤僻的同學不愿參與結對,而且認為自己獨立開發效率應該更高。在今后的實驗教學實踐中,針對這些現象,將思考解決辦法,進一步完善該改革方案。
參考文獻:
[1] 邵奇峰,車戰斌. Java課程教學方法探討[J]. 計算機教育,2008(12):50-52.
[2]Robert C. Martin. Agile Software Development: Principles, Patterns, and Practices[M]. Pearson Education, Inc., 2003.
[3]Armour P. Agile and Offshore[J]. Communications of the ACM, 2007,50(1):13-16.
[4]Kim Man Lui, Keith C.C. Chan, John Teofil Nosek. The Effect of Pairs in Program Design Tasks[J]. IEEE Transactions on Software Engineering,2008,34(2):197-211.
[5]Jeffrey C. Carver, Lisa Henderson, Lulu He, et al. Increased Retention of Early Computer Science and Software Engineering Students using Pair Programming[C]//In Proceedings of 20th Conference on Software Engineering Education & Training (CSEET'07). Washington,DC,USA:IEEE Computer Society. 2007:115-122.
[6]Richard G. Epstein. Getting Students to Think About How Agile Processes can be Made More Secure[C]//In Proceedings of 21st Conference on Software Engineering Education & Training (CSEET'08). Washington,DC,USA:IEEE Computer Society. 2008:51-58.
[7] 俞輝. 計算機專業提高Java語言教學效果的探索與實踐[J]. 計算機教育,2008(14):48-49.
[8] 劉竹松,李振坤,王文彥. 極限編程在計算機本科畢業設計中的應用[J]. 計算機教育,2007(7):25-27.
[9] 鐘揚,劉業政,馬向輝. 小團隊結對編程實踐研究和重構[J]. 計算機技術與發展,2007,17(11):160-163.
Exploration on the Experimental Teaching of Java Programming Course
CHEN Hao, MING Zhong
(College of Computer Science and Software Engineering, Shenzhen University, 518060 Shenzhen, China)
Abstract: Considering the current situation in the experimental teaching of Java programming course, this paper proposes to introduce the agile methods and automatic unit test in the experimental teaching for the sake of stimulating the students learning interest, which also improves their programming skills, communication skills, teamwork capability and program quality.
Key words: Java; Agile methods; pair programming