熊晶 高峰 王愛民



【摘要】針對師范院校計算機專業實踐教學存在的問題,提出利用結對編程進行實踐教學改革的方案。分析了結對編程的特點、結對原則和實施要求,并與傳統的實踐教學進行了實驗對比。實驗結果表明,結對編程能有效降低Bug出現頻率,提高學生動手能力和團隊合作意識,促進了實踐教學改革。
【關鍵詞】結對編程:師范院校;實踐教學改革;計算機專業
【中圖分類號】G40-057 【文獻標識碼】A 【論文編號】1009-8097(2013)07-0122-05
引言
在我國高等教育體制中,師范院校計算機專業培養目標主要包括兩個方面:一是要求畢業生具備教書育人的良好教育理論素質和技能:二是要求畢業生具備勝任所從事崗位的扎實的學科專業知識以及較強的實踐能力和創新能力。長期以來,由于受傳統教師教育培養模式的影響,師范院校計算機專業實踐教學僅被看作是一種輔助性和驗證性手段,導致出現重理論教學,輕實踐技能,重思維能力,輕動手能力的現象,培養出來的學生難以適應社會需求。隨著師范院校就業形式多元化的發展,畢業生不僅可以選擇當老師,還可以從事軟件開發、網絡管理、信息技術等操作能力較強的工作。針對河南省4所師范院校的一份調型結果顯示:計算機師范生只有34.7%的學生非常愿意和愿意從事教師職業,其中計算機專業科班出身的學生只有29.68%的人愿意從事計算機教學。由此可見,推行實踐教學改革已成為師范院校的迫切要求。當前師范院校計算機專業應該著力培養“教師+IT工程師”新模式的人才,因此,如何提高學生的計算機應用能力,培養專業素養高、綜合能力強、動手能力突出的實踐型人才是亟須解決的問題。
對計算機專業而言,實踐教學是培養計劃的重要組成部分,而提高編程能力、踐行軟件工程思想、培養團隊合作精神則是實踐教學中的重要環節和目標,因此,各院校均將實踐教學擺在了重要的戰略位置上。目前,師范院校計算機專業的實踐教學環節主要包括教學(課程)實驗、實習實訓、課程設計、畢業設計(論文)、實踐創新等方面,實踐操作方式大體分為獨立完成和團隊合作兩種。但是不論哪種方式,都存在不足:獨立完成方式開發周期長、開發效率低、Bug出現頻率高,不利于培養團隊合作精神,不利于踐行軟件工程思想:團隊合作方式無法保證團隊成員均能各司其職,無法達到全面發展,并且存在著“窩工”、“吃大鍋飯”等現象。往往團隊中只有小部分人真正動手編程,其他人員僅僅是借用團隊實驗成果達到實驗或考核目標。通過分析目前實踐教學實施過程中存在的問題,我們提出利用結對編程思想來改革傳統實踐教學方式的方案。
一 結對編程概述
結對編程的定義為:兩名程序員合作開發同一產品模塊(設計、算法、代碼),這兩名程序員分別扮演“駕駛員”和“導航員”的角色,共同思考問題,共同負責產品模塊的各個方面。“駕駛員”控制鼠標、鍵盤并編寫代碼,“導航員”主動持續地觀察和輔助“駕駛員”的工作,找出代碼的缺陷,思考替換方案。結對雙方的角色不是固定的,而是進行周期性的交換。任何時候雙方都是平等活躍的參與者,在整個項目開發過程中,兩者共享所獲得的工作成績。
結對編程是極限編程12個最佳實踐中最重要原則之一,是團隊設計的基礎,它與傳統的開發過程有很大的不同。在傳統開發過程中,每個開發人員負責系統的一部分開發任務,各自分工,互不干擾。而結對編程是兩人結為一對,共同完成同一個開發任務。兩人在同一臺計算機面前進行編程活動,“駕駛員”進行操作編碼,“導航員”觀察代碼并考慮設計問題。一旦發現問題時,暫停編碼工作,雙方討論解決。結對者的角色根據需要進行不斷調整和交換,包括與其他結對小組交換成員。
結對編程的概念起源于20世紀90年代中期。經過近20年的研究和發展,多數軟件企業因其具有可以減少風險、提高生產效率、代碼質量高、有利于交流學習等優點而積極采用結對編程。也有一些企業對其持反對態度,主要理由是認為結對編程浪費人力資源、對程序員要求太高、公司人手短缺等。高校教學中應用結對編程思想的目的與軟件企業采用結對編程的目的不同,前者主要是幫助學生提高編程能力和培養團隊合作精神。在教學方面,最有代表性的是在1999年猶他州立大學做的一項試驗,結果表明雖然結對組在最初階段比獨立工作的學生完成同樣任務花費的時間更多,但很快結對組花費的時間大幅度下降,而獨立工作的學生需要花費比結對組更多的時間來達到相近的代碼質量。國外研究顯示,教學過程中采用結對編程可以提高學生的記憶力、自信心、學習興趣、代碼質量和學習成績。國內研究表明結對組的共同學習失敗率小于獨立學習失敗率,采用結對編程進行實踐教學的班級普遍在編程能力和質量上優于采用傳統實踐教學的班級。而且,結對編程有利于培養學生互相學習的良好習慣,提高學生的自信心,促進團隊合作和人際交往。但是,目前針對師范院校計算機專業特點的結對編程研究還很少。
二 實踐教學改革中對結對編程的要求
綜合考慮師范院校計算機專業本科生的實際情況,對實踐教學改革中踐行結對編程從工作環境、項目選擇、結對原則等方面提出相關要求。
1 工作環境要求
由于結對編程工作模式是兩人坐在一起共同完成程序的設計、編程和測試,因此需要將傳統的“一人一桌一機”的工作環境改造為“兩人一桌一機”環境,使工作臺和設備的擺放便于結對搭檔之間的交流與合作,為了不影響其他結對組的工作,最好將工作環境設置為隔斷式空間。如圖1所示。
目前,大多數軟件公司的工作環境與圖1類似(傳統開發仍然是“一人一桌一機”),這樣可以讓學生“身臨其境”感受未來實習或工作單位的工作環境。
2 項目選擇
實踐教學不是單純的課程實驗,提高學生編程能力最好的方式是項目驅動式。考慮到師范院校計算機專業學生的實際能力和編程素養,功能全面、業務邏輯復雜、代碼量龐大的大中型項目并不適合作為實踐課題,而通常情況下只由一人工作幾天甚至半天即可完成的微型項目也不能起到鍛煉技能的作用。因此,團隊結構簡單,開發人數在4~6人,代碼量在18人月以下,項目目標簡單,不需要與周邊系統集成,對系統高可用性要求一般的小型項目是最佳選擇。同時,宜選擇學生感興趣的、業務邏輯比較熟悉的小型項目進行實踐,如單機版游戲開發、多媒體教室預約管理系統、單詞記憶軟件等。
3 結對原則
實踐教學改革的目的是最大限度地提高學生實際動手能力、培養團隊合作精神和創新精神。實踐教學改革中的結對編程除了滿足基本的原則外,還應突出以下幾點:
(1)按照編程水平高低,將學生分為高級、中級和低級三個級別,因此結對組合有“高級+高級”、“中級+中級”、“低級+低級”、“高級+中級”、“高級+低級”、“中級+低級”幾種形式,為了達到學習和提高的目的,應該優先選擇“高級+低級”的模式。在這種模式中,力求達到高手培養新手的“幫帶”效果。
(2)結對編程的雙方有一個較長的磨合過程,應該讓學生盡早“結對”,爭取在實踐項目開始時,結對雙方已經有多次合作經歷。因此,在課程實驗階段,就應該讓學生自行尋找“搭檔”,并經常更換“搭檔”,以期找到最“志同道合”的伙伴。伙伴的選擇盡量將性格融合的,技術互補的配對。
(3)結對編程的雙方經常交換角色。角色可以定時交換,也可以根據開發任務交換。假設A為“高級”者,B為“低級”者,則難度大的任務由A擔任“駕駛員”,此時B在一旁觀摩和學習;難度小的任務由B擔任“駕駛員”,此時A在一旁監督和指導。
(4)結對雙方必須保證地位平等。“低級”者容易產生依賴和畏難心理,所以在結對編程過程中需要鼓勵“低級”者積極主動,而“高級”者應該以指導和溝通為主。兩人是平等的,只有經驗多寡之分,沒有地位高低之分。對“低級,,者而言,獨立操作實現一個功能模塊后,往往異常興奮,在結對中也會表現得越來越積極。因此,安排難度適中的結對任務有利于加強“低級”者參與結對的意愿。
(5)結對雙方必須全力以赴。結對編程本身能促使人竭盡全力,兩人一起工作的時候,沒有走神分心的條件。一旦編程過程中出現問題,則立即停止,雙方共同討論解決。
(6)結對雙方必須對待解決的問題有相同或相近的認知。結對雙方對開發任務都必須做到逐步了解、思路一致、編碼規范一致,包括標識符命名規則、注釋風格等。編程時先經過討論,達成共識,然后方能動手編寫程序。
(7)任務出錯或不能完成,應由雙方共同負責,不能相互指責。兩人意見不同時,可由指導教師協助解決,不要各執己見、據理力爭。
(8)指導教師給予學生更多鼓勵,結對雙方之間也需要相互鼓勵、相互學習,可以產生共同的榮譽感、責任感和成就感。
三 實驗對比及分析
1 實驗設計
我們在課程設計這一實踐教學環節中,采用對比實驗的方法對結對編程進行評價。在課程設計開始之前,學生已經在課程實驗階段進行了結對編程訓練。對比實驗班級有44名同學,分成兩個實驗對比組:一組采用傳統的小團隊開發方式,稱為傳統組,組員各自獨立編程;一組采用結對編程的團隊方式,稱為結對組,結對組由若干結對單元組成,結對單元采取兩人結對編程方式。指導教師擬定4個課題并事先劃分好模塊,分別交由兩個實驗對比組完成,均采用面向對象程序設計。對比組分配如表1所示。
表1中,對比實驗組的具體要求如下:
(1)兩組均要求遵循軟件開發流程,需要提交相關文檔。
(2)兩組均分成三個階段,由指導老師根據時間確定,每個階段同時考查各組的完成情況。階段考查時,傳統組需提交各成員的任務分配記錄;結對組需提交結對交換記錄。
(3)兩組均以答辯的形式給出每個課題的最終成績,并事先告知:傳統組各成員均有自己的成績,根據自己對課程設計的貢獻給出;結對組每個結對單元的兩人共同獲得一個成績(若結對單元之間經常互換結對角色,則參與交換的人員共同獲得一個成績)。
2 實驗結果及分析
對比實驗組的實驗結果分別如圖2、圖3、圖4所示。
圖2顯示在課程設計初期,結對組花費的平均開發時間比傳統組長,原因是結對組在結對編程之前需要進行討論和交流,達到共識后才進行動手編程,而且有些結對單元還處于磨合期。隨著項目的進展,結對組的編程效率逐漸增加,與傳統組的開發時間差距也逐漸減小。
圖3顯示,在各個開發階段,結對組的平均Bug數量均較獨立組少,原因是結對單元的兩人對同一任務實行結對設計、結對編碼、結對測試和結對評審。因此,在動手編程之前已進行了充分的交流和討論并達成一致意見,而且在編程過程中,一人編程,另一人隨時對編程中的錯誤進行監督和提醒,有效降低了Bug數量。
圖4顯示了兩個實驗對比組的平均成績(4個課題的總平均成績),成績的考核綜合考慮了開發時間、Bug數量、團隊合作精神、項目完成質量、編碼風格等指標。實驗結果表明,結對編程的效果明顯高于傳統方式。
四 結對編程對實踐教學的改進
通過考查學生結對編程過程及對比實驗分析,發現采用結對編程的學生,其編程素質有了明顯的提高。因此,我們提倡在教學過程中采用結對編程思想來改革計算機專業實踐教學。
1 結對編程的優點
(1)動手能力較低的學生學習和上手速度快,主要原因為:一是學習的內容均是實際需要的,目的明確,針對性強:二是有人幫帶,手把手的演示,比自己看書摸索進展快、效果好;三是邊學邊用,知識點掌握扎實。
(2)結對編程改掉了一些學生的編碼壞習慣,同時也學習了他人的編程優點:如快捷鍵的靈活運用,解決問題的搜索技巧等。另外,代碼的層次和語句變得更優美易讀。
(3)工作效率提高了。結對中,一人對另一人實際上有監督作用,有效杜絕了學生上機時聊天、打游戲、泡論壇、看電影等現象。結對編程時兩人合作能更有效地交流,相互學習和傳授經驗,解決問題能力有較大提高。而且,在結對過程中,結對雙方經常有思想的碰撞,在討論中更容易培養創新意識。
(4)程序Bug明顯減少,代碼質量顯著提高。結對編程,首先需要兩人共同理解,經過討論,形成一致思想,才可以編程。這樣減少了由于理解錯誤帶來的風險;其次,結對編程在編寫代碼的同時進行著代碼評審,出錯幾率降低了很多。所以結對編程能有效減少Bug數量。
(5)每個學生都有動手實踐的機會,都能在實際操作中學到實用知識,避免了前述傳統團隊開發中“窩工”、“吃大鍋飯”的現象發生。由于每人需要完成自己的結對任務,所以幾乎不存在照搬照抄他人成果的情況。
2 對師范院校實踐教學的促進作用
結對編程除了具備上述的優點外,對師范院校的計算機專業而言,還有著獨特的優勢。
(1)培養和提高了師范生的教學技能。師范生的教育實習是一個重要環節,但是多數學生的實習效果并不好,往往表現為不能進入教師角色,無法勝任頂崗課程教學任務等。究其原因是教育實習之前的試教環節存在弊端,因此嚴抓試教工作是教育實習取得成效的前提。但是,由于課時的限制,教師不可能讓每個學生都試講并給予指導。而結對編程環境恰好可以提供一個良好的試教平臺,這也是提倡“高級+初級”結對方式的原因所在。因為,在幫助和指導“搭檔”的時候,學生可以切身體會到“學會”和“教會”是兩個不同的層次,要想講清楚一個知識點,需要有耐心、勤思考。另外,被輔導的對象也會有無形的動力去努力學習,并模仿“搭檔”的教學方式。因為老師講解某個知識點可能無法完全站在學生的角度去考慮,學生如果聽不懂會認為“老師懂這些是理所當然的”,而且性格內向的學生可能會羞于向老師請教。但是,如果這個知識點是由自己的同學來講解的話,則情況大有改觀。在這個過程中,學生往往能收獲到成功的喜悅。
(2)增強了女生的自信心。師范院校女生居多,而且大都受“女生不適合學計算機”等片面觀點的影響,往往對編程望而生畏。在結對編程中,不論知識點的難度大小,每個人均需要親自動手操作。在公平對等的編程環境中,她們能真正動手敲程序代碼,一旦完成了自己的第一個小程序,她們往往很有成就感,自信心也極大增強。如果能得到老師和“高級”者的鼓勵和贊許,她們的進步會更大。
五 結束語
結對編程是一種新的編程思想。雖然部分軟件公司在項目開發中,對使用結對編程的方法持消極態度,表現為:(1)管理人員的反對;(2)不能讓兩個人干一個人的活;(3)編程人員的反對。究其原因主要是考慮開發成本等經濟效益以及程序員編程水平相差大。而在本科教學中這幾條因素的影響很小,故可以實施和推行。通過對比實驗結果表明,結對編程可以加快學生的學習速度,同時還能提高程序的設計質量、減少程序缺陷、提高學生的操作技能和團隊合作精神,并且在此過程中結對學生的心情更加愉快,學習積極性、自信心都得到了明顯增強。但是,也存在著一些問題:如有的學生喜歡獨立編程,不愿意結對(存在個別學生選擇獨自完成課程設計而不參與團隊開發的現象):有時會出現不適合結對的時機,比如對新技術進行嘗試和攻關的時候:如何采取有效措施讓“低級”者真實地參與結對編程等。在下一步的實踐教學改革中,將關注以上問題,尋找合適的解決方案。