主頁 > 軟體設計 > Brian 的回憶——Unix 誕生地貝爾實驗室和那里有趣的人們

Brian 的回憶——Unix 誕生地貝爾實驗室和那里有趣的人們

2020-12-09 13:40:29 軟體設計

在這里插入圖片描述

作者 | 八寶粥

責編 | 唐小引

出品 | 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 又對打孔卡進行了一系列的改進,

在這里插入圖片描述

80 孔打孔卡(https://upload.wikimedia.org/wikipedia/commons/thumb/4/4c/Blue-punch-card-front-horiz.png/400px-Blue-punch-card-front-horiz.png)

分時系統和 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 的電子游戲或者類旅行商問題哪個更重要其實說不好,那么如何打造一個提升程式員作業效率的環境?如何讓編程變得更加容易呢?如果做出了一些能對自己有幫助的事情,對他人的作業可能也會有所改善,何樂而不為呢?

參考資料:

  1. 播客 The Birth of UNIX with Brian Kernighan
  2. Read UNIX: A History and a Memoir
  3. 維基百科 打孔卡

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/232079.html

標籤:其他

上一篇:現代數字信號處理課后作業【第六章】

下一篇:VUE---爬蟲播放器(三)---頁面布局--vue3

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more