三思而後行:前期的前置作

三思而後行:前期的前置作業 #

俗話說「三思而後行」(Measure Twice, Cut Once),這句古老的木工諺語同樣適用於軟體開發。 造出高品質軟體的設計師,往往會使用高品質的前置實踐(Practice)。

3.1 前置作業的重要性 #

前置作業的核心目標在於降低風險。軟體開發中最常見的風險往往源自於糟糕的需求分析與專案規劃。 我們越盡早清除這些主要風險,後續的開發工作就越能平穩進行。

然而,許多程式設計師並未做好準備工作,原因通常有三:

  1. 缺乏完成此項任務的專業技能。
  2. 無法抵抗「盡早寫程式」的慾望。
  3. 管理者輕視前置作業的價值。

如何說服管理者(與自己)? #

若你的管理者輕視設計與規劃,你能做的最好處理就是教育你的老闆。我們可以訴諸邏輯、類比或數據資料來進行溝通。

自我應驗預言(Self-fulfilling Prophecies) 我們可以透過開發團隊的態度,來判斷專案是否已準備就緒。當團隊能從前兩種心態轉變為第三種時,代表準備工作已完成:

  1. ❌ 「我們最好立刻編碼,因為之後會有許多除錯工作要做。」(缺乏規劃導致的惡性循環)
  2. ❌ 「我們沒有為測試安排太多時間,因為將來不會發現多少缺陷。」(過度自信與缺乏風險意識)
  3. 「我們已詳細研究需求和設計,想不出在編碼與除錯期間還會遇到什麼大問題。」(充分準備後的自信)

3.2 不同軟體類型與對應做法 #

不同種類的軟體專案,需要在「準備工作」和「建構活動」之間取得不同的平衡:

  • 商業專案:往往適用於高度迭代開發(Iterative)。規劃活動(計畫、需求、架構)與開發活動(建構、系統測試、品質保證)會互相交織進行。
  • 攸關性命的系統:因為要求極高的可靠性,通常採用循序方法(Sequential),強調嚴謹的前置作業。

雖然迭代法通常比循序法省錢,但沒有一種開發能做到絕對的極端。較好的混合做法有二:

  1. 先詳細說明 80% 的需求(給予額外需求說明定量時間),再在專案進行中系統化地接納最有價值的新需求。
  2. 先詳細說明最重要的 20% 需求,並小幅增量開發其餘部分,之後再逐漸說明額外的需求和設計。

3.3 ~ 3.5 關鍵的前置作業清單 #

無論採用何種開發流程,我們都必須確保以下三項前置作業已到位:

1. 問題定義 (Problem Definition) #

這必須先於具體的需求分析。重點在於從客戶的角度,使用客戶的語言來描述問題,確保開發團隊解決的是正確的問題。

2. 明確需求 (Requirements) #

明確的需求能確保是「使用者在駕馭系統」,有助於避免爭論,並減少系統開發後的變更成本。

  • 核心觀念:需求是專案成功的關鍵。
  • 心態調整:雖然我們希望需求明確,但也必須接受「需求變更是客戶越深入理解專案後的必然結果」。

3. 軟體架構 (Software Architecture) #

架構是支撐細節設計的框架,決定了系統的概念完整性。一個完整的軟體架構應包含以下組成成分:

點擊展開:軟體架構檢核清單

在設計架構時,應考慮以下面向:

  • 程式組織:系統的整體結構與模組劃分。

  • 主要類別:核心的 Class 定義與職責。

  • 資料設計:資料庫與數據結構的規劃。

  • 業務規則:特定領域的商業邏輯。

  • 使用者介面:UI 設計準則。

  • 資源管理:記憶體、連線數等資源控管。

  • 安全性:驗證、授權與資料保護。

  • 效能:速度與回應時間的目標。

  • 規模彈性(Scalability):系統擴充的能力。

  • 互用性:與其他系統介接的能力。

  • 國際化/本地化:多語言與地區支援。

  • 輸入輸出(I/O):資料讀寫策略。

  • 錯誤處理:例外狀況的捕捉與回報。

  • 容錯性:系統在部分失效下的運作能力。

  • 可行性:技術與資源是否能實現上述設計。

3.6 前置作業的時間與工作量 #

做足前置作業並非浪費時間,而是為了節省後續大量的修正成本。根據經驗法則,建議的投入比例為:

  • 工作量 (Effort):約佔總工作量的 10-20%
  • 時程 (Schedule):約佔專案總時程的 20-30%

這段時間與工作量應該被獨立規劃出來,不應與編碼階段混淆,以確保前置作業的品質。