摘要:結對編程(Pair Programming)是極限編程(Extreme Programming,簡稱XP)的十二個實踐之一。它指的是兩個軟件開發人員共用一臺計算機,其中一個人負責具體細節工作,而另一個人關注整體,但這兩個人的角色可以隨時互換。這是一種輕量、高效、低風險、柔性、可預測、科學而充滿樂趣的軟件開發方式。結對編程可改進設計質量、減少程序缺陷、降低人員風險、提高技術技能和團隊合作精神。
關鍵詞:軟件工程;敏捷方法;極限編程;結對編程
中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2009)24-7058-02
Research of Pair Programming Based on Extreme Programming
LI Yun-chao
(South-Central University For Nationalities, Wuhan 430074, China)
Abstract: Pair programming (Pair Programming) is the Extreme Programming (Extreme Programming, referred to as XP), one of the 12 practice. It means that two software developers share a computer, a person responsible for one of the specific details of the work, and the other concerned with the overall, they can swap roles any time. This is a lightweight, high efficiency, low-risk, flexible, predictable, scientific and fun way of software development. Pair Programming can bring economic profit, improve design quality, reduce defects, decrease staffing risk, enhance technical skills and improve team communications.
Key words: software engineering; agile methods; extreme programming; pair programming
目前,我國軟件行業還處在初級階段,傳統的軟件工程技術很難在中小軟件公司中發揮作用,然而極限編程(Extreme Programming,簡稱XP)技術的出現,使中小軟件公司的軟件開發有了新的突破。XP是一個輕量級的、靈巧的軟件開發方法,同時它也是一個非常嚴謹和周密的方法。
XP中非常重要的實踐之一是結對編程(Pair-Programming)。指的是兩位程序員并肩坐在同一臺電腦前,共同探討設計方案、共同設計算法、共同編寫程序代碼、共同完成各種測試。簡單地說就是兩個人坐在同一臺計算機前面,一個稱為駕駛者(Driver),負責代碼的鍵入;另外一個稱為領航員(Navigator),負責其他工作,包括隨時觀察駕駛員的工作情況,發現并糾正其操作性和策略性失誤等。
1 結對編程分析
1.1 結對編程優點分析
1.1.1 減少風險
風險會使大多數團隊停滯不前,減少風險的最佳方法是確保團隊中的每個人都完全熟悉系統的所有部件以及對系統的所有變更。因此,技術講解和設計文檔很有用,但對于大多數快節奏的項目,它們并不能很好且迅速地傳播知識。研究表明傳播知識最有效的方法是讓知道代碼的人與不知道代碼的人一起解決問題。
1.1.2 使團隊生產效率更高
1+1>2。首先,一個人的編程,平均很難實現1>80%×1的工作效力。但是在和同伴一起工作時,必須保持思維一直高度集中,所以平均都可以達到1>80%×1的個人效力,一個人有了想法,首先要表達出來,讓自己的同伴理解,經過深刻的討論,一致認可之后才開始編寫代碼。編寫代碼時至少有一個人一直在復查代碼,使得出錯幾率就降低,減少了bug的產生,對代碼的質量起關鍵作用。另外,由于兩個人的思想匯集,能創造了很多新編程算法或結構重用等。
1.1.3 Pair 可以打造出最佳的合作團隊
通過結對,團隊可以在最短的時間內完成磨合。Pair很好的促進了團隊的溝通交流,經常一起合作Pair的員工,彼此了解、熟悉,很多都是工作和生活上的好友。在這樣的團隊里,大家很樂意互相協助,一起分享知識、分享快樂,打造出最佳的合作團隊。
1.2 結對編程遇到的問題分析
1.2.1 由于人員的變動,來了新成員
在這種情況下,前期確實會對其搭檔產生一定的影響,但是磨刀不誤砍柴工,通過結隊編程,可以最快的使新成員進入狀態,通過后期的高效工作完全可以彌補前期的消極影響。
1.2.2 后面坐著的人跟不上寫代碼的人的思路,或不習慣寫代碼人的代碼風格
結隊編程不僅僅是一起寫代碼,在寫代碼之前更需要一起對需求進行探討, 一起討論設計方案,達成共識之后再一起寫測試用例,一起編碼,一起測試。但在開發過程中要嚴格遵循事先定好的代碼規范。這樣才能實現XP強調的“代碼共同擁有”。
1.2.3“我的搭檔太差勁”等因盲目自大導致的問題
這是一個極其嚴重的問題,整個團隊的心理狀態和團結精神都處于極大的危險之中。而最好的解決辦法就是安排那位“自大狂”與幾位公認的好搭檔合作,讓他感受一下結對編程技術的價值和高效率,使他能由此認識到結對編程的好處,以便以后全身心地投入到工作中。
1.2.4“我的搭檔太聰明”等因盲目自卑而導致的問題
這種自卑問題相當容易被發現。此時可以讓那位缺乏自信心的成員擔任駕駛員角色,因為駕駛員必須全力集中在手里的工作上,這樣可以讓那位缺乏自信心的成員更主動一些,并安排一位個人技能良好的團隊成員做這種人的領航員,領航員可以贊揚駕駛員的每一個好主意和每一個好做法,有助于幫助他樹立自信心。
1.2.5 什么情況下結對編程行不通
1) 造成結對編程無法正常工作的一些情況:
2) 不情愿的配合;
3) 拒絕別人的意見,甚至攻擊對方;
4) 小心翼翼有意見不敢提;
5) 怕別人覺得自己笨不敢問問題;
當然這些問題跟管理以及個人性格有關系,最好的方式就是不讓他們結對,或者讓他們跟別的人結對。
1.2.6 Pair團隊做同一工作的效率問題
表1為來自某印度技術公司的項目統計數據。
1.3 結對編程的幾條準則
1.3.1 用編碼規范來支持結對編程
如果兩個人整天把時間浪費在爭論代碼風格的問題上,那么結對編程就不可能發揮它的威力,應該嘗試對風格進行標準化。
1.3.2 不要讓結對編程變成旁觀
不掌握鍵盤的那個人應該主動參與到編程當中,他應該分析代碼,提前思考接下來的代碼應該做些什么,對設計進行評估,并對如何測試代碼做出計劃。
1.3.3 有規律地對結對人員和分配的工作任務進行輪換
結對編程的好處在于能夠讓不同的人熟悉系統的不同部分,有規律地進行輪換有助于知識的互相轉播—有些專家建議盡可能經常進行人員輪換,甚至每天進行。
1.3.4 鼓勵雙方跟上對方的步伐
要是其中一個人相對走得太快的話,那就會大大限制了其結對搭檔的作用,速度太快的人需要放慢步伐。否則這對組合應當被拆開,然后和其他人重新組合。
1.3.5 搭檔間在設計、方向、技術等發面意見不合發生沖突
此時盡量由領航員把引起沖突的問題記在一張卡片上,過一會(如半小時后)再重新探討,這樣做可以暫不干擾駕駛員的思路,如果兩位搭檔間的意見始終不能統一,把問題上交給團隊的隊長/教練/經理去評判。
2 結對編程方案改進
1) 編程三人組。一個人守護鍵盤,一個人守著“黑板”,最后一個人則代表用戶在“大聲地思考著”。2) 兩位搭檔來自不同的學科。編程搭檔不必非得由兩位代碼開發人員組成。3) 盡量給駕駛員留時間去發現和糾正他自己的錯誤,盡量適應自己的搭檔。4) 避免新手組合。用專家—中級程序員、專家—新手組合方式,兩個人中至少一個人有結對經驗。5) 項目開發過程中要營造一個可以能暢所欲言、和諧平等、相對民主的開發環境,一種相互交流、相互研究、共享代碼、共享知識的氛圍,創建一種共同成長、開放共享的學習型組織。
3 結對編程實踐
如表2,表3所示:
1) 需求分析中,需求調研和需求分析進行輪流交換,輪流交換至少是三個以上的人進行互換,而不是兩兩互換;2) 概要設計中,需求分析到概要設計也進行輪流交換;3) 詳細設計中,概要設計到詳細設計再進行一次輪流交換;4) 編碼實施啟動后,詳細設計到編碼的交換采用兩兩交換,這個時候最好不要再采用輪流交換。
參考文獻:
[1] Williams L,Kessler R.Pair Programming Illuminated[M].北京:機械工業出版社,2004.
[2] Marchesi M,Succi G,Wells D,et al.Extreme Programming Perspectives[M].北京:電子工業出版社,2004.
[3] 白慧冬.交換編程——結對編程的延伸實踐[J].程序員,2006(12):78-81.
[4] 謝國波,劉竹松,陳平華.結對編程在計算機專業學生編程實踐的應用[J].廣東工業大學學報:社會科學版,2008,8(B07):65-66.