1. 軟體開發的多樣性#

每種工作都有其特有的困難(bugbears)。軟體開發的世界並非鐵板一塊——不同類型的軟體有截然不同的約束條件、品質要求與開發文化。許多開發方法論的爭論,根源在於忽略了這些差異。

2. 五個世界#

2.1 套裝軟體(Shrinkwrap Software)#

面向大量使用者的商業軟體,如 Microsoft Office、Adobe Photoshop。

  • 使用者基數龐大,任何小問題都會被放大
  • 極度重視易用性穩健性
  • 安裝體驗、效能表現、錯誤處理都必須精緻打磨
  • 投入在使用者介面上的心力遠超其他類型

2.2 開源軟體(Open Source Software)#

由志願者社群驅動的軟體開發。

  • 開發者通常是自願參與,動機來自興趣與社群認同
  • 品質參差不齊,取決於核心維護者的投入程度
  • 易用性是關鍵挑戰——若使用門檻太高,難以吸引非技術使用者
  • 文件品質往往是薄弱環節

2.3 內部軟體(Internal Software)#

為特定組織量身打造的系統,如企業 ERP、內部工具。

  • 只有一個「客戶」——使用它的組織
  • 優先考量開發速度,因為內部使用者可以被訓練
  • 易用性要求較低,因為使用者沒有其他選擇
  • 大多數企業程式設計師的日常工作

2.4 嵌入式軟體(Embedded Software)#

燒錄在硬體中的軟體,如汽車引擎控制、醫療設備、家電韌體。

  • 不可更新或更新成本極高,沒有「推送修補」的機會
  • 品質要求最高——出錯可能危及生命安全
  • 必須在開發階段就做到接近零缺陷
  • 測試與驗證流程最為嚴格

嵌入式軟體沒有「之後再修」的選項。一旦產品出貨,修復成本可能是召回整批硬體。

2.5 遊戲軟體(Games)#

以娛樂為目的的軟體,受經濟驅動。

  • 上市時間至關重要——錯過聖誕季等於錯過一整年的收入
  • 首發品質必須到位,因為玩家的第一印象決定口碑
  • 通常只有一個版本的機會,不像企業軟體可以持續迭代
  • 效能最佳化是核心技能

3. 另一種類型:拋棄式程式碼#

Throwaway Code 是為特定任務寫的臨時程式碼,例如資料遷移腳本、一次性報表產生器。這類程式碼的價值在於完成任務,不需要維護性或擴展性。

確保拋棄式程式碼真的會被拋棄。許多「臨時」腳本最終變成了永久的生產系統,但品質卻停留在原型階段。

4. 為何區分很重要#

大多數軟體開發方法論是為企業內部軟體設計的,因為那是最大的市場。但將內部軟體的方法論套用到套裝軟體或嵌入式軟體上,往往會產生問題。

認識這五個世界的差異,有助於:

  • 在技術社群討論中減少無謂的爭論
  • 選擇適合自身環境的開發方法論
  • 理解為何其他領域的開發者做出不同的決策

沒有一種開發方法論適用於所有情境。開發者應該根據自己所處的「世界」,調整方法論與實踐,而非盲目套用。