六種不同的結(jié)對編程模式對比
專業(yè)編程領(lǐng)域總是產(chǎn)生一些相當(dāng)激烈的爭論。例如關(guān)于是否以及怎樣對代碼作注釋。我們很難平息這些爭論,因?yàn)榭茖W(xué)地論證專業(yè)編程是有難度的。我們不可能真的要求大公司用一個對照組與一個實(shí)驗(yàn)組兩次構(gòu)建同一個軟件。因此很多時(shí)候我們的依據(jù)是傳聞或個人意見,極缺經(jīng)驗(yàn)數(shù)據(jù)。因此,相比是否該選擇結(jié)對編程,今天我更想談?wù)劷Y(jié)對編程的模式。
我先前曾從業(yè)務(wù)角度談?wù)撨^結(jié)對編程的好處,現(xiàn)在我以同樣的方式來介紹今天這篇文章。你能從中獲益,但你必須評估它對你是否有意義。要想做好評估,你就應(yīng)該了解不同的結(jié)對編程模式以及它們都是如何運(yùn)作的。
沒錯,結(jié)對編程并非只是把兩個人扔一起、讓他們瘋狂撒歡。多年以來,從業(yè)者開發(fā)了一些應(yīng)用于不同情況的技術(shù),通過實(shí)踐與實(shí)驗(yàn),他們對這些技術(shù)作了提高與完善。
一、熟練程度不同結(jié)對編程模式的影響
看實(shí)際方案之前,讓我們先繞個小彎看看不同開發(fā)人員的技術(shù)水平。盡管我們看似特別傾向于細(xì)致地區(qū)分不同技術(shù)水平,但我覺得實(shí)際只存在兩種開發(fā)人員技術(shù)水平:初學(xué)者和專家。我懂,我懂,你們一定覺得這種分法太草率了,但這樣確實(shí)可以把復(fù)雜性降到***,且能很好地解釋不同結(jié)對模式。根據(jù)我們這兩種技術(shù)水平,能得出以下三種結(jié)對組合:
- 專家-專家
- 專家-初學(xué)者
- 初學(xué)者-初學(xué)者
請注意,我這里談及的專業(yè)技術(shù),是背景的一部分,而不僅僅是一般的行業(yè)經(jīng)驗(yàn)。技術(shù)的積累、對代碼庫的熟悉程度、甚至還有專業(yè)領(lǐng)域知識在這都很重要。我有兩個計(jì)算機(jī)科學(xué)學(xué)位,對幾種面向?qū)ο蟮木幊陶Z言也有數(shù)年經(jīng)驗(yàn),但如果我哪天加入你的Go語言團(tuán)隊(duì),你可以妥妥地把我放在初學(xué)者陣營直到我找到自己的定位。
每種結(jié)對模式有它的優(yōu)缺點(diǎn),然而有時(shí)候命運(yùn)可能迫使你根據(jù)哪個人有空來做出選擇,到時(shí)候?qū)Σ煌Y(jié)對模式的了解會助你更有效率。另外,值得一提的是,初學(xué)者-初學(xué)者的組合可為二者提供很多的學(xué)習(xí)機(jī)會,但有風(fēng)險(xiǎn)。因此,這種組合的適用性更多地取決于你對風(fēng)險(xiǎn)而非結(jié)對模式本身的傾向。
二、非結(jié)構(gòu)化結(jié)對模式
設(shè)想一下結(jié)對編程誕生時(shí)的情況,李四走到張三的格子間辦公室,說:“嗨,我們一起用FORTRAN語言工作吧。”好吧,這么個小故事也許不足為信,不過想象一下它會怎么發(fā)展吧。李四和張三習(xí)慣把編程作為獨(dú)自的工作,某天卻決定把他們的智慧結(jié)合在一起。他們不一定知道任何編程協(xié)作的技巧,所以他們臨時(shí)結(jié)伙,試著互相幫助。
這是我要列舉的***種協(xié)作示例。如果覺得很荒唐,那你要錯過這堂課了。知道一些技巧可以嘗試當(dāng)然很有幫助,但不要麻痹了你的分析能力。如果你想起步,試錯(測試與出錯)會有很大幫助。就像下面的結(jié)對技巧通過試錯而不斷進(jìn)步,你自己也需要這樣。
但也要知道結(jié)對的組成中也存在著限制。它需要兩個夠格的頭腦和單單一臺計(jì)算機(jī),所以當(dāng)你在編程而你的伙伴在檢查她的郵件是不行的。你可以視情況用些不同的溝通技巧,如“鍵盤用一個還是兩個?”、“誰來打代碼?在什么時(shí)候?”
三、駕駛員-***員模式
就已建立的模式而言,我們先來看一下駕駛員-***員模式。理論上這可構(gòu)成最成熟的模式。
它的名字源于兩個人可能作汽車旅行穿越未知區(qū)域的場景,駕駛員的注意力集中在機(jī)械方面,包括操控油門和剎車,調(diào)轉(zhuǎn)車輪還有提防障礙與其他車輛。與此同時(shí),***員則考慮更宏觀的問題。還要開多久才能下高速?手機(jī)是否能及時(shí)收到任何突發(fā)交通堵塞的提示?
把這對關(guān)系的比喻應(yīng)用于編程,那么駕駛員就負(fù)責(zé)寫代碼,瀏覽文件,還有基礎(chǔ)實(shí)現(xiàn)方法。***員則著眼更長遠(yuǎn)的考慮并且檢查錯誤。這方法適合這種架構(gòu)嗎?我們有沒有可能另辟蹊徑重寫一個實(shí)現(xiàn)方法?我們是否困在死胡同里了?
如果二者都是可互換角色的專家,那么駕駛員-***員模式會很理想,對于專家與新手的組合來說也不錯。這個模式在專家做***員時(shí)最容易起效,因?yàn)樽尣锁B來當(dāng)***員,他可能只會被動地干坐著而讓專家分飾兩角。
四、后座***員模式
接下來要講的結(jié)對編程模式是后座***員模式。這方案看起來像是駕駛員-***員模式,但***員接管了更多具體策略的工作(讓人聯(lián)想到后座駕駛員)。
和駕駛員-***員模式一樣,駕駛員在鍵盤前坐著,執(zhí)行諸如寫代碼的工作。但不像駕駛員-***員模式,后座***員下達(dá)的是更細(xì)致的指示。這意味著她可能告訴駕駛員什么時(shí)候創(chuàng)建一個方法或打開一個新的文件。她還會告訴他應(yīng)該如何為一個測試或變量命名。
這種模式在以初學(xué)者為駕駛員的初學(xué)者-專家組合中發(fā)揮得***。初學(xué)者在按照專家指示做事的過程中得到學(xué)習(xí)。
五、向?qū)J?/strong>
另一種非常適合專家-初學(xué)者組合的模式是向?qū)J健M瑯樱{駛的比喻依然適用。
設(shè)想去某地度假并在當(dāng)?shù)芈眯小q{駛員登上客車或巴士,開始駕駛,然后告訴你他正在做的每件事情和你所看到的每樣事物。你的地位就很被動。
向?qū)J骄幊棠J揭彩沁@樣。駕駛員做戰(zhàn)略與策略上的思考,同時(shí)寫代碼。當(dāng)她這么做時(shí),她告訴“游客”她正在做什么。游客很少介入。
這在專家駕駛員與菜鳥游客組合上很有效,尤其是菜鳥一無所知的情況下。但如果角色互換,它其實(shí)也同樣有效。初學(xué)者可以在專家的觀察下探索解決問題,專家則提供反饋與糾正,如此反復(fù)。
六、乒乓結(jié)對模式
要認(rèn)真完成結(jié)對編程模式的學(xué)習(xí),你還得了解乒乓結(jié)對模式。這種模式有個不同于其他模式的有趣因素。
為了便于理解,把結(jié)對編程看成一項(xiàng)極限編程運(yùn)動,這些人深愛著結(jié)對編程和其他具體應(yīng)用,如單元測試。因此當(dāng)你遇到一個極限編程者,你可以穩(wěn)妥地認(rèn)定她喜歡結(jié)對也喜歡實(shí)踐測試驅(qū)動開發(fā)(TDD)。
這個步調(diào)很簡單,前一個人寫一個失敗測試而后一個人設(shè)法通過。接著后一個人寫失敗測試讓前一個人設(shè)法通過。如此來回往復(fù),有點(diǎn)像乒乓球。
這種模式在兩個專家的組合時(shí)進(jìn)行得格外***,初學(xué)者-專家組合也進(jìn)行得相當(dāng)順利。另外很有趣的是,它可能在初學(xué)者-初學(xué)者組合下效果***,前提是以鍛煉初學(xué)者為目的。乒乓結(jié)對模式下,兩人角色轉(zhuǎn)換得非常頻繁,使得他們總能一起思考,因此所有的組合都能進(jìn)行順利(盡管會帶來一些人際關(guān)系問題)。
七、分布式模式
我將以一種“非正式”的結(jié)對模式收尾。不過這種配對模式極有可能掌握著未來日益全球化的分布式世界的關(guān)鍵,我說的正是分布式結(jié)對模式。
極限編程始于90年代,當(dāng)時(shí),遠(yuǎn)程工作需要Citrix系統(tǒng)與撥號調(diào)制解調(diào)器。換言之,你在任何地方都做不了協(xié)作編程工作,只能由個人完成。但20年后,托管的硬性要求隨著技術(shù)發(fā)展而弱化了。你可以用Screen Hero之類的軟件無縫銜接。顯然,就個人而言,協(xié)作仍然更有效,但技術(shù)已經(jīng)縮小了很大的差距。另外,人們隨時(shí)隨地協(xié)作產(chǎn)生的長遠(yuǎn)收益是不可否認(rèn)的。
相信在未來,結(jié)對編程模式還需要加入經(jīng)得起考驗(yàn)的技術(shù)。不過我認(rèn)為分布式模式會變得更加多元化。前面幾種模式隨著時(shí)間推移均進(jìn)行了技術(shù)的更新與完善。我認(rèn)為不到20年,我們將看到一些頗明智且復(fù)雜巧妙的結(jié)對編程模式。