現代程式設計工具能大幅縮短建構時間,使用前沿工具組合可將生產力提升 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)makeant,自動檢查相依性並只重新編譯受影響的檔案
程式碼函式庫(Code Libraries)以開源或購買替代自行撰寫,涵蓋容器類別、加密、網路通訊、報表等眾多領域
程式碼產生精靈(Code-Generation Wizards)自動產生資料庫、UI、編譯器等程式碼,適合快速原型,但產生的程式碼通常難以閱讀與維護
前置處理器(Preprocessors)方便在開發碼與正式碼之間切換,例如用巨集在開發時插入檢查,在正式版中重新定義為空操作

除錯、測試與調校#

工具類型說明
除錯工具編譯器警告、測試鷹架(Test Scaffolding)、差異比較、執行分析器、追蹤監視器和互動式除錯器
測試工具自動化測試框架(JUnit、NUnit、CppUnit)、測試產生器、錄製回放工具、覆蓋率監視器、系統擾動器、缺陷追蹤軟體
執行分析器(Execution Profilers)監視每條陳述式的執行次數或耗時,找出熱點以集中調校
組合語言列表與反組譯器查看編譯後產生的組合語言碼,理解為何看似快速的程式碼實際執行緩慢

30.4 工具導向的環境#

UNIX 環境以其小工具集合聞名——grepdiffsortmakelintsedawkvi 等——各自精巧且能良好協同工作。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):探討工具使用對生產力的影響。

要點#

  • 程式設計師有時會忽略最強大的工具多年才發現它們。
  • 好的工具涵蓋編輯、品質分析、重構、版本控制、除錯、測試和效能調校,讓工作輕鬆許多。
  • 你可以自行打造許多所需的專用工具。
  • 好的工具能減少軟體開發中較繁瑣的面向,但無法消除對程式設計的需求——儘管它們會持續重新塑造「程式設計」這個詞的意涵。