第三部花了 7 天挖這個套件的跨版本相容性跟靜態品質工具現況。今天把它們串起來看一次全貌。
| Day | 發現 |
|---|---|
| 15 | composer.json 沒有 "php" 版本約束,相容性承諾沒寫在 Composer 安裝階段能檢查的地方 |
| 16 | 程式碼天生相容是因為沒用到新語法,不是刻意設計;依賴鏈裡的 guzzlehttp/promises 已經先觸發 PHP 8.4+ 的棄用警告 |
| 17 | README 徽章連到 Travis CI/Scrutinizer,跟實際在跑的 GitHub Actions 已經脫鉤 |
| 18 | 沒有任何靜態分析工具;composer audit 實測發現依賴鏈累積 17 個安全性風險通報 |
| 19 | 暫存複本上跑 PHPStan level 5,發現 7 個錯誤,包含一個 PHPDoc 打字錯誤(stirng)鬧出的烏龍 |
| 20 | check-style(phpcs PSR2)從未被 CI 呼叫,實測發現 8 個既有違規全部集中在對應綠界欄位命名的方法 |
| 21 | AI 產生程式碼時不會自動知道版本限制,除非明講在 prompt 或專案指引裡 |
把這 7 天的發現放在一起看,會發現它們其實在回答同一組問題:
「這個承諾/規則寫在哪裡?」 答案幾乎都是「只寫在 CI 矩陣設定裡,沒有寫進 composer.json、README、或任何給人類/AI 讀的專案指引」。
「誰會檢查?」 答案是「除了 CI 跑測試那一刻,沒有別的機制在檢查」——PHPStan 沒裝、phpcs 沒接進去、composer audit 從沒被想到要跑。
「什麼時候才會被發現?」 答案是「等到某天有人(或 AI)不小心踩到,或是某個依賴版本的已知漏洞被公開很久之後才偶然被注意到」。
不是說「跑測試沒有用」——CI 矩陣涵蓋 7.1 到 8.3,確實會在每次 push 時攔下明顯的語法不相容問題,這是真實有效的防線。這句話的意思是:目前這個套件除了『跑一次測試』之外,沒有任何第二層防線——沒有靜態分析在寫程式碼的當下就攔截型別問題,沒有 composer audit 在依賴版本累積風險時發出警訊,沒有版本約束在安裝階段就擋下不相容的環境。單一防線的問題不是它不管用,是它只在「剛好跑到那條路徑」的時候才生效——沒被測試覆蓋到的分支、沒被特別注意到的依賴版本,防線就完全不存在。
這也剛好呼應這個系列從第一天就立下的主題句:AI 能幫你補程式碼,但補不出你自己都沒發現的測試缺口——換到這裡的脈絡,可以延伸成:工具能幫你多開幾道防線,但補不出你自己都沒想到要去檢查的那個面向。 PHPStan、composer audit、phpcs 都不是新奇的工具,它們沒被用起來的原因,通常不是技術障礙,是根本沒有人在某個時間點停下來想「我們現在還缺什麼」。
接下來 8 天要動手做的候選項目,都是這一部發現的直接延伸:
check-style 接進 CI,並處理既有的 8 個違規(呼應 Day 20)RefundRequest/VoidRequest 補上例外情境測試(呼應 Day 05、10)看完這 7 天的發現,如果要你只選一件事優先做,你會先補哪一個?是最容易做的(例如加一行 composer audit),還是影響最大的(例如處理 phpcs 既有違規讓 check-style 能真正接進 CI)?
明天正式進入第四部——不再只是診斷,而是實際在一份暫存複本上動手做出幾個補救示範,第一個是幫覆蓋率補一份有意義的門檻。