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