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























