我在公司帶專案有一條硬規定,講起來很不性感:
新的上線之後,舊的先留著。
不是留一天,是留到你確定不需要它為止——通常是幾週,有時候幾個月。
這條規定讓我被念過。有人覺得留著兩套是浪費,有人覺得那代表對新系統沒信心,有人覺得這樣程式碼庫會很髒。
三個說法都對。我還是留。
一個真實的例子
我們有一個評分系統,本來是用 Google Apps Script 寫的。後來規模長大了,GAS 的執行時間上限開始擋路,我們把它搬到 Cloud Run。
搬完之後,新系統跑得很好。快、穩、可以處理更大的量。
我沒有刪掉 GAS 那一版。
程式碼還在,觸發器關掉但沒有移除,資料的連結也留著。整套東西就那樣安靜地躺在那裡,一行都沒有在跑。
同事問我什麼時候要清掉。我說再等等。
為什麼我這麼堅持
理由有三個,而且它們的重要性是遞增的。
一、失敗的時間點永遠很糟
這是最基本的。
新系統不會在你上線後的第一個小時掛掉。那時候大家都在盯著,任何問題都會馬上被發現、馬上被修。
它會在第三週的某個星期五晚上掛掉。或是季末結算的當天早上。或是你剛好在請假的那一週。
墨菲定律在這件事上準確得令人生氣。而那些時刻的共同點是:你沒有時間慢慢修。
有退路的話,你花三十秒切回舊系統,然後禮拜一再來查原因。
沒有退路的話,你就得在星期五晚上、在所有人都在等的壓力下,除一個你還不熟的新系統的錯。
這兩種情境的差別,不是技術問題,是你會不會做出更糟的決定。
二、你其實不知道舊系統在做什麼
這一條比較深,而且我是吃過虧才懂的。
任何一個跑了幾年的系統,都累積了一堆沒有寫在文件上的行為。
某個欄位為什麼要 trim 空白?因為三年前有一次匯入的資料前面多了一個空格,出過事。
為什麼星期天不寄信?因為以前寄過,被客戶抱怨。
為什麼這裡要判斷金額是不是零?因為有一種特殊的合約狀況會這樣。
這些東西不會出現在需求規格裡,因為它們不是設計出來的,是撞出來的。而知道它們的人可能已經離職了。
當你重寫一個系統,你會把明顯的功能都做進去,然後漏掉這些補丁。而你不會在測試的時候發現,因為測試資料是乾淨的。
你會在正式環境遇到第一筆髒資料的時候發現。
舊系統是一份沒有人寫過的文件。 在你確定看懂它之前,不要把它燒掉。
三、有退路的人比較敢往前
這一條最反直覺,也是我覺得最重要的。
大家會以為留退路是保守的表現。我的經驗剛好相反。
沒有退路的團隊會變得非常保守。
因為他們知道一旦切過去就回不來了,所以每一個決定都要開三次會、每一個功能都要多測兩輪、每一次上線都要挑一個「大家都有空」的時間——而那個時間永遠不會到。
有退路的團隊敢在星期二下午上線。因為最壞的情況就是切回去,損失一個下午。
我在公司推 AI 導入的時候,這件事特別明顯。
我一直在講的一個主題是:「如果我們的 AI 帳號明天被停掉,我要怎麼上班?」
有人覺得這個問題很掃興——你不是在推廣 AI 嗎,怎麼一直講它會失效?
正好相反。我就是因為想清楚了斷線那天怎麼辦,才敢讓四百多個人都用下去。
如果我沒想清楚,我會下意識地限制大家的使用深度,因為我怕依賴。而那個限制會讓整件事沒有效果。
這條原則的另外幾個長相
同一個道理,在不同場合有不同的樣子。我列幾個我自己在用的。
寫自動化腳本的時候: 第一版不要直接改資料,先讓它印出「我打算改什麼」,你看過覺得對了,再讓它真的改。
做資料遷移的時候: 舊資料表不要 drop,改名字加個 `_old` 就好。硬碟很便宜,你的週末很貴。
換工具的時候: 確認新工具可以匯出。任何不能把資料拿回來的工具,都是一張單程票。
推流程改革的時候: 明確講「試三個月,不好就回去」。有這句話,反對的人會少一半——因為他們反對的往往不是新流程,是「回不去」這件事。
什麼時候該把退路收掉
留退路也有代價,我不想假裝沒有。
兩套系統並存的期間,你要維護兩套。資料可能不同步。新人會搞不清楚該看哪一個。而且最麻煩的是——只要退路還在,就永遠有人在用舊的。
所以退路不能永遠留著。我用兩個條件判斷什麼時候可以收:
第一,新系統已經走過一個完整的週期。 如果是月報系統,那要跑過一次月底。如果是季度流程,那要跑過一次季末。因為系統最容易出事的時刻,就是那些一個週期只發生一次的邊界。
第二,這段期間真的沒有人切回去過。 如果中間有人切回去過一次,那計時器要重來。
兩個條件都滿足,我才會刪。
而且刪之前我會再備份一次。(我知道這聽起來有點病態。)
一個更大的版本
寫到這裡我想到,這條原則其實不只用在系統上。
我從人資轉職成工程師的時候,沒有辭職去補習。我是一邊做著人資的工作,一邊在辦公室裡偷偷把自己換掉的。
那時候我不覺得自己在留退路,我只是沒有那個勇氣賭。
現在回頭看,那個「沒勇氣」反而是對的策略。因為有薪水在,我可以慢慢試、可以失敗、可以在某個週末發現自己寫的東西完全跑不動然後不用恐慌。
如果我當初辭職去學,我大概會因為壓力而選一條「最快能找到工作」的路,而不是我真正想走的那條。
退路不是讓你不用往前走。退路是讓你在往前走的時候,可以走得比較大步。
(不過我還是很佩服那些直接跳的人。我只是知道我自己不是那種人。)