weken.news
ai協作claude-code工程實務自動化debug

文件跟程式不同步怎麼防?一天踩四次同一個坑之後我寫了自檢器

直接回答

文件跟程式不同步,根因是同一份資訊有兩個副本而沒有東西比對它們,靠紀律維持一致一定會漏、差別只在哪一天。解法照三個順序:能改結構的改結構(把清單改成掃資料夾,那份清單就不存在了,也就不需要檢查)、改不動的寫自動比對、最後才是寫更詳細的規則。第三個最沒用,我的證據是那份清單的註解裡就寫著上次漏過,我照樣又漏一次。

週末哥 ·

使用者問我一句話:所有優化都改到 skill 了嗎,說真話。

我去查,找到四個漏洞。

第一個是安裝流程裡有一份寫死的檔案清單,決定專案更新之後哪些檔案要同步到快取。我當天新增了兩個元件檔,那份清單還是舊的。後果是別人拿到這包,動畫會整個渲染失敗。

第二個是總控程式還在呼叫兩天前就搬走的指令。那三個指令搬到另一支程式了,舊的會被擋下來並且叫你改用新的,所以不會靜靜跑錯,但任何人跑完整流程都會在那一步卡住。

第三個是規格文件缺了三個角色的驗收條件,其中一個還是整條線判斷最集中的那一棒。

第四個是說明文件的檔案結構表列了不存在的檔案,而實際存在的四支程式沒有列。

我一開始把它們當成四件事在修。修到第三個才發現它們是同一件事發生四次。

實際的檔案,對上安裝流程的清單。 實際的流程順序,對上總控程式的執行順序。 實際的程式,對上規格文件。 實際的檔案,對上說明文件的結構表。

全部都是「我改了 A,但 B 沒跟上」。

而 B 沒跟上不會有任何徵兆,因為沒有人在比對。

最能說明問題的是第一個。

那份寫死的清單,正上方就有一行註解:某月某日加了兩個元件檔就漏過一次,動畫層整個沒產生。

寫得清清楚楚。四天後我新增另外兩個元件檔,照樣漏。

那件事讓我確定一個結論:這不是「不夠仔細」可以解決的問題。

註解是寫給「已經在看這段程式的人」看的。而漏掉的人,正是沒有想到要來看這裡的人。

所以解法有順序,而且順序不能反。

第一順位是改結構,讓那件事無從發生。

那份檔案清單我沒有幫它加一條「檢查清單完不完整」,而是把清單改成掃資料夾。以後加任何檔案都自動涵蓋,因為那份清單不存在了。

不存在的東西不需要檢查。

第二順位才是寫檢查器,在錯誤發生的當下攔住。改不動結構的才用這個,例如兩份人寫的文件要對得上。

第三順位是寫更詳細的規則。這個最沒用,而且我已經有證據。

檢查器寫完,第一次跑就抓到八個問題。

其中一個是我當天完全沒發現的:總控程式還在呼叫已經搬走的指令。那代表任何人用它跑完整流程都會失敗,而那個 bug 在我眼皮底下活了一整天,因為我測試的方式是一個模組一個模組手動跑,從來沒跑過那條把它們串起來的主流程。

改了沒跑過,就等於沒改。

然後使用者問了一個更狠的問題:以後每次有更新,是不是都要檢查這支需不需要更新?是的話,是不是要有一個機制,而不是想到才去檢查?

對。不處理的話,這個檢查器就是第六個副本。

問題沒有被解決,只是往上搬了一層。但那一層不是白搬的,它把「N 個地方要記得同步」變成「一個地方要記得更新」,從 N 縮到 1 是有價值的,只是還不夠。

所以我做了三件事。

第一件是把能通用的規則通用化。文件裡提到的檔案要存在、實際的檔案要在文件裡、元件要被引用,這三條都改成掃資料夾比對,以後加任何東西都自動涵蓋,檢查器一行都不用改。

第二件是讓它明講哪些規則會過期。它跑完會分開報:通用規則四條、具名規則三條,並且說清楚具名那幾條寫死了特定變數的關係,加新東西要手動跟上。

假裝完整比不完整更危險。

第三件是時間訊號。它會比對自己跟被檢查對象的修改時間,如果專案改了八個檔案以上而它一次都沒動過,它會自己說「我上次更新是幾天前,之後有幾個檔案改過,我可能沒跟上」。

它不需要知道你加了什麼,只要知道「你改很多而我沒改」。那是唯一一條不靠「我有沒有想到」的網子。

最後一件事比前三件都重要,我把它寫進規格:

想幫檢查器加一條規則之前,先問能不能把那個副本消滅掉。

檢查條目應該越來越少。它一直在長的話,不是它變強,是我們一直在製造副本。那個數字要當警訊看。

發現同一個地方踩兩次的時候,不要再寫一次註解提醒自己。那代表問題出在結構。

常見問題

為什麼寫註解提醒自己「這裡容易漏」沒有用?
因為漏掉的當下你不會去看那行註解。我的安裝流程有一份寫死的檔案清單,註解就寫在正上方:某月某日加了兩個檔案就漏過一次,動畫層整個沒產生。四天後我新增另外兩個檔案,那份清單還是沒跟上。註解是給「已經在看這段程式的人」看的,而漏掉的人正是沒有想到要來看這裡的人。
什麼樣的問題該用改結構解決,什麼樣的該寫檢查器?
先問「這份資訊為什麼需要兩個副本」。能刪掉一個副本就刪掉,那類問題不需要檢查。我的檔案清單就是這樣解的:改成掃資料夾,以後加任何檔案都自動涵蓋,那份清單不存在了。刪不掉的(例如兩份人寫的文件要對得上)才寫自動比對。
自檢器本身也會過期,怎麼辦?
分三層。第一層是能通用化的規則就通用化(掃資料夾比對,加新檔案自動涵蓋,檢查器一行都不用改)。第二層是具名規則要明講自己會過期,假裝完整比不完整更危險。第三層是時間訊號:比對檢查器自己跟被檢查對象的修改時間,被檢查的改了八個檔案而它一次沒改,它就有資格說「我可能沒跟上」。第三層是唯一不靠「我有沒有想到」的一層。
自檢器應該擋住流程還是只警告?
只警告。擋住開工的話,人只會想辦法繞過它,那就等於沒有。我的做法是把它接在每次開工必跑的環境檢查後面,不一致就在那個時間點講出來,因為那時候修最便宜。真正該擋的是事實問題(上游產物過期、核准的內容沒進成品),那些不是品味問題。
怎麼分辨「真的不一致」跟「已知還沒做完」?
要分開報,不然每次開工看到同樣三行警告,人就會開始無視它,然後真正的不一致混進去也沒人看見。我的做法是在文件的檔案清單裡標「還沒寫」,自檢器讀到那個標記就歸類成待辦,只提醒一行,不算進不一致的數量裡。