观止--微软创建NT的夺命狂奔
周末读了一本小众的书--观止,讲的是windows NT的开发过程。
这个项目历时5年,从1988-1993,是一个典型的软件项目,延期很久,出来的是一个艺术品,奠定了windows的基础。
showstopper是什么意思?
英文意思观看戏剧演出,演到精彩处,观众拍手叫绝,演出被喝彩打断。
在计算机领域,指造成停机的A类故障。
故事主角戴夫.卡特勒(Dave Culter)
1942年生人,目前快80了还在微软编程,宝刀不老。他非科班出身,也非名校毕业,英雄不问出处。在杜邦公司研究化学数据,需要计算机,上了个培训班,然后就在公司编程处理化学数据,不想爱上了编程,进入DEC小型机公司,顺风顺水,1975年编写了著名VAX系统上的操作系统VMS,一战成名。后来为了远离公司政治,在西海岸的西雅图(正是微软总部所在地)成了了研究所,做新一代计算机,后prism项目被公司取消,一气之下离开DEC。正赶上微软在招揽人才,盖茨亲自出马,有了经典对话:
盖茨:你觉得微软的DOS如何
卡特勒:那就是个玩具,不是真正的操作系统
盖茨:好,请你来为微软设计真正的操作系统。
1)管理风格:缺乏耐性、火爆脾气,经常攻击别人,说“我靠压力生存”。幸好有个助手皮亚佐利,脾气随和,善解人意。两人红脸白脸的管理方式相得益彰。
皮亚佐利在1996年卡特勒厌倦管理转技术后,领导了windows2000的开发。
2)家庭:结婚两次,发誓不再跌倒第三次,只有一个女友,不再结婚。长期专注工作。和父母关系差,父亲去世也没有参加葬礼。当然父亲小时候也没有给过他关心,经常酗酒打老婆。
3)匈牙利表示法
微软早期员工西蒙尼(就是自己花钱上太空的那个人)的变量命名法。卡特勒的评价:是我见过的最愚蠢的东西。
4)每行代码都加注释。
5)对优化的看法:总是要把事情做对,让其可靠,然后才顾及性能。一边向前走一边逐渐加入修饰和润色。NT的问题没有哪个是时间无法治愈的。性能不好是新程序的通病。软件历史证明这一点,从IBM的360到UNIX,再到Windows,都是在不成熟状态就发布了,然后逐步演进并赢得广泛认可。
6)对UNIX的看法:是个由一帮博士设计的垃圾操作系统。整个系统背后的设计思想从来没有统一过,而且显露在外面。
7)人数:只想管理内核团队,对图形、网络、测试团队不想管,后来为提高效率,不得不管。最终人数发展到800人,就卸任去做技术了。
8)娱乐:不吃午饭,去打一小时壁球。其他时间全部围绕NT展开。不过里程碑后会放假滑雪。
9)C++:盖茨为图形组引入C++,卡特勒反对,但图形组的人赞同,最终果然拖慢了性能,程序也变大。看来做操作系统的人都不太喜欢c++, linus在写git时有人问他为何不用C++,他回复C++是shit.
比尔.盖茨
1955年生人,富裕家庭。从小在湖畔中学(条件好的私立学校)学习了计算机。1974年在电子杂志上发现了牛郎星个人电脑,与艾伦看到了机会,给这个电脑做了basic程序,微软起步。 同时起步的还有苹果,沃兹尼亚克和乔布斯也看到了个人电脑的机会,不过这个组合更厉害,看不上牛郎星,沃兹直接自己设计了硬件,然后也是加上basic语言,软硬件一人包了,足见其天才。苹果很快崛起。
1979年IBM看着PC机被苹果做的很好,也找了一个边缘部门做PC,这个部门很懒,把核心CPU包给了intel,操作系统还没有着落,盖茨看到了机会,很快在西雅图花5万买了DOS系统,通过老妈关系作为了IBMPC的操作系统,并且只买授权,这个聪明做法使微软八十年代随着PC流行而发了笔大财。
盖茨在90年代可谓所向披靡,IT界头把交椅,可称工业界的拿破仑,也顺利成为首富。2000后,逐步转去做慈善,公司交给了鲍尔默,这家伙差点把公司高破产,幸亏微软底子厚。换上了那亚拉,刚上云计算这波浪潮,才再次崛起,现在发展平稳。
1988DEC部落来到微软
卡特勒不是一个人来的,而是带来了一个团队,包括硬件工程师。他在团队中威信极高,大家愿意追随。
1)进入微软,要求签署竞业协议,即离开微软后1年不得从事类似工作,DEC的人不干,卡特勒直接让HR删除了这一条。
2)微软不做硬件,但卡特勒坚持必须带上DEC硬件的人,盖茨不得不妥协,招收硬件人员。
技术思路整理
不急于开工,先熟悉PC机,同时整理技术思路。整理需求。然后亲自操刀,写出顶层抽象代码,然后把代码分成几十个组,每组代码附上详细要求。然后再分工。 这个办法挺好。
NT几大模块
1)内核:卡特勒的DEC部落主力完成
2)界面部分:微软图形方面专家完成,这部分管理比较松散
3)网络部分:也是一个重要特色,当时novel的netware在局域网上用的比较多,记得同轴电缆组网非常流行,上面运行foxbase数据库。微软这方面比较差,所以增加网络功能非常迫切
4)安全:多用户鉴权是NT引入的。
内存问题
开始预测需要8M内存,盖茨认为太高(记得他说个一句话,好像是计算机有1M内存就足够了)。说明即使是行业领袖,对未来理解也透彻,现在手机都8G内存。最终1993年,NT最少需要16M内存,盖茨不得不妥协。
优化问题
不过早优化,卡特勒的哲学是先跑起来,结构合理。然后再优化。不过NT最后几个月才优化,感觉还是晚了一些。
优化的关键人物,传奇程序员Michael Abrash,汇编专家,图形界面专家。我读过他的黑皮书,真是一位高手。现在研究VR。被同事誉为:地球表面无可争议自强大的intel程序员。
卡特勒也以身作则,亲自写了一部分汇编代码,给优化工作做出了榜样。Michael Abrash看了卡特勒的代码后说:我遇到的最好的汇编代码编写高手。
NTFS文件系统慢的问题:NTFS比DOS好的是有文件备份,不宜损坏,DOS文件损坏我就遇到过,一个好玩的游戏,因为电脑断电,文件被破坏,不能用了。我记得诺顿公司当时有个修复工具,但有时也休不了。言归正传,NTFS做了一个定时备份的机制,但写程序的家伙为了安全,备份时不能读写,这样正常文件操作会很慢,这个问题定位了很久。靠其他团队的同事发现了问题。
微内核和宏内核
1)nt采用的是微内核,其他应用和内容采用client-server模式,这种模式最大的麻烦是互相调用多,性能是个问题,盖茨多次担心此问题,卡特勒很坚持先完成功能才优化,并反复说明肯定可以优化到满意。最终效果看,保持了client-server结构,性能比dos 稍微差点,达到了要求。
2)微内核的学院派教授Rick Rashid,也是著名的Mach的作者,微软有钱给他弄了个研究院,也来给nt提意见,内存占用方面提出了分页技术。卡特勒对这种意见很反感,但最终在内核中加入了分页技术,减少了内存占用。
重视API
也就是微软最重要的win32 API,NT兼容windows,把API全部移植过来,连鲍尔默都参加API检查会议。
几个很难定位的BUG
1)一个写硬盘问题
intel出的RISC芯片i860, 卡特勒在上面编码,NT存盘功能总是搞不定,代码反复检查也无济于事,后来换了新的硬盘驱动器,也不行。换了电缆仍旧不行。最终给硬件工程师索特聊到这个事情,索特想起手册里面的内容,查阅发现手册里藏着一个不起眼的线索,索特忘记安装电路的一个次要零件。卡特勒代码一致是正确的。 i860最终因为问题太多被淘汰。
2)一个网络问题
某款康柏电脑,网元发送数据,总是每页开头多了一个字符串0x3fffffff fffff7。硬件反馈没有问题,让软件这边查。最后都差不错问题,两边打赌谁输了请吃饭。几周后,adaptec网卡的一个工程师发来勘误表,他们公司的设备在康柏电脑上,用来控制输入输出的部分有缺陷,与问题刚好一样。这样格拉斯很愤怒。以为他多次与adaptecg工程师沟通,有一次甚至十分详细的描述了这个问题,而对方很震惊的告诉他从来没有听说过。
所以说外部产品有时不靠谱。
3)发布前的最后一个观止BUG
打印图文混合的文档,pagemaker程序就崩溃了,耗尽了40M内存。分成单页可以打印。也就是说能规避。
因为临近发布,大家想遗留这个故障。但测试猪肝唐尼想继续跟踪,几天没有进展。为啥没有提前发现?唐尼回忆起这个测试的负责人刚离职,去开洗衣店了,所以没有好好测试。以后离职交接要注意啊。
晚上找到程序员定位,最终发现是两个bug,图形程序分配内存不对,pagemaker计算字体内存也不对。当时有点纠结,改图形程序是否会引起其他应用程序问题?最终还是改了。又半夜找人来测试。pagemaker是第三方软件,就不太好弄了,半夜打电话果然没有找打人。开始想退给第三方不管了,后来觉得还是做一下兼容吧,于是NT针对pagemaker错误做了兼容,问题圆满结束。赶上了压盘发布。有点惊心动魄。
吃自己的狗粮
最初大家用OS2上编码,测试用NT,1991年2月开始卡特勒让用NT,吃狗粮不可避免遇到NT的缺陷,使程序员有紧迫感去提高伙食水平,尽快修复错误的代码,从开始就编写耐用的程序。
三个阶段:首先不包括图形的NT,然后加上图形,最后是网络。
人力储备:需要一个万金油人才,什么都懂。拉科夫斯基就是这种人才,当出来问题,他会毫不犹豫地寻找原因,然后拉人解决。
死亡行军
采用每日构造,91年就开始每日构造,确实很早。微软在软件项目管理方面,经验丰富。
里程碑临近时,每天举行会议,包括周六和周日。
收尾
最后阶段,人心浮动,卡特勒让大家做好收尾,并说以后回忆这段经历,肯定是人生的成就。记住这美好的旧日时光。
这让我想起了高考。
花絮-糟糕的IBM
IBM那时已经很官僚,戴蒙得回忆的一个事情:OS2程序崩溃了,IBM程序员对着屏幕研究了一会儿说:喔,好严重的问题,还好不是出在我的代码上。然后他重启电脑继续工作,甚至从来没有报告这个问题。
怪不得90年代初IBM差点完蛋,最后不得不请卖饼干的郭士特纳来拯救,谁说大象不会跳舞。跳到现在又不太行了。老巴都看错了,买了IBM股票,最终以亏损卖出(待查)