Kernighan《UNIX 傳奇:歷史與回憶》雜感

Brian W. Kernighan 是一個偉大的技術作家,我買了他寫的幾乎所有書。他近些年的書我買的是 Kindle 電子版,不佔地方。

以下是我手上保存的紙版書:

陳碩手上保存的 bwk 著作

Kernighan 的書大多與別人合作,它與 P. J. Plauger 和 Rob Pike 分別合作了兩本書,參見圖中左上角的兩本和右下角的四本。右上角是著名的 K&R,中間第一本是 AWK,這兩本書的合作者 D.M. Ritchie 和 A. V. Aho 都是拿了圖靈獎的人。正中間那本《風格的要素》是《英文寫作指南》的原版,是它上面那本《編程風格的要素》致敬的對象。

下排中間的是裘宗燕老師翻譯的《程序設計實踐》,這是我上大學期間買的性價比最高的技術書,定價只有 20 元,卻讓大一剛學了 C 語言和數據結構的我的編程能力提升了不止一個檔次。讀完這本書之後,我意識到認準作者和譯者是挑到好書的不二法門,並從此記住了 Kernighan 這個不太常見的名字。注意 Kernighan 中的 g 不發音,讀音接近「柯尼漢」或「科爾尼汗」,不要讀成「柯尼根」,以下簡稱 bwk,三字母用戶名是 Unix 先鋒人物的殊榮 //youtu.be/Y4lDvkAFyps


我的書架上專門有一格叫 Kernighan Classics。

上大三的時候,我又發現了 bwk 在普林斯頓開設的兩門課:面向大一新生的秋季 COS 109 課程和面向高年級本科生的春季 COS 333 課程《高級編程技巧》,感覺如獲至寶。特別是 COS 333 讓我眼界大開,深刻體會到了自己在動手能力上的差距。

《Unix 傳奇:歷史與回憶》封面

《Unix 傳奇:歷史與回憶》 是 bwk 2019 年的新作,我 2020 年 1 月購得,先通讀了英文版,9 月份機緣巧合做了中譯本的審校,逐字閱讀了韓磊的譯本,乘着記憶尚未褪去,寫一篇書評兼讀後感。在談這本書之前,讓我先聊幾句 Unix。Unix 的主要故事發生在上個世紀 70 ~ 90 年代,因此後文所有的「年代」都是二十世紀,不再贅述。

Unix 最初是「草根」操作系統

“UNIX is very simple, it just needs a genius to understand its simplicity.” — Dennis Ritchie

Bell Labs 的 Ken Thompson 和 Dennis Ritchie 在 70 年代初寫了 Unix,根據傳統,下文簡稱 Ken 和 dmr。

Unix 一開始並不是為高端的價值幾百萬美元的大型計算機而開發,它最初誕生在售價「僅有」幾萬美元的小型機上。介紹 Unix 的經典論文《The UNIX Time-Sharing System》發表在 1974 年第 7 期的《ACM 通訊》雜誌上。在文章的第 1 節有這麼一段話,我標一下重點:

Perhaps the most important achievement of Unix is to demonstrate that a powerful operating system for interactive use need not be expensive either in equipment or in human effort: it can run on hardware costing as little as $40,000, and less than two man-years were spent on the main system software. We hope, however, that users find that the most important characteristics of the system are its simplicity, elegance, and ease of use. — //www.bell-labs.com/usr/dmr/www/cacm.html

本文把最初 Ken 在 PDP-7 開發的那個操作系統叫做 Unics,把後來 Ken 和 dmr 在 PDP-11 上重新開發的叫 Unix,以示區別。PDP-7 是字長 18-bit 的小型機,有 8K x 18-bit 內存(約 16KB),Unics 使用其中 4K 字,剩下 4K 留給用戶程序;Unix V1 運行在 PDP-11/20 上,它是 16-bit 小型機,內存有 24K 位元組,Unix 內核使用其中 16KB,剩下 8KB 留給用戶程序。這些初代 PDP 小型機的性能估計還比不上 80 年代初上市的 IBM PC 機(基於 16-bit 的 Intel 8088 CPU),恐怕跟任天堂紅白機(8-bit 6502 CPU)相比也快不了太多。我估計高端 PDP-11 的性能和 Intel 80286 相當,大致也就是跟 80 年代的 x86 個人電腦打個平手。

BYTE in 1984 reported that the PC’s Intel 8088 microprocessor outperformed the PDP-11/23 when running Unix.
//en.wikipedia.org/wiki/PDP-11#Decline

運行 Unix 並不需要比 MS-DOS 更高檔的機器,我實在不明白為什麼微軟要自己搞一套這麼原始的「PC 磁盤操作系統」,跟 Unix 比起來,稱 MS-DOS 是「操作系統」真是太抬舉它了。

MS-DOS was a pretty pathetic operating system. — Brian Kernighan //youtu.be/O9upVbGSBFo?t=2421

PDP-7 長這個樣子:
PDP-7
圖片來源://en.wikipedia.org/wiki/Ken_Thompson

站着的 dmr、坐着打字的 Ken 和幾台 PDP-11:
Ken和dmr
圖片來源://www.bell-labs.com/usr/dmr/www/picture.html

在 60~70 年代,高端計算機的代表有 CDC 6600(60-bit)、 IBM 7094/360/370 系列(36-bit 或 32-bit)、 Clay-1 (64-bit)等等,它們的售價數百萬美元起,摺合今天上千萬美元一台,也就是人民幣上億元,運行着科學計算和「海量」數據處理等關鍵任務。與之對比,16-bit 的 PDP-11 小型機的價格只有這些大傢伙的百分之一,Unix 最初定位是面向程序員的交互式操作系統,其核心功能(賣點)是文檔製備(document preparation),說白了就是排版打字,核心業務和 90 年代國內街頭常見的電腦打字鋪子高度重合。70 年代的科研院所沒有認真對待這種運行在「低端」設備上的、很長時間沒有商業支持的「hobbyist」操作系統是完全可以理解的。但是,Unix 靠着群眾路線,走農村包圍城市的道路,最終鯉魚躍龍門,成就一代霸主地位,把以前那些大傢伙們掃進了歷史的垃圾堆。由於 Unix 售價低廉,對大學等教育機構只收幾百美元的工本費(磁帶和郵寄),還附帶完整源碼和詳細的程序員手冊,大約從 1975 年開始,它開始在大學中流傳,在學生中佔領了思想陣地,大家認為在 Unix 上寫代碼或改進 Unix 系統是很酷的事情,有無數的畢業論文以此為題(下文提及的 Marshall Kirk McKusick 博士即是一例),然後隨着這些學生畢業進入工業界,也慢慢把 Unix 帶入了各大公司。這個故事在這本《Unix 傳奇:歷史與回憶》里有生動的論述,我就不劇透了。

慣性的力量是強大的,2000 年起 Linux 在服務器領域逐漸取代 Unix 其實也是靠着類似的慣性 //www.zhihu.com/question/19738282 。公司初創的時候買不起高端的 Unix 服務器,拿 PC 機裝個免費的 Linux 就能開展業務。等到業務量大起來了,往往選擇買更強大的 PC 服務器,繼續運行 Linux,而不是遷移到 Unix。如此新陳代謝下來,Linux 市場份額越來越大。另外一個數據:從 2018 年起,Top 500 的超級計算機全部都是 Linux 系統。

甚至與目前大家對 Unix 的印象相悖,Unix 一開始也不是安全、可靠、高性能的代名詞。1988 年世界上第一個通過互聯網傳播的計算機病毒 Morris 蠕蟲 感染了全球 1/10 的聯網 BSD Unix 主機。Marshall Kirk McKusick 等人在 1984 年發表的經典論文《A Fast File System for UNIX》中提到,傳統的 Unix V7 文件系統只能發揮 2% 的磁盤最大帶寬,也就是 20KB/s,比軟盤快不了多少。而他實現的 Berkeley 快速文件系統(FFS),提高了可靠性,還把性能提高了 10 倍以上,即便如此,也只發揮了 50% 磁盤帶寬,有興趣的讀者可以聽 Dr. McKusick 自己講這個故事。我還聽說一些商業公司的例子,這裡就暫且按下不表了。

Unix 早期歷史

最早 PDP-7 上的 Unics 內核是 Ken 一個人寫的,之後 dmr 加入一起開發了 PDP-11 上的 Unix,並同時負責 C 編譯器的開發;可以說,早期的 Unix 內核是 Ken 和 dmr 的「二人轉」,從 V4 到 V6 的內核源碼有兩個子目錄,ken 和 dmr,分別存放二人各自維護的源文件。到了 V7 才根據功能劃分——而非源碼作者——組織內核源文件。

Unix 的誕生可以說是機緣巧合,在正確的時間出現在了正確的地方,//youtu.be/EY6q5dv_B-o 有 Ken Thompson 在 2019 年 5 月自己親口講述這個小故事。注意,有人把這個故事誤傳為 Ken 花 3 周寫出來了 Unix,這是理解錯誤。Three weeks away from an OS,是說 Ken 花 3 周寫了一個編輯器、一個彙編器、一個 shell,這樣就把 Unix 空缺的部分填上了,而 Unix 內核在這之前就已經寫好了。我總結就是 Bell Labs 「有錢又有閑」。Bell Labs 當時屬於 AT&T 公司,由於 AT&T 壟斷了美國全國的電話業務,「收電話稅」富得流油,Bell Labs 也資金充足。在 PDP-7 上寫了 Unics 之後,Ken 糾結了幾個人一起忽悠領導買了一台名義上用於打印專利申請表的 PDP-11,實際上用它來繼續搞操作系統開發。另一方面,也正因為 AT&T 的壟斷地位,其受政府的嚴格監管,經營範圍不能涉及銷售計算機軟件(含操作系統),Unix 才可以以接近免費的價格「開源」給大學,並且開發由 Ken 和 dmr 這樣的絕頂程序員主導。假如 Unix 一開始就是商業產品,我猜這個傳奇就不會發生了:一是價格不會那麼低,用戶群不會這麼大;二是從知識產權保護的角度,估計也不會提供源碼;三是會為了增加銷量而實現甲方種種不合理需求,不會保持簡潔優雅的高品味。

我把《Unix 傳奇:歷史與回憶》的時間線整理成下表:

版本 發佈日期 內核行數 目標大小 主要改動
PDP-7 Unics 1970-01 3,000 彙編 單用戶
第 1 版 Unix PDP-11/20 1971-01 4,700 彙編 文檔排版工具 roff
第 2 版 Unix 1971-11 ??? 缺失 首次提供 C 編譯器、新的排版工具 nroff
第 3 版 Unix 1972-06 ??? 缺失 多用戶?管道、Yacc
第 4 版 Unix PDP-11/45 1973-11 6,500 C 和 600 彙編 內核改用 C 語言重寫,CACM 1974論文。troff
第 5 版 Unix PDP-11/40 1974-06 7,600 C 和 1,100 彙編 25KB 開始進入大學。C 語法把 =+ 換成 +=,已經很接近現代版本。
第 6 版 Unix PDP-11/70 1975-05 10,500 C 和 1,700 彙編 28KB 《萊昂氏UNIX源代碼分析》、日本人寫的《Unix內核源碼剖析》、國人寫的《返璞歸真——UNIX技術內幕》;MIT 的現代克隆 xv6。C 語言新增 long 類型。
PWB/Unix 1977-07 10,000 C 和 1,000 彙編 lex、make。C 語言新增 unsigned、union、typedef 關鍵字。
移植 Interdata 7/32 1978 9,000 C 和 3,200 彙編 52KB 澳大利亞的卧龍崗大學把 v6 移植到了新的 32-bit 硬件平台。
第 7 版 Unix 1979-01 17,000 C 和 2,100 彙編 51KB 第一個便於移植的版本,awk、pcc、tar。C 語言新增short、enum 關鍵字。
32V Unix 1979-05 14,700 C 和 1,200 彙編 59KB V7 首次移植到 VAX-11/780,但沒有使用分頁式虛擬內存。
System III 1980-06 17,800 C 和 1,600 彙編 第一個有商業支持的版本

表中的發佈日期和內核源碼行數來自://minnie.tuhs.org/cgi-bin/utree.pl

擱在今天,以早期 Unix 內核的代碼量和複雜度而論,估計會被歸入嵌入式操作系統或者微控制器上的實時操作系統。根據 Andrew S. Tanenbaum 在 //www.cs.vu.nl/~ast/brown/ 的觀察,優秀的個人程序員可以獨立實現早期 Unix 內核的完整功能,他舉了幾個例子,包括:

  • 30歲的 Ken 和 32 歲的 dmr 在 1973 年夏天用 C 語言重寫了 Unix 內核,即 Unix v4;
  • 30 多歲的 Douglas Comer 在 1981 年發佈了 XINU;
  • 43 歲的 Andrew Tanenbaum 在 1987 年發佈了 Minix 1.0(花了他用 3 年業餘時間),然後與人合作在 1997 年發佈了 Minix 2.0;
  • 不滿 22 歲的 Linus Torvalds 在 1991 年 9 月發佈了 Linux 0.01 (開發用了不到一年時間)。跟前三個最初都是面向 16-bit 硬件有所不同,Linux 0.01 直接在 32-bit 的 80386 上開發。

我估計進入 2010 年之後,實現 Unix v6 這種級別的操作系統的工作量可以當本科生的畢業設計,但當不了碩士的畢業論文。

當然,這裡邊要數 Ken 和 dmr 首創 Unix 的含金量最高,後面的跟風之作只能算 Unix-clone,畢竟模仿是最大的恭維。Ken 和 dmr 首次完成了用高級語言實現操作系統的創舉,並「年紀輕輕」就獲得了 1983 年的圖靈獎(獲獎的時候二人只有 40 歲出頭,而在 40 歲之前獲得圖靈獎的目前只有 Donald Knuth 和 Robert Tarjan 兩人)。在 Unix 之前,操作系統都是用彙編語言寫的,針對特定硬件平台,不可移植,「拿高級語言寫操作系統」會被當成瘋子;在 Unix 之後,我不知道哪個主流操作系統(MS-DOS 除外)不是主要用 C 寫的。可以說 Unix 重新定義了「操作系統」,就憑這一點就足以永載史冊。

TCP/IP 也有類似的情況,Vinton Cerf 和 Robert Kahn 憑藉在 1974 年設計了 TCP/IP 獲得了 2004 年圖靈獎,他們的論文《A Protocol for Packet Network Intercommunication》其實與後來 1981 年 9 月發佈的 RFC 793 定稿在細節上有不小的出入,但首創之功屬於他二位。 Bill Joy 於 1982 年左右在 4.2BSD Unix 上實現了第一個廣為使用的 TCP/IP 協議棧,後來創建了 Sun 公司,成了億萬富翁。Van Jacobson 在 1988 年成功提出了 TCP 擁塞控制,解決了當年的大面積網絡癱瘓問題,他於 2012 年成為 Internet 名人堂 的創始成員。適合嵌入式系統的 lwIP 是 Adam Dunkels 2001 年的碩士論文。而到了 2020s,實現一個玩具級的 TCP/IP 已經降級為大學本科編程大作業的內容 //cs144.github.io

參考資料

這本《Unix 傳奇:歷史與回憶》當然是最好的參考文獻,是當事人回憶的一手資料。另外也可交叉印證以下內容。

Unix 的遺產

上大學的時侯有一陣我對各種「底層實現」產生了比較濃厚的興趣,但事實證明鑽研古代 Unix 源碼的性價比不高。我先是囫圇吞棗讀了 CACM 1974 年那篇經典論文,然後不自量力試圖去讀《萊昂氏UNIX源代碼分析》,結果只大致讀懂了 malloc 和 printf 這兩個基礎庫函數的實現,後面操作系統內核的實際內容由於缺乏對 PDP-11 的理解實在讀不下去,只好半途而廢。記得還從圖書館借閱過浙江大學胡希明老師編著的《Unix 結構分析》,這恐怕是全球惟一一本對 Unix System V 做源碼分析的書(System V 至今沒有正式開源)。第一部分文件系統的實現(一次間接、二次間接)還勉強能跟上,第二部分開始講 VAX-11/780 上的內存管理,又讓我放棄了。我認為一頭扎進工業級的源碼去學習是非常低效的,只能算是沒有辦法的辦法。我當年在 tuhs.org 上漫無目的地看 Unix 源代碼,除了讓我感嘆 C 語言這麼多年沒啥變化之外,也沒學到啥有用的知識,現在只記得有一處 C 語言的用法讓我記憶猶新:位於 //minnie.tuhs.org/cgi-bin/utree.pl?file=V7/usr/sys/sys/prf.c 的 printn() 函數,打印 b 進制的整數 n,其中最後一句是:

    putchar("0123456789ABCDEF"[(int)(n%b)]);

我當時就覺得沒有必要花時間去弄懂 PDP-11 和 VAX-11 這種比我年齡還大的早已被淘汰的機型,現在就更不必說了。因此我建議對 Unix v6 有興趣的讀者可以去看 MIT 的人在 x86 上重新實現的 xv6,代碼量約一萬行。xv6 適當簡化以突出重點,學習的性價比較高。

我上本科的時候,學院服務器機房有一台 Sun E450 服務器,四四方方的一個藍灰色大鐵塊(見下圖),據說挺沉,反正我看見機箱下面還自帶軲轆。此物被老師們當寶貝一樣供着,我們小本沒有上機(遠程登錄)資格,因此我至今也不知道這台機器的軟硬件具體配置。剛上研究生時,我在實驗室角落找到了兩台落灰閑置的 Sun SPARCstation 20,重新裝上新版的 Solaris 之後,把玩了幾周。用下來感覺這台 1994 年上市的 Unix 圖形工作站的性能比不上 1997 年國內風靡一時的 Intel Pentium 133。眼見 Intel 迎頭趕上,Unix 的領先優勢已經所剩無幾。

Sun E450 server

圖片來源://en.wikipedia.org/wiki/Sun_Enterprise

我記得大三有一次課後作業,老師讓調研工作站和小型機的軟硬件配置,讓我對 Unix 的衰退有了直觀的認識。90 年代可以說是 Unix 最繁榮的時代,各大高端硬件廠商都有自己的 Unix 和 CPU 體系結構,並有對應的服務器和工作站產品線,除此之外,還有運行在 Intel x86 上的商用或免費 Unix。

Unix 陣營 CPU 工作站
IBM AIX POWER RS/6000
HP-UX PA-RISC 和 Itanium HP 9000
SGI IRIX MIPS SGI Indigo
Sun Solaris UltraSparc Ultra 系列

進入 21 世紀,x86 擴展成了 x86-64,PC 機也能用上 4GB 以上的內存,Unix 工作站隨之消亡;而中低端服務器市場迅速同質化,Intel Xeon + Linux 一統江湖,實現了對 Unix 的逆襲。也因為如此,可移植操作系統界面(POSIX)標準的意義也大為減弱,它要解決的問題已經消失,程序在不同 Unix 之間的可移植性也變得不那麼重要了。

互聯網向用戶提供免費服務,需要用最少的錢支持盡量多的並發用戶,那麼選用廉價的 Intel x86 服務器搭配免費的操作系統是自然的選擇,而 Unix 的賣點(安全、穩定、可靠)顯得不那麼重要了。畢竟互聯網本身也沒那麼可靠嘛,網站訪問出錯多刷新幾次就好了,誰知道是網絡的問題還是網站服務器的問題呢?我的第一份工作是在一家成立於二戰以前的跨國金融公司,原本以為會遇到小型機,結果進去一看,只有一些 legacy 系統還運行在跑着 Solaris 的 Sun Enterprise 服務器上,新的業務清一色用 RedHat Enterprise Linux 跑在 x86-64 的刀片服務器上。我的同事 Kevin 從華為跳槽過來,據他說電信的計費系統這樣的關鍵業務也跑在 Linux 上。用一句話形容我的直觀感受:Unix 已死,有事燒紙。我想有人不同意「Unix 已死」的判斷,沒關係,也不必試圖拿 FreeBSD、macOS、illumos 來說服我,真的。

我認為 Unix 最重要的遺產有兩點:

  • C 語言
  • 示範了操作系統的接口應該是什麼樣子的

C 語言是有史以來最重要的編程語言,是整個現代信息社會的基石。在 Unix/C 誕生的那個年代,位元組的長度還不統一,有 6/7/8/9-bit 等多種可能。6-bit 的位元組無法區分大小寫字母(在字長 18-bit 的機器上每個 word 剛好存 3 個字符 ),在 C 之前發明的語言大多是不區分大小寫的,例如 Fortran、Pascal、SQL、BASIC 等等,而 C 之後的語言基本都區分大小寫了:C++、Java、Python 等等,這估計不是一個巧合。進入 80 年代,隨着 TCP/IP 的普及,位元組的長度也很快統一到了 8-bit,因為其他字長的機器很難方便地與 Internet hosts 通信。開個腦洞,如果 Unix 沒有轉到 PDP-11(16-bit 字長,可按 8-bit 位元組尋址),而是繼續在 PDP-7(18-bit 字長)開發,我們今天的 IP 地址會不會是 36-bit?(就像 a.b.c.d.e.f,其中 0 <= a,b,c,d,e,f < 64。)

C 語言也影響了通用 CPU 硬件的發展路線,80 年代起,設計一個新 CPU 指令集的時候就必須考慮能不能高效地表達 C 語言,因為只要支持了 C 語言,就有無數的軟件包可以方便地移植過來。可以說,C 語言定義了計算機處理器應該具備的基本功能。而那些與 C 語言不太兼容的特性就慢慢沒人用了,例如 16-bit x86 上的分段式內存管理在 32-bit 系統上被基本閑置,到了 x86-64 時代就廢棄了(防杠:聽說虛擬化的場合還用得到)。

2011 年 10 月 C 語言之父 dmr 去世,我很喜歡這個關於他侄兒的小故事:
//medium.com/@wilshipley/the-absolutely-true-story-of-a-real-programmer-who-never-learned-c-210e43a1498b

Unix 另一個重要的遺產:定義了操作系統的接口。可以說,Unix 提供了一種語言(不是一般意義上的編程語言),這門語言的名詞(主語和賓語)主要是文件進程,它的動詞(謂語)是各種系統調用。

xv6 把 Unix v6 的系統調用從 50 來個精簡到了 20 個,只要實現了這 20 個系統調用,你就有了一個具備層次化文件系統的多任務操作系統。這些系統調用很多是和文件相關:creat/open/close/read/write/seek/stat/unlink 這十來個系統調用就支持了常用文件操作。其他一些可以按位元組讀寫的東西——比如 pipe、TCP/UDP sockets——也可以用這套接口來操作,不必再發明新的動詞。Unix 的文件這個概念更接近一般意義下的位元組流,比「磁盤文件」的範圍要廣。Unix 號稱一切都是文件,除了按位元組讀寫,更重是要能 poll,這樣可以用一個統一的框架來處理各種事件。當然,話不能說太滿 。提到 Unix 文件系統,inode 是個繞不開的概念,//www.zhihu.com/question/58261869/answer/156276161 。理解進程的文件描述符表、系統的打開文件表、代表磁盤文件的 inode 表這三個表之間的引用關係 (//chenshuo.com/notes/kernel/file-descriptor-table/),這對理解 Unix 文件至關重要。文件的長度和打開文件的偏移量為什麼不存放在一起?同一個磁盤文件,一個進程 open 它兩次,拿到兩個 fd;或者 open 一次,再 dup 一次拿到兩個 fd,這兩種情況在讀寫的時候有何區別?普通文件的 inode 有什麼內容,為什麼文件名不在裡邊?

文件是靜態的,進程是動態的,理解起來可能要稍微難一些。進程是運行着的程序,理解進程對於理解現代操作系統至關重要。一個系統上可以同時有多個進程在運行,每個進程有自己獨立的(虛擬)地址空間,同一個可執行文件可以起多個進程,這些進程通常共享代碼段,但有各自的數據段。在一些早期的書上,甚至把進程當虛擬機來看待,不過這種講法隨着「虛擬機」概念的轉移已經很少見了。

不過,Unix 的 fork/exec/wait/kill 這套管理進程的系統調用在多線程時代顯得有些過時,我比較同意微軟的人寫的這篇文章:《A fork() in the road》

這套「操作系統語言/思想」被 Linux 很好地繼承和發展,因此 Eric Raymond《Unix 編程藝術》仍然值得一讀。

2019 年 10 月,Bell Labs 搞了一個慶祝 Unix 誕生 50 年的紀念活動,視頻://youtu.be/l03CF9_078I 。注意 20:42 可以看到坐在觀眾席里的 C++ 之父 Bjarne Stroustrup,他後來上台講一段話。

《Unix 傳奇:歷史與回憶》是一本有趣的閑書

《Unix 傳奇:歷史與回憶》是一本故事書,想從中學習具體的 Unix 編程技術無異於緣木求魚。它是面向非程序員的書,其中出現了 void main() 這樣的譚浩強式 C 語言寫法,但願不要有人拿這當例子說明 void main() 是對的——「你看大名鼎鼎的 Kernighan 自己都這麼寫哦!」。這本書講了很多人和事,歷史總是不斷重複的,書上的故事情節竟然也在自己身邊發生着,讓人不禁感嘆太陽底下沒有新鮮事。

譯者韓磊先生與我相識多年,他文字功力深厚,常年筆耕不輟,技術水平又高,同時還具備豐富的翻譯經驗,這本書的翻譯質量實屬一流水準。這裡邊其實也有 bwk 自己的功勞,他老人家有豐富的寫作和「被」翻譯經驗,英文非常好懂,而且對非英語母語的人也相當友好,我感覺這本書可能刻意避免了一些俚語與俏皮話——他知道哪些說法容易讓外國人讀不懂或誤解。如果你像我一樣對技術的來龍去脈感興趣,願意花一個周末的時間讀這麼一本講述 Unix 50 年興衰史的書,合卷之後感嘆一下天下大勢,合久必分,分久必合,也算不虛此行。

附:貝爾實驗室計算機研究中心的人員去向 //www.spinroot.com/gerard/1127_alumni.html

本文歡迎轉載。由於我人在國外,沒有國內的手機號,在其他網站(知乎、豆瓣)都不能發帖或回帖,就獨家發在博客園好了。