結(jié)對編程踩坑指南

背景

最近但惶,我開始重新審視這些融入日常的工程實(shí)踐方式,去嘗試找出實(shí)際與理論的差距樱衷,分析差距成因,基于分析結(jié)果酒唉,嘗試找出可以逐步彌補(bǔ)差距的實(shí)踐方式矩桂,從而讓日常軟件交付工作變得更加“順滑”。

本文作為“沉思錄”的第一篇痪伦,將列舉實(shí)際交付項(xiàng)目中侄榴,在結(jié)對編程時(shí)遇到的幾個(gè)實(shí)際問題,并針對具體問題給出一些嘗試過的解決方式网沾。

如有其他更好的建議癞蚕,歡迎共同討論。

注意:以下話題不在本文的討論范圍中辉哥,并且默認(rèn)讀者已經(jīng)具備下列問題相關(guān)的知識:

工作環(huán)境上下文

  • 9 人團(tuán)隊(duì)(1 BA会放, 1 QA, 1 TL钉凌, 6 Devs)
  • 特殊角色(BA鸦概,QA, TL)基本都是 Solo 工作甩骏,Dev Pair 工作
  • 每對 Pair 同一時(shí)間只會工作在一個(gè) User Story 上,直到該 User Story 進(jìn)入測試階段
  • 團(tuán)隊(duì)在 Sprint 開始時(shí)進(jìn)行 Switch Pair 活動先慷,User Story 未完成的 Pair饮笛,會有一人留在未完成的 Story 上,以便完成保證卡片上下文充足
  • Switch Pair 會按照 Pair 輪換表(如下)進(jìn)行论熙,以確保所有開發(fā)都會有均等的 Pair 機(jī)會

Dev輪換表大概是這個(gè)樣子(每個(gè)周期內(nèi)團(tuán)隊(duì)采用同一編號的配對組合)

基于以上的上下文福青,我們遇到了以下實(shí)際問題

問題 1:Switch Pair時(shí),需要交接的內(nèi)容過多

Switch Pair 時(shí)脓诡,需要交接的內(nèi)容過多時(shí)无午,可能會漏掉一些細(xì)節(jié)信息。為了補(bǔ)充遺漏祝谚,會陷入更多宪迟、更深的討論。

具體場景

張三和薛霸經(jīng)過了一周的結(jié)對編程交惯,手頭的一張復(fù)雜 User Story (無法進(jìn)一步拆分)沒有完成次泽,薛霸被留在了當(dāng)前工作上,準(zhǔn)備和阿樂開始工作席爽。

可是意荤,在薛霸向阿樂介紹當(dāng)前的工作進(jìn)度時(shí),無法清楚地給阿樂說明之前所寫代碼與 User Stroy 的對應(yīng)關(guān)系和一些必要的上下文只锻。

于是這對 Pair 不得不將張三重新拉回來玖像,進(jìn)行上下文交接,三人討論時(shí)間較長齐饮,并且會將之前已經(jīng)討論過的問題重新討論捐寥,降低了工作效率。

分析原因

后來祖驱,張三上真,薛霸,阿樂對這次效率不盡人意的 Switch Pair 進(jìn)行了回顧羹膳,嘗試?yán)?strong>問答的形式進(jìn)行分析:

  • 對于阿樂的問題睡互,薛霸無法清楚地解答,但在拉回張三后,增加了一些額外的討論時(shí)間就珠,就可以解答了寇壳。

    問: 結(jié)對的兩人在當(dāng)前工作中,理論上應(yīng)該能夠具備相當(dāng)信息積累妻怎。那么壳炎,為什么當(dāng)前薛霸和張三出現(xiàn)了信息積累差異的情況?

    答:卡片從 Kick-Off 到當(dāng)前交接 Switch Pair 的時(shí)間跨度較長(7天逼侦,含周末)匿辩,包含內(nèi)容較多,需要一些討論重新回想起當(dāng)時(shí)的信息榛丢。
    另外铲球,薛霸無法解答的問題,基本都是張三在薛霸請假期間完成的晰赞。

  • 結(jié)對編程理應(yīng)是有任務(wù)拆分(Tasking)作為前提的稼病,以確保 Pair 兩人對于當(dāng)前的工作進(jìn)度一致,以盡量減輕請假所帶來的信息不對稱問題掖鱼。

    問:為什么當(dāng)前的效果并不理想然走?

    答:最初拆分的任務(wù)粒度較大,但實(shí)際上戏挡,在一個(gè)大粒度的任務(wù)中芍瑞,會包含一些較小粒度的任務(wù),并且這些任務(wù)的完成結(jié)果褐墅,還會影響后續(xù)的任務(wù)內(nèi)容啄巧。在工作時(shí),完成了這些較小粒度的任務(wù)后掌栅,沒有將關(guān)鍵工作內(nèi)容更新到兩人共享的任務(wù)列表中秩仆,于是造成了信息不對稱情況。

可嘗試的實(shí)踐

于是猾封,大家總結(jié)出了如下可以實(shí)行的行動:

  • 初始任務(wù)拆分盡量將可能會產(chǎn)生任務(wù)分支的關(guān)鍵任務(wù)(或問題)標(biāo)出澄耍。
  • 在完成任務(wù)的過程中,保持最初任務(wù)列表的更新晌缘,特別是上述的關(guān)鍵任務(wù)齐莲,按需記錄任務(wù)的產(chǎn)出或關(guān)鍵信息。
  • Switch Pair 圍繞任務(wù)列表進(jìn)行磷箕,以避免出現(xiàn)內(nèi)容遺漏或花費(fèi)額外時(shí)間討論上下文外的問題选酗。

問題 2:Pair時(shí),其中一人變Solo

  • 采用Navigator-Driver Pair 模式時(shí)岳枷,掌握鍵盤和鼠標(biāo)的一人(Driver)芒填,有時(shí)會成兼任 Navigator 角色呜叫。
  • Pair 過程中,一人會處于高度集中狀態(tài)殿衰,另外一人可能會因?yàn)闆]跟上朱庆,而從 Pair 中脫出,產(chǎn)生信息斷層闷祥。
  • Pair 過程中娱颊,如果不作 Driver 的角色,可能無法完全掌握當(dāng)前 User Story 的全貌凯砍。

其實(shí)上述的問題是有一定的內(nèi)在邏輯聯(lián)系的箱硕,可以通過下面的具體場景來進(jìn)行復(fù)現(xiàn)。

具體場景

肖蘭和阿發(fā)在結(jié)對編程過程中悟衩,肖蘭使用自己的筆記本電腦外接顯示器剧罩,并通過筆記本的鍵盤和觸控板完成操作,阿發(fā)則可以通過外接的顯示器看到肖蘭的操作局待。

起初,兩人會對著外接顯示器進(jìn)行一些討論菱属。

但在深入調(diào)查代碼時(shí)和一些代碼編寫時(shí)钳榨,肖蘭開始對著自己的筆記本屏幕進(jìn)行操作,隨著肖蘭逐漸地集中精力纽门,討論和解說停止了薛耻。

在連續(xù)幾次的進(jìn)入某個(gè)類查看細(xì)節(jié)代碼,再切換到另外幾個(gè)文件中查看配置文件后赏陵,肖蘭寫了幾行代碼試了試饼齿。

如此反復(fù)了幾次后,阿發(fā)已經(jīng)不清楚肖蘭所進(jìn)行操作的目的了蝙搔,但他看著肖蘭投入的樣子缕溉,欲言又止,不忍心打斷她的操作吃型。

于是阿發(fā)又努力了3分鐘嘗試跟上肖蘭的思路证鸥,可是猜透一個(gè)人的心思何其難也,阿發(fā)最終無奈放棄勤晚,于是默默轉(zhuǎn)向自己的電腦(手機(jī))枉层,去看看郵件(朋友圈),等待肖蘭等下有了結(jié)果再同步給他赐写。

可是鸟蜡,肖蘭在完成的調(diào)查整個(gè)過程中獲得的信息,卻不一定都能同步給阿發(fā)挺邀,阿發(fā)也就無法掌握當(dāng)前工作的全貌了揉忘。

至此跳座,Pair 終成 Solo...

分析原因

  • 硬件設(shè)施準(zhǔn)備不充分

    肖蘭掌控了所有的操作癌淮,阿發(fā)更多的時(shí)候都處于一種“被動”狀態(tài)躺坟,結(jié)對編程的參與感不高,特別是當(dāng)肖蘭“全情投入”后乳蓄,阿發(fā)的參與感幾乎被全部“剝奪”咪橙。

    說明:在了解 “如何進(jìn)行結(jié)對編程” 的部分有說明過,結(jié)對編程的兩人在硬件準(zhǔn)備上虚倒,應(yīng)該盡量平等美侦,至少兩人都有可以各自操作的鍵盤。

  • 沒有分配魂奥、交換角色的活動菠剩。

    結(jié)對編程是兩個(gè)人共同合作的活動,那么兩人中每個(gè)個(gè)體在活動中的體驗(yàn)感就直接影響這項(xiàng)活動的效果耻煤。

    在上述例子中具壮,肖蘭一開始就掌握了"操作權(quán)”,到了代碼調(diào)查階段時(shí)哈蝇,肖蘭又直接“搶奪”了思維的“導(dǎo)向權(quán)”棺妓,隨著自己的想法去調(diào)查、嘗試炮赦。

    導(dǎo)致阿發(fā)在這次結(jié)對編程中的參與度極低怜跑,體驗(yàn)感也極差,并最終轉(zhuǎn)向獨(dú)自工作吠勘。

    說明:為了保證結(jié)對兩人的參與度性芬,結(jié)對編程存在多種不同的實(shí)踐方式(Navigator-Driver 模式、乒乓模式剧防、鍵盤 + 鼠標(biāo)模式)植锉,但無論采用那種方式,兩人都應(yīng)在實(shí)踐一段時(shí)間后峭拘,交換角色汽煮,從而使每人都有機(jī)會從不同的視角分析、解決問題棚唆。

  • 缺少有效溝通暇赤。

    結(jié)對編程與其說是編程方式,不如說更多是的一種“社交”活動宵凌。那么娃圆,在整個(gè)過程中昭齐,結(jié)對兩人需要進(jìn)行大量近哟,高強(qiáng)度的溝通交流。

    在上述場景中译株,一方面,當(dāng)肖蘭要開始進(jìn)行一些深入調(diào)查時(shí)挺益,沒有說明意圖歉糜,從而使阿發(fā)開始產(chǎn)生迷茫。

    另一方面望众,當(dāng)阿發(fā)努力嘗試后匪补,依然認(rèn)為自己跟不上肖蘭的操作時(shí),沒有與肖蘭說明情況烂翰,從而使兩人的“信息鴻溝”進(jìn)一步被擴(kuò)大夯缺。

可嘗試的實(shí)踐

針對上述問題,可以:

  • 每對Pair中甘耿,至少有一人使用從公司申請(自備)的鍵盤和鼠標(biāo)踊兜,確保每個(gè)人都有條件能在想要操作的時(shí)候進(jìn)行操作。
  • 每對 Pair 按照拆分的任務(wù)列表佳恬,每完成 1(X)個(gè)任務(wù)捏境,交換一次兩人的角色。
  • 練習(xí)提問毁葱。結(jié)對的兩人中垫言,任何一人發(fā)現(xiàn)兩人的思路不一致時(shí),通過提問的方式头谜,將問題暴露骏掀,并解決鸠澈。

問題 3:Switch Pair頻率高柱告,引發(fā)高溝通成本

Pair 過程會產(chǎn)生大量的溝通交流,頻繁的 Switch Pair 會使這種交流的成本擴(kuò)大笑陈,那么如何從這種高頻的 Switch Pair 活動中獲得更高的個(gè)人收益呢际度?

具體場景

團(tuán)隊(duì)最近在嘗試提高 Switch Pair 的頻率,從之前的每兩周提升到現(xiàn)在的每周一次涵妥,之后視情況仍有提升的可能乖菱。

而這給阿花造成了困擾,因?yàn)閹缀趺看谓Y(jié)對編程蓬网,阿花都和搭檔會討論很多問題窒所,而幾乎每次 Switch Pair,阿花都需要花費(fèi)不少時(shí)間將這些討論的結(jié)果和新的搭檔解釋帆锋。

阿花認(rèn)為這降低了工作的效率吵取,并且自己也沒從中獲得額外的收益,那為什么還要提升 Switch Pair 的頻率呢锯厢?

分析原因

其實(shí)皮官,阿花遇到的工作效率降低問題脯倒,可以利用問題1中提到的實(shí)踐進(jìn)行嘗試。

另外捺氢,隨著頻率的提升藻丢,需要傳輸?shù)男畔⒘恳矔陆担偌由虾侠淼牟鹂ㄉ闫梗ぷ餍蕟栴}的影響應(yīng)該微乎其微悠反。

可是,阿花提出的另一個(gè)問題缺狠,“如何從高頻 Switch Pair 中獲得更高的個(gè)人收益問題问慎?” 這卻不是一個(gè)單靠結(jié)對編程技能就能解答的問題。

先拋開 Switch Pair 的初始目標(biāo)(信息流動)不談挤茄,因?yàn)檫@其實(shí)是對于團(tuán)隊(duì)的收益(一定程度上降低團(tuán)隊(duì)人員變化帶來的風(fēng)險(xiǎn))如叼。

那么,對個(gè)人而言穷劈,要想從 Switch Pair 中受益笼恰,就需要從敏捷軟件工程實(shí)踐的相關(guān)理論和目的出發(fā),如果能結(jié)合“快速反饋歇终,識別變化”社证,那得出如下的結(jié)論就不難了:

  • 更頻繁的搭檔交換,能使反饋的信息源變化评凝,從而使反饋的角度變化追葡,有利于個(gè)人從不同視角識別自身的長處與短板。無論是主動通過觀察學(xué)習(xí)奕短,還是通過收集反饋宜肉,都提供了更加豐富的輸入。
  • 縮短單一搭檔工作的時(shí)間翎碑,但保證周期性的輪換谬返,提供了一個(gè)適當(dāng)?shù)臅r(shí)期(大約一個(gè)月)去嘗試、應(yīng)用一些變化日杈,從而在下次輪換到相同的搭檔時(shí)遣铝,可以收集驗(yàn)證性的反饋。

可嘗試的實(shí)踐

想要在高頻 Switch Pair 的實(shí)踐中最大化個(gè)人利益莉擒,那么就需要充分利用此時(shí)的機(jī)會和資源酿炸,即不同的搭檔的視角,再結(jié)合 **Feedback **機(jī)制涨冀,就可以很容易構(gòu)建個(gè)人有目的填硕,有針對性的提升計(jì)劃。

  • 那么就從每次 Switch Pair 前蝇裤,向上一個(gè)搭檔收集這段時(shí)間合作的反饋開始吧廷支。

注意:Switch Pair 的頻率不必一味求高频鉴,只要能夠確保工作所需的關(guān)鍵信息在團(tuán)隊(duì)內(nèi)充分流動即可。

小結(jié)

結(jié)對編程也只是程序員工作中會用到的一項(xiàng)技能而已恋拍,那么只要是技能垛孔,通過時(shí)間的堆積,去磨煉施敢,去思考周荐,就會有所提升。

穩(wěn)扎穩(wěn)打僵娃,時(shí)間會給予最棒的回饋概作!

相關(guān)參考


文/Thoughtworks 何疆樂
原文鏈接:https://insights.thoughtworks.cn/pair-programming-anti-patterns/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末讯榕,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子匙睹,更是在濱河造成了極大的恐慌愚屁,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件痕檬,死亡現(xiàn)場離奇詭異霎槐,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)梦谜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門丘跌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人唁桩,你說我怎么就攤上這事闭树。” “怎么了朵夏?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵蔼啦,是天一觀的道長榆纽。 經(jīng)常有香客問我仰猖,道長,這世上最難降的妖魔是什么奈籽? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任饥侵,我火速辦了婚禮,結(jié)果婚禮上衣屏,老公的妹妹穿的比我還像新娘躏升。我一直安慰自己,他們只是感情好狼忱,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布膨疏。 她就那樣靜靜地躺著一睁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪佃却。 梳的紋絲不亂的頭發(fā)上者吁,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機(jī)與錄音饲帅,去河邊找鬼复凳。 笑死,一個(gè)胖子當(dāng)著我的面吹牛灶泵,可吹牛的內(nèi)容都是我干的育八。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼赦邻,長吁一口氣:“原來是場噩夢啊……” “哼髓棋!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起惶洲,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤仲锄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后湃鹊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體儒喊,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年币呵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了怀愧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡余赢,死狀恐怖芯义,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情妻柒,我是刑警寧澤扛拨,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站举塔,受9級特大地震影響绑警,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜央渣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一计盒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧芽丹,春花似錦北启、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽场钉。三九已至,卻和暖如春懈涛,著一層夾襖步出監(jiān)牢的瞬間惹悄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工肩钠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留泣港,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓价匠,卻偏偏與公主長得像当纱,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子踩窖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 背景今年坡氯,我開始了使用敏捷軟件交付工程實(shí)踐的第五個(gè)年頭,在編程知識滿足工作需求之余洋腮,我開始重新審視這些融入日常的工...
    Oliver_Le閱讀 877評論 0 1
  • Ron Jeffries[1]啥供,他在的博客中描述什么是極限編程時(shí)悯恍,繪制了一張圖: 并對最內(nèi)圈的四項(xiàng)實(shí)踐描述如下: ...
    袁慎建閱讀 582評論 0 1
  • 前言 俗話說,”三個(gè)臭皮匠頂個(gè)諸葛亮“伙狐,可見組織內(nèi)的團(tuán)隊(duì)合作并非顛覆性理念涮毫。但在普遍傾向于自由工作的編程領(lǐng)域,要求...
    碎夢有聲閱讀 1,150評論 0 2
  • 什么是結(jié)對編程 結(jié)對編程(英語:Pair programming)是一種敏捷軟件開發(fā)的方法贷屎,兩個(gè)程序員在一個(gè)計(jì)算機(jī)...
    云無心上閱讀 133評論 0 0
  • 第一次聽說結(jié)對編程的時(shí)候罢防,我覺得太反直覺了,兩個(gè)人用一臺電腦寫代碼唉侄,效率不就下降了一半嗎咒吐?后來我在團(tuán)隊(duì)里去嘗試引入...
    李浪溪_WaterLee閱讀 4,930評論 8 27