可以,但你的型別系統得先認得什麼是美元
TypeScript 把所有數字視為同一種型別。本文示範如何讓編譯器區分 USD 與 EUR,在程式上線前就擋下貨幣轉換錯誤。
2022 年,一家大型金融科技平台處理了一筆 32,700,000.00 的批量轉帳。這筆金額以純 儲存。下游服務誤以為單位是分(cents)。事實並非如此。 這個 bug 通過了 code review、unit tests 與 integration tests。型別系統看到 與…
探索 AI 優先開發、編碼護欄和可處置架構。
TypeScript 把所有數字視為同一種型別。本文示範如何讓編譯器區分 USD 與 EUR,在程式上線前就擋下貨幣轉換錯誤。
2022 年,一家大型金融科技平台處理了一筆 32,700,000.00 的批量轉帳。這筆金額以純 儲存。下游服務誤以為單位是分(cents)。事實並非如此。 這個 bug 通過了 code review、unit tests 與 integration tests。型別系統看到 與…
該傳秒數的地方傳了毫秒,這種 bug 能通過所有測試。以下介紹如何將單位直接編碼進 TypeScript 的型別系統,讓混用在編譯階段就失敗,且執行期零成本。
某個函式要求以毫秒為單位的超時時間。你傳入 。稍後,另一個函式要求以秒為單位的超時時間。你傳入 。在這之間的某處,你呼叫了 ,結果整整一小時又二十三分鐘什麼事都沒發生。 TypeScript 在這裡幫不上忙。 和 都是…
Type aliases 不會在 TypeScript 中建立不同的型別。Branded types 會,而且它們能在編譯時期就防止你搞混識別碼。
上個季度,我們釋出了一個 bug,把款項退錯了客戶。一個 函式在預期收到 order ID 的地方收到了 user ID。字串看起來一模一樣,測試也通過了,TypeScript 完全沒有提出異議。 這兩個識別碼的型別都是 。TypeScript 看不出它們之間的差別。如果你曾經把 傳進一個需要…
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 能抓出任何單一模型都會自信上線的錯誤。以下是如何建立一個真正有效的分歧解決系統。
你把一個 prompt 送給 GPT-4o。它回傳了一個 JSON blob,信心值 0.97。你把同一個 prompt 送給 Claude 3.5 Sonnet。它回傳了另一個 JSON blob,信心值也是 0.97。兩個模型聽起來都篤定不移。兩個都在不同層面上錯了。 這不是假設情境。只要你運行任何非瑣碎的…
N-version programming 聽起來很簡單:跑多個實作,挑最好的答案。但在實務上,「最好」比「最常見」難定義得多。
你有同一個函式的五種實作。三個回傳相同的結果。一個稍有不同。一個拋出例外。哪一個才是對的? 大多數團隊預設採用多數決。當輸出完全一致且錯誤顯而易見時,這麼做沒問題。但只要你的實作在細微處出現分歧,或每個變體都回傳不同答案時,這套方法就會崩解。N-version programming…
用 LLM 進行 N-version programming 不需要多個模型。只要改變 prompt、角色設定和推理限制,就能從單一模型中產出多樣且正確的實作。
N-version programming 的假設是:多樣性來自不同的作者。對 LLM 來說,這意味著不同的模型、不同的供應商,甚至不同的訓練版本。但這個假設是錯的。只要改變「怎麼問」,而不是「問什麼」,就能從同一個模型中獲得有意義的多樣性。 問題在於:把 temperature 調到 1.0 然後重複跑五次…
N-version programming 曾宣稱獨立團隊會犯下獨立的錯誤。Knight 與 Leveson 在 1986 年的實驗證明了相反的事實,NASA 也默默退出了這條路。
1980 年代初期,NASA 面對一個至今仍困擾著安全關鍵工程領域的問題:你該如何容忍那些還沒被發現的漏洞?他們的答案是 N-version programming。把同一份規格交給三個獨立團隊。同時執行三份程式。對輸出結果進行投票。如果其中一個團隊寫出了漏洞,另外兩個會以多數票壓過它。…
Cucumber 的 'skipped' 狀態隱藏了三種完全不同的問題。這裡教你如何診斷是哪一種正在蠶食你的測試套件,以及如何阻止它。
你有一半的 Cucumber scenario 被跳過。不是失敗,是被跳過。 那個黃色的狀態比紅色的 build 還危險。它讓你的測試套件看起來很健康,卻把三種完全不同的問題藏在同一個禮貌的標籤底下。一個被跳過的 scenario 可能是你的 tag filter 把它排除了、某個 step definition…