問題
在一輪工作裡加了六條標準條文與兩支檢查腳本,全部標成「觀察」、預設值全是 0, 文件裡誠實地寫著「目前還沒有人填」。四天後回頭盤點,發現九個地方寫著同一類會過期的結論: README、容量規劃文件裡的三處、兩支腳本的提示訊息、計畫文件裡的四項狀態、標準條文的觀察級別、兩個 repo 的進度紀錄。
真正的問題不是有九個地方要改,是沒有任何機制會在狀態改變時提醒任何人。
這九處的命運,跟我四月寫下的另一條待辦一樣——「CI 加檢查擋 :latest」列了五個月沒做,
最後是被一次 build 失敗推著做的,不是因為有人回頭翻那條待辦。
那件事的經過寫在 自架觀測棧掛在 :latest 的後續段落。
為什麼這比「憑證到期」更難處理
TLS 憑證、token、EOL 版本、log 保留期這類東西會無聲過期,但它們至少有明確的到期日, 可以設告警、可以交給 secrets 管理服務。
團隊自己寫下的「暫時狀態」沒有到期日:
| 憑證到期 | 文件裡的「暫時」 | |
|---|---|---|
| 何時失效 | 有明確日期 | 某個人某天填了數字的那一刻 |
| 誰會知道 | 監控系統 | 只有填數字的那個人,而且他不知道自己該去改 |
| 怎麼盯 | 設 30 天告警 | 沒有辦法設告警,因為不知道哪天會變 |
所以處理方式不能是「記得回來看」,必須是把提醒綁在會使狀態改變的那個動作上。
解法:提醒放在動作發生的當下
兩支預算檢查在「數字填好且通過」時,多印一段(下面是示意,項目換成你自己的文件):
── 數字填好了,下面這些結論現在過期了 ──
1. README 裡「預設全是 0(還沒有人想過)」那段
2. 容量規劃文件的開頭與「目前狀態」
3. 計畫文件裡對應項目的狀態
4. 規範文件的對應條文:有兩個樣本的真實數字就能提升級案
5. 該 repo 的進度紀錄:把量測條件一起記下來
(這份清單由檢查腳本印出,改動它請一起改)為什麼是這個位置:填數字的人一定會跑這支檢查——不跑就不知道數字對不對。 而沒有人會回頭翻文件。把清單放在文件裡等人來看,等於沒放。
三條路徑都要分開驗:
- 沒填時不印(那是提示路徑,還沒到談後續的時候)
- 填了且通過時印(這才是狀態改變的那一刻)
- 違規時不印(那是失敗路徑,該先修再談後續)
第三條容易漏。如果違規時也印,使用者會在一堆錯誤訊息裡看到「恭喜,接下來要改這些」,訊號會互相稀釋。
另一半:讓「暫時」有明確的畢業條件
光有提醒還不夠。那六條標準條文原本寫「等第二個樣本」,但沒寫樣本是誰、什麼算通過。 這種寫法下,「觀察」會永遠是觀察——而全是觀察的標準擋不住任何東西。
補上逐條的升級條件之後,浮現一個原本看不見的區別:
- 有些條文的缺口是**「還沒填」**——填了就能升,只是還沒人去做
- 有些是**「現在的環境驗不出來」**——例如「副本分散」在單節點的本機叢集上, 填再多數字也驗不出分散有沒有生效,得等多節點環境
- 有些是**「決定不做」**的結果——依佇列深度擴容需要額外元件,而引入元件的條件不成立
這三種缺口的處理方式完全不同,但在「等第二個樣本」這句話底下長得一模一樣。 寫升級條件的真正價值不是列出條件,是逼自己分辨這三種。
順帶修正的一個門檻
那六條原本要套用共通標準的「四家已實作」門檻。但這組專案裡,扣掉範本本身、CI 平台、 兩個實驗性專案,實際可用的樣本只有兩個。拿四當門檻等於宣告它永遠達不到。
這個門檻原本是在有足夠多獨立實作可以歸納的地方訂的。 搬到樣本數只有個位數的地方,同一個數字會從「防止標準膨脹」變成「保證標準癱瘓」。 所以在該章明確寫下調整與理由,限定範圍,不動其他章。
怎麼預防再次發生
- 寫下任何「暫時」「目前」「還沒」之前,先回答:狀態改變時,誰會看到提醒
- 答案是「文件裡寫了」的話,那就等於沒有
- 找出會使狀態改變的那個動作(跑某個檢查、填某個欄位、換某個版本),把清單印在那裡
- 清單要自己標明出處(「這份清單由 xxx 印出,改動它請一起改」),否則清單自己也會過期
- 「暫時」要有畢業條件,而且條件要分辨「還沒做」「驗不出來」「決定不做」三種
- 成功路徑與失敗路徑要分開:後續清單只在成功時印
相關
- Cloudflare 退我的中文 commit:一個活太久的 workaround:同一個問題的另一面——workaround 要寫「怎麼判定它可以拆掉」,這篇講的是「暫時」要寫畢業條件
- 自架觀測棧掛在 :latest:待辦列了五個月沒做、最後被 build 失敗推著做的實例
- 第二次跑才是真的測試:狀態留下來了,但沒有人在看
- 驗收假綠形態目錄:其中「帳面過時」是同一個家族的另一面