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