嚴悍 苑俊旺 邵帥 趙學龍
摘要:結(jié)對編程是極限編程的特色實踐之一。在極限編程活動中,對于中國學生,結(jié)對編程是組織難度最大的活動。為了更有效地組織結(jié)對編程,文章分析以往團隊成員所出現(xiàn)的一些不良現(xiàn)象,并探討可行對策,為大學軟件實踐教學和軟件業(yè)者從事極限編程提供參考和指導。
關(guān)鍵詞:結(jié)對編程;極限編程;敏捷軟件開發(fā);人為因素
0 引言
結(jié)對編程(pair programming)是極限編程(XP,eXtreme Programming)和敏捷軟件開發(fā)方法學的特色實踐之一。對于我國學生,組織極限編程活動,采用結(jié)對編程方法,有助于溝通能力、口頭表達能力的培養(yǎng),有助于相互學習、相互支持,有助于團隊協(xié)作能力的培養(yǎng),有助于提高軟件質(zhì)量和開發(fā)效率。因此結(jié)對編程實踐具有非常重要的意義。
筆者詳細分析了結(jié)對編程中學生所表現(xiàn)出來的不良現(xiàn)象,并針對這些現(xiàn)象給出相應(yīng)對策,以改進極限編程活動的效率。
1 結(jié)對編程的不良現(xiàn)象
一個項目團隊成功或失敗的關(guān)鍵原因往往不是技術(shù)因素,很多非技術(shù)的人為因素在起作用。極限編程活動中,如何組織結(jié)對編程就是非常突出的人為因素。筆者曾參與德國波恩大學2屆XP活動,在國內(nèi)組織了4屆XP活動。活動中發(fā)現(xiàn)傳統(tǒng)軟件工程中的一些習慣做法,以及學生的一些習性,導致活動中出現(xiàn)了一系列問題,在價值觀、團隊行為等多個方面都產(chǎn)生了明顯沖突,導致結(jié)對編程在國內(nèi)“水土不服”。
沖突1,傳統(tǒng)軟件工程中,往往先劃分模塊,然后個人對模塊負責。這種做法看似責任明確,但實際上,項目依賴每個成員,當某個成員離職,該模塊就無法維護,導致項目風險增大。此種做法與極限編程所倡導的“代碼集體所有權(quán)”違背。
代碼集體所有制,即每個人都是項目中所有代碼的受益人,同時也是責任人。每個人對所有代碼負責,而不是僅對自己編寫的代碼負責;每個人要對所有代碼的將來的維護負責;而不是僅對當前運行負責;每個人提交的代碼都屬于團隊,允許他人質(zhì)疑、修正、重構(gòu),甚至拋棄重建。
國內(nèi)學生大多過度關(guān)注個人能力和個人成績,而往往忽略團隊能力和團隊成績,他們往往傾向于獨立研究解決問題。獨立學習能力往往作為衡量學生個人能力的標尺,從小學到大學的教育都如此,根深蒂固,短時間內(nèi)難以改變。
沖突2,傳統(tǒng)軟件工程中,多人分別完成任務(wù),看似并行工作,效率應(yīng)該更高,但實際上返工較多。原因是個人獨立完成一個模塊的設(shè)計、編程和測試,實際上往往導致需求誤解多、缺乏設(shè)計合理性、缺乏測試完備性,最后導致軟件質(zhì)量達不到要求,項目開發(fā)效率降低。
國內(nèi)學生常常質(zhì)疑這樣的問題,兩個人用一臺電腦編程,怎么可能比兩人用兩臺電腦并行編程更有效?
結(jié)對(pair)是最小的團隊。結(jié)對編程要求兩人自由組成一個結(jié)對來完成一項任務(wù),要求坐在一起用一臺電腦。兩人分別扮演兩個角色:正駕driver和副駕co-driver或領(lǐng)航員,就像汽車拉力賽中兩人共同駕駛一部汽車。正駕操鍵盤,負責編碼,副駕掌鼠標,負責指導方向并做代碼審查;正駕注意力往往集中在最鄰近目標上,如前方400米之內(nèi)的具體目標,而副駕能借助地圖(如模型或文檔)來指導更長遠目標。兩人不斷溝通交流,密切協(xié)作,共同抵達目標。
兩人每小時休息一次并更換角色,直到一項任務(wù)完成,任務(wù)完成之后,結(jié)對解散,對新的任務(wù)再組織新結(jié)對。一個項目完成后,每個人都應(yīng)與其它成員至少結(jié)對一次。
對于一個項目團隊來說,最理想情形是,一個人的成功經(jīng)驗就是整個團隊的經(jīng)驗,一個人在某個地方失敗或走彎路,整個團隊都不會再出現(xiàn)。
沖突3,傳統(tǒng)軟件工程教育中,指導教師或項目負責人往往要起過分重要的權(quán)威作用。因為學生往往只關(guān)注老師如何評價,而往往忽視團隊其他成員的意見或建議。當團隊成員之間出現(xiàn)錯誤或不一致,就難以協(xié)調(diào)自行解決問題,除非指導教師干預。極限編程中,尊重是極限編程核心價值觀之一。要尊重每個人的意見,而不僅僅是教師或項目負責人。
2 不良現(xiàn)象分析及對策
文章就結(jié)對編程活動中成員所出現(xiàn)的7種不良現(xiàn)象進行分析,并給出相應(yīng)對策。
1)高手單駕,副駕休閑。
編程能力強的學生往往傾向于單獨行事,高手單獨駕車,很忙很累,而副駕無事可做,導致人力資源浪費。解決對策是堅持每小時更換角色,共同駕駛,共同抵達目標。個人能力有高低差異,高手有責任主動介紹經(jīng)驗和技能,把更多機會給另一方,另一方應(yīng)主動提出問題,尋求解決,主動駕駛。
2)事后證明。
副駕不同意正駕選擇或未達成一致,正駕就獨自到達目標,先造成即成事實,“一夜之間”獨自解決難題,以此證明自己正確高明。這樣對另一方可能造成潛在矛盾,并未達到結(jié)對編程之目的。解決對策,副駕作為領(lǐng)航,應(yīng)先決定做什么,正駕再執(zhí)行。
3)成功自尊。
很多學生只希望別人看到自己成功的結(jié)果,不希望別人看到過程中的多次失敗。這種“要面子”心理和“結(jié)果證明成功”做法導致過程中交流被動,團隊效率降低。解決對策,鼓勵失敗和失敗共享。具體做法是,建立失敗表彰機制,鼓勵個人發(fā)布自己遇到的錯誤和失敗,發(fā)布“有效失敗”記錄,說明發(fā)生時間、錯誤或失敗現(xiàn)象以及原因和解決辦法,標明撰寫人、重寫人。并將記錄發(fā)布在團隊網(wǎng)頁上,使所有成員能及時看到?!坝行 钡拿恳粋€錯誤或失敗都有特色、不重復,對所有成員都有參照價值。對于一個錯誤,如原因不明,相同錯誤可能再次發(fā)生,對于多次發(fā)生的錯誤需要團隊格外重視,如果原因已清楚,相同錯誤就不應(yīng)再犯。一名成員發(fā)現(xiàn)錯誤后,不鼓勵私下自行解決,因為這樣對其它成員并沒有經(jīng)驗積累。在每個開發(fā)周期之后應(yīng)累計錯誤記錄次數(shù)。對累計次數(shù)最多的個人進行鼓勵表彰。鼓勵失敗是極限編程最具顛覆j生的特點之一,測試優(yōu)先和測試驅(qū)動開發(fā)也有鼓勵失敗的動機。
4)情面阻礙。endprint
學生在發(fā)現(xiàn)別人編碼有錯誤時,不好意思指明,更不好意思修改或重構(gòu)他人代碼,導致錯誤和缺陷不能及時發(fā)現(xiàn)和處理,進一步可能導致項目延誤或重大缺陷。解決對策,勇氣是極限編程核心價值觀之一,要求每個人共同擔責,貫徹代碼集體所有制,將所有共享代碼都看作是自己的編碼。項目負責人應(yīng)明確當發(fā)生錯誤或缺陷時,不僅應(yīng)追查誰做的編碼,還應(yīng)追查誰可能已經(jīng)發(fā)現(xiàn)了錯誤而沒有說明的責任人。
5)不熟悉難結(jié)對。
只與相熟的人結(jié)對,而對陌生人難以有效交流,難以組成結(jié)對。團隊中可能有外國學生,也可能是本科生、研究生混搭,大部分相互間不熟悉,導致部分成員在執(zhí)行任務(wù)時形成隔閡。解決對策,成員應(yīng)明確與陌生人有效溝通是一種極其重要的能力,應(yīng)格外重視這種能力的培養(yǎng),一些集體配合游戲項目有助于成員之間增強交流和協(xié)作。
6)個人偏見。
對技術(shù)方案見解或意見不一致而產(chǎn)生個人偏見,進而導致對某成員“看不慣”“合不來”,從而采取不合作態(tài)度。如果團隊中兩個重要成員形成個人矛盾,那么整個團隊就會受到影響。解決對策,編程是一種創(chuàng)作,創(chuàng)作都帶有個人色彩,編程作為軟件工程活動,個性發(fā)揮應(yīng)受到限制。讓團隊成員知道,可爭論,但反對爭吵;可公開爭論,但反對私下言論和個人偏見。每個迭代周期結(jié)束后,成員都應(yīng)回答“對你幫助最多的同學是誰?”,以促進相互學習,交流經(jīng)驗。
7)延誤借口。
學生編程往往要使用別人已完成的編程,但發(fā)現(xiàn)別人編程有問題或缺陷,而沒有及時地、明確地提出,并以此為借口,延誤了自己的任務(wù),并把延誤責任推給別人。另一種情形為起初使用他人編程正確,后來他人出于糾錯或重構(gòu)目的而修改了編碼,導致自己編碼錯誤。以此為借口,延誤了自己的任務(wù)。解決對策,項目負責人應(yīng)明確指出這是不可容忍的行為,成員應(yīng)明確每個人的編碼都會被他人使用。
3 相關(guān)討論
結(jié)對編程目前獲得廣泛關(guān)注并給予好評。文獻[3]通過實踐指出結(jié)對編程可減少15%的開發(fā)時間。文獻[4]說明組織大學生結(jié)對編程,獲得定性和定量的評價和度量,結(jié)果都是積極的。但軟件業(yè)開發(fā)者則提出更多更尖銳問題來探討。
文獻[5]指出結(jié)對編程對于軟件工程的好處和缺點,其中大多缺點是針對中國軟件開發(fā)團隊。例如個人編程習慣不同可能導致難以協(xié)調(diào);爭論中各執(zhí)己見,互不讓步。應(yīng)關(guān)注結(jié)對副作用,如談?wù)搩?nèi)容與工作無關(guān),合伙應(yīng)付敷衍等現(xiàn)象分析。文獻[6]給出結(jié)對編程中的一些成型的模式,一個結(jié)對中的兩個角色,正駕和副駕,對于不同人員的行為特征,給出解決辦法。最主要的是,在一個結(jié)對中,當某人行為出現(xiàn)某種現(xiàn)象時,就應(yīng)及時轉(zhuǎn)換角色。
文獻[7]探討了何時結(jié)對編程最有效的問題。前提是具體考慮任務(wù)(稱為挑戰(zhàn))難度和個人技能之間是否匹配。結(jié)對編程有流模式與指導兩種成功模式,流模式就是兩人技能與任務(wù)難度之間都匹配,分工協(xié)作完成任務(wù);指導模式是針對新手完成較簡單任務(wù),需要老手指導,讓新手有機會學到經(jīng)驗。結(jié)對編程還有兩種不成功模式,“經(jīng)驗浪費”和“不知所措”?!敖?jīng)驗浪費”模式是任務(wù)太簡單,而無需老手指導,此時如果強行結(jié)對編程,就會導致浪費人力;“不知所措”模式是另一個極端,任務(wù)太復雜或需要太多新知識,最后無力完成。
4 結(jié)語
結(jié)對編程在我國仍處于探索階段。盡管目前存在種種不良現(xiàn)象,但也存在多種途徑和方法。(1)活動組織者只要認識到這些不良現(xiàn)象背后的原因,就容易找到合理的解決辦法。(2)在活動之初通過培訓告知參與者注意事項。(3)在活動中各個迭代周期小結(jié)時組織者應(yīng)及時指出所發(fā)現(xiàn)的不良現(xiàn)象。(4)對“失敗”鼓勵和獎勵,這種觀念轉(zhuǎn)變也很重要。
參考文獻:
[1]Beck K,Andres C.解析極限編程:擁抱變化[M].2版 雷劍文,譯.北京:機械工業(yè)出版社,2011:42-55.
[2]Martin R C.敏捷軟件開發(fā)——原則、模式與實踐[M].鄧輝,譯.北京:清華大學出版社,2003:9-20.
[3]Cokburn A.The costs and benefits ofpair programming[J].Extreme programming examined,2000(8):223-247.
[4]Williams L,Kessler R R,Cunningham W,et al.Strengtheningme caseforpairprogramming[J].Software,IEEE,2000,17(4):19-25.
[5]陳皓.結(jié)對編程的利與弊[EB/OL].(2010-03-15)[2013-9-4].http:∥kb.cnblogs.com/page/58732/.
[6]Pairprogramming stereotypes[EB/OL].(2011-12-27)[2013-9-1].http:∥www.planetgeek.ch/2011/12/27/pair-programming-stereotypes/.
[7]Pair programming:to do or not to do[EB/OL].(2008-12-10))[2013-09-04].http:∥softwarecreation.org/2008/pair-programming-to-do-or-not-to-do/.
(編輯:趙廓)endprint