有效進行結對編程的四種實踐機制
在極限編程與敏捷開發一文中,我們曾介紹過幾種有效實踐的方法,其中之一就是結對編程。結對編程好像兩個程序員在一個工作臺上共同參與、合作。就好像一個開車一個做導航員,而且最好經常是互換角色。 這種合作對開發程序有很多好處。比如增加紀律性,寫出更好的代碼等。
近日,皇家信號學校的Stuart Wray為IEEE軟件雜志2010年的一月刊撰寫了一篇文章,題目是“結對編程如何才能真正起作用”。在文章中,它舉出可各種結對的方法(幫工-學徒/驅動者-導航者),并指出了工作的一般方式:
#T#作為使用結對編程的開發者,我自己的的經驗是這樣的,它并非只是一種一個人編碼,另一個人觀察的技術。兩個程序員會很緊密地在一起工作,總是在交談,快速記下對要做的事兒的提醒,并且在屏幕上指出代碼的片段。(結對編程的特征之一就是,如果你正確地使用了這種方法,那么在一天結束的時候,屏幕上會滿是油膩的手指印。)程序員輪番使用鍵盤,經常會用這樣的話來進行交換,“不,讓我向你展示一下我是什么意思。”
以他對有效的結對編程的描述為基礎(并且指出并非所有對結對編程的實現都是有效的),他提出了能夠使有效的結對編程變得成功的四種機制。
機制一:結對編程者的交談
Brian Kernighan和Rob Pike建議要大聲地解釋問題,即便是向毛絨玩具也要那樣,John正在研究的一種實踐叫做“橡膠植物效應(rubber-plant effect)”。結對編程的一部分效力是由于持續觸發這種效應而得到的:當一位程序員被卡住了,那么反復的交談會使其突破,這種方式與單獨工作的程序員大聲地說出自己的問題是類似的。
他還討論了交談帶來的更大的好處,其中應用了他所謂的“專家程序員理論”——隨著需要知識的問題被更有效地解決,結對的兩個人會彼此更了解對方。
那么這可能正是專家程序員理論起作用的地方:專家更可能會提出有深度的問題,那會對被卡住的程序員起到很大的提示作用。看起來還可能僅僅是認為你正在與一位專家交談——或者假裝——那會幫助被卡住的程序員得出那種有深度的問題,可能在之前專家曾經問過他們。
將交談的價值累加起來,他指出:
這樣,第一種機制讓我們可以猜測,對程序談論更多的程序員會更有生產力,而不時地互相提出有深度的問題的人會是生產力最高的。
機制二:結對編程者會注意到更多細節
“你看不到自己的錯誤”,這是軟件開發中的(也是很多其它學科的)公理。
我們所能注意到的東西取決于我們期望看到什么,以及我們無意識地認為突出的東西。所以,盡管成功的結對編程者通常更多地會關注同樣的東西,但是他們也可能會注意到不同的東西。
因此,一起編程的兩個人不會擅長同樣的知識或者類別:一個人可能會更快地指出某個方面的問題,而另一個人對于其他方面更快一些。這樣他們的工作效率就取決于他們通過觀察來找到問題的速度。兩個人的頭腦肯定會比一個人的好。事實上,當人們開始進行結對編程的時候,最早做出的發現之一就是,不輸入代碼的人總是會更快地找出拼寫錯誤:“哦,在這里你漏掉了逗號。”
接下來,他提出了關于結對疲勞現象的警告:當兩個程序員進行結對,他們發現和無法發現的東西會變得越來越類似。最終,兩雙眼睛的優勢會喪失殆盡。
結對疲勞使得我們經常對結對進行輪換:
有些結對編程者認為輪換是實踐中可選的部分,而且在小型團隊或者是沒有幾個程序員愿意結對的團隊中,可能沒有其它的選擇。但是,結對疲勞意味著最終他們的生產力會降低。
機制三:與不好的實踐作斗爭
由于來自同儕的壓力而不使用不好的實踐,有人已經明確地指出這是有效的結對編程的優勢。
他討論了“編碼并修正”編程的例子,并將它與老虎機賭博成癮相關聯。
這是交互編程特定的屬性,使得我們很難做正確的事情。使用編碼并修正的方式,我們會隨意的修改程序,每次運行代碼的時候,就像將硬幣放在老虎機里面一樣。老虎機是我們所知道的最容易上癮的一種賭博形式。而來自于“編碼并修正”編程會帶來類似的不可預測的好處,這意味著它同樣讓人容易上癮。
而結對編程比較不容易受到不好的實踐的影響,因為程序員們會承諾以特定的方式編寫代碼,并確保兩個人都信守承諾。在人們容易犯錯的工作中,兩人結對工作的方式變得越來越流行,這會讓我們認真考慮,結對的壓力也可能是我們的一種解決方案。
機制四:分享并評價專家的意見
個人的生產力之間會有巨大的不同,至少可以將其分解成十個因素來度量。這通常意味著對難度和時間的估計是不準確的。對于好的和壞的程序員都是這樣——你只能通過與其緊密地工作來確定一個人的編程能力。
大多數程序員會解決他們自己的問題,因此沒有人知道他們有多棒(或者有多糟糕)。但在結對編程中,人們持續地一起工作。因為他們會不停地交換搭檔,團隊中的每個人都知道對于特定的領域誰是最專業的。出于這種比較,他們也會意識到自己的專業等級。這樣我們應該期望,比起單獨的編程團隊,通過結對編程可以對時間和難度進行更準確的估計。從我們的經驗看,這的確是那樣的。