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 以上的文件都占多少比例?
答案和讨论见评论区 😄