一個由聰明能干的開發者組成的敏捷團隊正在努力完成交付。他們遇到了一些意料之外的缺陷,正在努力修復生產環境中發現的缺陷;前端開發的工作量比後端開發更大,因此當前端開發者掙扎著試圖跟上進度時,後端開發者反而處於無所事事的狀態。可能他們需要更新控制器系統,但是 Brian 是唯一一個能夠看懂控制器代碼的人,不幸的是他現在正在忙其他事情。這個場景是不是很熟悉?結對編程可以有效地解決這些問題並給這個煎熬中的團隊帶來更多好處。那麼為什麼很多團隊不進行結對編程呢?
在《Pair Programming Illuminated》一書中,Laurie Williams 和 Robert Kessler 曾斷言:
我們發現很多人不願意采用結對編程——這需要改變現有習慣並且具備更強的溝通和協作能力……我們知道,如果被強迫采用結對編程,有些人寧可選擇辭職。[1]
讓團隊適應結對編程是一件很棘手的事情,那怎麼做才能讓你的團隊更容易接受結對編程呢?
問題到底出在哪裡?
首先我們來思考一下為什麼結對編程很難落實,以下是一些原因。
1. 對於團隊來說這是個很大的變化
很少有工作實踐能像結對編程這樣對團隊造成巨大影響。在傳統的工作中,開發者會“進入狀態”:帶上耳機打開音樂;手邊就是咖啡因飲料和零食。大部分開發者都不能適應在工作中和同事進行大量溝通,他們需要一段時間來適應對話狀態!
2. 精神高度集中
這是結對編程有效的秘籍之一:專注、專注、專注!如果你正在結對編程,那就不可能查看 Facebook、浏覽網頁或者回復收件箱中剛收到的郵件。
3. 疲憊
結對編程需要的專注和緊張程度高於大部分人的日常工作強度。結對編程會把你稍微推離舒適區並鍛煉你的專注能力。但是無論你多麼擅長結對編程,都會到達極限。Kent Beck 寫道“絕大多數程序員每天的結對時間不能超過五或者六個小時。”[2]
4. 大部分成員都沒有完全具備所需要的軟技能
人類不是生來就有同理心和超強的社交技能的。如果你在工作中和同事交流很少,那你在這方面的技能可能就會弱一些。想象一下,和一個缺乏社交技能的人緊密合作一整天是什麼感覺。或者,想象一下作為新手和一個不耐煩的老手一起編程的感覺。結對編程的兩方都需要很高的耐心和同理心。
5. 所有的改變都很困難
所有的變更管理專家都會告訴你——要求他人改變做事的方式會立刻激發恐懼反應,人們試圖理解改變對他們的影響。
既然如此艱難,為什麼我們還要改變呢?
接下來,我們會討論到底是什麼支撐你克服這些障礙。結對編程有很多好處,我們來看看你能獲得什麼回報。
讀到這裡,希望你已經充分意識到結對編程的價值。當你和其他人討論結對編程的時候,可以直接引用這個列表中的內容。一定要把這個列表擺在最顯眼的位置,遇到困難的時候就提醒自己回報是什麼。
所以,如何進行結對編程?
下面我會介紹一些減輕痛苦的方法,能夠幫助你更好地推行結對編程。當你向開發者們推行新工具或者新技術的時候,要根據實際情況選擇合適的方法,結對編程也一樣。首先我們來看看 Gina Green 和 Alan Hevner 的研究。
Green 和 Hevner[4]研究了為什麼優秀的編程工具和技術經常會被程序員拒絕。調查了企業軟件的開發者之後,他們總結出三條推行新技術或者新工具的准則:
記住這三條准則之後,我們來看一些推行結對編程的方法。
方法一)細胞分裂
這種方法適用於你已經擁有,或者可以招聘到經驗豐富並且非常熱情的結對編程程序員。我們叫他們結對專家。你至少需要2~3 人來推行結對編程。具體方法如下:
這個過程開始很慢,但是會呈指數增長。從一個團隊開始,到第一年底你就會擁有八個團隊,到第十五個月就會擁有十六個團隊。到那時,你就很容易在團隊中推行其他技術實踐,比如測試驅動開發和持續集成。這些技能會快速傳播到整個團隊,因為大家都會對彼此負責。
注意:頻繁更換結對目標也被稱為“無序結對”。這樣���好處是知識可以在整個團隊中傳播。此外,這樣做也可以避免讓兩個人之間建立太深的感情,從而難以和其他人結對。Kent Beck 喜歡每隔幾個小時換一次結對對象,但是一天一次就足夠了。門羅創新公司會每周更換一次結對對象。
方法二)從零開始
如果你沒有任何經驗豐富的結對編程程序員,那就只能從零開始了。但是你還是可以遵循一個具體的方法。下面是 Laurie Williams 等人在《Pair Programming Illuminated》中推薦的方法。[5]
第一步是從團隊中找出一個聲望高並且願意協助你進行改變的開發者。選擇一些候選人並向他們解釋你想做什麼以及為什麼要這麼做。記住你的好處列表(上文提到過)。如果他們不能做出決定,可以讓他們參考一下列表中的好處。如果他們拒絕幫助你,那也要讓他們保持開放的心態,不要變成你的敵人,然後詢問下一個候選人。
當你找到認同你的開發者之後——我們叫他/她“結對支持者”——就可以進入下一步了。在這個階段,結對支持者開始逐漸向組織中的其他人介紹結對編程的思想。最好的方式是向其他程序員提供幫助,協助他們完成工作或者進行一對一幫助。這樣,結對支持者就可以不動聲色地和其他程序員建立起結對關系。如果這種關系進展順利,結對支持者就可以和隊友討論結對編程及其好處,並評估隊友對於結對編程的態度。這一階段的目標是發現組織內和你想法相同的人。
當你有一批可以接受結對編程的人之後,下一步就是和所有人進行公開的討論。列出一個暫時的自願性質的結對編程計劃——包括最初有多少對開發者和嘗試多長時間。因為需要一段時間來適應,所以最好嘗試三個月或者更久。讓大家公開討論他們對於結對編程的疑慮,並探討如何解決他們的問題。和他們討論評價標准,什麼樣的結果會讓大家相信結對編程是一件值得長期堅持的事情?討論如何收集數據從而可以驗證結果是否符合標准。最後詢問有多少人願意參與。如果可能的話可以加入物質獎勵,從而讓結對編程者在一個理想的新項目上開始工作。
其他建議
除了推行結對編程,還有一些需要思考的內容:
分布式團隊
工作地點不一致的團隊怎麼辦呢?他們能獲得結對編程的好處嗎?當然可以,只要他們願意付出一些額外的努力。有許多工具可以幫助程序員共享屏幕和音/視頻,從而創建一個虛擬的結對環境。可能需要一些嘗試來判斷哪些工具最適合你的技術棧。雖然視頻是可選的,但是我很推薦視頻——獲得肢體語言和表情反饋可以極大地幫助你理解隊友的狀態。比如說,他保持沉默的原因是因為感到疑惑嗎?他在思考嗎?還是他起身去休息了呢?經驗豐富的遠程結對編程者 Joe Moore 的博客是學習遠程結對的好地方。讓團隊短期共同工作也是一個好辦法——比如一次或者兩次沖刺——這可以讓他們在遠程結對之前適應結對編程。
結論
結對編程對於所有軟件開發公司來說都極具價值。它可以顯著提高質量和速度,甚至可以提高開發者的工作滿意度。為了獲得這些價值,需要非常謹慎小心地把結對編程引入到你的團隊中。避免命令和強制要求,要不斷鼓勵和獎勵他們。這項強大的技能會在日復一日的練習中逐漸顯現出威力,讓你的團隊慢慢發現它的作用並達成共識。最後,別忘了,結對編程不適合所有人,所以要想好如何回應那些拒絕結對編程的團隊成員。
作者介紹
Melinda Stelzer Jacobson是一名敏捷教練,堅信生產力和成功源自快樂的成員和重視信任、尊重和溝通的團隊。她的信念源自 15 年的軟件開發經驗,包括電信、銀行、科學設備、網站和互聯網程序。Melinda 住在舊金山,曾獲得敏捷專家認證、敏捷開發者認證、ICAgile 專業敏捷教練認證、DAD 黃帶和創新游戲合作架構師認證。在業余時間她會收養可愛的流浪兔,這樣它們就不會被安樂死。