我想知道自己這些年做的 54 支作品,各自用到了哪些外面的東西。一支一支翻太慢,我就寫了一段程式去數。
它跑完了。沒有紅字,最後印出一份排得整整齊齊的報表。我低頭往下看:地圖,0 支。地理查詢,0 支。天氣,0 支。高程,0 支。一路到底,每一項都是 0。
報表項目 掃出來的支數 ──────────────────────────────────────── 地圖函式庫 0 支 地理查詢 0 支 天氣資料 0 支 高程資料 0 支 ──────────────────────────────────────── 結束代碼 0,格式完整,零錯誤訊息
我以為發生了什麼
我以為這份報表在告訴我一件事:素材不夠。
那一刻我心裡已經下好結論:這個題目做不起來。差一點就照著這份報表回報出去。
會相信它,是因為它該有的樣子全都有。結束代碼是 0,代表順利收工;欄位對齊、每一列都印出來了。一份格式完整的報表,看起來就像一份跑過的報表。
實際發生了什麼
2026-09-17,我把那支腳本原封不動再跑一次,這次先單獨呼叫它內部要用的那個搜尋程式。
它不在。第二版為了跑快一點,我換了一個比較快的搜尋程式來掃,而它根本沒裝在這台機器的執行路徑裡。
接下來是一條直線:每次呼叫都失敗,失敗的輸出是空的,空的拿去統計就是 0——而 0 是一個合法的統計結果,程式沒有任何理由報錯。
換回原本比較慢的做法重跑,同一批資料夾、同一份關鍵字,這次實際掃了 5,611 個程式碼檔、66 支 App,地圖函式庫掃出 14 支。
官方文件寫了嗎
沒有官方文件可以查,因為這支腳本是我自己寫的。
這句話聽起來像藉口,其實正是問題本身。自己寫的工具沒有人幫你寫使用說明,也沒有人幫你在旁邊標一行警告。 官方文件至少會告訴你某個呼叫失敗時會回什麼;自己寫的東西,你記得的是你打算讓它怎麼做,不是它實際上怎麼做。
別人的工具騙你,你還會懷疑它。自己的工具騙你,你只會懷疑資料。
你一定會踩的那個細節
這是空集合讓檢查假通過的典型。
危險在於:0 不是錯誤訊息,0 是一個答案。「這批作品裡有 0 支用到地圖」跟「我根本沒掃到任何一個檔」在報表上長得一模一樣,程式分不出這兩件事——除非你自己讓它分。
擋住它只有一個方法:任何統計都要先斷言工具真的跑起來了,而不是直接相信它的輸出。
在統計任何東西之前,先確認工具真的在: 1. 單獨呼叫一次那個工具,只印它的版本 2. 拿不到版本就當場停掉,不要往下跑 3. 跑完統計,印出「掃了幾個檔、命中幾支」 掃到的檔數是 0,就是工具沒跑起來, 不是專案裡真的沒有。兩個數字都印出來, 你才分得出「沒找到」和「根本沒找」。
另外一半是交叉驗證:14 能用,不是因為它是程式算的,是因為另一次完全獨立的人工清點也得到 14。單一方法給出的數字再漂亮,都只是一個說法。
站內延伸
來源: Lucas 實測,自己寫的掃描腳本,2026-09-17。重跑方式:把腳本原封不動再跑一次,確認工具不在執行路徑時它照樣回報成功、結束代碼 0。
一份跑失敗的統計,跟一份跑成功但結果是零的統計,在螢幕上長得一樣。要分開它們不能等它報錯,得自己在算之前多問一句:這個數字是從幾個樣本裡算出來的。問不出樣本數的,不管印出什麼都不算數。