Unix 和 Windows NT 比較
來源于這兩本書,把兩本書對照來讀,發現很多有意思的地方:
《Unix 傳奇》
https://book.douban.com/subject/35292726/
《觀止 微軟創建NT和未來的奪命狂奔 》
Showstopper!: The Breakneck Race to Create Windows NT and the Next Generation at Microsoft
https://book.douban.com/subject/3699395/
1. 創始人的教育經歷
首先是創始人的信息,他們都是 1942 年前后生人,但是家庭環境和個人成長經歷很不一樣:
Unix:
Dennis Ritchie (1941) 老爸是貝爾實驗室的科學家,他獲得哈佛博士,1966年 進入貝爾實驗室實習隨后成為正式員工。
Kenneth Thompson (1943) UC 伯克利碩士, 1966年進入貝爾實驗室。 他喜歡自由自在的生活,對加入大公司不太感興趣,貝爾實驗室花了不少努力請他去實驗室參觀,并后續誠懇邀請他入職。
Brian Kernighan (1942) 多倫多大學學士,普林斯頓博士,1967 進入貝爾實驗室實習隨后成為正式員工。大學時開始編程 (COBOL,FORTRAN) 但是不得其法。
Windows NT:
David Cutler (1942) 密歇根州 Olivet 文理學院的學士
貧苦出身,和父親(汽車廠的清潔工)缺少交流,在學校時展現出聰明才智,并且在各種體育項目都是明星球員。他靠體育獎學金上了大學,但是受傷中斷了體育生涯。1965年畢業后拒絕了 GM 的程序員 offer (那時候程序員職業名聲不好),而進入杜邦公司。 他開始并不喜歡計算機編程,由于工作的原因不得不學,被觸動后決定要成為強者,半夜去學習,成功地在 IBM 大型機上實現實時系統處理化學數據。
2. 學習方法
他們學習編程都不是一學就精通。 但是都喜歡熬夜折騰。
Ken Thompson:午夜之后會用自己的鑰匙去開機房,在大型機上折騰直到第二天早上 8 點。 "我很快樂,毫無雄心壯志,是一個沒有目標的工作狂“
David Culter:半夜去上機,犯各種錯誤,然后從錯誤中學習。
關于折騰, 我們教授(女)曾經說,當年上機時間非常寶貴,女生通常把算法考慮非常仔細,把代碼仔細地打在卡片上,上機一次運行就成功,于是高高興興地下機了,其實對具體的電腦了解不多。 男生通常很自信,但是程序經常不對,在機器上折騰很多次。 后來,女生都當了老師,男生大多去做實際開發工作了。
我在Unix 系統上也喜歡折騰, 經常把機器搞崩潰,半夜重裝系統。 😃
3. 編程的能力
Ken Thompson: 開發了國際象棋程序 Belle,是第一個拿到國際象棋大師稱號的程序。 他在一臺快要過時的PDP-7 (8K * 18位 內存)寫了一個游戲,然后寫了簡單的文件系統。 正好他妻子帶娃走親戚,不在家三周時間,他用這三周時間寫出操作系統的的其他模塊。
故事: 當時安裝了Unix的PDP-11被放在貝爾實驗室供大家使用,有一天大家伙發現Ken總是可以得到最高的權限輕松進入他們的帳戶,在貝爾實驗室這種高人云集的地方,這簡單是太不能容忍了,于是有若干高人跳了出來,仔細分析Unix代碼,找到后門,修改后再重新編譯整個Unix,當所有人都以為這個世界應該從此清靜了的時候,卻發現Ken還是很容易就取得了他們的帳戶權限,為此大家郁悶不已。至到很多年后,Ken才道出其中的原委,原來代碼里確實存在后門,不過并不在Unix代碼中,而是藏在編譯Unix的編譯器里,每次編譯器編譯時就會自動加入后門代碼,而當時整個貝爾實驗室都用的是Ken所寫的C編譯器。 (來源:https://i.linuxtoy.org/docs/guide/ch45s05.html)
David Culter: 他的同事評價他的編程能力: “他處理困難的問題和處理簡單問題一樣快。 ”
這說明,對于他來說,這些問題的復雜度都是一個等級,可能他期待更難的問題。
4. 典型程序員的特點是什么?
Unix 傳奇:從書上的描述看, 這些人都是:友善,有合作精神,追求卓越。
Unix 創立者:對自己嚴格要求,經常鼓勵別的同事(能在貝爾實驗室工作的人非常聰明, 可能鼓勵就足夠了)
Unix 創立者們開會:幾乎沒有正式的會議,就是聊天,郵件,而且沒有什么大的沖突。
NT: 作者這樣描述 David Cluter,并說這是普遍程序員的特點:
// David Culter 的特點
single-minded (專注)
obsessive (執著,一根筋)
competitive (好勝).
David 對自己嚴格要求, 也用同樣的標準要求所有團隊成員。 他這樣評價自己:
I thrive on stress. (我在壓力下茁壯成長)
David 的團隊開會的模式是: 前十五分鐘平靜地討論會議議程,中間充滿了有敵意的大嗓門,最后大家居然能微笑著走出會議室。
5. 程序員和領導的關系
**Unix:**貝爾實驗室的行政領導通常不管程序員在干什么。 他們的管理方法是:找到優秀的員工,把新員工介紹給優秀的老員工,然后讓大家自己尋找項目和合作者。
對于那些長年做一件事情(還沒有成果)的人,管理層會保持耐心,以待長遠。
不同部門的領導在互相評價兄弟團隊的員工很少說:“我的人比你的人強”, 而更加會說 “別忘了你的人還做了一件好事”。
NT:
David Culter 在 DEC 公司的時候, 他的領導 Gordon Bell 給了他很大的自由度,并保護他不受其他人的打擾。 在Gordon 離職后,David 把團隊搬到西雅圖, 因為那時候波士頓到西雅圖沒有直飛的航班, 公司大領導很少來視察,他獲得了很多自由。
加入微軟后, 蓋茨和鮑爾默都給了David Culter 很多空間, 但是也派了微軟原生的程序員去合作,希望雙方能磨合好。
微軟公司的績效評價經歷了很多階段,從末位淘汰到不同團隊之間惡意爭奪排名(盡管不同的工程師做的事情不具備可比性)。
6. 和先行者 OS 的關系
Unix 的先行者叫 Multics, 是GE,MIT,Bell Lab 等多方合作的項目,經歷了典型的過度設計和拖延,最后Bell Lab 退出了合作。 然后兩個程序員 (Ken,Dennis) 自己做出了簡單的早期的 Unix , 一個 Minimal Viable Product, 足夠好到能給同事們用,就行了。
NT 的先行者是 VMS,是 DEC 公司的還算成功的小型機的操作系統。 也是 David Culter 領導開發的。 David 在離開 DEC 公司前做的一個項目 Prism 失敗了,被公司高層砍掉,他在項目解散會上流下了熱淚… 隨后加入了微軟, 他想用 NT 證明什么呢?
- 項目的難度
Unix: 是幾個非常聰明的計算機科學家和工程師寫給自己用的簡單操作系統。
1969:用匯編語言寫的第一版,隨后移植到別的PDP 機器上
1971: 發明了C 語言,
1973: 用 C 語言重寫 Unix
1974: 正式向外界宣布,獲得學術界的重視和采用
1978:大約有 600 臺中型機使用 Unix
1979:版本 7 發布,隨后Unix 走向了紛繁復雜的開源,變異,壯大之路。一路有各種版權糾紛伴隨。
NT:是一個商業公司工程團隊寫給商業用戶的操作系統。要支持 DOS,OS/2, Windows 應用程序。 要有現代化的操作系統內核,網絡功能,應用程序支持,圖形界面。
1989:早期設計
1990/1: 最小版本 (計劃)
1990/7: Code Complete 代碼完成 (計劃)
1990/10: 應用程序 ready (計劃)
1991/3: 最終版 (計劃)
1993/7: 最終版 NT3.1(實際,比計劃晚了兩年)能運行在 12M 的內存,需要90 M 的硬盤。
8. OS 的設計哲學
Unix 的哲學
https://zh.wikipedia.org/wiki/Unix%E5%93%B2%E5%AD%A6
程序應該只關注一個目標,并盡可能把它做好。
讓程序能夠互相協同工作。應該讓程序處理文本數據流,因為這是一個通用的接口。
感謝 Unix 的發明者和后來的維護者,布道者, 讓我們可以使用 Unix,Linux,MacOS,iOS,還有很多其他的分支… … 也影響了幾代程序員…
9. 下一代
Unix 的下一代是什么,它也很成功么? 一幫證明過自己的科學家來設計下一代的 OS,為何幾乎沒有人聽說過呢?
請看 Plan9 的故事: Plan-9效應:為什么東西不壞就不要去修它_ IT技術精華 (taocms.org)
NT 的下一代是什么,它也很成功么?
Windows XP 是最成功的 NT 下一代,它在市場上服役的時間遠遠超過了原來的預期,微軟 2014 年才停止發布它的安全更新。
然后進入質量和體驗起起伏伏的后代:
Windows Visa:開發過程混亂,用戶體驗差
Windows 7:改進性能,提高穩定性,用戶體驗好
Windows 8:想一舉搞定 PC 和 Mobile 體驗,隱藏 “開始” 按鈕,探索各種觸摸界面… 用戶反饋差
Windows 10: 綜合滿足了各方面的需求,還算不錯,但是 PC 時代已經慢慢落幕了
Windows 11:還有人很在乎么?
David 視頻采訪,回顧了 Windows Longhorn 系統的開發歷程,并坦言該系統所編寫代碼是“他見過最糟糕的”。
革命性的下一代:請搜索 Midori。
提問
如何用Shell 命令組合起來完成一個復雜的任務,請看例子:
如何用 awk sed 命令統計一個 Unix 系統中文件大小的分布情況?例如,10K,100K,1M,10M,1G,100G 以上的文件都占多少比例?
答案和討論見評論區 😄