現代程式設計工具能大幅縮短建構時間,使用前沿工具組合可將生產力提升 50% 以上。Barry Boehm 發現 20% 的工具佔了 80% 的使用量——缺少其中一項,你就錯失了大量可運用的利器。本章涵蓋建構工具的「種類」而非特定品牌。
30.1 設計工具#
設計工具主要是圖形化工具(Graphical Tools),用於建立 UML、架構方塊圖、階層圖、實體關係圖等設計圖表,有時嵌入在 CASE 工具中。它們比一般繪圖軟體多了自動重排、層次切換、一致性檢查,甚至能直接從設計生成程式碼。
30.2 原始碼工具#
原始碼工具比設計工具更為豐富且成熟,可分為以下幾大類別:
編輯#
- 整合開發環境(IDE):程式設計師花費高達 40% 的時間編輯原始碼。好的 IDE 提供編譯與錯誤偵測、版控整合、程式碼摺疊、跳轉至定義與用法、大括號配對、範本、智慧縮排、自動化重構、正規表示式搜尋取代、多檔案編輯、並排差異比較和多層復原等功能。
- 多檔案搜尋與取代:用
grep或正規表示式搜尋所有出現位置。重新命名時特別有用,常見工具包括 Perl、AWK、sed。 - 差異比較與合併工具(Diff / Merge Tools):比較檔案差異、自動合併簡單變更並提示衝突,常與版控整合。
美化、文件與品質分析#
| 工具類型 | 說明 |
|---|---|
| 原始碼美化工具(Beautifiers) | 統一縮排、格式化註解。一類只產出美化輸出,另一類直接修改原始碼——處理舊程式碼時特別實用 |
| 介面文件工具 | 從 @tag 標記提取程式設計師介面文件,例如 Javadoc |
| 範本(Templates) | 標準化常見的鍵盤任務(如常式前言、類別骨架),在團隊中推動一致的編碼風格 |
| 嚴格語法檢查器 | 比編譯器更嚴格,例如 C/C++ 的 Lint 能偵測未初始化的變數、可疑的指標操作、不可達的程式碼等 |
| 度量報告工具(Metrics Reporters) | 報告複雜度、計算行數、追蹤缺陷。複雜度分析對維護生產力有約 20% 的正面影響 |
重構與轉換#
- 重構工具(Refactorers):跨程式碼庫重新命名類別、提取常式等,使變更更快速且不易出錯。
- 重組工具(Restructurers):將 goto 義大利麵式程式碼轉換為結構更好的版本,在維護環境中可帶來 25-30% 的正面影響。
- 程式碼翻譯器(Code Translators):將程式碼從一種語言翻譯成另一種,但壞程式碼只會變成另一種語言的壞程式碼。
版本控制與資料字典#
- 版本控制(Version Control):管理原始碼、相依性(如
make)、專案文件版本化,以及關聯需求、程式碼與測試案例。 - 資料字典(Data Dictionary):描述專案中所有重要資料的資料庫,在大型團隊中有助於避免命名衝突。
30.3 可執行碼工具#
程式碼建立#
| 工具類型 | 說明 |
|---|---|
| 編譯器與連結器(Compilers and Linkers) | 編譯器將原始碼轉為可執行碼;連結器將多個目的檔連結為可執行程式 |
| 組建工具(Build Tools) | 如 make、ant,自動檢查相依性並只重新編譯受影響的檔案 |
| 程式碼函式庫(Code Libraries) | 以開源或購買替代自行撰寫,涵蓋容器類別、加密、網路通訊、報表等眾多領域 |
| 程式碼產生精靈(Code-Generation Wizards) | 自動產生資料庫、UI、編譯器等程式碼,適合快速原型,但產生的程式碼通常難以閱讀與維護 |
| 前置處理器(Preprocessors) | 方便在開發碼與正式碼之間切換,例如用巨集在開發時插入檢查,在正式版中重新定義為空操作 |
除錯、測試與調校#
| 工具類型 | 說明 |
|---|---|
| 除錯工具 | 編譯器警告、測試鷹架(Test Scaffolding)、差異比較、執行分析器、追蹤監視器和互動式除錯器 |
| 測試工具 | 自動化測試框架(JUnit、NUnit、CppUnit)、測試產生器、錄製回放工具、覆蓋率監視器、系統擾動器、缺陷追蹤軟體 |
| 執行分析器(Execution Profilers) | 監視每條陳述式的執行次數或耗時,找出熱點以集中調校 |
| 組合語言列表與反組譯器 | 查看編譯後產生的組合語言碼,理解為何看似快速的程式碼實際執行緩慢 |
30.4 工具導向的環境#
UNIX 環境以其小工具集合聞名——grep、diff、sort、make、lint、sed、awk、vi 等——各自精巧且能良好協同工作。C/C++ 語言體現相同哲學。某些程式設計師在 UNIX 中生產力極高,以至於到了其他環境也要帶上 UNIX 工具(如 Cygwin)。
30.5 打造你自己的程式設計工具#
大多數優秀的程式設計師寧可花 4 小時 45 分鐘打造工具,再讓工具在 15 分鐘內完成工作,也不願花整整 5 小時手動完成。打造工具是程式設計的核心織理。 幾乎所有大型組織都有內部工具與支援團隊。
專案專用工具#
中大型專案通常需要獨特的工具——產生特殊測試資料、驗證資料檔品質、模擬尚未到位的硬體等。專案規劃時就應考慮所需工具並分配建造時間。
腳本#
腳本(Script) 將重複性工作自動化。如果你每天重複輸入超過五個字元的相同指令,它就是腳本的好候選者。常見用途包括編譯連結序列、備份指令和帶有大量參數的命令。
30.6 工具夢想世界#
數十年來,從 Fortran 到第四代語言、CASE 工具、視覺化程式設計——每一項創新都帶來有價值的漸進式改善,但沒有任何一項真正消除了程式設計。
程式設計在本質上是困難的。無論工具多好,程式設計師仍須與混亂的現實世界搏鬥、嚴謹地思考序列與相依性、處理善變的需求與定義不清的介面。只要電腦存在,我們就需要告訴它們做什麼的人——這項活動就叫做「程式設計」。
更多資源#
- Hunt & Thomas. The Pragmatic Programmer (2000):第三部分深入討論程式設計工具。
- Glass. Software Conflict (1991):提出最低標準工具集的概念。
- Jones. Estimating Software Costs (1998) 及 Boehm et al. Software Cost Estimation with Cocomo II (2000):探討工具使用對生產力的影響。
要點#
- 程式設計師有時會忽略最強大的工具多年才發現它們。
- 好的工具涵蓋編輯、品質分析、重構、版本控制、除錯、測試和效能調校,讓工作輕鬆許多。
- 你可以自行打造許多所需的專用工具。
- 好的工具能減少軟體開發中較繁瑣的面向,但無法消除對程式設計的需求——儘管它們會持續重新塑造「程式設計」這個詞的意涵。