結對程式設計搞了兩年,我學到了這些!

myillusion3852發表於2015-06-28

結對程式設計是被極限程式設計運動帶上舞臺的,而且在當今的生產環境中,它越來越受到歡迎。在兩年的結對程式設計經驗中,我發現,有時候結對程式設計很奇妙,甚至可以說是神奇。有時它卻真的非常糟糕。我想要探究藏在背後的真正原因,並且揭示一些模式,也許通過這些模式我們能夠層層深入,分析怎樣才能把結對程式設計做得更好。

我的結對程式設計經驗

我相信,瞭解我有什麼樣的經驗對你來說十分重要,這樣你就可以有更好的背景知識評價本文。兩年裡,我分別就職於兩個不同的公司,幾乎天天都以結對程式設計的形式開展工作。一個是諮詢公司,在那裡我為客戶開發應用。另一個是高速發展的創業公司,開發大型 SaaS 產品。整個這段時間,我和超過 20 個開發者結對工作,他們有不同的背景、個性、技能、經驗和文化背景。

旁註:在進行結對程式設計時,你會發現有很多好處。對我來說,就是遇到非常多了不起的人,並且和他們成為朋友。

結對程式設計是否物有所值

寫這個主題時,我在草稿紙上列出一連串相關的內容,但是後來我都刪了,這是因為我不想把本文的中心寫散。有太多的研究論文、觀點、統計資料說這說那。我認為這個問題和大背景沒多大關係。有太多的可變因素在裡面。

在以下的文章中,你將會看到我認為好的和糟糕的結對程式設計。所以,我對這個問題的回答在我們這個行業中可以說是最受歡迎的——“視情況而定了。”  :)

當你專注於這個主題時,我會闡述在我觀察下結對程式設計對工作的幫助,可能也會對程式設計師有所幫助。(這部分可能會寫在今後的文章中。)

高效結對的特點

當我回想起我那些好的壞的結對經歷時,許多問題闖入我腦海。我不會反覆講述這些故事,但是我會將其歸入這樣一個精美的、MBA 式,諮詢樣式的 2×2 矩陣中。

結對程式設計成功矩陣

定義

工作能力的差異

據我觀察,結對雙方相關性最強、區別性最大的因素是他們兩人的效率差距。很多東西會影響程式設計師的效率,包括他們先前的經驗、領域知識、語言知識等。如果我們把這些綜合起來,我們就能得出“效率”。考量“效率”可能還有另外一種方式,看他們產出的潛在強度,包括完成的速度與質量。為了在這裡討論方便,我將高效和低效程式設計師分別對應為“高階程式設計師”和“低階程式設計師”。

獲益

當開始結對時,理想情況是公司(及個人)將會比兩個人獨立工作獲益更多。

效率相近的兩人結對

在我的經驗中,效率相近的兩人結對通常會比差距較大的效果更好。原因可能是由於開發人員有更多共同點,這等於即時“無代價”的情感溝通,有助於他們增進交流。這點在矩陣中的位置是十分清晰的。本質上,強強聯合能夠產生更好的化學反應。他們瞭解並尊重彼此,能夠經常交換意見,互相幫助學習。其結果往往是令人滿意而且相互受益的互動。當然也會有很多樂趣。

如果我們進一步深入研究,可以發現低階程式設計師和高階程式設計師結對時還有不同的特徵。

低階程式設計師結對

據我觀察,低階程式設計師結對與高階程式設計師結對相比收穫更多。這是為什麼呢?可能因為低階開發者並不一味堅持主見,他沒有強大的自尊心影響,與“正確性”相比,他們更加關心學習。

我也認為存在“新生入學”效應影響。想像你還是個孩子,在學期中全家搬入一個新的城市。如果恰好班上另一個孩子和你一樣,也是剛剛加入這個班級,那麼你們很可能變成好朋友,因為你們兩個處於相同的情況。結對程式設計同樣。如果你們兩個都是剛剛接觸應用/技術/語言/無論其他什麼,你們將會立即產生共鳴。你們想要探索相似的事情,會為解決相同型別的問題而激動不已,通常也會更好地合作。

當兩個低階程式設計師結對,他們的主要目標應該是學習。

高階程式設計師結對

當兩個開發者都是高階程式設計師,往往有相同的原因導致他們很難良好配對。每個程式設計師都是不同的,都有不同的主見。經驗更多,會有更強的個人主見。而且,當你知道得越多,越有可能自尊心膨脹。當一個人有很強的自尊心時,搭檔可能會屈從於一個拙劣的決定,原因可能是沒有安全感,或者是因為他“小心行事”,確保他們不會傷害到搭檔的自尊心。

更糟糕的是,結對雙方都有很強的自尊心。在這種情況下,他們爭論(不是辯論)許多問題,整個氛圍由於敵意變得緊張。我所見過更糟的情況是,當領航員離開工作站躲避一會。搭檔在這時沒有給予任何溝通,很顯然這時處於負收益階段。

優秀的高階程式設計師結對會彼此尊重對方。他們會談論許多。他們辯論、討論、做計劃。他們以專業的水準在工作,而不是仰仗個人。這才是美妙的事情。這時公司能夠從高產出中獲得極大的收益。

當兩個高階程式設計師結對,主要的目的就是生產。

當低階程式設計師遇到高階程式設計師

把低階程式設計師和高階程式設計師融合在一起需要的方法不同。這種配對安排多見於新開發人員加入一家公司或者轉入新的開發環境中。對於新人,“低階程式設計師”可能會分配給一個期望他能夠飛速進步的“高階程式設計師”。如果高階程式設計師不是合適的人選,或者有錯誤的預期,事情反而會變糟,會打擊低階程式設計師的士氣。

預期

領導層必須瞭解,這種能提升低階程式設計師的安排要儘可能的快。但是,每個與他有利害關係的同伴也必須明白這個道理,無論他的同伴是開發者、設計師、質檢員等,特別是對於高階程式設計師。同伴不應該施加任何壓力,因為一旦他們表現出來,將會破壞相互間的動態平衡。由於高階程式設計師工作會被拖慢,或者遙遙領先於低階程式設計師,雙方都對陷入挫折感。

當進行教學時,產出會降低。

教學

一旦高階程式設計師明白他們的角色是導師,而不是獨立承擔所有事情,在這之後,結對雙方才開始進行最有成效地工作。但是還有更多的事情需要考慮。

好的導師聆聽、回答問題,觀察和提出引領性的問題。

作為普通人,這(導師)真的是很難做到,我們往往傾向於成為相反的一方。所以,以下幾點必須牢記:

不要告訴他們鍵入什麼,也不要告訴他們去做什麼,更不要直接將事情自己接管下來然後做給他們看。你先要把自己停下來。親眼看著他們自己犯錯,讓他們體會錯誤帶來的結果,思考結果為什麼會如此糟糕,然後自己更正錯誤。在整個過程中他們可以問你問題,你要嘗試回答。如果他們被這個問題困住了,那你要引領他們解答這個問題。

我記得當我與一個實習生結對時,我真的是在很大壓力下完成工作。我故意給我的夥伴施加壓力然後不停地道歉,雖然這樣做可能不會讓他感覺好點。回頭看來,我應該改變這種結對安排或者尋找一種方法來減壓。

作為一名好的導師,應該充滿耐心、自信和同理心。我們想培養低階程式設計師,又不想把你知道的展示給他們。據我所見,好的程式設計導師在業界是十分緊缺的。每個人都忙著完成任務,或者他們只是沒有好的溝通技巧把這件事做好。一些問題可能能夠幫助確定一個人是否是一個好導師:

他們是否經常分享知識幫助低階程式設計師?他們是否固守他們的技術或者觀點?他們是否願意為團隊的利益做出自我犧牲?

當高階程式設計師和低階程式設計師結對時,他們的主要目的是教學與學習。

領導層的作用

文化

在任何情況下,當兩個人達成共識,事情就會向好的方向發展。結對程式設計也不無例外。相互理解源自與同理心、溝通和自信。公司和技術領導者能夠樹立榜樣,使良好的氛圍傳播給其他成員。文化就來自於最頂端。它不是由人們的言論決定的,而是由人們一言一行決定的。

期望

正如上文我的親身體會,每一個結對情景都是不同的。只有意識到他們的不同,瞭解什麼對他們最有益,與每個需要了解的人溝通,才能使對期望清晰明確,才能隨著結對情況變化時刻改變期望值。

總結

對我來說,結對程式設計是一個特別的主題,加強了我對程式設計的看法——和技術相比,人的因素同樣重要。我們是人,為人編寫軟體,和其他人一起工作。技術很顯然是必須的,但是在成為一個卓越的程式設計師的同時,我們也可以成為一個優秀的人。

結對程式設計愉快!

相關文章