飛行的隱喻:從冒險到專業#
作者以航空史作為開場隱喻,勾勒出一個從夢想、冒險、失敗到專業化的演進歷程:
- 古希臘神話中 Daedalus 與 Icarus 的飛行夢想(約西元前 1550 年)
- 達文西(Leonardo DaVinci)首度以理性思考飛行原理——空氣阻力的雙向作用產生升力
- 十八至十九世紀:大量的原型實驗與科學研究,升力、阻力、推力、重力被辨識與理解
- 1903 年萊特兄弟完成首次持續、可控的動力飛行
- 二戰期間美國損失 65,000 架飛機,但僅 23,000 架是戰鬥損失——更多人死於不懂如何飛行,而非敵火
- 直到 1950 年代後,航空業才逐漸成為世界上最安全的交通方式
2009 年,機長 Chesley Sullenberger 憑藉超過兩萬小時的飛行經驗,在雙引擎失效的情況下將飛機迫降哈德遜河,拯救了 155 條性命。他精通自己的技藝——他是一位匠人(Craftsman)。
軟體的平行歷史#
作者將軟體發展史與航空史進行平行對比,揭示兩者驚人的相似性:
早期理論奠基#
| 人物 | 時期 | 貢獻 |
|---|---|---|
| Charles Babbage | 十九世紀初 | 建造曲柄驅動的計算機,真正的數位電腦雛形 |
| Ada Lovelace | — | 洞察到電腦中的數字可以代表現實世界中的事物,被譽為世界第一位程式設計師 |
| Alan Turing | 1936 | 證明了不可判定性問題,過程中發明了有限狀態機、機器語言、符號語言、巨集與原始子程式——本質上發明了軟體 |
| Alonzo Church | 同時期 | 以不同方法證明同一問題,發展出 Lambda 演算——函數式程式設計的核心概念 |
硬體與語言的爆發#
| 年份 | 事件 |
|---|---|
| 1941 | Konrad Zuse 建造第一台可程式化數位電腦 Z3 |
| 1947 | Turing 發表演講,預言需要大量數學家來編寫程式,並警告維持紀律的困難 |
| 1949 | Grace Hopper 創造「compiler」一詞;1952 年建造第一個編譯器 |
| 1960 年代 | IBM 大量生產電腦,程式設計師需求激增 |
關鍵里程碑時間軸#
| 年份 | 事件 |
|---|---|
| 1966 | Simula 67 誕生——第一個物件導向語言 |
| 1968 | Dijkstra 發表 “Go To Statement Considered Harmful” |
| 1972 | Thompson 與 Ritchie 發明 UNIX 和 C |
| 1977 | Apple II 發布 |
| 1981 | IBM PC 發布 |
| 1995 | Design Patterns、Ruby、JavaScript 問世 |
| 2000 | Y2K 千年蟲危機 |
| 2001 | Agile 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 迫降哈德遜河
現今 : 軟體業仍在追尋 Craftsmanship1970 至 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:#fffExtreme 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
連結業務與技術
業務可讀寫
行為即規格