關於結對程式設計
今日許多從事軟體開發的人員都聽過結對程式設計的作法,但它在業界的採用率仍然參差不齊。其接受度不一的其中一個原因是它的好處並不明顯,它在中長期能獲得較多的回報。而且它也不像「兩個人共用一台電腦」這麼簡單,因此許多人在感到不舒服時便會很快地放棄。然而,根據我們的經驗,結對程式設計對於協作團隊合作和高品質軟體至關重要。
2020 年 1 月 15 日
從一開始,貝蒂·史奈德和我就是一對。我相信最好的程式和設計都是由兩個人完成的,因為你們可以互相批評,找出彼此的錯誤,並使用最好的想法。
讓兩個人坐在一台機器前撰寫所有生產程式。
-- 肯特·貝克
珍·巴提克是 ENIAC 女性 之一,許多人認為她們是第一批程式設計師。她們在「程式」這個詞彙尚未被使用的時代承擔了編寫程式的任務,而且沒有任何角色模型或書籍告訴她們如何執行這項任務,她們決定兩個人一起工作會是個好主意。大約過了 50 年,配對程式設計才成為一個廣泛使用的術語,當時肯特·貝克在 1990 年代後期於其著作「極限程式設計」中描述了這個術語。這本書向更廣泛的受眾介紹了敏捷軟體開發實務,其中一項就是配對。
配對程式設計基本上意味著兩個人在同一台機器上共同編寫程式碼。這是一種高度協作的工作方式,需要大量的溝通。當一對開發人員共同執行一項任務時,他們不僅編寫程式碼,還會規劃和討論自己的工作。他們會在過程中釐清想法、討論方法並找出更好的解決方案。
本文的第一部分 「如何配對」 概述了配對程式設計的不同實務方法。它適用於希望開始配對或希望改善配對技巧的讀者。
第二和第三部分,「好處」和「挑戰」,深入探討結對程式設計的目標,以及如何應對可能阻礙我們實現這些目標的挑戰。如果您想更深入了解結對程式設計對您的軟體和團隊有益的原因,或者如果您想獲得一些改進的想法,這些部分適合您。
第四和第五部分,「結對或不結對?」和「但真的,為什麼要費心?」,將以我們對團隊流程和協作中配對的想法作為結論。
如何結對
風格
乒乓球
此技術採用 測試驅動開發 (TDD),當您有一個可以透過測試驅動方式實作的明確定義任務時,此技術非常完美。
- 「Ping」:開發人員 A 編寫一個失敗的測試
- 「Pong」:開發人員 B 編寫實作讓測試通過。
- 然後,開發人員 B 開始下一個「Ping」,也就是下一個失敗的測試。
- 每個「Pong」也可以接著一起重構程式碼,然後再進行下一個失敗的測試。這樣您就能遵循「紅 - 綠 - 重構」方法:撰寫一個失敗的測試(紅色)、使用必要的最低手段讓測試通過(綠色),然後 重構。
強式配對
這是一種特別適用於知識傳遞的技術,由 Llewellyn Falco 在 此處 有更詳細的說明。
規則:「要讓一個想法從你的腦袋進入電腦,它必須經過別人的手」。在此風格中,領航員通常是對設定或手邊任務更有經驗的人,而駕駛員是新手(對語言、工具、程式碼庫等)。經驗豐富的人大多擔任領航員的角色,並指導新手。
此方法的一個重要面向是,駕駛員完全信任領航員,並且應該「對不完全了解感到自在」。在實作階段後,應討論「為什麼」的問題以及對解決方案的挑戰。在一個人完全是新手的設定中,這可以讓配對更有效率。
雖然此技術接近微觀管理,但它可以成為一個有用的入門工具,可以優先採用主動的「邊做邊學」方式,而不是被動的「邊看邊學」。此風格非常適合最初的知識傳遞,但不要過度使用。請記住,目標是在一段時間後能夠輕鬆切換角色,並擺脫微觀管理模式。這將表示知識傳遞成功。
配對開發
「配對開發」不只是配對的特定技術,更是一種關於配對的心態。(我們第一次在 Sarah Mei 的 Twitter 帳戶上的 此討論串 中看到這個術語。)開發 使用者故事 或功能通常不僅需要編碼,還需要許多其他任務。作為一個配對,你們要負責所有這些事情。
為了幫助你進入這種心態,以下是故事生命週期中一些非編碼活動的範例,這些活動可以從配對中受益。
規劃 - 我們的目標是什麼?
當你第一次開始共同處理某事時,不要立即跳入編碼。功能生命週期的這個早期階段是避免浪費的絕佳機會。在這個早期階段,四隻眼睛關注問題,可以及早發現誤解或缺少先決條件,從而節省大量時間。
- 了解問題:仔細閱讀故事,並向彼此說明你的理解。與產品負責人釐清開放式問題或潛在的誤解。如果你的團隊中有準備就緒定義,請再次仔細閱讀,並確保你具備開始所需的一切。
- 提出解決方案:集思廣益,找出問題的潛在解決方案。你可以一起進行,或分開進行,然後向彼此提出你的想法。這取決於解決方案的定義程度,也取決於你的個人風格。有些人喜歡自己花時間思考,而另一些人則喜歡在思考時大聲說出來。如果你們中的一個人不太熟悉領域或技術,請花點時間彼此分享必要的背景知識。
- 規劃你的方法:對於你選擇的解決方案,你需要採取哪些步驟才能實現?是否有需要記住的特定任務順序?你將如何測試它?理想情況下,將這些步驟寫在共享文件或便利貼上。這將有助於你追蹤進度,或在需要讓其他人協助處理任務時。寫下這些內容也有助於記住需要完成的工作 - 在當下,我們常常低估了我們會忘記的事情,即使是隔天的事情...
研究和探索
在實作需要你使用不熟悉的技術的功能時,你必須先進行一些研究和探索。這項工作不符合明確的「駕駛員導航員」或「乒乓」方法。例如,通常在同一個螢幕上一起瀏覽搜尋引擎結果並非非常有效。
以下為在配對開發模式中處理此問題的方法之一
- 定義一串問題清單,以便找出適當的解決方案。
- 分工 - 將問題分配給你們,或嘗試分別找出相同問題的答案。在網路上或組織內部其他資源中搜尋以回答問題,或閱讀你們兩個都陌生的概念。
- 在事先約定的時間後重新聚在一起,討論並分享你們的發現。
文件
除了程式碼之外,文件也是可以一起處理的事項。一起思考你們所做的事情是否需要任何文件。同樣地,根據手邊的案例和你們的個人偏好,你們可以一起建立文件,或由其中一人建立,然後另一人審查並潤飾文字。
文件是一個很好的範例,說明配對如何讓彼此保持紀律。這通常是最後才處理的任務,當這是讓我們將故事放入「完成」的最後一件事時,我們通常會跳過它,或「隨意處理」。配對工作讓我們誠實面對一些有價值但令人討厭的事情,這些事情在未來會讓我們非常感激。
時間管理
除了配對的一般風格之外,還有其他小工具和技術可以讓配對更容易。
番茄工作法就是其中一種工具。這是一種時間管理方法,將工作分解成時間區塊 - 傳統上為 25 分鐘 - 並以短暫的休息時間隔開。此技術幾乎可以應用於所描述的所有配對方法,並讓你們保持專注。配對可能是一種令人疲憊的練習,因此收到提醒要休息並定期切換鍵盤會很有幫助。
以下是如何在實務中使用番茄工作法的範例。
- 決定接下來要處理什麼
- 設定 25 分鐘的計時器,例如透過許多番茄瀏覽器擴充功能的協助 - 甚至是一個真正的番茄形狀廚房計時器...
- 專注工作不受干擾
- 計時器響起時暫停工作 - 從短暫休息開始(5-10 分鐘)
- 完成 3 或 4 個「番茄鐘」後,休息較長時間(15-30 分鐘)
- 利用短暫休息時間真正休息並補充能量,喝點水或咖啡,上廁所,呼吸新鮮空氣。避免在短暫休息時間處理其他工作,例如寫電子郵件。
結對輪替
輪換配對表示在共同工作一段時間後,配對的一半離開故事,而另一人則找新的人選繼續進行。留下來的人通常稱為故事的「錨點」。
輪換的原因類別之一是後勤。您的配對夥伴可能會生病或休假。或者你們其中一人遠距工作一天,而工作需要實體到場,例如因為牽涉到硬體設定。
輪換的另一組原因是為了改變現狀。你們兩人可能已經合作一段時間,並且開始出現「幽閉恐懼症」的跡象,因為你們相處的時間太多了。或者你們正在處理非常繁瑣且耗費精力的工作 - 輪換會讓你們其中一人休息,而新的人選可以帶來一些新鮮的觀點和能量。
最後,輪換配對最常見的原因是避免知識孤島,增加集體程式碼擁有權,並在進行中取得更多程式碼檢閱。配對本身已經有助於這些事情,但輪換可以進一步增加傳送到生產環境的每一行程式碼的平均檢視次數。
至於輪換的理想頻率,這是意見分歧的地方。有些人認為每 2-3 天輪換一次對於確保充分的知識傳播和品質至關重要。不過,每次輪換都伴隨著一些成本。有找新的人選加入的時間,以及兩者之一的脈絡切換成本。如果沒有持續的錨點來確保連續性,可能會增加有關問題和解決方案空間的默會知識遺失並觸發返工的風險。對於較資淺的開發人員來說,有時在某個專案上待得更久會更有益,這樣他們就有足夠的時間深入了解主題,並讓新知識有時間沉澱。
想想這些成本和收益之間的取捨。例如,假設您已經具備高品質的知識分享,團隊「展示與說明」、可讀的程式碼和良好的文件。在這種情況下,堅持頻繁輪替可能只會稍微改善您的集體程式碼擁有權,同時會產生大量的摩擦和開銷。
規劃一天
配對需要一定程度的排程和行事曆協調。如果您沒有花時間承認並配合這一點,它會在當天晚些時候回來困擾您。
從行事曆檢查開始 - 與您的配對夥伴同意您要配對多少小時,並查看您是否需要根據會議或在配對任務之外處理其他事情所需的時間進行規劃。如果結果是你們其中一人必須自己工作一段時間,那麼請務必做好準備,讓事情在沒有另一個人時也能繼續進行,例如不要使用那個人的電腦來編寫程式碼。
如果您在當天有會議或其他承諾,請確保您有一個提醒,特別是在使用您的配對夥伴的機器時。如果您的團隊預設配對,請考慮同意每個人的定期「核心編碼時間」。這讓排程更容易。
實體設置
配對程式設計意味著您需要在一個共用書桌的物理空間中非常緊密地合作。這與擁有自己的桌子來攤開東西非常不同。彼此如此接近需要一定程度的尊重和關注彼此的需求。這就是為什麼花一些時間找出一個讓你們雙方都感到舒適的設置是值得的。
- 確保你們都有足夠的空間,必要時清理書桌。
- 書桌前是否有足夠的空間放置兩張椅子?將垃圾桶和背包移開。
- 您是要使用兩個鍵盤還是一個鍵盤?滑鼠也是一樣,一個還是兩個?沒有總是適用的明確規則,我們建議您嘗試找出最適合每種情況的方法。影響這一點的一些因素包括衛生、您在分享鍵盤時間方面的表現如何,或者您有多少可用空間。
- 您是否有可用的外接顯示器,甚至可能是兩個?如果不是,您也可以考慮設定某種螢幕分享,就像您在遠端配對一樣。在這種設定中,你們每個人都將使用自己的筆電鍵盤。
- 詢問您的夥伴他們是否有任何特別的偏好或需求(例如更大的字體大小、更高的對比度,...)
- 如果您有異常的鍵盤/IDE 設定,請詢問您的夥伴他們是否可以接受。看看您是否可以有一個簡單的機制,將您的設定切換回更標準的配置以應對這些情況。
如果您的團隊可以同意一個預設設定,這樣您就不必反覆討論這些事情,這是有好處的。
遠端結對
你是分散團隊的一份子,或有些團隊成員偶爾在家工作嗎?只要你們兩個都有相當穩定的網路連線,你仍然可以練習結對程式設計。
設定
對於遠端結對,你需要一個螢幕分享解決方案,它不只能讓你看到,還能控制另一個人的機器,這樣你才能切換鍵盤。現今許多視訊會議工具已經支援這個功能,所以如果你在一家有商業 VC 工具授權的公司工作,先試試看那個。也有開放原始碼的視訊通話工具支援遠端控制,例如 jitsi。對於在較低頻寬下運作的解決方案,試試像 ssh with tmux 或 Visual Studio Code 的 Live Share 擴充功能。
秘訣
- 使用視訊:由於人們透過手勢和面部表情進行大量溝通,因此同時看到共享螢幕和你的結對夥伴的視訊很好。有些視訊會議解決方案附帶這個功能;如果你的沒有,考慮開啟額外的通話以看到彼此。
- 規劃和設計:使用協作線上視覺化工具,以重現紙上或白板上繪製草圖的體驗。
- 音訊體驗:尋找一個安靜的區域,並使用一副好的耳機,甚至配備指向性麥克風。如果你無法遠離噪音,「按鍵通話」功能也有幫助。為避免你這方的干擾,抗噪耳機是你的好朋友。
- 處理網路延遲:當網路延遲時,在遠端電腦上工作一段時間可能會很累人。所以務必定期切換電腦,這樣你們每個人都有機會在自己的機器上無延遲地工作。當你捲動檔案時,網路延遲也可能會很煩人,因為很難跟上。避免在長檔案中捲動有幫助,試著使用鍵盤快速鍵開啟檔案的不同部分,或改用展開/收合功能。
人為因素
如果您在一個並非整個團隊都分散,而只有您其中一、兩位是遠距工作的環境中,請嘗試讓遠距夥伴參與所有在辦公室中發生的討論。我們往往會忘記,光是坐在同一個房間中,我們會無意間分享多少資訊。
與您未曾見過且不認識的人遠距工作會產生額外的挑戰。一方面,配對是讓遠距團隊彼此更親近的機會。另一方面,有時很容易忘記協作的這部分。如果您沒有機會親自見面,請考慮其他方式來更深入地了解彼此,例如嘗試一起遠距喝咖啡。
最後,雖然遠距配對可能會帶來挑戰,但它也可以讓您比在現場配對時更容易專注,因為戴上耳機後可以更輕鬆地消除干擾。
一起吃個甜甜圈
當你們一起完成一項任務時,請慶祝!互相擊掌可能看起來很俗氣,但這其實是一個你們可以一起做的「力量姿勢」,可以讓你們充滿活力,並為下一個任務做好準備。或者,您可以像 Lara Hogan 一樣,創造自己慶祝成功的獨特方式,她會用 甜甜圈 來慶祝事業成就。
應避免的事項
不同的方法和技巧可以幫助您獲得更好的配對體驗。以下是一些常見的陷阱,請避免
漸行漸遠
配對時,請避免閱讀電子郵件或使用手機。這些干擾可能會讓您的配對夥伴感到不尊重,而且會讓您分心,無法專注於正在處理的任務。如果您真的需要查看某些內容,請公開說明您在做什麼,以及為什麼這麼做。確保每個人都有足夠的時間閱讀電子郵件,方法是安排足夠的休息時間,並每天保留一些個人時間。
微觀管理模式
注意微觀管理模式:它沒有給對方思考的空間,而且如果有人不斷給您指示,例如
- 「現在輸入『System, dot, print, "...
- 「現在我們需要建立一個名為...的新類別」
- 「按下 command shift O...」
不耐煩
應用「5 秒規則」:當領航員看到駕駛員做了一些「錯誤」的事情,並且想要評論時,請在說出任何話之前至少等待 5 秒鐘 - 駕駛員可能已經想到這一點了,然後您就會不必要地打斷他們的思緒。
作為領航員,不要立即指出任何錯誤或即將發生的障礙:稍等一下,讓駕駛員自己修正或寫下便利貼,以便稍後記住。如果您立即介入,可能會打斷駕駛員的思考過程。
霸佔鍵盤
注意您是否「霸佔了鍵盤」:您是否一直控制著鍵盤,不讓您的配對夥伴也打字?
對於您的配對夥伴來說,這可能會是一個非常令人惱火的事情,並且可能會因為「積極參與」受限而讓他們難以專注。請嘗試使用前面描述的方法之一,以確保您頻繁切換鍵盤。
每天配對 8 小時
真正致力於讓結對程式設計發揮作用的團隊,有時會每天配對 8 小時。根據我們的經驗,這並不可持續。首先,這實在太累了。其次,這在實務上甚至行不通,因為除了編碼之外,還有許多其他事情要做,例如查看電子郵件、進行一對一會議、參加會議、研究/學習。因此,在規劃一天時請記住這一點,不要假設它會是 100% 一起編碼。
沒有「唯一」正確的方法
有許多結對程式設計的方法,並沒有「正確」的方法。這取決於你們的風格、個性、經驗、情況、任務和許多其他因素。最後,最重要的問題是:你們是否從中獲得承諾的優點?如果不是這樣,請嘗試其他方法,反思、討論並調整以獲得它們。
好處
結對程式設計有什麼好處?了解其所有潛在優點對於決定何時執行、如何執行以及在困難時期激勵自己執行非常重要。配對可以支持你們的主要目標是軟體品質和團隊流程。

那麼,配對如何幫助你們實現這些目標呢?
知識分享
讓我們從配對最明顯且最無爭議的優點開始:知識分享。讓兩個人處理一段程式碼有助於團隊每天傳播技術和領域知識,並防止知識孤島。此外,當兩個頭腦理解並討論一個問題時,我們提高了找到良好解決方案的機率。不同的經驗和觀點將導致考慮更多替代方案。
實用技巧
當你們對所涉及的技術或領域一無所知時,不要迴避配對任務。如果你們持續在最擅長的領域工作,你們將錯失學習新事物並最終在團隊中傳播知識的機會。
如果你們注意到團隊成員傾向於始終處理相同的主題,請要求他們混合搭配以傳播他們的專業知識。建立團隊技術和商業主題的技能矩陣,以及每個成員在每個領域的優勢和差距,也有助於此。如果你們將其放在團隊區域的牆上,你們可以共同努力獲得良好的知識傳播。
省思
結對程式設計迫使我們討論方法和解決方案,而不是只在自己的腦海中思考它們。大聲說出並解釋事情會促使我們反思我們是否真的有正確的理解,或者我們是否真的有好的解決方案。這不僅適用於程式碼和技術設計,也適用於使用者故事和故事帶來的價值。
實用技巧
這需要你們兩者之間的信任,才能創造一個讓你們都感到自由發問,並對你們不理解的事情公開討論的氛圍。這就是為什麼當你們配對時,在團隊內建立關係變得更加重要。花時間進行定期的一對一和回饋會議。
保持專注
當有兩個人的時候,採用結構化的方法會容易得多:你們每個人都必須明確地傳達為什麼要執行某項操作以及目標為何。當單獨工作時,很容易分心,例如「快速地」嘗試不同的方法而沒有經過深思熟慮,然後幾個小時後才從兔子洞中出來。你的配對夥伴可以防止你陷入這些兔子洞,並專注於完成任務或故事的重要事項。你們可以互相幫助,保持正軌。
實用技巧
一起制定計畫!討論手邊的任務,並思考需要採取哪些步驟才能達成目標。將每個步驟寫在便利貼上(或如果遠端,則寫在你的工作單管理系統中的子任務),按順序排列,然後逐一執行。嘗試結合 番茄工作法,並嘗試在一個番茄鐘內完成其中一個目標。
永遠不要忘記溝通是關鍵。討論你在做什麼,並要求彼此提供解釋。
隨時進行程式碼檢閱
當我們配對時,我們對小事和大事件都有 4 隻眼睛,因此在完成後,會在過程中發現更多錯誤。
程式碼的 重構 總是編碼的一部分,因此也是配對程式設計的一部分。當你身邊有人時,改進程式碼會更容易,因為你可以討論方法或事物的命名方式。
事後進行程式碼檢閱有一些缺點。我們稍後會在 「要配對還是不配對?」 中深入探討這一點。
實用技巧
互相提問!提問是了解你在做什麼並找到更好解決方案最有力的工具。如果其中一方無法輕鬆閱讀和理解程式碼,請嘗試另一種更容易理解的方法。
如果你覺得需要對配對編寫的程式碼進行更多程式碼檢閱,請想想是否可以改善你的配對。你是否無法在配對過程中提出所有問題和疑慮?為什麼會這樣?你需要改變什麼?
結合兩種思考模式
正如我們之前在說明經典的 駕駛/領航員 風格時提到的,配對可以讓你對程式碼有不同的觀點。駕駛的大腦通常處於「戰術」模式,思考細節、當前的程式碼行。與此同時,領航員的大腦可以進行更具策略性的思考,考慮大局,將後續步驟和想法停放在便利貼上。一個人可以結合這兩種思考模式嗎?可能不行!結合戰術和策略觀點將提高你的程式碼品質,因為它可以讓你關注細節,同時也能考慮大局。
實用技巧
請記得定期切換鍵盤,並因此定期切換角色。這有助於你更新思維、避免感到無聊,並練習兩種思考方式。
作為導航員,請避免「戰術」思考模式,將編碼的細節留給駕駛員 - 你的工作是退後一步,並用中期的思考方式來補充你的搭檔的較戰術性的模式。
集體程式碼擁有權
集體程式碼所有權放棄了模組的任何個人所有權概念。程式碼庫由整個團隊所有,任何人都可以在任何地方進行變更。
持續配對確保每行程式碼都至少被 2 人觸及或看到。這增加了團隊中的任何人都能自在變更程式碼的機率,幾乎在任何地方。這也讓程式碼庫比只有單一編碼員時更一致。
實用技巧
配對程式設計本身並不能保證你達成集體程式碼所有權。你需要確保你也在不同的配對和程式碼區域中輪換人員,以防止知識孤島。
讓團隊的 WIP 保持在低水準
限制進行中的工作是看板改善團隊流程的核心原則之一。設定進行中工作 (WIP) 限制有助於你的團隊專注於最重要的任務。如果團隊設定 WIP 限制,整體團隊生產力通常會增加,因為多工不僅對個人沒有效率,對團隊層級也沒有效率。特別是在較大的團隊中,配對程式設計會限制團隊可以並行處理的事項數量,因此會增加整體專注力。這將確保工作持續進行,並立即解決阻礙因素。
實用技巧
將你的團隊的 WIP 限制在你團隊中的開發人員配對數量,並在你的團隊空間中(或如果你遠端工作,則在你的線上專案管理工具中)讓它可見。在選取新任務之前,請注意限制。WIP 限制紀律可能會自然而然地迫使你養成配對習慣。
新團隊成員快速上手
由於配對促進知識分享,因此它可以協助新團隊成員的導入。新加入者可以在其配對的協助下認識專案、業務和組織。團隊中的變更會影響團隊流程。人們只需要一些時間來彼此認識。配對程式設計有助於將這種影響降至最低,因為它迫使人們比單獨工作時需要更多溝通。
實用技巧
僅將新加入者放入配對中是不夠的,然後他們就會「神奇地」被納入和導入。請務必在他們第一次配對會議之前提供全貌和更廣泛的背景,並為導入預留一些額外時間。這將使他們更容易在配對期間追蹤和貢獻,並充分利用它。配對時請務必使用新加入者的機器,以確保他們也能自己設定工作。
制定一個導入計畫,其中列出要涵蓋的主題清單。對於某些主題,你可能想要安排專門的會議,對於其他主題,新團隊成員可以帶著導入計畫從一對配對到另一對配對。如果在配對會議中涵蓋了某個主題,你可以將其從清單中勾選。這樣一來,導入進度對團隊中的每個人都是可見的。
挑戰
結對程式設計雖然有很多好處,但它也需要練習,並且可能無法從一開始就順利進行。以下是團隊遇到的常見挑戰清單,以及一些應對建議。當你遇到這些挑戰時,請記住好處,並記住你結對的原因。重要的是要知道你想要透過練習達成什麼,這樣你才能調整你的做法。
結對可能會讓人疲憊不堪
當獨自工作時,你可以隨時休息,並且你的思緒可以在需要時暫時飄走或關閉。結對迫使你專注於潛在更長的時間,並找到與另一人的節奏和思考方式的共同點。增加專注力是結對的好處之一,但它也可能讓它變得非常激烈和令人筋疲力盡。
應對方法
充分休息是應對這項挑戰的關鍵。如果你發現你忘記定期休息,請嘗試使用鬧鐘安排休息時間,例如每小時 10 分鐘。或使用時間管理技術,例如 番茄工作法。不要跳過你的午餐休息時間:離開螢幕並真正休息一下。無論是否結對,休息都很重要,並且可以提高生產力。
防止筋疲力盡的另一件重要事情是不要每天結對 8 小時。將其限制在每天最多 6 小時。定期在駕駛和領航員之間切換角色也有助於保持能量水平。
密集的協作可能會很困難
與另一個人長時間如此緊密地合作是很激烈的。你需要不斷溝通,並且需要同理心和人際交往能力。
你們在技術、知識、技能、外向性、個性或解決問題的方法上可能有所不同。其中一些組合可能不匹配,並給你一個艱難的開始。在這種情況下,你需要花一些時間來改善協作,並使其成為一種相互學習的體驗,而不是一場鬥爭。
應對方法
在結對會議開始時進行對話可以幫助你了解你們風格之間的差異,並計畫適應這些差異。從以下問題開始你的第一次會議:「我們希望如何一起工作?」、「你比較喜歡如何結對?」。請注意你喜歡如何工作以及如何提高效率,但也不要對其他方法封閉起來 - 也許你會發現一些新事物。
配對一天結束後,彼此進行一輪回饋。如果你覺得給予回饋的想法令人望而生畏,可以把它當成一個小型回顧。想想你們在配對過程中各自的感覺。你警覺嗎?你累了嗎?什麼讓你感到自在,什麼讓你感到不自在?你們夠頻繁地切換鍵盤嗎?你們達成目標了嗎?下次有什麼想嘗試的嗎?養成這個例行公事很好,這樣當事情出錯時,你可以練習給予回饋。
有一些優秀的訓練和書籍可以幫助你處理人際衝突和困難,例如關於困難對話的書籍。
團隊合作面對挑戰,不要把衝突留給個人。你可以透過組織配對會議來做到這一點,在會議中討論如何共同應對困難。會議一開始先收集配對的好處,這樣你們就知道所有人都想從中得到什麼。接著收集每個人在配對時遇到的挑戰。現在小組可以思考哪些行動可能有幫助。你也可以收集團隊成員的熱門按鈕觸發因素:配對時什麼會讓你立即感到不自在?
會議中斷
你是否曾有過開會開到滿檔的日子,而且你覺得自己什麼事都沒做?這可能發生在每個交付團隊中。會議是必要的,用來討論、規劃和同意你們要建立的事項,但另一方面,它們會中斷流程。當一個團隊實踐結對程式設計時,開會過多的影響可能會更糟。如果每個配對的人員在不同的時間開會,中斷會倍增。
應對方法
一種方法是限制會議發生的時段,例如透過定義沒有會議的核心配對時段,或透過「中午後不開會」等規則來封鎖沒有會議的時間。
思考會議長度和整體數量也很有價值。你真的需要哪些會議?它們有什麼目標?你可以如何透過適當的準備、促進和明確的議程來提高它們的品質?
但有一件事是肯定的:永遠都會有會議。那麼,作為一對搭檔該如何應對?在配對會議開始時一起查看你們的行事曆,確保你們有足夠的時間開始配對。如果你們有任何會議,請考慮以一對搭檔的身分參加。依賴你的產品負責人或其他非配對團隊成員,在核心配對時段讓團隊遠離中斷。
不同的技能水準
當兩個具有不同經驗水準的人在某個主題上配對時,這通常會導致對彼此能貢獻多少產生錯誤的假設,或因為步調不同而感到沮喪。
應對方法
如果你的搭檔在這個主題上有更多經驗:不要假設他們最了解。也許需要解釋他們為什麼以這種方式做事,這會為他們帶來新的見解。詢問如何和為什麼的問題,可能會導致富有成效的討論和更好的解決方案。
如果你的搭檔在這個主題上的經驗較少:不要假設他們無法對解決方案做出太多貢獻。你可能戴著眼罩,而不同的觀點可以幫助你找到更好的解決方案。此外,請記住,必須解釋一個概念是一個很好的機會,可以測試你是否真的理解它並徹底思考過它。
了解不同的學習階段也有助於理解從新手到專家的學習過程如何運作。丹·諾斯在他的演講中很好地描述了這一點,有效團隊的模式。他介紹了德雷福斯技能習得模型,作為理解不同學習階段的方法,以及將它們結合起來在配對的背景下意味著什麼。
權力動態
處理權力動態可能是此清單中最艱難的挑戰之一。配對程式設計並非發生在沒有階層的空間中。存在正式階層,例如經理與其報告之間,以及非正式階層。非正式階層的例子是
- 初階 - 高階
- 非男性 - 男性
- 轉職者 - 擁有電腦科學學位的專業人士
- 有色人種 - 白人
這些只是其中一些。權力動態是流動且交叉的。當兩個人配對時,這些動態中的多個可能會發揮作用並重疊。要了解權力失衡如何影響配對,以下是幾個例子。
- 一個人通過霸占鍵盤並未給配對夥伴留出空間,從而主導配對會議。
- 一個人始終保持教學立場和態度。
- 一個人沒有聽另一個人的意見,並否決他們的建議。
有時將這些情況與階層聯繫起來可能很微妙,你通常只是認為你與對方相處得不好。但根本問題往往受到配對的兩個人之間的不平衡影響。
莎拉·梅寫了一篇關於這個主題的優秀推文系列,並發表了一篇演講,更一般地涵蓋了敏捷中的權力動態。
應對方法
解決此問題的第一步是處於權力動態上升一方的人承認並承認自己的地位。只有這樣,你才能誠實地反思與配對夥伴的互動,以及權力動態如何影響它們。試著思考你自己的位置和處境。你積極做些什麼來消除權力失衡?
認識到這些類型的差異並調整我們的行為以改善協作可能很困難。這需要大量的自我反省。有一些培訓可以幫助個人或團隊做到這一點,例如「反偏見」或盟友技能培訓。
與許多未知數結對
當你們處理一個龐大的主題,而兩人都沒有解決問題的想法時,常見的配對方式通常無法發揮作用。假設你需要第一次使用某項技術,或嘗試新的方法或模式。在某些情況下,共同研究和實驗是有用的,但它也可能令人沮喪,因為我們都有不同的方法來找出事情的運作方式,而且我們的閱讀和學習速度也不同。
應對方法
當有許多未知數時,例如你使用一項新技術,請考慮執行尖峰來探索主題並在實際開始工作之前了解技術。別忘了與團隊分享你的發現,也許你可以舉辦知識交流會議,並繪製一些可以張貼在團隊空間的圖表。
在這些情況下,請記住採用配對開發的心態,而不是配對程式設計。分頭進行研究是可以的,也許在同意需要共同回答的問題集後。
沒有自己的時間
我們已經討論過,持續對話會相當耗費精力。大多數人每天也需要一些獨處時間。對於內向的人來說尤其如此。
當獨自工作時,我們很自然地會花時間深入探討一個主題或在需要時學習。但這在配對時可能會感覺像是一種中斷。那麼,如何在需要時獨處並學習呢?
應對方法
再次強調,不要一天配對 8 小時,與你的團隊同意核心編碼時間,並將其限制在每天最多 6 小時。也許你還想分配幾個小時的自學時間。
當一對搭檔覺得他們沒有足夠的知識來解決問題時,請分頭閱讀並分享,然後繼續實作。
輪替導致情境切換
知識分享是配對的好處之一,我們已經提到輪替如何進一步增加這種效果。另一方面,輪替太多可能會導致頻繁的背景切換。
應對方法
在輪替頻率和新的配對夥伴有足夠背景來適當地做出貢獻的可能性之間取得平衡。不要為了輪替而輪替,想想分享某個背景是否重要以及為什麼重要,並給它足夠的時間以發揮效果。
結對需要脆弱性
配對需要脆弱性。這表示分享你所知道和不知道的一切。這對我們來說很難。程式設計師應該很聰明,非常聰明。大多數人看著我們所做的事,並說「我永遠做不到」。這讓我們覺得有點特別,給我們一種自豪感,而自豪感會產生無敵感。
-- 湯姆·豪利特
當你配對時,很難表現出你不知道某件事,或對某個決定感到不安全。尤其是在一個像 10 倍工程師 那樣的神話定期流傳的產業,而且我們傾向於 互相批評 我們使用的語言,或我們在 5 年前做出的設計決策。
脆弱性通常與軟弱聯繫在一起,而在大多數現代文化中,展現力量是常態。但正如研究員布芮尼·布朗在多場演講和書籍中所闡述的,脆弱性實際上是創新和變革中非常重要的要素。
脆弱性是創新、創造力和變革的發源地。
-- 布芮尼·布朗
應對方法
展現脆弱性需要勇氣,並創造一個環境,讓人們可以更安全地展現他們的脆弱性。同樣地,這一切都與建立團隊有關,在團隊中,人們彼此信任(定期 1:1、回饋、人們可以提問的文化等)。
對於在團隊中擁有更多權威的人來說,表現出脆弱性更容易、風險也更低,無論是自然的(例如,因為他們已經很受尊敬)或制度性的(例如,因為他們擁有「技術主管」等頭銜)。因此,重要的是,那些人開始並成為這種行為的榜樣,讓它成為常態,並因此讓其他人也能更安全地表現出脆弱性。
說服經理和同事
配對程式設計的倡導者經常努力說服他們的經理或同事,讓配對成為團隊日常工作的一部分。
應對方法
沒有簡單的配方來說服他人配對程式設計的效用。然而,一個關鍵要素應該是花時間先討論它,並確保每個人都有相同的理解(例如,閱讀這篇文章 :-) )。然後找到一種方法來嘗試它,無論是從一對分享他們經驗的人開始,或提出團隊實驗,例如「讓我們在接下來的 2 個衝刺中預設配對」。務必建立回饋和回顧的機會,以分享進行順利的事項和遇到困難的事項。
最終,你無法強迫人們採用某種做法,而且它並不適用於所有人。你最終可能只與團隊的一部分人配對 - 至少在開始時。根據我們的經驗,說服人們的最佳方式是定期接觸這種做法,體驗配對時團隊成員獲得的好處和樂趣。
在這種情況下最常出現的問題是實務經濟效益:結對程式設計是否會讓成本增加一倍,而增加的品質和團隊效益是否值得額外的成本?有幾項關於這個主題的研究,最著名的就是 這篇,被引用來提供結對程式設計值得執行的證據。不過,我們對於「科學證明」結對程式設計有效性的嘗試持保留態度。軟體開發是一個充滿變動和不確定性的過程,除了程式碼之外,還有許多難以比較和衡量的成果,例如分析、測試或 品質。結對程式設計的堅定反對者總能找到方法,對任何用來證明開發生產力的「科學」實驗的可重複性提出質疑。最後,你需要證明它對你有效,而唯一的方法就是在你的環境中嘗試看看。
結對或不結對
我們的經驗清楚顯示,結對程式設計是建立高品質、可維護軟體的關鍵實務,而且能以永續的方式進行(請參閱 "效益")。不過,我們也不認為以教條式的方式來進行,並總是結對程式設計是有幫助的。結對程式設計如何對你有效、進行多少、以及針對哪些任務,可能會有所不同。我們發現,將結對程式設計設定為團隊的「合理預設值」是有用的,然後討論我們什麼時候想要例外。
讓我們來看幾個在如何和何時結對程式設計方面取得平衡有幫助的範例。
無聊的任務
有些編碼任務是「無聊的」,例如因為它們是關於使用一些定義良好的樣板方法,所以你可能不需要結對程式設計?整個團隊已經知道這種方法,或者它很容易理解,所以知識分享並不那麼重要?而由於手邊既定的模式過去已經成功使用過,所以即時程式碼檢閱比較沒有用?所以是的,你可能不需要結對程式設計。
不過,請務必考慮 例行工作可能是設計不良的徵兆:結對程式設計可以幫助你找到那段無聊程式碼的正確抽象化。當你的大腦進入「這很容易」的自動駕駛模式時,也比較有可能遺漏事情或犯下粗心的錯誤。
「我真能自己做到嗎?」
配對對剛起步的程式設計師有很多好處,因為這是一個從團隊中較有經驗的成員那裡快速學習的機會。然而,初階程式設計師在配對時也可能對自己的能力失去信心。「沒有人看著我,我真能做到嗎?」。他們也錯失了學習如何自己找出問題的方法。我們都會經歷挫折和未經觀察的除錯與錯誤分析實驗,最終讓我們成為更好的程式設計師。自己遇到問題通常比有人告訴我們我們會遇到問題更能有效地學習。
有幾種方法可以解決這個問題。一種是讓初階程式設計師時不時自己工作,並找一位導師定期查看並進行一些程式碼檢閱。另一種方法是讓團隊中較初階的程式設計師互相配對。他們可以一起找出解決方案,並且比自己編寫程式碼更快地擺脫困境。最後,如果你是在配對中較有經驗的程式設計師,請務必大部分時間坐在領航員的位置上。給駕駛員空間找出問題 - 有時只需要等待一下,直到你們一起撞到下一堵牆,而不是事先指出它。
程式碼檢閱與結對
配對編程的優點在於它引人入勝的即時性:當審查者坐在你旁邊時,不可能忽視他或她。
-- Jeff Atwood
許多人認為程式碼檢閱流程的存在就足以不需要配對編程。我們不同意程式碼檢閱是配對的替代方案。
首先,通常有一些動態因素會導致程式碼檢閱粗糙或膚淺。例如,當程式設計師和審查者過度依賴彼此而沒有明確說明時:程式設計師可能會推遲一些小決定和改進,認為問題會在檢閱中被發現。而審查者則依賴於程式設計師的勤奮,信任他們的工作,而不會仔細查看程式碼。另一個動態因素是沉沒成本謬誤:我們通常不願意為團隊已經投資的事情返工。
其次,程式碼檢閱流程可能會打亂團隊的流程。接受檢閱任務需要有人進行情境切換。因此,程式碼檢閱發生的次數越多,對審查者的破壞就越大。而且它們應該經常發生,以確保小變更的持續整合。因此,審查者可能會成為整合和部署的瓶頸,這會增加時間壓力 - 再一次,這會導致潛在的審查效果較差。
透過持續整合(和交付),我們希望透過頻繁交付小塊變更來降低風險。在原本的定義中,這表示實踐主幹開發。透過主幹開發,延遲的程式碼檢閱效果更差,因為程式碼變更會立即進入主分支。因此,配對編程和持續整合是兩個相輔相成的實務。
我們看到團隊有效使用的方法是預設成雙人作業,但在某些例外情況下,當有人必須變更生產程式碼而沒有配對時,則使用拉取請求和程式碼檢閱。在這些設定中,你應小心監控為團隊拉取請求不要停留太久,以確保你仍持續整合。
但說真的,為什麼要費心?
我們談了很多配對程式設計的好處,但更多的是它的挑戰。配對需要許多不同的技能才能做對,甚至可能影響團隊中的其他流程。那麼為什麼要費心?它真的值得麻煩嗎?
要讓團隊對配對程式設計感到自在並成功,他們必須培養所有有助於克服其挑戰的技能:專注和集中力、任務組織、時間管理、溝通、給予和接收回饋、同理心、脆弱性 - 這些實際上都是有助於成為運作良好、合作且有效率的團隊的技能。配對讓團隊中的每個人都有機會一起培養這些技能。
另一個今天廣泛被討論為有效團隊成功因素的因素是多元性。觀點、性別、背景和技能的多元性已證明可以提升團隊的績效 - 但它通常會先增加摩擦。它甚至可能增加我們討論過的配對程式設計的一些挑戰。例如,我們建議的關鍵要素之一是展現脆弱性,這對代表性不足的群體的團隊成員來說特別困難。
考慮哈佛商業評論的這個標題:"多元團隊感覺較不自在 - 而且這就是他們表現更好的原因"。作者提出觀點是「同質團隊感覺較輕鬆 - 但輕鬆對績效有害。(...) 這個想法與許多人的直覺相違背」。為了說明,他們指出一個稱為流暢性啟發法的認知偏誤:「我們偏好較容易處理的資訊,並判斷它較為真實或美麗。」
這種偏見讓我們追求簡潔,這在軟體開發的許多情況中對我們很有幫助。但我們不認為這對結對程式設計有幫助。結對感覺很困難,但這並不一定表示它對團隊沒有好處。最重要的是,它不必一直很困難。在 這個演講 中,Pia Nilsson 描述了她的 Spotify 團隊採取的措施,以克服最初因引入結對程式設計等做法而造成的令人不適的摩擦。她提到了回饋文化、非暴力溝通、 心理安全、謙遜以及擁有目標感等事項。
結對程式設計、極端程式設計以及整體的敏捷軟體開發都是關於接受變更。敏捷軟體實務人員承認變更不可避免,因此他們希望做好準備。
我們建議我們應該接受並準備好另一件事,那就是摩擦,因為在成為一個高效能且多元的團隊的過程中,摩擦也是不可避免的。接受摩擦並不表示「讓我們產生許多衝突,我們就會變得更好」。我們的用意是團隊應該具備必要的工具來處理摩擦,並將它們預設放在工具箱中,而不僅僅是在團隊已經遇到問題時。實踐回饋、改善團隊溝通、採取措施創造心理安全的環境。
我們相信結對程式設計經常被避免,因為它可能會產生摩擦,但我們會請你給它一個機會。如果你有意識地將它視為一種可以改進的技能,並努力讓它變得更好,你最終會得到一個更具韌性的團隊。
致謝
這篇文章最初是 Thoughtworks 內部的投影片組,我們策劃並透過群眾外包的方式,分享有關結對程式設計實務的知識。在整個過程中,我們收到了許多人的回饋和很棒的建議,以至於很難一一列出所有有貢獻的人,我們可能會忘記許多名字。因此,我們要感謝每一個人,特別是 Thoughtworks 的同事,他們與我們討論、指引我們取得更多資源、在原始投影片組上留下評論,或審閱這篇文章。這真的已經成為許多人經驗的集合,謝謝大家!
特別感謝為本文繪製大部分圖畫的 Stefanie Grewenig。
重大修訂
2020 年 1 月 15 日:發布