實驗室已驗證
唯讀優先:第一次執行目標系統前先做唯讀驗證
唯讀優先:第一次執行目標系統前先做唯讀驗證 具體情境 你要為新環境部署設定變更,或是在執行緒中讓 AI 修改生產環境設定。你寫了一個改動,一發布上去整個服務就掛了,底下的人在罵你。經典情境: 你寫了一段設定改動,發布後服務掛掉 你在程式碼中修改了一個 API,QA 發現它把其他三個 API 的回傳值都改了 你在生…

驗證報告
唯讀優先:第一次執行目標系統前先做唯讀驗證
具體情境
你要為新環境部署設定變更,或是在執行緒中讓 AI 修改生產環境設定。你寫了一個改動,一發布上去整個服務就掛了,底下的人在罵你。經典情境:
- 你寫了一段設定改動,發布後服務掛掉
- 你在程式碼中修改了一個 API,QA 發現它把其他三個 API 的回傳值都改了
- 你在生產環境進行了一次環境探測,結果把健康檢查的狀態旗標搞亂了
問題不在你的技術水準,而在於你跳過了一步。先做唯讀驗證。
什麼是唯讀驗證
唯讀驗證 = 在完成之前,先跑一遍目標系統的唯讀模式。 意思是你不改變任何東西,只檢查你的改動會在哪些層面遇到副作用。
一次唯讀驗證包含三個子步驟:
| 子步驟 | 你要回答的問題 | 典型操作 |
|---|---|---|
| 依賴檢查 | 我的改動會觸及哪些模組?哪些是唯讀的? | 靜態分析 / Lint / 文件搜尋 |
| 影響評估 | 同層的其他程式碼會不會被波及? | 執行緒追蹤 / 流量追蹤 / 日誌搜尋 |
| 狀態確認 | 我看的資料是不是當前狀態?會不會被併發修改? | CHECKSUM / 時間戳記 / 狀態旗標比對 |
什麼時候用它
- 進入新環境做第一次改動
- 改動涉及共享資源(API、資料庫、設定)
- 你不清楚完整架構圖,只能看到其中一部分
- 有併發修改風險(多人同時修改,或者有排程任務在跑)
- 你在讓 AI 或自動化系統修改程式碼,你無法人工審查所有改動
什麼時候可以略過
- 你很清楚架構,改動範圍單點明確
- 你已經做了很多次同類改動(不是第一次)
- 有現實可行的自動化回歸測試當後盾
- 改動不涉及共享狀態(例如修改自己的文件)
怎麼操作(3 步走)
步驟 1:依賴圖邊界檢查
這一步你可能已經做過很多次依賴梳理,但在做的時候經常漏掉一類:唯讀判斷。
正確做法:
- 列出所有要改動的模組
- 對每個模組,找出所有可能從那裡讀取資料的位置
- 對每個讀取位置,確認它是唯讀的,還是會在讀取的同時修改狀態
- 將非唯讀的位置標註出來
# 範例:修改 config.yaml
-grep -r "config.yaml" --include "*.py"
# 發現:
# main.py:5 read_config() # 唯讀 → 安全
# cache.py:12 load_config() # 唯讀 → 安全
# health.py:8 check_config() # 讀取後更新狀態旗標 → 非唯讀 → 標註
步驟 2:影響面追蹤
這一步最費工,但也最值得。你要回答:同版本的其他程式碼會不會受到影響?
具體操作:
- 找出呼叫同一個 API 端點的所有呼叫方
- 對每個呼叫方,確認它處理回傳值的方式是否為唯讀
- 對涉及資料庫的部分,找出所有讀取該資料表的位置,確認它們是否會在讀取同時進行寫入操作
- 對涉及共享狀態的部分,找出所有讀取該狀態的位置,確認是否有併發修改
檢查清單:
- 哪些 API 端點從這個模組回傳資料?
- 哪些程式碼直接讀取這個資料表的欄位?
- 哪些模組共享這個狀態旗標/快取鍵值?
- 是否有排程任務或 webhook 會修改我觸及的狀態?
步驟 3:狀態確認(CHECKSUM 比對)
這一步是為了確認你現在看到的資料沒有被其他人改掉。
具體操作:
- 在你開始檢查之前,先為關鍵資料建立指紋
- 檢查過程中,如果遇到非唯讀操作,停下來,重新建立指紋
- 最後,比對指紋,確認資料沒有被中間步驟篡改
# 方式一:直接檔案指紋
md5sum config.yaml > /tmp/config-before.md5
# ... 你的檢查和抖動 ...
md5sum config.yaml > /tmp/config-after.md5
diff /tmp/config-before.md5 /tmp/config-after.md5
# 方式二:時間戳記比對
stat -c "%Y %n" config.yaml # Linux
stat -f "%m %N" config.yaml # macOS
常見陷阱
- 只做靜態檢查,不做動態追蹤 — 靜態分析只能看到程式碼裡寫了什麼,看不到執行時實際會觸發什麼
- 漏掉非同步/webhook/排程任務 — 這些不在主呼叫鏈上,你最容易漏掉
- 指紋建立的時間點不對 — 你在檢查的過程中建立指紋,但看起來是檢查完之後的資料,實際上你漏掉了中間那次修改
- 把唯讀和「不改檔案」混為一談 — 讀取可能修改快取、健康檢查旗標、session 狀態,這不是「改动檔案」,但確實是非唯讀操作
- 用唯讀驗證代替回歸測試 — 唯讀驗證確認你的檢查時機正確,但不能確認你的改動正確。兩者都不能省
最小可用檢查清單
開始檢查之前:
- 列出所有我要觸及的模組
- 對每個讀取位置判斷唯讀/非唯讀
- 找出同層的上游呼叫者
- 確認是否有排程任務/webhook 觸及我關注的資料
- 建立資料指紋
檢查過程中:
- 每次發現非唯讀操作就停下
- 重新建立指紋,確認時間軸
檢查完成後:
- 指紋比對一致
- 已標註所有非唯讀位置
- 你的判斷和你看到的架構一致,沒有遺漏
檢查後與開發流程的關係
唯讀驗證是開發規劃前的第一道關卡。它不告訴你的改動對不對,它只告訴你你的認知和你的目標系統是否一致。
這就是為什麼它很重要:在 AI 撰寫程式碼的範式裡,你對架構的了解能從「你記得多少」變成「你查到了多少」。唯讀驗證就是「你查到了多少」的檢查清單。
怎麼用
先在隔離環境中按記錄步驟重現,再決定是否採用這項技能。
實測效果
實驗室只記錄可重現結果,不把未經驗證的說法寫成結論。
踩坑
套用前核對權限、輸入、回復步驟和證據是否完整。
適用場景
適合環境條件與本報告證據範圍一致的任務。
不適用場景
缺少必要證據、隔離條件或回復控制時不要使用。