想改變既有文化的專案,遠比能從零打造新文化的專案來得常見。 在運行中的專案上採用 XP,要一點一點來,從測試或規劃開始。

改造比新建更難#

在新團隊採用 XP 已是挑戰,在既有團隊加既有程式碼庫上採用更難:

  • 你有所有既有的挑戰——學技能、當教練、把流程變成自己的
  • 你還有維持正式系統持續運行的即時壓力
  • 那些軟體不太可能是照你的新標準寫的,很可能比它需要的更複雜,也不太可能測試到你想要的程度
  • 新團隊你可以只挑願意嘗試 XP 的人;既有團隊很可能有些懷疑論者
  • 更別提所有桌子都已經擺好了,你連結對程式設計都辦不到

在既有專案上改造 XP,會比在同等規模的新團隊上採用花更多時間。 這是壞消息。

好消息是:有些「綠地」XP 開發必須面對的風險,你不必面對。

  • 你永遠不會處在「以為自己有個好軟體構想、卻其實不知道」的危險位置
  • 你永遠不會處在「做了大量決策、卻缺乏來自真實客戶那種立即而殘酷的回饋」的危險位置

作者說他遇過很多團隊講:「喔對,我們已經在做 XP 了。除了測試那部分。還有我們有一份 200 頁的需求文件。但其他每一項都完全就是我們的做法。」

正因如此,本章是逐項實踐編排的:你如果已經在做 XP 主張的同一項實踐,就跳過那一節;如果有某項新實踐你想撿起來,就去看專屬那一節。

要在既有團隊、既有正式系統上採用 XP,你必須修改五個領域的採用策略。

測試#

一旦你開始寫測試,畫面就變了:你對新程式碼有信心,你不介意做改動——事實上,那還挺好玩的

在舊程式碼與新程式碼之間切換,簡直是日夜之別。你會發現自己在迴避舊程式碼——你必須抵抗這個傾向。

在這種處境下取得掌控的唯一辦法,是把所有程式碼都往前帶。否則醜東西會在黑暗中滋長,而你將背負規模未知的風險。

此時很誘人的一件事,是回頭把所有既有程式碼的測試都補寫出來。

  • 當你需要為未測試的程式碼加功能時,先為它現有的功能寫測試
  • 當你需要修 bug 時,先寫測試
  • 當你需要重構時,先寫測試

你會發現開發起初感覺很慢:你花在寫測試的時間遠多於正常的 XP,而且感覺新功能的進展比以前慢。

然而,那些你老是造訪的部分——那些吸引注意力與新功能的部分——很快就會被徹底測試到。不久之後,系統中最常被使用的部分,感覺起來就像是用 XP 寫出來的。

設計#

轉向 XP 設計,很像轉向 XP 測試:你會注意到新程式碼的感覺與舊程式碼截然不同,於是你會想一次修好所有東西——別這樣

一次一點點來。 加新功能時,準備好先重構。在 XP 開發中你本來就總是準備好在實作前先重構,只是轉型期你得更常這麼做

把這些目標訂下來、寫在卡片上、顯眼地展示出來。 當你能宣告大重構完成時(可能得一小口一小口啃上數個月甚至一年),辦一場大派對,儀式性地把卡片燒掉,好好吃喝一頓。

這個策略的效果,很像需求驅動的測試策略:那些你在開發活動中經常造訪的系統部位,很快就會感覺像你現在正在寫的程式碼一樣;額外重構的開銷也會很快淡去。

規劃#

  • 你必須把既有的需求資訊轉換成故事卡
  • 你必須教育客戶遊戲規則
  • 客戶必須決定下一次發布包含什麼

切換到 XP 規劃最大的挑戰(也是最大的機會),是教會你的客戶:他們能從團隊那裡得到的,比他們以為的多得多。

他們大概從沒經歷過一支歡迎需求變更的開發團隊。要習慣「客戶能從團隊多拿到多少」,需要一段時間。

管理#

最困難的轉變之一,是習慣 XP 式的管理——XP 管理是一場關於間接與影響力的遊戲

如果你是管理者,你八成會抓到自己在做「該由程式設計師或客戶做」的決定。別慌——只要提醒自己與在場的每個人「我正在學」,然後去請對的人做這個決定,並把結果告訴你

突然被賦予新責任的程式設計師,不太可能立刻表現優異。 身為管理者,你在轉型期必須小心地提醒每個人他們自己選擇的規則——因為壓力之下,每個人都會退回先前的行為模式,無論那些模式管不管用。

這種感覺有點像轉換設計或測試:起初會很彆扭,你會知道自己沒有全速前進。但隨著你留意日復一日發生的各種情境,你(以及程式設計師與客戶)會學會如何順暢處理它們,很快就會對新流程感到自在。

不過時不時會冒出一個你以前沒「極限地」處理過的情境。這時候,退一步,向團隊重申規則、價值與原則,然後再決定怎麼做。

管理一場疾馳中的 XP 轉型,最困難的面向之一是判定某位團隊成員不合適。在這種情況下,沒有他你們永遠比較好;而且一旦你確定情況不會再好轉,就該立刻做出改變。

開發#

重讀關於結對程式設計的材料(〈開發策略〉),把桌子擺成兩個人能並肩而坐、且不必移動椅子就能把鍵盤推來推去。

關於結對,轉型期有兩面:

  • 一方面,轉型到 XP 時,你對結對程式設計應該比平常更嚴格。結對起初可能不舒服——逼自己去做,即使你不想。
  • 另一方面,偶爾也要休息一下:自己躲開去寫個兩小時程式。當然結果要扔掉——但別為了能說「我這週結對了 30 小時」而摧毀你寫程式的樂趣。

至於測試與設計問題,一小口一小口地啃。並且,把你碰到的所有程式碼,都提升到你們議定的編碼標準——你會很驚訝,光是這麼簡單的活動就能學到多少東西。

如果專案已經陷入麻煩#

有些讀者手上有既有團隊,但軟體還沒上線,而且專案可能麻煩纏身——XP 看起來像是可能的救贖。

如果你從一開始就用 XP,也許(也許不)能避免現在的處境。但如果說在河中央換馬已經很難,那從一匹正在溺水的馬上換下來難十倍。情緒會很高漲,士氣會很低落。

如果選擇是「轉用 XP,否則走人」,那你首先要認清:你能一貫地採用新實踐的機會並不高。壓力之下,你會退回舊習慣——而你已經有一大堆壓力了,成功轉換的機會會被大幅削減。

慶祝你能學到多少關於測試的事、關於間接管理的事,或你能把設計做得多漂亮、能刪掉多少程式碼。也許會有足夠的秩序從混沌中浮現,讓你不介意隔天再來上班。

不過,如果你決定把一個陷入麻煩的專案轉向 XP,就把它做成一個戲劇性的姿態半吊子的措施只會讓每個人停留在跟以前差不多的狀態。

仔細評估目前的程式碼庫:沒有它,你們會不會比較好?如果是,就沖掉它——全部。 辦一場大營火把舊磁帶燒了,休息一週,重新開始。