pair programing是所有XP實(shí)踐中爭(zhēng)議最大的一個(gè),但竊以為確實(shí)XP實(shí)施的關(guān)鍵關(guān)鍵實(shí)踐之一,甚至于,我認(rèn)為很多XP實(shí)施的失敗都是由于沒(méi)有采用pair programming而造成的。
要了解pair為什么重要,就要了解pair的目的在何。當(dāng)然了,大多數(shù)人都知道pair的重點(diǎn)在于知識(shí)傳遞,知識(shí)共享,持續(xù)走查,降低代碼缺陷等等等等。這些都是pair的優(yōu)點(diǎn),不過(guò)最重要的一點(diǎn)卻常常被忽略——pair programing的最直接而又最根本的目的之一在于simple design。

上圖是著名的Ron Jefferies Model,可以看到XP最佳實(shí)踐被劃分成了一個(gè)一個(gè)的圓圈,而pair, TDD, refactor和simple design位于中心。這并不是說(shuō)這四個(gè)實(shí)踐就是xp的核心。jefferies model每一圈代表了xp實(shí)踐過(guò)程中的不同關(guān)注點(diǎn),最中心的是dev視角,其次是team視角,最外層是交付/管理視角。每圈上的最佳時(shí)間多少都有些緊耦合,放開(kāi)其他的不講,我們專(zhuān)門(mén)說(shuō)說(shuō)dev圈,pair programing, tdd, refactor和simple design。
這四個(gè)實(shí)踐里只有simple design最虛也最重要。有一個(gè)問(wèn)題已經(jīng)被問(wèn)過(guò)無(wú)數(shù)次了,“到底多simple的design才叫simple”。我對(duì)此也有一個(gè)近乎刻板的回答:team里所有人員都能夠理解的design就是simple的。一旦立了標(biāo)準(zhǔn),這四個(gè)實(shí)踐的主從關(guān)系就一下子清晰起來(lái)——simple design是這四個(gè)實(shí)踐的核心,其他三個(gè)實(shí)踐都是它服務(wù)的。
首先做出一個(gè)設(shè)計(jì),最簡(jiǎn)單的判斷標(biāo)準(zhǔn)就是是否可測(cè),一個(gè)不可測(cè)的設(shè)計(jì)基本上可以認(rèn)為無(wú)法實(shí)現(xiàn),于是TDD即是simple design的質(zhì)量保證又是simple design的直覺(jué)驗(yàn)證。
refactor是為了得到好的代碼,那么什么是好的代碼?simple design!!!這里有人不同意了,有人說(shuō)只是要易于修改和擴(kuò)展,可是擴(kuò)展和修改也要?jiǎng)e人看得懂才行啊...simple design是起碼的要求嘛。實(shí)際上,XP中的refactor就是朝著simple design的方向重構(gòu)過(guò)去的,也就是朝著所有人都能理解的代碼refactor過(guò)去的。插一句題外話(huà),為啥說(shuō)好的架構(gòu)的不是設(shè)計(jì)出來(lái)的呢?因?yàn)楹玫募軜?gòu)至少應(yīng)該是simple design的,而simple的概念有和人員相關(guān)...所以當(dāng)你極盡能事show off你的pattern知識(shí)之后,得到復(fù)雜設(shè)計(jì)根本就不可能是好的架構(gòu)。時(shí)刻緊記,架構(gòu)是妥協(xié)啊...
最后,pair programming是simple design的實(shí)際檢驗(yàn)?。。∫?yàn)榧幢闶亲顝?fù)雜的設(shè)計(jì),只要是你自己想出來(lái)的,你都覺(jué)得它簡(jiǎn)單無(wú)比,里面充滿(mǎn)了直白且顯而易見(jiàn)的理由??上Р恍业氖?,我們要的簡(jiǎn)單,是對(duì)team里所有人的簡(jiǎn)單。如果你的pair不能理解你的設(shè)計(jì),那么說(shuō)明你的設(shè)計(jì)復(fù)雜了;如果你們兩個(gè)人懂,但是swith pair的時(shí)候,換過(guò)來(lái)的人不懂,說(shuō)明你的設(shè)計(jì)復(fù)雜了。pair programming(以及他那容易讓人忽略的子實(shí)踐switching pair)就是檢驗(yàn)simple design的過(guò)程。pair programing + refactor就是時(shí)刻保證simple design防止過(guò)渡設(shè)計(jì)反攻倒算的過(guò)程。pair programming + refactor + tdd就是團(tuán)結(jié)在以Deming同學(xué)built quality in的質(zhì)量大旗下,堅(jiān)定地與過(guò)渡設(shè)計(jì)做斗爭(zhēng)的過(guò)程。據(jù)我觀(guān)察,至沒(méi)有使用pair programming的團(tuán)隊(duì)中,少一半simple design成了口號(hào),而這一半中,至少又有一半最終放棄了xp放棄了敏捷(俺以前帶過(guò)的團(tuán)隊(duì)就有這樣的...默哀一下)。深刻的教訓(xùn)啊,我們來(lái)高呼一下:"pair programming是檢驗(yàn)simple design的唯一標(biāo)準(zhǔn)!"。
最后說(shuō)一下pair programming經(jīng)濟(jì)學(xué),過(guò)多的假設(shè)我就不講了。單說(shuō)一點(diǎn),有哪一位上班的8小時(shí)從來(lái)不上msn/yahoo/qq等im?有哪一位上班從來(lái)不上論壇/不回貼/不發(fā)郵件?以我pair的經(jīng)驗(yàn)來(lái)看,pair programming的過(guò)程中,兩個(gè)人幾乎不會(huì)用im,幾乎不會(huì)逛論壇。你不好意思呀,畢竟不是你一個(gè)人的機(jī)器,畢竟是兩個(gè)人的時(shí)間,畢竟你也不愿意給同事一種懶散的印象吧?收回的這么浪費(fèi)的時(shí)間,至少頂?shù)眠^(guò)另外一個(gè)人的工作時(shí)間了吧?