
作者 | 八寶粥
責編 | 唐小引
出品 | CSDN(id:CSDNnews)
【前言】
Brain Kernighan,加拿大計算機科學家,曾就職于貝爾實驗室,目前為普林斯頓大學教授,他曾參與 Unix 的研發,也是 AMPL 與 AWK 的共同創造者之一,他和 Dennis Ritchie 共同寫作了C語言的第一本著作《C程式設計語言》,他是大名鼎鼎的 K & R 里面的 K,當然也是 AWK 里面的 K ,作為 Unix 的開發者之一、Unix 命名者,親眼見證了 Unix 的誕生, 關于 Kernighan,還有一個有趣的定律——柯林漢定律,
柯林漢定律:除錯一段代碼的難度是撰寫它們的兩倍,因此如果你的代碼寫的盡可能巧妙,按照定義而言,你可能沒有能力來除錯它了,
關于 Unix ,除了 Kernighan,有三個人的名字需要記住:美國計算機科學學者和工程師、B語言發明人 Ken Thompson,美國計算機科學家C語言的創造者、Unix作業系統的關鍵開發者Dennis Ritchie 以及 達特茅斯學院的兼職教授、著名數學家、工程師以及程式員 Doug Mcllory, Unix 的誕生地貝爾實驗室真的是大神云集,自己好幾天才能做出來的東西別人可能一頓飯工夫就能解決,這種自由的環境令人不禁想起來著名物理學家費恩曼介紹自己在 Caltech 的有趣故事,在 Unix 的誕生之路上,有哪些人和事給 Kernighan 留下了深刻印象呢?
在貝爾實驗室的第一天就遇到了 Richard Hamming !
1967 年,當 Kernighan 還是一個研究生的時候,就拿到了貝爾實驗室的實習,貝爾實驗室可真大,三千多人在此作業,Kernighan 雖然是實習生,也配置了獨立辦公室,讓我等打工人羨慕不已,令人更酸的是,Kernighan 后來去貝爾實驗室都沒有面試,只要完成博士論文就可以了,和我們一樣,快到中午的時候,也會思考“我中午要吃點什么才好呢?,就像電視劇當中的劇情一樣,真的就有一位紳士來邀請共進午餐,他介紹說自己是 Dick(英文名 Richard 的簡寫和昵稱),Kernighan 當時也沒有記住他的名字,只能偷偷去他的辦公室看門口的牌牌,他就是 Richard Hamming!
Hamming 的英文維基百科頁面特別的長,隨便哪個都是碾壓級別的:參與曼哈頓計劃為核武器發射撰寫程式、圖靈獎得主、糾錯碼發明人,為了表彰他的貢獻,IEEE 還特意設立以他的名字命名的獎項,和費恩曼一樣,Hamming 在實驗室里面也不喜歡當團隊的領導者,
將 Kernighan 對于 Hamming 的描述概括起來就是兩個字——偉大,這可不是高帽,Hamming 真的是這樣要求自己的,這個天賦異丙而又有趣的人,在很多方面對世界做出了深刻的影響,Hamming 說過,他會把周五的下午用來思考偉大的事情,他還會去找其他方向的人聊天,發出靈魂拷問:“你的研究是否有可能獲得諾貝爾獎?”如果得到否定回答的話,就會化身教鞭“那你為什么要做?這個研究連獲得諾貝爾獎的可能都沒有,肯定沒那么重要了,你為什么要把時間浪費在不重要的事情上呢?”退休幾年之后,他還發表了關于如何獲得成功職業生涯建議的演講,題目為《你和你的研究》,
Fortran 那么難
話題說回 Kernighan,他聽從了 Hamming 的建議,論文研究的課題是圖分割,這個跟著名的旅行商問題比較像,不過他還得用普林斯頓的電腦,要知道,1967年的電腦跟今天的可大不一樣,和段子里面中用針刻光碟類似,那時候的程式員編程還是喜歡用打孔卡,比如 Fortran 和 Combol 語言,Fortran 是用于科學計算的編程語言,現在也有很多科學家的課題組或者專業軟體在使用Fortran語言編程,
Kernighan 其實也是個有趣的家伙,有一次他們參與了一條廣告的拍攝,他反常地打了一條領帶,結果幾周后對方表示照片丟失了,需要再拍一張,結果 Kernighan 堅決表示不打領帶拍攝,后來發現刊登的還是打領帶的照片,因為那張照片居然被他們找到了,
現在連小學生都會玩電腦和平板,但是大部分見到軟盤的話應該會當成“保存按鈕”,就更不用說古老的打孔卡了,感興趣的朋友可以搜索一下關于打孔卡的歷史,撰寫一個程式真的太費功夫了,做好的打孔卡裝在盒子里面,去計算機房,計算機操作人員給你們處理,你就只能等結果,而且可不會給你顯示什么報錯,就算這樣,在那個時候真的是足夠快、且昂貴了,
【關于打孔卡】19世紀80年代,美國人口調查局職員發明了用于人口普查的穿孔卡片和機器,用于90年的人口普查,用了六周就完成了之前需要7年的工程,何樂禮創建的公司發展成了今天的 IBM ,1928 年(算到這邊就是民國十七年),IBM 發現矩形孔更省空間,發明了 80 列的矩陣孔卡片,它的設計是這樣的,最下面的 10 行命名為 0-9 行,頂部兩行為 11、12 行,每列的孔代表一個字符,一些特殊的字符用了額外的單孔雙孔表示, 后來 IBM 又對打孔卡進行了一系列的改進,

分時系統和 Multics 的誕生
在 Unix 分時系統出現之前,人工和機器的互動簡直就像《瘋狂動物城》里面的樹懶一樣,慢是真慢,而且毫無互動體驗,和現在相同的是,提交者都不希望有 bug 出現,即使多提交幾張打孔卡的代碼也無妨,
Kernighan 講到,他注意到 Jerry Saltzer寫的給博士論文排版的程式,自己也寫了一個代碼來給自己的論文進行排版,但是 Fortran 對于字符的處理實在是不太好,以至于最后論文居然有 3 盒打孔卡,每盒 5000 張,大概 5 公斤那么重,其中 1000 張是程式代碼,等了兩三個小時之后才打出來這份論文,
貝爾實驗室的 Ken Thompson 和 Dennis Ritchie 開始了一個新的專案——Multics,這是個分時作業系統,在互動式方面有著重要的突破,它允許多人連接到計算機上,每個人都可以獲得一部分時間,給用戶一個獨占整個計算機的感覺,不過計算機實際上還會在他們之間來回切換,如果你可以“獨享”的話,你就可以使用電傳打字機而不需要打孔卡了,電傳打字機這個東西是打字機、列印機和電話線的結合體,你可以輸入命令,通過電話線傳給計算機,然后輸出,這種原理和現在的 SSH 其實比較類似,
打孔卡的環境其實叫做批處理環境,這個提交腳本作業、Windows 當中的 bat 比較像,如果代碼完正確的話,其實效率還是挺高的,就比如我們現在利用超算提交作業,往往就是用的批處理腳本,例如著名的競賽網站 Kaggle 平臺就會分別提供 Notebook 互動環境和 Scripts 的模式,有了分時系統,用戶就可以進行及時的人機互動,對于較小的不成熟的作業就能夠及時獲得反饋,
了不起的 Ken Thompson
不過,Multics 實在是太貴了,盡管它能提供很好的計算環境,很多針對它的描述用到了”過度工程“這個詞, 因此,貝爾實驗室在 1969 年退出了專案,只有 MIT 和 AT&T 還在支持,雖然貝爾實驗室退出了 Multics計劃,Ken 可沒閑著,實驗室有一臺 PDP-7,說是一臺微型機,實際上也是需要一件屋子才能放得下,不過還好已經有顯示幕了,他就用這臺 PDP-7 機器,把自己寫的《Space Travel》 游戲在上面運行了,游戲當中玩家可以互相射擊,而且還加入了引力效果,讓玩家對軌道動力學有了簡單了解,
總是有那么多巧合,Ken 的愛人帶著一歲的孩子去加州呆了三周度假,利用這三周的時間,Ken 完成了可以正常運行的系統,他命名為“Uniplexed Information and Computing System”,縮寫為 UNICS ,這可以說是 Unix 的初代機了,
對于檔案處理軟體,Ken 也很感興趣,為了論文格式之類的問題,他們買了一臺排字機,這個東西有點像現在的激光列印機,列印到感光紙上,然后洗成照片,不過機器本身的軟體很容易出錯,兩人商量了決定逆向一下這個軟體,設計自己的軟體來運行,一臺機器、使用手冊,匯編語言的代碼,這就是他們目前手頭上有的東西,Kernighan 想著太難了還是先吃個晚飯,等他回來的時候,Ken 已經寫出了反匯編程式看到裸機當中代碼了,第二天他甚至還用 B 語言寫了一個解釋器,Kernighan 表示說這些事情你我都可以完成,但絕對不是幾個小時就能搞定的,對 Ken 來說簡直就是砍瓜切菜,手到擒來,
檔案系統、shell 和管道
早期的計算機,例如 IBM,實際上沒有什么檔案系統,雖然存盤資訊的方式比較多,但是都比較局限于特定設備和場景,但訪問輔助存盤的資訊是,你就得記住注入光碟柱面等等奇怪的屬性,而 Ken 在 Unix 當中就實作了更加簡單整潔的檔案系統,只要 6 個系統呼叫就能獲得處理資訊需要的所有東西,
關于 Unix 另外一個偉大的點在于互動式 shell,也就是我們喜歡的命令列,這個想法最初在 Multics 上就有體現,只是 Unix 上更加清晰,早期的管道概念也是在這里萌生的,你不用經過中間件,就能將程式的輸出放到另一個的輸入當中,大概 1973 年,Doug Mcllory 希望把程式接在一起,就像花園里面的水管連接起來一樣,后來反復提及,他想到了用豎線,也就是我們今天的管道符號,Ken 也將管道符號添加到了 Unix 系統,這個有點像函式式編程,Unix 程式似乎一下子變成了積木,有了拼接的可能,
Unix 文化
Unix 系統后來被移植到了 PDP-11 上面,放置這臺機器的地方在貝爾實驗室的 6 層,這就是 Unix 房間,房間很大,但是走廊光線很差,還有些二戰時期的垃圾設備,不過房間本身不錯,就像現在開放式環境一樣,大家可以閑聊,雖然有點嘈雜,畢竟大家的作業一致,有時候很容易得到啟發,
你可以在辦公室里面思考程式,也可以寫在黑板上,需要的時候在放回公共區域,有些人就喜歡一直在公共區域里,比如 Ken,他從來不在自己的辦公室里面,Kernighan 就喜歡在辦公室里面,然和每隔一兩個小時就去沖個咖啡,和別人交流一下,整棟大樓的人都很愿意和別人交流,樓里面的走廊里面貼著很多東西,計算機方向的人在兩個小走廊直接辦公,他們很愿意來回走動,不過 Unix 房間某個時期在走廊的一端,后來又到了六樓,空間非常緊湊,不過這種布局也更方便了大家交談,這種友善的環境當中,經常能發現一些有趣的東西,
據 Kernighan 講,當時他們還搬來了 10kg 的巧克力,人們用刀切一兩塊帶走,搞得滿地都是渣渣,估計負責清潔的人都要炸了,有時候你走進 Unix 房間,走到旁邊的屋子里面,聽到人們會討論 Unix 多么強大或者給別人介紹我們做的其他東西,有時候還會有一些名人到訪,整個氛圍輕松愉快,Ritchie 經常會把他姐姐送給他的英國諷刺刊物《私家偵探》放在桌子上,一般就在巧克力旁邊,我有時候也會翻一下看看里面有趣的卡通畫,不過有些東西真的是英式幽默,沒有在英國生活過可能無法理解,
給 CIA 演示
Unix 的強大引來參觀者無數,70年代中后期,Kernighan 他們就要給許多名人展示 Unix 系統, 陪同人員還都是貝爾實驗室的高層,不過最有意思的還是中情局局長,William Colby,
展示的內容主要基于 Unix 的組合思想,比如管道,多個程式組合就能比寫一個專用程式容易得多,常見的展示就是拼寫檢查,可以把檔案分割成單詞,然后都變成小寫,獲得一片叫好,不過,由于當時的機器比較慢,知道 Colby 要來的時候,提前運行了管道,然后把結果存在檔案里面當天直接列印,畢竟不能讓大人物等三四十秒,這就是一個經典的“演示工程”,不過比今天很多"PPT 專案”已經好很多了,
如果對于程式誰有新的想法,也可以寫一個新版本來改進,不過這里有個特別的規則,最后修改這擁有程式的所有權,Kernighan 后來成為了 ed 文本編輯器的所有者,這時候,其實計算機也是一個社區,只是你們看不到誰在線而已,那么還有個命令就是 who,不僅能看到誰在線,還能知道他最后做了什么,這種方式方便了資訊共享和共同交流,
編程很難,如何變得簡單?
我們今天用的一切,比如分享代碼樹、審查 PR 等等,其機制在四五十年前就出現了,后來 Unix 傳到了貝爾實驗室之外,包括原始碼,人們開始給 Unix 貢獻代碼,雖然這不是開源,但是和開源非常相似,
在 Kernighan 看來,今天的代碼撰寫太難了,比起某個不知道多少層代碼的檔案中去找需要的函式,自己寫程式邏輯這種創作的行為更加容易,Ken 的電子游戲或者類旅行商問題哪個更重要其實說不好,那么如何打造一個提升程式員作業效率的環境?如何讓編程變得更加容易呢?如果做出了一些能對自己有幫助的事情,對他人的作業可能也會有所改善,何樂而不為呢?
參考資料:
- 播客 The Birth of UNIX with Brian Kernighan
- Read UNIX: A History and a Memoir
- 維基百科 打孔卡
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/232079.html
標籤:其他
