← 回到天際線 寫程式的人第 5 層 / 31

EP 1092020-07-181:43:09

UNIX、C 與 AWK 背後的工具哲學

Brian Kernighan

《The C Programming Language》的共同作者、AWK 與 AMPL 的共同設計者,回顧從 Bell Labs 到 Go 語言的工具設計歷程,也談了他對機器學習的疑慮。

Brian Kernighan: UNIX, C, AWK, AMPL, and Go Programming | Lex Fridman Podcast #109在 YouTube 看 ↗

重點6 條

  1. UNIX 誕生於 Multics 失敗之後:Bell Labs 在 1969 年退出太貴又交付太晚的 Multics 計畫,Ken Thompson 找到一台很少人用的 PDP-7,趁太太帶一歲兒子去加州的三週裡,寫出了後來成為 UNIX 的雛形。
  2. UNIX 靠硬體限制才變精簡:早期硬體資源很少,逼出「找一種機制通用化」的習慣,像是把裝置讀寫跟檔案讀寫用同一套介面處理;這個想法後來在 Plan 9 上被推得更遠。
  3. UNIX 不是開源,是對大學慷慨的授權:AT&T 一直把原始碼當成專屬財產,只是多年來很自由地授權給大學使用,養出整整一代懂 UNIX 的學生與教職員,這批累積下來的專業知識也是 1991 年 Linus Torvalds 能做出 Linux 的基礎。
  4. AWK 跟 C 語言的長壽,靠的是找對一個甜蜜點:AWK 是他跟 Al Aho、Peter Weinberger 為了「兩三行搞定的資料任務」設計的,四十多年後他仍覺得好用;C 則同時兼顧表達力與效率,又跟著 UNIX 的可攜性一起擴散開來。
  5. AMPL 起源於一次辦公室對面的合作:1984 年 Bob Fourer 到 Bell Labs 休假研究,他們跟 Dave Gay 一起討論怎麼把數學規劃的模型跟資料分開處理,Kernighan 寫出的第一版原型大約三千行 C++,只是為了證明這件事做得到。
  6. 對現在的機器學習,他最擔心資料裡帶的偏見:如果訓練資料本身反映了歷史上的不平等,模型學到的東西也會跟著錯。Lex 補了一句樂觀的看法:這等於替社會照了一面鏡子。他說真能這樣當然很好,但他不知道實際上是不是這樣,還是反而會強化、放大過去就錯的東西。

時間軸25 段

01 04:30
UNIX 誕生前的時代

Lex 問 UNIX 是半世紀前怎麼開始的,Kernighan 回顧 1960 年代的分時系統:MIT 的 CTSS 非常好用;想接棒它的 Multics 要做成服務更多人、像插座一樣隨插即用的運算公用服務,最後太貴又交付太晚。

02 11:41
Bell Labs 是什麼樣的地方

他介紹 Bell Labs 主要在紐澤西的 Murray Hill,當時三四千人,多半是物理、化學、材料的博士;它隸屬提供全美電話服務的 AT&T,目標是讓服務一直變好,所以什麼都研究,從電晶體、光纖到微波系統都做過。他 1966 年第一次去實習,那時運算才剛開始起飛。

03 14:05
Multics 收場,UNIX 誕生

Bell Labs 在 1969 年退出 Multics 計畫,幾個習慣了好用電腦環境的人只能自己動手;Ken Thompson 找到一台很少人用的 PDP-7,趁太太帶一歲兒子去加州的三週,寫出了後來成為 UNIX 的東西。

04 16:44
用組合語言寫作業系統

Kernighan 先澄清自己沒寫過任何作業系統程式碼;他形容那個年代全是組合語言、沒有除錯工具能幫忙,寫得出來靠的是掌握全局的能力,而 Ken Thompson 在他接觸過的程式設計師裡是個「奇點」。

05 21:00
Bell Labs 的開放環境與 UNIX 的設計哲學

他回憶 Bell Labs 是個開放、互助又帶點反骨的地方,有問題就直接找人聊;UNIX 的設計哲學是把環境做得讓程式設計師好用,而不是為了某個特定用途,這種正向循環讓好工具不斷冒出來。

06 27:13
UNIX 不是開源,但幾乎對大學全開放

Kernighan 糾正「UNIX 是開源」的說法:AT&T 一直把原始碼視為專屬財產,只是多年來很自由地授權給大學,養出整整一代懂 UNIX 的學生與教職員,最終這批累積下來的專業知識讓 Linus Torvalds 在 1991 年能站在這個基礎上做出 Linux。

07 29:50
什麼造就好的作業系統

他認為 UNIX 的效率有部分來自早期硬體資源極少,逼出找通用機制的習慣,例如檔案系統的讀寫介面後來被拿去統一處理裝置甚至行程;這個想法在 Plan 9 上被推得更遠。

08 31:58
寫程式是藝術還是科學,他自己怎麼寫

他認為寫程式同時是藝術(想清楚使用者要什麼)、科學(演算法與資料結構)與工程(在時間與維護成本之間取捨);他自己現在寫的程式都不大,常常是用 AWK 探索資料,規模變大才會換 Python。

09 35:24
AWK 是什麼、為什麼好用

AWK 是他跟 Al Aho、Peter Weinberger 在 1970 年代末寫的文字處理語言,設計來快速處理計數、挑出有用資訊這類簡單的文字工作;他覺得這套「模式比對加動作」的模型比原先預期的更通用,四十多年後依然常用。

10 38:36
grep 與指令列文化

他形容 grep 是 AWK 的簡化版,只做比對跟印出;談到指令列文化為什麼留在 UNIX/Linux 而不是 Windows,他認為 Windows 把力氣放在圖形介面,對不寫程式的人更友善,教這群人用指令列有時是一場苦戰,所以他覺得微軟這個選擇大概是對的。他自己在手邊僅剩的一台 Windows 機器上固定用 Cygwin 跑指令列工具;Lex 大力推薦的 WSL,他說自己完全沒概念。

11 41:59
開發環境與編輯器的演化

他現在主力用 13 吋 MacBook Air,編輯器常用 Rob Pike 寫的 Sam,偶爾用 vi,坦言自己沒有真正走進 Emacs;回顧編輯器史,從只能一行一行印在紙上操作的 QED 與 ed,到有螢幕游標之後才出現的 vi 與 Emacs。

12 46:36
程式語言簡史

從 1940 年代末用開關輸入零與一講起,到最早的組合語言,再到 1950 年代讓語言脫離特定硬體的 Fortran(科學計算)、COBOL(商業)與 ALGOL(描述演算過程);1970 年代出現系統程式語言,C 是其中的倖存者,之後物件導向興起,再往後就是語言大爆發的年代。

13 52:56
C 為什麼撐了這麼久,以及寫那本書

他認為 C 找到了表達力與效率的甜蜜點,又因為 UNIX 本身也是用 C 寫成,跟著 UNIX 的可攜性一起擴散開來;他說是自己硬拉著 Ritchie 一起寫書,兩人在 1977 年寫成《The C Programming Language》,他形容 Dennis Ritchie 文筆一流,書裡的參考手冊部分完全是 Ritchie 寫的,他自己則花很多力氣找例子,想辦法讓讀者在差不多該用到某個觀念的時候,剛好透過例子看到它。

14 58:35
Go 語言的並發模型

他形容 Go 延續了 Bell Labs 那套傳統,三位創造者裡有兩位是 Ken Thompson 與 Rob Pike,又受到歐洲學界、經由 Robert Griesemer 帶進來的影響;他覺得特別有用的是 Go 用 Tony Hoare 的 CSP 概念做出的並發模型,寫起來自然又有效率。他也說那本 Go 的書九成是共同作者 Alan Donovan 寫的。

15 1:02:02
嘗試各種新語言,包括對 JavaScript 的看法

他用同一個文字自動排版的小題目在二十種左右語言裡各寫一次來感受手感:Lua 一小時搞定,Haskell 花了好幾週,Rust 卡了好幾天,一來記憶體管理的模型他不熟,二來當時文件一直在變;談到 JavaScript,他認為這語言本身已經進步很多,但不覺得它會吃下所有東西。

16 1:06:28
依賴別人的函式庫,語言會不會收斂

他觀察現在寫程式常常要下載一大堆不知道裝了什麼的套件,出問題也無從追起,覺得 npm 生態又比 pip 更缺紀律;被問到語言會不會收斂成一兩種,他不希望如此,認為新語言是嘗試新想法的地方,遞迴、closure 這類概念都是先在函數式語言裡試過才進主流。

17 1:10:23
AMPL 的誕生故事

AMPL 是把數學規劃的模型跟資料分開處理的語言,源自 Bob Fourer 1984 年到 Bell Labs 休假研究那年,跟 Kernighan、Dave Gay 討論出來的;Kernighan 用 C++ 寫出第一版原型,大約三千行,只是為了證明這件事做得到,他說 AMPL 重要的部分大多來自 Fourer 與 Gay,那本書也大多是 Fourer 寫的。

18 1:18:09
P versus NP,以及他自己的博士論文

被問 P 是否等於 NP,他說自己沒有直覺,只是身邊做這行的同事多半押寶「不等於」;他的博士論文做的是圖分割問題,他和 Shen Lin 當時只找得到效果不錯的啟發式解法,找不到保證正確的方法,差不多同一時期,Stephen Cook 開始證明有一類問題看起來真的很難,圖分割就是其中之一,但他說自己的研究完全早於那套理論;他也提到念研究所時跟 John Hopcroft 短暫共事過,很快發現理論不是自己的路,轉向寫程式和寫書。

19 1:22:21
1964 年的大學論文寫 AI,回顧 AI 樂觀與悲觀的循環

他大學時寫過一篇關於人工智慧的文獻回顧,那正是大家相信電腦很快就能做機器翻譯、下棋、證明幾何定理的樂觀年代;他認為教訓是短期常常太樂觀或太悲觀,長期反而不該太悲觀,並引用科幻作家 Arthur C. Clarke 的話:德高望重的老科學家說某件事可能,他大概是對的;說不可能,他幾乎一定是錯的,只是說不準時間。

20 1:25:03
對現在機器學習熱潮的看法

他自認完全不是專家,認為機器學習如果從帶有偏見的歷史資料裡學習,學出來的東西也會帶著同樣的偏見。Lex 補充說往好處想,這等於替社會照了一面鏡子;他說真能這樣當然很好,但不確定實際上是不是這樣,還是反而會強化、放大過去就錯的東西,這是得認真擔心的事。

21 1:27:05
人類水準智慧、圖靈測試,以及運算無所不在的憂慮

對於怎麼打造人類水準的智慧,他說自己毫無頭緒;對圖靈測試,他覺得那大概只能算「模糊地客觀」。談到運算滲透一切的影響,他認為多數科技長期來看是好的,但短期常常也有壞處,並舉商業監控為例:現在企業與政府掌握關於我們的事,遠超過我們原本可能願意接受的程度。

22 1:29:45
摩爾定律走到盡頭之後,語言會怎麼變

他認為指數成長不可能永遠持續,但時間尺度才是重點,只要撐得夠久,對我們來說就沒差;處理器不再變快之後,產業轉向把更多東西塞進同一塊晶片、往平行方向擴張;至於程式語言的未來,他預期會有更多工作交給程式自己完成,朝宣告式而非程序式的方向走,你說要什麼,系統自己想辦法。

23 1:32:56
教不寫程式的人

他在普林斯頓開一門給非本科生的通識課,學生多半是歷史或英文系;他不覺得每個人都該會寫程式,但覺得每個人都該有起碼的概念,課堂上會讓學生在一台只有十來個指令的玩具機器上寫組合語言,體會一下電腦到底在做什麼。

24 1:36:38
運算怎麼改變了人跟人的連結

他回憶小時候打一通長途電話是件大事,現在大家傳訊息完全不當一回事;他自己反而因為 email 跟加拿大的手足通信變得更頻繁,關係更緊密,但他也觀察到校園裡學生走路都低頭滑手機,不確定那是不是真的讓人更靠近彼此。

25 1:39:06
對未來樂觀還是擔心,以及 Bell Labs 最快樂的回憶

對接下來一二十年,他覺得運算普及能幫很多人改善生活,但也看到短期內人變得更部落化、更容易被誤導,影響政治;被問起最快樂的時刻,他說不是哪一個瞬間,而是 UNIX 還年輕、到處是「低垂的果實」可摘的那個年代——做出東西,馬上有人用、馬上有回饋,AWK 就是一個例子。