結對編程(英語:Pair programming)是一種敏捷軟件開發的方法,兩個程序員在一個計算機上共同工做。一我的輸入代碼,而另外一我的審查他輸入的每一行代碼。輸入代碼的人稱做駕駛員,審查代碼的人稱做觀察員(或導航員)。兩個程序員常常互換角色。 php
在結對編程中,觀察員同時考慮工做的戰略性方向,提出改進的意見,或未來可能出現的問題以便處理。這樣使得駕駛者能夠集中所有注意力在完成當前任務的「戰術」方面。觀察員看成安全網和指南。結對編程對開發程序有不少好處。好比增長紀律性,寫出更好的代碼等。 程序員
結對編程是極端編程的組成部分。 編程
一些研究發現程序員結對工做與單獨工做相比,會寫出更短的程序,更好的設計,以及更少的缺陷。研究發現缺陷率下降15%到50%,會因爲程序員的經驗以及任務的複雜度而不一樣。結對編程比單獨編程相比,一般會考慮更多的設計選項,達成更簡單,更易維護的設計;程序員們也會更早地捕捉到設計的缺陷。結對編程與一個程序員承擔同一個任務相比工做會完成的更快。結對的程序員常常發現當他們一同工做時表面上「不可能」的問題變得容易,或更加快速,或至少有可能解決。 安全
然而,一個2007年的元分析得出結論「結對編程並不是一致地有利或有效的」,這是由於是否結對編程選擇之外的許多因素在編程任務的產出上起着很大的最用。元研究發現結對編程每每必定程度地縮短了開發時間,並且對代碼質量產生了正的邊際效益,可是結對編程大大增長了開發人員的工時;也就是說與單獨編程相比花費大大增長了。做者指出有關結對編程的研究遭遇了發表偏倚,有些不利於結對編程的研究要麼沒有開展研究,要麼沒有投稿,要麼沒有被授受發表。他們得出結論「你不可能期待又快又好又便宜。」 編輯器
雖然編碼一般比一個程序員單獨工做更快地完成,可是總的程序時間(程序員數目 × 花費的時間)增長了。管理者須要在工做更快的完成以及縮減測試和調試時間和更高的編碼成本之間平衡。這些因素的相對權重在不一樣的項目、不一樣的任務之間也不一樣。對於那些程序員沒有徹底理解的任務上,程序員期待更多的創造性,挑戰,以及 高複雜度,此時使用結對編程最有幫助。在簡單的,程序員都徹底瞭解的任務上,結對編程致使生產力的淨降低。 分佈式
在兩個程序員工做時,兩個程序員之間傳遞着知識。他們分享關於系統細節的知識,而且互相學習編程技巧。新的員工很快地得到團隊的習慣,並學習到系統的細節。「混雜結對編程」,即每一個程序員輪流與團隊中的全部其餘程序員結對編程,而不是僅與某個程序員編程,使得系統的知識在整個團隊中傳播,減小了程序員離開團隊帶來的風險。 工具
結對編程一般會帶來紀律和時間管理的提高。程序員在與結對的夥伴一同工做時,較少地可能忽略編寫單元測試,花時間上網或處理我的電子郵件,或偷工減料。結對的夥伴「讓他們保持誠信」。人們更不肯意打斷兩個結對編程的人,而單獨工做的人卻容易被打斷。 單元測試
其餘的收益據報告包括提升士氣以及在代碼正確性上更大的信心。 學習
在學術圈裏,結對編程也是爭議的。其緣由是過往學術期刊所發表的結對編程實驗,基本上其餘學者很難讓重複實驗覈對。因此不少結對編程實驗只有原做者才真正瞭解結果。但是,2013年Giri 和Soni 重複了在2006年Kim Man Lui所報告的結對編程實驗 而實驗結果也是一致。這次重複實驗標記着結對編程研究的里程碑 測試
遠程結對編程,也稱做虛擬結對編程或分佈式結對編程,是指兩個程序員不在同一地點,經過協同編輯器,共享桌面,或遠程結對編程的IDE插件進行的結對編程。 遠程結編程引入了一些在面對面的結對編程中不存在的困難,例如協做的額外時延,更多的依賴「重量級」的任務跟蹤工具,而不是「輕量級」的索引卡片,以及沒有口頭交流致使的在相似誰「控制鍵盤」問題上的混亂和衝突
許多任務具,例如Eclipse有插件支持遠程結對。有些團隊嘗試使用VNC和RealVNC,每一個程序員使用他們本身的計算機。其餘人使用基於文本的GNU Screen的多顯示模式。蘋果公司的Mac OS X包含內建的屏幕共享應用。
在乒乓結對編程中,觀察者編寫失敗的測試用例,駕駛者修改代碼以經過該用例,觀察者編寫新的單元測試用例,等等。這個循環持續到觀察者不能寫出失敗的測試用例。可是這種方法比估計的計劃要花更多的時間。