結對編程

兩位程序員完成同一個設計

結對編程(Pair programming)是一種敏捷軟體開發的方法,兩個程序員在一個計算機上共同工作,一個人輸入代碼,而另一個人審查他輸入的每一行代碼。與兩位程序員各自獨立工作相比,結對編程往往只需花費大約一半的時間就能編寫出質量更高的代碼。

背景


結對編程
結對編程
結對編程開始流行還要追溯到肯特•貝克在1999年撰寫的《Extreme Programming Explained》一書。根據書中記述,公司應該非常快速地發行軟體,而且軟體本身也應該在發行的過程中不斷得到完善,而兩人結對編程則可以更加快速的地實現這一點。
二十世紀八十年代,貝克曾與全球首個維基系統的開發者沃德•坎寧安(Ward Cunningham)同在一家軟體公司工作,貝克在此期間迸發出了很多關於“結對編程”的想法。在坎寧安要求貝克檢查一款軟體應用的漏洞過程中,雙方的合作關係逐漸形成。最終雙方的合作關係發展得越發深入,兩個人此後開始結對處理任務。

簡介


所謂結對編程,也就是兩個人寫一個程序,其中,一個人叫Driver,另一個人叫Observer,Driver在編程代碼,而Observer在旁邊實時查看Driver的代碼,並幫助Driver編程。
有實驗證明,結對編程時間花銷比單人編程增加10%的時間,也會比單人編程減少15%的代碼BUG。如果再算上後期代碼的維護和學習成本,結對編程比單人編程更有效率,更為節省成本。

變體


遠程結對編程
結對編程
結對編程
遠程結對編程,也稱作虛擬結對編程或分散式結對編程,是指兩個程序員不在同一地點,通過協同編輯器,共享桌面,或遠程結對編程的IDE插件進行的結對編程。遠程結編程引入了一些在面對面的結對編程中不存在的困難,例如協作的額外時延,更多的依賴“重量級”的任務跟蹤工具,而不是“輕量級”的索引卡片,以及沒有口頭交流導致的在類似誰“控制鍵盤”問題上的混亂和衝突。
乒乓結對編程
在乒乓結對編程中,觀察者編寫失敗的測試用例,駕駛者修改代碼以通過該用例,觀察者編寫新的單元測試用例,等等。這個循環持續到觀察者不能寫出失敗的測試用例。但是這種方法比估計的計劃要花更多的時間。

優勢


1、程序員互相幫助,互相教對方,可以得到能力上的互補。
2、可以讓編程環境有效地貫徹Design。
3、增強代碼和產品質量,並有效的減少BUG。
4、降低學習成本。一邊編程,一邊共享知識和經驗,有效地在實踐中進行學習。
5、在編程中,相互討論,可能更快更有效地解決問題。

缺點


結對編程
結對編程
1、對於有不同習慣的編程人員,可以在起工作會產生麻煩,甚至矛盾。
2、有時候,程序員們會對一個問題各執己見(代碼風格可能會是引發技術人員口水戰的地方),爭吵不休,反而產生重大內耗。
3、兩個人在一起工作可能會出現工作精力不能集中的情況。程序員可能會交談一些與工作無關的事情,反而分散注意力,導致效率比單人更為低下。
4、結對編程可能讓程序員們相互學習得更快。有些時候,學習對方的長外,可能會和程序員們在起滋生不良氣氛一樣快。比如,合夥應付工作,敷衍項目。
5、面對新手,有經驗的老手可能會覺得非常的煩躁。不合適的溝通會導到團隊的不和諧。
6、新手在面對有經驗的老手時會顯得非常的緊張和不安,甚至出現害怕焦慮的的精神狀態,從而總是出現低級錯誤,而老手站在他們後面不停地指責他們導致他們更加緊張,出現惡性循環。最終導致項目進展效率低下,並且團隊貌合神離。
7、有經驗的人更喜歡單兵作戰,找個人來站在他背後看著他可能會讓他感到非常的不爽,最終導致編程時受到情緒影響,反而出現反作用。

前提條件


兩種文化之間其實有些無可爭議的共同點:
穩固且持續的整合開發:基於每項任務的構建過程
牛X的核心開發人員:這些傢伙可以幫助提高代碼庫的質量並完善體系結構。
代碼質量的重要性:團隊以及整個公司都知道保持一個高質量的代碼庫的價值。
不斷的自組織:整個團隊願意定期評估並矯正調整他們的開發過程

樂趣


結對編程
結對編程
兩個人結對編程可以共同分擔每天的工作的壓力和精力。有時這些狀態的起伏都是相互的。當一個人工作正勁而另一個分神時,狀態好的可以幫助另一個集中注意力。而當兩個人同時注意力高度集中時,那這工作效率是要逆天的節奏啊,他們互相可以依靠、信賴。
一個總是一起工作的小夥伴可以促進自我提高;每個人都想在他們尊重的人面前表現出色。而且這時我們往往更容易做出些策略決定,同時也會帶來更好的工作氣氛:兩個人都不會輕易的選擇捷徑,經常會就某個問題進行權衡討論。
代碼集體所有權這個概念更容易被接受,因為代碼都是至少兩人合作完成的。這些使得整個團隊能以更積極的心態面對失敗。
當一切都很順利的時候,結對編程看上去是那麼的美好,但它同時也是只不羈的野獸需要去掌控。
結對編程的效率可以充分反映團隊的平衡。結對編程對訓練 菜鳥來說是非常好的一個方法,但是過分的稀釋核心人才,將他們分配給所有的初級開發人員會破壞團隊的生產力和氛圍。當一個團隊有過多的初級開發員,這種現 象會發生的更快,結對編程就變成了場人才調配的俄羅斯方塊遊戲。
同樣的平衡問題也會影響到知識庫。結對編程對於改進、重構之前的知識庫非常有效。一但一個新的庫或者分支被建立起來,就會增加結對人員分配和輪換的難度。
團隊需要不停的發現類似問題並儘早加以改正。知識和人才的失衡會導致團隊效率降低,更有可能破壞項目進程。