飛行的隱喻:從冒險到專業#

作者以航空史作為開場隱喻,勾勒出一個從夢想、冒險、失敗到專業化的演進歷程:

  • 古希臘神話中 Daedalus 與 Icarus 的飛行夢想(約西元前 1550 年)
  • 達文西(Leonardo DaVinci)首度以理性思考飛行原理——空氣阻力的雙向作用產生升力
  • 十八至十九世紀:大量的原型實驗與科學研究,升力、阻力、推力、重力被辨識與理解
  • 1903 年萊特兄弟完成首次持續、可控的動力飛行
  • 二戰期間美國損失 65,000 架飛機,但僅 23,000 架是戰鬥損失——更多人死於不懂如何飛行,而非敵火
  • 直到 1950 年代後,航空業才逐漸成為世界上最安全的交通方式

2009 年,機長 Chesley Sullenberger 憑藉超過兩萬小時的飛行經驗,在雙引擎失效的情況下將飛機迫降哈德遜河,拯救了 155 條性命。他精通自己的技藝——他是一位匠人(Craftsman)

軟體的平行歷史#

作者將軟體發展史與航空史進行平行對比,揭示兩者驚人的相似性:

早期理論奠基#

人物時期貢獻
Charles Babbage十九世紀初建造曲柄驅動的計算機,真正的數位電腦雛形
Ada Lovelace洞察到電腦中的數字可以代表現實世界中的事物,被譽為世界第一位程式設計師
Alan Turing1936證明了不可判定性問題,過程中發明了有限狀態機、機器語言、符號語言、巨集與原始子程式——本質上發明了軟體
Alonzo Church同時期以不同方法證明同一問題,發展出 Lambda 演算——函數式程式設計的核心概念

硬體與語言的爆發#

年份事件
1941Konrad Zuse 建造第一台可程式化數位電腦 Z3
1947Turing 發表演講,預言需要大量數學家來編寫程式,並警告維持紀律的困難
1949Grace Hopper 創造「compiler」一詞;1952 年建造第一個編譯器
1960 年代IBM 大量生產電腦,程式設計師需求激增

關鍵里程碑時間軸#

年份事件
1966Simula 67 誕生——第一個物件導向語言
1968Dijkstra 發表 “Go To Statement Considered Harmful”
1972Thompson 與 Ritchie 發明 UNIX 和 C
1977Apple II 發布
1981IBM PC 發布
1995Design Patterns、Ruby、JavaScript 問世
2000Y2K 千年蟲危機
2001Agile Manifesto 誕生
timeline
    title 航空史與軟體史的平行時間線
    section 夢想與理論
        約西元前1550年 : 希臘神話 Daedalus 與 Icarus
        十九世紀初 : Babbage 建造計算機雛形
        1936年 : Turing 發明軟體概念
    section 首次實現
        1903年 : 萊特兄弟首次動力飛行
        1941年 : Zuse 建造第一台可程式化電腦 Z3
        1949年 : Grace Hopper 創造 compiler
    section 危險的成長期
        郵政航空時代 : 大量飛行員殉職
        二戰 : 65000架飛機損失,多數非戰鬥損失
        1960年代 : 程式設計師需求激增,品質參差
        1972年 : Thompson 與 Ritchie 發明 UNIX 和 C
    section 邁向專業化
        1950年代後 : 航空成為最安全交通方式
        1995年 : Design Patterns 問世
        2001年 : Agile Manifesto 誕生
    section 匠人典範
        2009年 : Sullenberger 迫降哈德遜河
        現今 : 軟體業仍在追尋 Craftsmanship

1970 至 2000 年間,電腦時脈速度提升了 3 個數量級,密度提升 4 個數量級,磁碟空間提升 6-7 個數量級,RAM 容量提升 6-7 個數量級。綜合起來,硬體能力提升了約 30 個數量級

核心提問#

作者提出尖銳的問題:隨著社會對軟體的依賴日益加深,我們是否培養出了像 Sullenberger 一樣深刻理解自身技藝的程式設計師?我們是否擁有社會所需要的匠人

什麼是 Craftsmanship(匠藝)?#

Craftsmanship 是指精通某項技能的狀態,來自良好的指導與大量的經驗。然而軟體產業長期缺乏這兩者:

  • 程式設計師往往將寫程式視為通往管理職的跳板,不會長期留在技術崗位
  • 有經驗的程式設計師太少,無法將技藝傳承給後進
  • 新進程式設計師的數量約每五年翻倍,使有經驗者的比例持續偏低
  • 結果:多數程式設計師從未學習應有的紀律(Disciplines)、標準(Standards)與倫理(Ethics)

大多數程式設計師在其相對短暫的編碼生涯中,始終是未經學徒訓練的新手。這意味著大量產出的程式碼品質低劣、結構混亂、不安全且充滿錯誤。

Part I:紀律(The Disciplines)#

紀律的本質:必要部分與任意部分#

每個紀律由兩個部分組成:

  • 必要部分(Essential):賦予紀律力量的核心原因
  • 任意部分(Arbitrary):賦予紀律具體形式的規則細節

作者以外科醫師的洗手流程為例:手必須徹底清潔是必要的,但每根手指刷十下而非八下或十二下則是任意的。不要因為任意部分而拒絕必要部分的價值。

Semmelweis 的教訓:1861 年 Semmelweis 發表研究,證明醫師用氯漂白水洗手後,產婦死亡率從十分之一降至幾乎為零。但當時的醫師無法區分必要與任意——他們排斥漂白水的不便(任意部分),因而拒絕了洗手的價值(必要部分)。數十年後醫師們才開始真正洗手。

flowchart TD
    A["面對一項紀律"] --> B{"區分必要部分與任意部分"}
    B -->|"理解必要部分的價值"| C["接受紀律的核心原則"]
    C --> D["容忍任意部分的不便"]
    D --> E["持續實踐與改善"]
    E --> F["專業化與進步"]
    B -->|"因排斥任意部分"| G["拒絕整體紀律"]
    G --> H["數十年的停滯與傷害"]
    H --> I["最終被迫接受"]
    I --> C

    style C fill:#2d6a4f,color:#fff
    style F fill:#2d6a4f,color:#fff
    style G fill:#d62828,color:#fff
    style H fill:#d62828,color:#fff

Extreme Programming(XP)#

  • 1970 年 Winston Royce 發表的論文推動了瀑布式開發(Waterfall) 成為主流,這個錯誤花了近 30 年才被修正
  • 1995 年起出現 Scrum、FDD、DSDM、Crystal 等替代流程,但產業變革有限
  • 1999 年 Kent Beck 出版 Extreme Programming Explained,XP 在前述流程基礎上加入了工程實踐(Engineering Practices)
  • XP 引發的熱潮催生並驅動了 Agile 革命
  • 至今 XP 仍是所有 Agile 方法中定義最完整的一個

五大核心紀律#

作者介紹了本書涵蓋的五項軟體匠藝紀律,它們來自 Ron Jeffries 的 Circle of Life(XP 實踐圖):

1. Test-Driven Development(TDD,測試驅動開發)#

  • TDD 是基石紀律,沒有它,其他紀律不是不可能就是無效
  • 逐秒逐字元地運作,週期以計算,不是以分鐘計算
  • 測試永遠優先——先寫測試、先清理測試
  • 目標:建立一個你願意以生命信賴的測試套件——測試通過即可安心部署
  • 是所有紀律中最繁重、最複雜的,因為它主宰一切,且程式碼的每種形態都有對應的 TDD 形態

2. Refactoring(重構)#

  • 重構是撰寫乾淨程式碼的紀律,沒有 TDD 幾乎不可能重構
  • 核心:在不影響行為的前提下,將結構不良的程式碼改為結構良好的程式碼
  • 軟體系統腐壞的根本原因:我們害怕清理程式碼會破壞行為
  • TDD 提供的測試套件消除了這個恐懼,使安全的重構成為可能
  • TDD 與重構深度交織,幾乎不可分割

3. Simple Design(簡單設計)#

  • 作者用生物學層次類比:TDD 是量子力學、重構是化學、簡單設計是微生物學、SOLID/OOD/FP 是生理學、架構是生態學
  • 簡單設計是重構的終極目標,重構是達成簡單設計的唯一實際手段
  • 由四條簡單規則驅動,但依賴判斷力與經驗
  • 是區分知道規則的學徒與理解原則的工匠的分水嶺
  • Michael Feathers 稱之為設計感(Design Sense)

4. Collaborative Programming(協作程式設計)#

  • 涵蓋結對程式設計(Pair Programming)、群組程式設計(Mob Programming)、程式碼審查(Code Review)、腦力激盪等
  • 所有團隊成員參與,包括非程式設計師
  • 是分享知識、確保一致性、將團隊凝聚為有效整體的主要手段
  • 五項紀律中技術性最低、規範性最低,但可能是最重要的

5. Acceptance Tests(驗收測試)#

  • 將軟體開發團隊與業務端連結的紀律
  • 業務目的被編碼為測試——測試通過代表系統行為符合規格
  • 測試必須能被業務代表閱讀與撰寫
  • 是 XP 業務實踐中最技術化、最工程導向的一項
mindmap
  root((Software Craftsmanship))
    TDD
      基石紀律
      秒級循環
      可信賴的測試套件
    Refactoring
      不影響行為
      改善程式碼結構
      依賴 TDD 才可能
    Simple Design
      四條簡單規則
      設計感
      重構的終極目標
    Collaborative Programming
      結對程式設計
      群組程式設計
      程式碼審查
      知識分享
    Acceptance Tests
      連結業務與技術
      業務可讀寫
      行為即規格