本書第三部分站在最高層次——倫理(Ethics)。當軟體已深入社會的每一個角落,程式設計師的行為不再只是技術問題,而是攸關公眾利益的倫理問題。作者以一段關於軟體專業的歷史與文化回顧揭開序幕,最後以「程式設計師的誓言(The Programmer’s Oath)」作為整個 Part III 的核心骨架。
The First Programmer:圖靈與軟體專業的起點#
軟體這個專業誕生得毫不起眼——1935 年夏天,艾倫·圖靈(Alan Turing)開始撰寫他的論文,試圖解決讓數學家們困惑了十多年的判定性問題(Entscheidungsproblem)。
- 許多人認為拜倫之女、Lovelace 女爵 Ada Lovelace 是第一位程式設計師——她是我們所知第一位理解電腦中的數字可以代表非數值概念的人,並為 Babbage 的 Analytical Engine 寫下演算法(雖然那台機器從未被建造)
- 但真正在電子電腦上執行第一個程式的人是圖靈
- 1945 年,圖靈為 Automated Computing Engine(ACE) 寫程式——他以 base-32 的二進位機器語言撰寫,途中發明了 subroutines、stacks、floating-point numbers 等基本概念
圖靈在報告中寫下兩句預言式的話:
We shall need a great number of mathematicians of ability, because there will probably be a good deal of work of this kind to be done.
(我們會需要大量有能力的數學家,因為這類工作的量將會非常龐大。)
One of our difficulties will be the maintenance of an appropriate discipline, so that we do not lose track of what we are doing.
(我們的困難之一,會是維持適當的紀律,以免我們迷失自己在做什麼。)
圖靈在 70 年前就為軟體專業奠下第一塊基石:有能力的數學家,維持適當的紀律。 你是這樣的人嗎?
Seventy-Five Years:程式設計師人口的指數成長#
以本書撰寫當下為準,軟體這個專業才75 年大——一個人的一生。這 75 年裡發生了什麼?
| 年份 | 電腦數量(數量級) | 程式設計師(數量級) | 關鍵事件 |
|---|---|---|---|
| 1945 | O(1) | O(1) | Turing |
| 1960 | O(100) | O(1,000) | Grace Hopper、Edsger Dijkstra、Jon Von Neumann、John Backus、Jean Jennings;FORTRAN、ALGOL、LISP 陸續問世 |
| 1965 | O(10,000) | O(100,000) | IBM 1401 電晶體電腦大量生產;程式設計師從會計、職員中招募——30–40 歲的專業人士,圖靈會認可 |
| 1975 | O(1,000,000) | O(1,000,000) | 迷你電腦(PDP-8、PDP-11)爆發;大量年輕男性 CS 畢業生湧入;人口結構從「紀律嚴謹的數學家」轉為「精力充沛但經驗不足的二十幾歲年輕男性」 |
| 2020 | 數十億 | 數億 | 若納入 VBA 使用者,全球程式設計師人數為數億 |
這是典型的指數成長。以 $2^{27} \approx 1 \times 10^8$,75 年除以 27 得出 doubling rate 約 2.8 年——但實際上前幾十年成長更快,現在則穩定下來,全球程式設計師人數大約每 5 年翻倍。
Perpetual Inexperience(永恆的無經驗狀態): 若程式設計師人數每 5 年翻倍,代表任何時刻都有一半的程式設計師經驗少於 5 年。只要翻倍速度不變,這個狀態就永遠存在。
Nerds and Saviors:程式設計師的文化形象變遷#
程式設計師在 70 年間,從社會看不見的小眾逐步演變為英雄與反派兼具的公眾角色:
timeline
title 程式設計師在大眾文化中的角色演變
section 隱形時代
1950–60 年代 : 人數太少,沒有社會印象
section 書呆子時代
1970 年代 : 開始有「書呆子」刻板印象 : TV 廣告中戴眼鏡的電腦天才
section 反派時代
1968 2001:太空漫遊 : 電腦 HAL 是反派
Star Trek/Colossus : 電腦多被塑造為威脅
section 英雄登場
1966 The Moon Is a Harsh Mistress : Heinlein 筆下自我犧牲的電腦英雄
1983 War Games : Broderick 駭入核武系統,最後拯救世界
1986 Short Circuit : 天真的機器人在程式設計師引導下習得智慧
section 反派回歸
1993 Jurassic Park : 程式設計師是反派,電腦只是工具
section 救世主定位
1999 The Matrix : 主角們是程式設計師,也是救世主 : 他們的神力來自能「讀懂 The Code」在短短二十年間,程式設計師的形象從書呆子到英雄、從反派到救世主,社會開始意識到我們所代表的威脅與承諾。
Role Models and Villains:偶像與反派並存#
2014 年,作者到瑞典斯德哥爾摩的 Mojang 辦公室(Minecraft 開發商)演講。會後一位約 12 歲的小男孩跑到圍欄邊大喊:
“Are you Jeb?”
他要找的是 Mojang 首席程式設計師之一的 Jens Bergensten(Jeb),索取簽名。作者坐在旁邊完全被忽略——但重點不在這裡:
程式設計師已成為孩子們的偶像。他們夢想長大後成為 Jeb、Dinnerbone、Notch。真實世界的程式設計師,變成了英雄。
但有英雄就有反派。2015 年 10 月,Volkswagen 北美 CEO Michael Horn 在美國國會作證,談論其車輛中欺騙環保署檢測設備的軟體。他把責任推給:
“This was a couple of software engineers who put this in for whatever reasons.”
Horn 雖然在推卸責任,但從字面上看他是對的——確實是某些程式設計師寫下了那些說謊、作弊的程式碼。
那些程式設計師——不論他們是誰——敗壞了整個專業的聲譽。若我們有一個真正的專業組織,他們的程式設計師資格應當被撤銷。他們背叛了我們所有人。
短短 75 年間,我們從默默無聞走到書呆子,再從榜樣走到反派。社會才剛開始理解我們是誰。
We Rule the World:我們主宰世界#
但社會還沒完全理解——我們自己也還沒。
- 現在世界上的電腦比人還多
- 社會上幾乎沒有任何事能在沒有軟體的情況下發生:買賣、法律、開車、送貨、通訊、供電、供水、付帳單
- 現代世界裡,大多數人每個清醒的時刻都在與某個軟體系統互動,有些人甚至睡覺時也在
And we write that software. And that makes us the rulers of the world.
其他人以為他們在訂規則——但他們把那些規則交給我們,由我們寫下在機器中執行的規則,而那些機器監控並協調著我們生活的每一個面向。
社會還沒完全意識到這一點。我們自己也還沒。但那一天正在逼近——屆時所有人都會被粗暴地認識到這個事實。
Catastrophes:軟體災難的累積#
數十年來,軟體已經引起許多重大災難,有些觸目驚心:
| 年份 | 災難 | 原因 | 後果 |
|---|---|---|---|
| 1996 | Ariane 5 火箭 | 64-bit 浮點數未檢查地轉換成 16-bit 整數,整數溢位例外 | 發射後 37 秒自毀 |
| 1999 | Mars Climate Orbiter | 地面軟體用英制(pound-seconds) 傳資料,探測器期望公制 | 燒毀於火星大氣層 |
| — | Therac-25 放射治療機 | Race condition | 殺死 3 人,重傷 3 人 |
| — | Knight Capital | 重用一個已啟用死程式碼的 flag | 45 分鐘內損失 $4.6 億 |
| — | Toyota 意外加速事件 | 堆疊溢位 bug | 疑似造成 89 人死亡 |
| — | HealthCare.gov | 上線失敗 | 差點推翻具爭議的美國醫療法案 |
| 2016 | Schiaparelli Mars Lander | 軟體誤以為已著陸,實際還在 4 公里高空 | 撞毀 |
這些災難花費了數十億美元與許多人命,且都是程式設計師造成的。 我們正在透過我們寫下的程式碼殺人。
終有一天,某個倒楣的程式設計師會做出一個微小的蠢事,然後數萬人死亡——這不是狂想,只是時間問題。
屆時政客會要求交代。他們會要我們證明如何防止未來再發生這種事。如果我們出庭時沒有倫理聲明、沒有標準、沒有被定義的紀律,只會哀嚎老闆給的期限不合理——那麼我們將被判 GUILTY。
The Oath:程式設計師的誓言#
作者以下列誓言揭開整個 Part III 的討論:
In order to defend and preserve the honor of the profession of computer programmers, I promise that, to the best of my ability and judgment:
| # | 誓言 | 對應章節 |
|---|---|---|
| 1 | 我不會產出有害的程式碼 | Ch.12 Harm |
| 2 | 我產出的程式碼永遠會是我最好的作品;不讓行為或結構上有缺陷的程式碼累積 | Ch.12 Harm |
| 3 | 每次 release 都會產出快速、確定、可重複的證明,證明程式碼每個元素都如預期運作 | Ch.12 Harm |
| 4 | 我會做頻繁、小型的 release,以免阻礙他人進度 | Ch.13 Int. |
| 5 | 我會無畏而不懈地改善我的創作;絕不讓它退化 | Ch.13 Int. |
| 6 | 我會盡我所能維持自己與他人的生產力,絕不做任何降低生產力的事 | Ch.13 Int. |
| 7 | 我會持續確保他人能 cover 我、我也能 cover 他人 | Ch.14 Team |
| 8 | 我的估算在量級與精度上都誠實;不做沒有合理把握的承諾 | Ch.14 Team |
| 9 | 我會尊重同儕的 ethics、standards、disciplines 與 skill;不以其他屬性或特徵評斷他們 | Ch.14 Team |
| 10 | 我永不停止學習並改善自己的技藝 | Ch.14 Team |
mindmap
root((Programmer's Oath))
Harm 不傷害
1. 不產出有害程式碼
2. 永遠是我最好的作品
3. 每次 release 都有可重複的證明
Integrity 正直
4. 頻繁小型 release
5. 無畏地改善
6. 維持生產力
Teamwork 團隊合作
7. 互相 cover
8. 誠實估算
9. 尊重同儕
10. 永不停止學習Part III 章節總覽#
Part III 包含三個章節,對應誓言的三個區塊:
- Harm(傷害):程式設計師對社會、對功能、對結構所負的「不傷害」責任,以及軟體災難(Knight Capital、HealthCare.gov、Volkswagen 排放造假)帶來的警示
- Integrity(正直):小循環(從原始碼控制演進理解持續整合的必要)、持續改善(測試覆蓋率、突變測試、語意穩定性)、維持高生產力(加速建置與測試、管理干擾、番茄工作法)
- Teamwork(團隊合作):知識共享、誠實估算(以 PERT 技術為基礎)、對同儕的尊重、永不停止學習
這三個倫理面向構成了完整的職業倫理體系:不傷害是底線,正直是對自我的要求,團隊合作是對他人的承諾。作者希望每位軟體開發者都能認識到——我們掌握的技術力量越大,肩負的倫理責任也越重。