軟體專案管理是一項艱巨的挑戰,而本章聚焦於與建構直接相關的管理議題:如何鼓勵良好的編碼實踐、控制變更、估算時程、度量過程,以及把程式設計師當人看。
28.1 鼓勵撰寫良好的程式#
由管理層強制推行嚴格的技術標準通常不是好主意——程式設計師傾向認為管理者的技術水準不足以制定規範。如果要定義標準,應由受人尊敬的**架構師(Architect)**來制定。
鼓勵良好編碼的技巧#
| 技巧 | 說明 |
|---|---|
| 指派兩人負責每個部分 | 從結對程式設計到導師-學徒配對,確保至少兩人認為程式碼可行且可讀 |
| 審查每一行程式碼 | 程式碼審查讓至少三人閱讀每行程式碼,也是推動團隊編碼標準的隱性力量 |
| 要求程式碼簽核 | 由資深技術人員簽署程式碼清單,如同工程圖紙需要工程師簽章 |
| 傳閱優秀程式碼範例 | 比用文字描述標準更容易理解與更新 |
| 強調程式碼是公共資產 | 程式碼不是私有財產,而是專案資產 |
| 獎勵優秀程式碼 | 確保獎勵對象的技術實力真的值得肯定,否則反而損害公信力 |
| 一個簡單標準 | 「我必須能夠讀懂專案中的所有程式碼」,能有效抑制過度「聰明」的寫法 |
28.2 設定管理#
設定管理(Configuration Management, CM) 是識別專案產出物並系統化處理變更的實踐,也稱為變更控制(Change Control)。它包括評估提案的變更、追蹤變更,以及保存系統在各時間點的狀態。
SCM 最大的系統性問題是過度控制。必須謹慎規劃,使其成為資產而非累贅。小型專案可能只需非正式的定期備份;大型專案則需要完整的 SCM 方案。
需求與設計變更#
| 做法 | 說明 |
|---|---|
| 遵循系統化的變更控制程序 | 讓變更在整體專案最佳利益的脈絡下被評估 |
| 批量處理變更請求 | 累積後作為一組來評估,選出最有價值的 |
| 估算每項變更的成本 | 包括對需求、設計、程式碼、文件的連鎖影響 |
| 警惕高變更量 | 大量變更請求是需求或架構做得不夠好的警訊 |
| 建立變更控制委員會 | 或指定一位「變更沙皇」來過濾變更請求 |
缺乏紀律的變更控制是軟體產業面臨的最大管理問題之一。許多被認為「延遲」的專案,若能追蹤未記錄的變更影響,其實是準時的。
程式碼變更與版本控制#
版本控制軟體(Version-Control Software) 是團隊協作的基石:避免多人衝突、一鍵更新至最新版、可回溯任何已簽入版本、取得完整變更紀錄,且本身即為安全備份。
備份計畫應涵蓋定期備份、異地存放與所有重要專案資料。別忘了測試你的還原程序。
28.3 評估建構進度表#
大型軟體專案平均超支 100%,開發者的估算通常帶有 20-30% 的樂觀因子(Optimism Factor)。
良好估算的步驟#
| 步驟 | 做法 | 說明 |
|---|---|---|
| 1 | 確立目標 | 釐清估算範圍與所需精確度 |
| 2 | 為估算留出時間 | 匆忙的估算就是不準確的估算 |
| 3 | 明確需求 | 無法在「還沒定義的東西」上做可靠的估算 |
| 4 | 在低層級做細節估算 | 大數法則讓多個小估算的誤差互相抵消 |
| 5 | 使用多種方法交叉比對 | 不同方法的結果差異本身就具有啟發性 |
| 6 | 定期重新估算 | 隨專案推進,估算精度應持續提高 |
落後時怎麼辦?#
- 不要寄望「之後追回來」:研究顯示延遲通常在專案後期更加惡化
- 增加人手要小心:Brooks 定律——為已延遲的專案增加人力只會讓它更晚完成
- 縮減專案範圍:最有效但常被忽視的策略。事先將功能分為「必要」、「想要」、「可選」三類,落後時優先砍掉低價值功能
28.4 度量#
「被度量的事情就會被執行」(What gets measured, gets done)——人們會關注被度量的面向而忽略未被度量的。謹慎選擇度量的項目。
任何專案屬性都能找到優於完全不度量的度量方式,即使不完美也能提供對開發流程的掌握。
| 類別 | 範例 |
|---|---|
| 規模 | 總程式碼行數、類別/常式數量、註解行數 |
| 缺陷追蹤 | 嚴重度、來源、修正時間、修正衍生的新錯誤數 |
| 生產力 | 每個類別/常式的工時、每行程式碼的成本 |
| 整體品質 | 每千行程式碼的缺陷數、平均故障間隔時間(MTBF) |
| 可維護性 | 公開常式數、參數數量、控制流複雜度 |
從簡單的度量開始(缺陷數、工作月數、總金額、總程式碼行數),跨專案標準化後逐步精煉。先設定目標,再決定需要回答什麼問題。
28.5 把程式設計師當人看#
高度技術性的工作需要以自然、人性化的環境來平衡。最成功的技術公司結合了高科技(High-Tech)與高接觸(High-Touch) 的元素。
績效差異#
研究顯示程式設計師之間存在數量級的差異:初始編碼時間最佳與最差比率約 20:1,除錯時間超過 25:1。經驗年數與程式碼品質或生產力之間沒有直接關聯。團隊層面,第 15 百分位能力的團隊通常需要第 90 百分位團隊約 3.5 倍的工作月數。
若需要多付薪資才能雇到前 10% 的程式設計師,絕對值得。你會在品質和生產力上立刻獲得回報,並在留住其他優秀人才方面產生正向循環。
宗教議題與物理環境#
某些議題屬於個人風格的信仰問題(Religious Issues),管理者應避免強制規定,包括:程式語言、縮排風格、大括號位置、IDE 選擇、命名慣例等。應使用「建議」而非「規則」,讓程式設計師自行發展團隊標準。
DeMarco 與 Lister 的研究顯示,表現前 25% 的程式設計師擁有更大、更安靜、更私密的辦公空間,其生產力是後 25% 的 2.6 倍。投資改善工作環境可帶來約 40-100% 的生產力提升。
28.6 管理你的管理者#
技術上稱職且跟得上時代的管理者相當罕見。若你的管理者屬於多數情況,你需要學會「向上管理」:
| 策略 | 說明 |
|---|---|
| 植入想法 | 提出構想後,等待管理者「靈光一現」地採納你的點子 |
| 持續教育管理者 | 這是長期工程,因為管理者經常調動 |
| 聚焦管理者的利益 | 做他真正想要你做的事,不要用不必要的實作細節分散注意力(把它當作工作的「封裝」) |
| 拒絕不當指令 | 堅持用正確的方式做事 |
| 換工作 | 如果以上都行不通 |
要點#
- 編碼實踐:良好的編碼實踐可透過強制標準或更溫和的方式(審查、範例、簽核)來達成
- 設定管理:正確應用的設定管理能讓程式設計師的工作更輕鬆,尤其是變更控制
- 估算:成功的關鍵在於使用多種方法、隨專案推進逐步收緊估算,並以歷史資料為基礎
- 度量:任何專案面向都能找到比完全不度量更好的度量方式;精確的度量是準確排程、品質控管與流程改善的基石
- 以人為本:程式設計師和管理者都是人,以人的方式對待他們才能獲得最佳成果