我們怎麼審查自己的產品
DisplayPilot 由一個人開發,是沒有評價的付費產品。與其讓你相信我們,不如把真實的記錄擺出來:我們怎麼找問題,以及找到了什麼——其中兩次是我們在檢查方法上犯錯,而不是產品出錯。
方法
- 四個角度。每個功能按四種方式讀一遍:它與系統其餘部分的連接點、每條失敗分支上會發生什麼、我們對它的說法與程式碼是否一致、以及行為在語意上是否正確(而不只是看起來合理)。
- 先懷疑檢查器。檢查失敗時,更可能出錯的是檢查本身。下面就有好幾條正是如此。
- 檢查必須能在植入缺陷時失敗。每一道自動檢查都被驗證過:故意改壞一處,確認它變紅。不會失敗的檢查只是裝飾。
- 檢查必須報告它量了什麼。最安靜的失效方式是「什麼都沒匹配到,於是印出全部通過」。我們的每道檢查都會印出它看了多少項,並且有一道元檢查斷言這些數字不會下降。
我們找到了什麼(節選)
錯在哪 → 代價 → 怎麼修。
- 隱私頁寫著我們看不到你的信箱,而程式碼把它明文儲存、且長期保留。這是最糟的一類錯誤——一句被程式碼推翻的公開說法。頁面與儲存都已修正,而這條說法現在本身就是自動檢查與程式碼比對的對象之一。
- 我們標價 US$14,實際收 ¥99,按匯率約 US$14.82——等於把自己的價格說低了 5.9%。已改為與實際收款一致。
- 發布驗證器會在兩個主機都壞掉時回報成功。它只比對內容雜湊,於是兩個一模一樣的 404 也算「一致」。現在它同時要求真實的 200 回應。
- 授權頁的一句話描述了一個我們從未使用的支付管道,而且不像我們啟用碼的輸入仍會被送到第三方端點。該端點已被完全移除:啟用只在這台 Mac 上發生。
- 每個 Release 頁面上都有一個指向從未發布檔案的連結。正文裡的「技術細節」指向 404。檔案現在已發布,連結形式也一併修好。
- 錢路的最後一環在本專案裡從未被測過。簽發啟用碼依賴登入鑰匙圈裡的簽章私鑰;若那把私鑰被重新產生,新簽發的每一枚碼都會被所有已安裝的應用拒絕,而且無聲無息。現在我們跑一個 2 秒檢查,比對鑰匙圈公鑰與應用內嵌公鑰。
- 錢可能到了卻沒人知道。未匹配的轉帳只寫日誌、從不通知。現在會觸發通知。
- 譯文缺格式符會導致當機。譯文漏一個 %d 或 %@ 會執行時當機或顯示錯值;現在的檢查會比對格式符,而不只是覆蓋率。
我們在「檢查本身」上錯在哪
- 一個看起來沒簽章的建置。我們自己的腳本報「沒有簽章」,因為某次 codesign 呼叫不印出 Authority 鏈。建置是好的,檢查不是。
- 424 個「缺失」的檔案其實一個都不缺。一個連結檢查器不會解析上層目錄路徑,把幾百個正常連結報成斷鏈。
- 一道「通過了」卻什麼都沒量的守衛。某道檢查在量測靜默失敗時回報「全部通過」——正是它被寫出來要防的那種失效。
現在跑什麼
在發布任何東西之前,會先跑 16 道自動檢查,然後是完整測試套件與編譯。它們覆蓋:應用與程式碼的說法是否一致、在地化、價格、站點頁面與中繼資料、隱私與授權文本、發布文案,以及站點的每一個站內連結與資源(包括大小寫——因為 macOS 大小寫不敏感,而 Web 敏感)。任何一道失敗都會中止發布。
完整清單與各自對應的命令在專案倉庫裡。如果你在這個網站上發現任何我們的程式碼支撐不了的說法,那是一個值得回報的 bug——告訴我們,我們會公開修正。