跳轉到

UNIX 哲學:一切皆檔案與管道的美學#

McIlroy 的構想:1973 年之前就存在的夢#

UNIX 哲學最著名的宣言,來自貝爾實驗室的 Doug McIlroy。早在 1964 年的一份內部備忘錄裡,他就寫下這個構想:程式之間應該像水管一樣串接,讓一個程式的輸出直接成為另一個程式的輸入,程式應該只處理純文字流,避免二進位格式把資料鎖死在特定程式裡。這個想法比 UNIX 的管道實作早了近十年。

真正的實作發生在 1973 年。據 McIlroy 回憶,是他向 Thompson 抱怨現有的命令無法組合,Thompson 隔天就完成了管道(pipe)系統呼叫,並改造了當時的工具。這種「聽懂一個概念、一夜之間做出正確抽象」的速度,是 UNIX 創造力的縮影。McIlroy 對 UNIX 的哲學總結日後成為經典:

讓每個程式只做好一件事。如果需要新工作,就寫新程式,而不是在舊程式上加功能。期待每個程式的輸出能成為另一個程式的輸入。

一切皆檔案:統一的介面#

UNIX 哲學的第二根支柱,是「everything is a file」。在 UNIX 裡,磁碟上的檔案、鍵盤與終端機、印表機、甚至行程資訊,都呈現為同一種抽象:可以 open、read、write、close 的位元組流。裝置檔案放在 /dev 目錄下,行程資訊後來在 Plan 9 與 Linux 中乾脆以 /proc 檔案系統呈現。

這個設計的威力在於:任何只會讀寫檔案的程式,自動就能處理任何裝置。cat file > /dev/lp 就能印文件;讀取 /dev/tty 就能讀鍵盤。程式不需要為每種新硬體重新設計介面,作業系統只需把新裝置掛進檔案樹。這是抽象化的教科書案例——找出一類事物背後的共同結構,把它變成一種介面。

文字流:通用介面的賭注#

第三根支柱是最受爭議、也最有遠見的決定:用純文字流做為程式間通訊的通用格式。當年這是逆流而上的選擇——業界主流相信二進位格式才有效率(COBOL 的定長記錄、IBM 的 EBCDIC 世界)。UNIX 押注文字:人讀得懂、程式易解析、任何工具都能接手任何資料。

這個賭注成就了 shell 的威力。因為所有工具都吃吐文字,grep 的輸出可以直接餵給 sort,sort 的結果再交給 wc:

ps aux | grep thompson | sort -k3 -n | wc -l

一行命令串起四個各自只做一件事的小工具,完成了「統計系統裡有多少 Thompson 的行程」這個查詢。没有管道之前,這需要寫一支自訂程式;有了管道,它成為即興的口語。shell 不只是命令列,而是一種組合語言——組合「工具」而非組合「指令」的語言。

對比:大一統 API 的另一條路#

UNIX 哲學有個著名的對立面。DEC 的 VMS 與後來的 Windows 採取「大一統 API」策略:作業系統提供海量、細緻的官方函式庫,應用程式依賴這些函式而非互相組合。這條路的好處是體驗一致、供應商易於控制;代價是工具之間壁壘分明,資料格式互不相通。

兩種哲學的分野,本質上是對「誰擁有組合權」的不同回答。UNIX 把組合權交給使用者與 shell;大一統路線把組合權交給 API 的設計者。歷史的評價並非一邊倒——大型商業系統確實需要豐富的官方 API——但長期來看,小工具組合的生態系展現了驚人的演化速度,因為每個新工具都能立即與既有的所有工具協作。

遺產:從 Plan 9 到微服務#

UNIX 哲學的直系後裔是 Plan 9——貝爾實驗室在 1980 年代後期的續作,把「一切皆檔案」推到極致:網路資源、行程控制全都以檔案系統介面呈現。Linux 繼承了 UNIX 哲學的使用者空間傳統;Plan 9 的 /proc 與 /net 概念則被 Linux 局部吸收。

更耐人尋味的是這套思想在二十一世紀的復興。2000 年代,Rob Pike 與 Thompson 離開貝爾實驗室後在 Google 參與設計 Go 語言,其簡潔語法與標準庫的克制,明顯帶有 UNIX 哲學的基因。而 DevOps 文化與微服務架構,本質上是管道哲學的服務版:每個服務只做好一件事,以標準介面(HTTP、JSON——一種新的「文字流」)互相組合,任意的服務可以接上任意的服務。Kubernetes 世界的 kubectl get pods | grep ... 與 1973 年的 ps | grep 遙相呼應。

Eric Raymond 在 2003 年的《The Art of UNIX Programming》中把這套傳統系統化為十七條準則:模組原則、清晰原則、組合原則、分離原則、簡單原則、吝嗇原則、透明原則、健壯原則、表現原則、最小意外原則、沉默原則、修復原則、經濟原則、生成原則、優化原則、多樣原則、擴展原則。這本書讓「UNIX 哲學」從口耳相傳的工匠傳統,變成了可傳授、可引用的文獻。

哲學的底層是一種價值判斷:相信智力有限的人類,勝過相信無所不能的設計。McIlroy 說得好——UNIX 的成功祕訣不在技術,而在「人們之間的態度:寫程式是為了被別人使用、被別人組合」。五十年後,這句話依然是系統設計最可靠的指南針。