I’ve never met a human being who would want to read 17,000 pages of documentation, and if there was, I’d kill him to get him out of the gene pool.

— Joseph Costello, President of Cadence

核心概念#

那是一個「不可能」的專案——一個古老的系統即將到達生命尾聲,硬體即將消失,一個全新的系統必須精確匹配其(往往沒有文件的)行為。數億美元的他人金錢會流過這個系統,而從啟動到部署的期限只有幾個月。

成功的唯一關鍵是什麼?那位管理這個系統多年的專家就坐在她的辦公室裡,就在開發團隊的密室般開發室對面。隨時可以回答問題、澄清疑問、做決定和看 demo。

這就是 Andy 和 Dave 首次相遇的地方。在那個專案中,他們實踐了後來被稱為結對程式設計群體程式設計的方式——一個人打字寫程式碼,而一個或多個團隊成員評論、思考、一起解決問題。這是一種強大的合作方式,超越了無盡的會議、備忘錄和被過度塞滿的法律文件。

「一起工作」真正的含義是:不只是提問、討論和做筆記,而是在你實際編碼的時候提問、討論和進行對話。

Conway’s Law(康威定律): 設計系統的組織,其產出的設計等同於組織內的溝通結構。也就是說,團隊的社會結構和溝通路徑會反映在正在開發的應用程式、網站或產品中。包含使用者在內的開發團隊會產出明顯反映這種參與的軟體,而不這樣做的團隊也會反映出來。

結對程式設計(Pair Programming)#

結對程式設計是 eXtreme Programming 的實踐之一,已經在 XP 之外廣泛流行。在結對程式設計中,一個開發者操作鍵盤,另一個不操作。兩人一起解決問題,並可以根據需要切換打字職責。

結對程式設計有許多好處:

  • 不同的人帶來不同的背景和經驗、不同的問題解決技巧和方法
  • 打字的開發者必須專注於低層次的語法和編碼風格細節,而另一個開發者可以自由地考慮更高層次的議題和範圍
  • 第二個人的同儕壓力有助於對抗懶惰的時刻和壞習慣——命名變數為 foo 之類的
  • 有人在旁邊看時,你不太可能走捷徑,這也導致更高品質的軟體

群體程式設計(Mob Programming)#

如果兩個腦袋勝過一個,那讓十幾個不同的人同時解決同一個問題,由一個人打字呢?

群體程式設計是結對程式設計的延伸,涉及超過兩個開發者。群體可以輕鬆包含通常不被視為開發團隊一部分的人——使用者、專案贊助人和測試者。你可以把群體程式設計看作是帶有即時編碼的緊密協作

該怎麼做?#

  • 如果你目前只是獨自程式設計,也許嘗試結對程式設計。至少給它兩週的時間,每次只做幾個小時
  • 如果要腦力激盪新想法或診斷棘手問題,也許嘗試群體程式設計
  • 如果你已經在結對或群體中,誰被包含在內?是否讓擴大團隊的成員參與?使用者、測試者、贊助人?

協作的一些建議:

原則說明
建構程式碼,而不是你的自尊不是在比誰最聰明
從小規模開始群體用 4-5 人,或先用幾對結對,短時間進行
批評程式碼,而不是人「讓我們看看這段程式碼」比「你錯了」好得多
傾聽並嘗試理解他人的觀點不同不代表錯誤
經常進行回顧,嘗試改進(持續精進團隊協作)

Tip 82 - Don’t Go into the Code Alone(不要獨自面對程式碼)

在同一間辦公室或遠端、獨自或結對或群體中編碼,都是解決問題的有效方式。如果你和團隊一直只用一種方式,你可能會想嘗試不同的風格。但不要盲目跳進去——每種開發風格都有規則、建議和指導方針。例如,群體程式設計中你大約每 5-10 分鐘就要換一次打字者。

相關章節#

  • Topic 2,貓吃了我的原始碼
  • Topic 45,需求坑