Einar Landre

火星氣候軌道器的教訓#

1999 年 9 月 23 日,價值 3.276 億美元的**火星氣候軌道器(Mars Climate Orbiter)**因為軟體錯誤而失聯。這個錯誤後來被稱為 metric mix-up

  • 地面站軟體使用(pounds)作為單位
  • 太空船預期接收的是牛頓(newtons)
  • 導致地面站低估了推進器的推力,偏差倍數達 4.45

這是一個本可透過更強的型別系統來避免的軟體失誤。

領域特定型別的力量#

以 Ada 語言為例,它具有強型別檢查,支援基本型別和使用者自訂型別:

type Velocity_In_Knots is new Float range 0.0 .. 500.00;
type Distance_In_Nautical_Miles is new Float range 0.0 .. 3000.00;

如果嘗試將 DistanceVelocity 相加,編譯器會將其視為型別錯誤而阻止。

現代語言中的應用#

在 Java、C++、Python 等現代語言中,抽象資料型別以 class 的形式存在。使用像 Velocity_In_KnotsDistance_In_Nautical_Miles 這樣的類別,而非單純的 FloatString,能大幅提升程式碼品質:

  • 更易讀:程式碼表達的是領域概念,而非只是基本型別
  • 更易測試:程式碼封裝了可測試的行為
  • 更易重用:跨應用程式和系統的重用更加容易

靜態與動態型別語言皆適用#

這個方法對靜態型別動態型別語言都同樣有效:

  • 靜態型別語言的開發者從編譯器獲得幫助
  • 動態型別語言的開發者更依賴單元測試
  • 檢查方式不同,但動機和表達風格相同

開始探索**領域特定型別(domain-specific types)**來開發高品質軟體。不要讓原始型別成為隱藏領域錯誤的溫床。