想法與洞見

探索 AI 優先開發、編碼護欄和可處置架構。

可以,但你的型別系統得先認得什麼是美元

TypeScript 把所有數字視為同一種型別。本文示範如何讓編譯器區分 USD 與 EUR,在程式上線前就擋下貨幣轉換錯誤。

2022 年,一家大型金融科技平台處理了一筆 32,700,000.00 的批量轉帳。這筆金額以純 儲存。下游服務誤以為單位是分(cents)。事實並非如此。 這個 bug 通過了 code review、unit tests 與 integration tests。型別系統看到 與…

數字不只是數字:如何讓編譯器抓出單位錯誤

該傳秒數的地方傳了毫秒,這種 bug 能通過所有測試。以下介紹如何將單位直接編碼進 TypeScript 的型別系統,讓混用在編譯階段就失敗,且執行期零成本。

某個函式要求以毫秒為單位的超時時間。你傳入 。稍後,另一個函式要求以秒為單位的超時時間。你傳入 。在這之間的某處,你呼叫了 ,結果整整一小時又二十三分鐘什麼事都沒發生。 TypeScript 在這裡幫不上忙。 和 都是…

TypeScript 竟然讓我把 user ID 傳進需要 order ID 的地方

Type aliases 不會在 TypeScript 中建立不同的型別。Branded types 會,而且它們能在編譯時期就防止你搞混識別碼。

上個季度,我們釋出了一個 bug,把款項退錯了客戶。一個 函式在預期收到 order ID 的地方收到了 user ID。字串看起來一模一樣,測試也通過了,TypeScript 完全沒有提出異議。 這兩個識別碼的型別都是 。TypeScript 看不出它們之間的差別。如果你曾經把 傳進一個需要…

Differential Testing 不需要形式化證明也能運作,但 Common-Mode Failure 才是真正的陷阱

Differential testing 讓你在不知道正確答案的情況下找到 bug。問題是,有相關性的錯誤看起來就像一致。以下是找出盲點的方法。

你可以信任 differential testing,即使沒有形式化證明——但前提是你必須清楚知道它會在什麼地方崩潰。 它的弱點叫做 common-mode failure。當一個規格的每個實作都做出同樣的錯誤假設時,它們全部一致通過,你的 test harness 就會標為通過。N-version…

測試無法證明兩個函式等價。真正有用的是這個。

N-version programming 假設你的實作結果一致。我們來看看為什麼測試不夠、SMT solver 如何真正證明等價,以及該在「夠好就好」和「形式化驗證」之間劃下哪條界線。

你建了一個 n-version 系統。同一個關鍵函式的三份獨立實作、一個選出多數結果的 voter,以及一種自己已經搞定單點故障的溫暖感覺。 你並沒有證明這些函式是等價的。你只證明了它們編譯得過。 N-version programming 的概念是:如果其中一個實作有 bug,其他的大概不會有,所以 voter…

如果我的 LLM 變體意見分歧,哪一個才對?

並行運行多個 LLM 能抓出任何單一模型都會自信上線的錯誤。以下是如何建立一個真正有效的分歧解決系統。

你把一個 prompt 送給 GPT-4o。它回傳了一個 JSON blob,信心值 0.97。你把同一個 prompt 送給 Claude 3.5 Sonnet。它回傳了另一個 JSON blob,信心值也是 0.97。兩個模型聽起來都篤定不移。兩個都在不同層面上錯了。 這不是假設情境。只要你運行任何非瑣碎的…

五種實作卻沒有共識:到底該怎麼選出最好的那一個

N-version programming 聽起來很簡單:跑多個實作,挑最好的答案。但在實務上,「最好」比「最常見」難定義得多。

你有同一個函式的五種實作。三個回傳相同的結果。一個稍有不同。一個拋出例外。哪一個才是對的? 大多數團隊預設採用多數決。當輸出完全一致且錯誤顯而易見時,這麼做沒問題。但只要你的實作在細微處出現分歧,或每個變體都回傳不同答案時,這套方法就會崩解。N-version programming…

同一個 LLM 就能寫出五種版本的函式。以下是讓它們真正不同的方法。

用 LLM 進行 N-version programming 不需要多個模型。只要改變 prompt、角色設定和推理限制,就能從單一模型中產出多樣且正確的實作。

N-version programming 的假設是:多樣性來自不同的作者。對 LLM 來說,這意味著不同的模型、不同的供應商,甚至不同的訓練版本。但這個假設是錯的。只要改變「怎麼問」,而不是「問什麼」,就能從同一個模型中獲得有意義的多樣性。 問題在於:把 temperature 調到 1.0 然後重複跑五次…

NASA 同時執行了 27 份相同的程式。漏洞們集體投票。

N-version programming 曾宣稱獨立團隊會犯下獨立的錯誤。Knight 與 Leveson 在 1986 年的實驗證明了相反的事實,NASA 也默默退出了這條路。

1980 年代初期,NASA 面對一個至今仍困擾著安全關鍵工程領域的問題:你該如何容忍那些還沒被發現的漏洞?他們的答案是 N-version programming。把同一份規格交給三個獨立團隊。同時執行三份程式。對輸出結果進行投票。如果其中一個團隊寫出了漏洞,另外兩個會以多數票壓過它。…

你有一半的 Cucumber Scenario 被跳過。這個狀態正在對你說謊。

Cucumber 的 'skipped' 狀態隱藏了三種完全不同的問題。這裡教你如何診斷是哪一種正在蠶食你的測試套件,以及如何阻止它。

你有一半的 Cucumber scenario 被跳過。不是失敗,是被跳過。 那個黃色的狀態比紅色的 build 還危險。它讓你的測試套件看起來很健康,卻把三種完全不同的問題藏在同一個禮貌的標籤底下。一個被跳過的 scenario 可能是你的 tag filter 把它排除了、某個 step definition…