查看原文
其他

代码传奇丨比尔盖茨亲手挖了个非科班程序员 如今是硅谷公认的操作系统天神

小七 程序人生 2017-11-09

David Cutler 听过吗? 他是微软公认的最厉害的程序员,VMS 和 Windows NT 的首席设计师,1988 年去微软前硅谷最牛的内核开发人员,在操作系统领域摸爬滚打几十年,其间的经历就像一部标准的硅谷程序员奋斗日记。



大卫·卡特勒(David Cutler),又叫做戴夫·卡特勒(Dave Cutler),戴夫是他的昵称。他是一位传奇程序员,是 VMS 和 Windows NT 的首席设计师,被人们成为「操作系统天神」。


他曾供职于杜邦、DEC 等公司,1988 年,由比尔 ·盖茨招募到微软,他用了 5 年时间花费了 15 亿美金,负责组织 NT 的开发。


与许多计算机界的前辈牛人们一样,David Cutler 并不是计算机科班出身,他在大学拿的是数学学士,主攻物理,满怀热情地想成为一位建造事物的工程师。所以,毕业后他进入杜邦公司从事材料测试。一次偶然的机会,David 被指派负责在 DEC 的计算机上运行模拟程序,还为多台单机实时系统编写中央控制程序,调度各种任务、监控系统运作。这个经历不仅丰富了 David 的软件知识,还让他做出了一个重大的决定:去一家真正从事计算机业务的公司,开发操作系统。


1971 年,David Cutler 离开杜邦公司来到 DEC。他的第一项任务就是为 DEC 的 PDP-11 微处理器开发操作系统——RSX-11M。PDP-11 是为工业控制和制造控制而设计的 16 位微处理器。David 结合总体概念和设计原则,利用汇编语言在非常有限的内存空间内实现了多项系统功能,如:树型文件系统、交换应用程序、实时调度和一整套开发工具等。据 David 回忆,当时连他的橡皮图章上都刻着开发这个操作系统的目标——「容量就是一切!」后来,这些概念和原则也体现在了 NT 上。


70 年代后期,DEC 公司在 PDP-11 的基础上开发出 32 位的 VAX 处理器。与之相应,也要开发基于 VAX 的操作系统 VMS,要能兼容 RSX-11M,可以在不同大小的机器上运行。David Cutler 成为这个项目主要负责人,设计 VMS 的架构。1977 年,VMS 1.0 问世。David 唯一的遗憾是,因为迎合商业进度,因此 VMS 也是用汇编语言写的,尽管当时完全可以用高级语言。所以,技术上正确的事并不见得是商业上的最佳选择。随后,David 继续研制 VMS 的后续版本,不过他有些不耐烦了。1981 年,David 威胁要离开 DEC。为了挽留它的明星开发者,DEC 给了 David 大约 200 位软硬件工程师。David 把他的小组搬到西雅图,并建立了一个开发中心。这个精英小组的目标是设计一个新的 CPU 体系结构和操作系统,可以把 DEC 带到九十年代。DEC 把这个小组的硬件项目称为 Prism,操作系统为 Mica。


很不幸,Prism 项目于 1988 年被 DEC 撤销,很多项目成员也被解雇。因此 David Cutler 萌生了去意。此时,为了未来能够与 Unix 抗争、开发新的操作系统,Bill Gates 见缝插针,竭力劝说 David 加入微软。David 去了,还带去了许多与他一同开发 VMS 和 Mica 的程序员。进入微软,David 领导一个工程小组,负责设计一种能提供文件服务、打印服务和应用服务的对称多处理。操作系统,起名为 Windows New Technology(NT)。这就是 Bill Gates 想用来对抗 Unix 的新型武器。


经过近 4 年的开发工作,在 1993 年 6 月发布的第一版 Windows NT 3.1,已经具备了现代操作系统的雏形——抢先式多任务、虚拟内存、对称多处理器、图形界面、C2 安全级、坚固而稳定的内核、内置网络支持、完全的 32 位代码等。而 1994 年推出的 Windows NT 3.51 和 1996 年推出的 Windows NT 4.0,在性能上有了更进一步提高;NT4.0 甚至提供了当时最先进的 Windows 95 风格界面。David Cutler 在自己的天梯上继续攀升,Bill Gates 也在销售数字面前笑得合不拢嘴。

毫无疑问,NT 操作系统有一个优秀的内核,David Cutler 成功地引入了硬件抽象层、内核对象这些天才的思想。虽然我们没能得见它的源代码,但在钻研 NT DDK 的过程中、在埋头可能就是由 David 亲笔撰写的文档中时,总能有那些闪光点,让我们可以在不同的时空与大师对话。


如今,Built On NT Technology 的 Windows 2000 和 XP 的成绩有目共睹,而针对 64 位处理器的 XP 也即将推出。回顾开发操作系统的历程,David 情不自禁地感叹道:「我也不知道,自己竟是那么的幸运,能够在有生之年开发好几个操作系统,而对于任何一个人来说,哪怕只开发一个都是非常难得的机会。」


是的,David Cutler 做到了,在操作系统领域中纵横了几十年,缔造了许多传奇和神话。然而,又有谁会去看他几十年的专注、寂寞、付出与艰辛呢?可能每个人在开始自己的职业生涯时都会设定一个目标。然而只有那么一些人会抓住目标紧紧不放、全心投入,最后这些人成了我们眼中的成功者、技术天才。也许,这就是成就天才与普通人的不同之处。


David Cutler 趣事一则


David Cutler,VMS 和 Windows NT 的首席设计师,去微软前号称硅谷最牛的 kernel 开发员。当初他和他的手下在微软一周内把一个具备基本功能的 bootable kernel 写出来,然后说:「who can』t write an OS in a week?",也是牛气冲天的说。顺便说一句,D 爷爷到 NT3.5 时,管理 1500 名开发员,自己还兼做设计和编程,不改 coder 本色啊。D 爷爷天生脾气火爆,和人争论时喜欢双手猛击桌子以壮声势。:-) 日常交谈 F-word 不离口。他面试秘书时必问:"what do you think of the word 『fuck』?",让无数美女刹羽而归。终于有一天,一个同样火爆的女面对这个问题脱口而出:"That』s my favorite word"。于是她被录取乐,为 D 爷爷工作到 NT3.5 发布。


David Cutler 是全世界公认的 Windows NT 之父,我们现在最常用的从 XP 开始直到 Win7 全部都是 NT 的内核,只是版本号不一样。这位 NT 之父对 Windows 内核有多少代码贡献呢,小编统计了一下:


\ntos\ex\alpha\raisests.c David N. Cutler (davec) 18-Oct-1990 

\ntos\ex\ia64\raisests.c based on David N. Cutler (davec) 18-Oct-1990 

\ntos\ex\mips\raisests.c David N. Cutler (davec) 18-Oct-1990 

\ntos\ex\ppc\raisests.c David N. Cutler (davec) 18-Oct-1990 

\ntos\ex\callperf.c David N. Cutler (davec) 22-May-1994 

\ntos\ex\delay.c David N. Cutler (davec) 13-May-1989 

\ntos\ex\event.c David N. Cutler (davec) 8-May-1989 

\ntos\ex\exp.h David N. Cutler (davec) 23-May-1989 

\ntos\ex\handle.c David N. Cutler (davec) 17-May-1995 (rewrite) 

\ntos\ex\lookasid.c David N. Cutler (davec) 19-Feb-1995 

\ntos\ex\mutant.c David N. Cutler (davec) 17-Oct-1989 

\ntos\ex\pool.c David N. Cutler (davec) 27-May-1994 

\ntos\ex\probe.c David N. Cutler (davec) 19-Jan-1990 

\ntos\ex\raise.c David N. Cutler (davec) 29-Apr-1995 

\ntos\ex\region.c David N. Cutler (davec) 25-Novy-1995 

\ntos\ex\resource.c David N. Cutler (davec) 20-Mar-1994 

\ntos\ex\semphore.c David N. Cutler (davec) 8-May-1989 

\ntos\ex\spintrac.c David N. Cutler (davec) 16-May-1989 

\ntos\ex\sysenv.c David N. Cutler (davec) 10-Nov-1991 

\ntos\ex\timer.c David N. Cutler (davec) 12-May-1989 

\ntos\inc\alpha.h Joe Notarangelo 31-Mar-1992 (based on mips.h by Dave Cutler) 

\ntos\inc\arc.h David N. Cutler (davec) 18-May-1991 

\ntos\inc\arccodes.h David N. Cutler (davec) 20-Sep-1991 

\ntos\inc\duodma.h David N. Cutler (davec) 13-Nov-1990 

\ntos\inc\dzport.h David N. Cutler (davec) 15-Aug-1990 

\ntos\inc\hal.h David N. Cutler (davec) 25-Apr-1991 

\ntos\inc\i386.h David N. Cutler (davec) 2-Aug-1989 

\ntos\inc\ia64.h David N. Cutler (davec) 31-Mar-1990 

\ntos\inc\jazzdef.h David N. Cutler (davec) 26-Nov-1990 

\ntos\inc\jazzdma.h David N. Cutler (davec) 13-Nov-1990 

\ntos\inc\jazzint.h David N. Cutler (davec) 6-May-1991 

\ntos\inc\jazzprom.h David N. Cutler (davec) 27-Apr-1991 

\ntos\inc\jazzrtc.h David N. Cutler (davec) 3-May-1991 

\ntos\inc\jazzserp.h David N. Cutler (davec) 28-Apr-1991 

\ntos\inc\jnsndef.h David N. Cutler (davec) 26-Nov-1990 

\ntos\inc\jnsnint.h David N. Cutler (davec) 6-May-1991 

\ntos\inc\jnsnrtc.h David N. Cutler (davec) 3-May-1991 

\ntos\inc\jnsnserp.h David N. Cutler (davec) 28-Apr-1991 

\ntos\inc\ke.h David N. Cutler (davec) 27-Feb-1989 

\ntos\inc\mips.h David N. Cutler (davec) 31-Mar-1990 

\ntos\inc\ppc.h Based on mips.h, by David N. Cutler (davec) 31-Mar-1990 

\ntos\inc\ppcdef.h David N. Cutler (davec) 26-Nov-1990 

\ntos\inc\ppcserp.h David N. Cutler (davec) 28-Apr-1991 

\ntos\io\complete.c David N. Cutler (davec) 25-Feb-1994 

\ntos\kd\alpha\kdtrap.c David N. Cutler 27-July-1990 

\ntos\kd\mips\kdtrap.c David N. Cutler 27-July-1990 

\ntos\kd\ppc\kdtrap.c Based on David N. Cutler MIPS version 27-July-1990 

\ntos\kd\kdbreak.c David N. Cutler 2-Aug-1990 

\ntos\kd\kdcomio.c David N. Cutler 27-July-1990 

\ntos\kd\kdinit.c David N. Cutler 27-July-1990 

\ntos\kd64\alpha\kdtrap.c David N. Cutler 27-July-1990 

\ntos\kd64\ia64\kdtrap.c David N. Cutler 27-July-1990 

\ntos\kd64\kdbreak.c David N. Cutler 2-Aug-1990 

\ntos\kd64\kdcomio.c David N. Cutler 27-July-1990 

\ntos\kd64\kdinit.c David N. Cutler 27-July-1990 

\ntos\ke\alpha\alignem.c David N. Cutler (davec) 17-Jun-1991 

\ntos\ke\alpha\allproc.c David N. Cutler 29-Apr-1993 

\ntos\ke\alpha\apcuser.c David N. Cutler (davec) 23-Apr-1990 

\ntos\ke\alpha\callback.c David N. Cutler (davec) 29-Oct-1994 

\ntos\ke\alpha\exceptn.c David N. Cutler (davec) 3-Apr-1990 

\ntos\ke\alpha\floatem.c David N. Cutler (davec) 16-Jun-1991 

\ntos\ke\alpha\flush.c David N. Cutler (davec) 26-Apr-1990 

\ntos\ke\alpha\flushtb.c David N. Cutler (davec) 13-May-1989 

\ntos\ke\alpha\getsetrg.c David N. Cutler (davec) 17-Jun-1991 

\ntos\ke\alpha\initkr.c David N. Cutler (davec) 11-Apr-1990 

\ntos\ke\alpha\intobj.c David N. Cutler (davec) 3-Apr-1990 

\ntos\ke\alpha\ipi.c David N. Cutler 24-Apr-1993 

\ntos\ke\alpha\thredini.c David N. Cutler (davec) 1-Apr-1990 

\ntos\ke\i386\apcuser.c David N. Cutler (davec) 23-Apr-1990 

\ntos\ke\i386\callback.c David N. Cutler (davec) 29-Oct-1994 

\ntos\ke\i386\exceptn.c David N. Cutler (davec) 30-Apr-1989 

\ntos\ke\i386\flush.c David N. Cutler (davec) 26-Apr-1990 

\ntos\ke\i386\flushtb.c David N. Cutler (davec) 13-May-1989 

\ntos\ke\i386\intobj.c David N. Cutler (davec) 30-Jul-1989 

\ntos\ke\i386\kernlini.c David N. Cutler (davec) 21-Apr-1989 

\ntos\ke\i386\thredini.c David N. Cutler (davec) 31-Mar-1990 

\ntos\ke\ia64\alignem.c David N. Cutler (davec) 17-Jun-1991 

\ntos\ke\ia64\allproc.c Based on MIPS original (David N. Cutler 29-Apr-1993) 

\ntos\ke\ia64\apcuser.c based on MIPS version by David N. Cutler (davec) 23-Apr-1990 

\ntos\ke\ia64\callback.c based on David N. Cutler (davec) 29-Oct-1994 

\ntos\ke\ia64\getsetrg.c David N. Cutler (davec) 17-Jun-1991 

\ntos\ke\ia64\initkr.c Based on MIPS version (David N. Cutler (davec) 11-Apr-1990) 

\ntos\ke\ia64\intobj.c David N. Cutler (davec) 3-Apr-1990 

\ntos\ke\ia64\mpipi.c Based on version of David N. Cutler 24-Apr-1993 

\ntos\ke\ia64\thredini.c David N. Cutler (davec) 1-Apr-1990 

\ntos\ke\mips\alignem.c David N. Cutler (davec) 17-Jun-1991 

\ntos\ke\mips\allproc.c David N. Cutler 29-Apr-1993 

\ntos\ke\mips\apcuser.c David N. Cutler (davec) 23-Apr-1990 

\ntos\ke\mips\branchem.c David N. Cutler (davec) 17-Jun-1991 

\ntos\ke\mips\buserror.c David N. Cutler (davec) 31-Oct-1991 

\ntos\ke\mips\callback.c David N. Cutler (davec) 29-Oct-1994 

\ntos\ke\mips\dmpstate.c David N. Cutler (davec) 17-Jan-1992 

\ntos\ke\mips\exceptn.c David N. Cutler (davec) 3-Apr-1990 

\ntos\ke\mips\floatem.c David N. Cutler (davec) 16-Jun-1991 

\ntos\ke\mips\flush.c David N. Cutler (davec) 26-Apr-1990 

\ntos\ke\mips\genmips.c David N. Cutler (davec) 27-Mar-1990 

\ntos\ke\mips\getsetrg.c David N. Cutler (davec) 17-Jun-1991 

\ntos\ke\mips\initkr.c David N. Cutler (davec) 11-Apr-1990 

\ntos\ke\mips\intobj.c David N. Cutler (davec) 3-Apr-1990 

\ntos\ke\mips\thredini.c David N. Cutler (davec) 1-Apr-1990 

\ntos\ke\mips\xxflshtb.c David N. Cutler (davec) 13-May-1989 

\ntos\ke\mips\xxmpipi.c David N. Cutler 24-Apr-1993 

\ntos\ke\ppc\alignem.c Based on MIPS version by David N. Cutler (davec) 17-Jun-1991 

\ntos\ke\ppc\allproc.c David N. Cutler 29-Apr-1993 

\ntos\ke\ppc\apcuser.c based on MIPS version by David N. Cutler (davec) 23-Apr-1990 

\ntos\ke\ppc\callback.c David N. Cutler (davec) 29-Oct-1994 

\ntos\ke\ppc\dmpstate.c Based on Dave Cutler』s MIPS implemenation 

\ntos\ke\ppc\exceptn.c Adapted from MIPS version by David N. Cutler (davec) 3-Apr-1990 

\ntos\ke\ppc\flush.c David N. Cutler (davec) 26-Apr-1990 

\ntos\ke\ppc\flushtb.c David N. Cutler (davec) 13-May-1989 

\ntos\ke\ppc\genppc.c David N. Cutler (davec) 27-Mar-1990 

\ntos\ke\ppc\getsetrg.c Based on MIPS version by David N. Cutler (davec) 17-Jun-1991 

\ntos\ke\ppc\initkr.c David N. Cutler (davec) 11-Apr-1990 

\ntos\ke\ppc\intobj.c Based on original code by David N. Cutler (davec) 3-Apr-1990 

\ntos\ke\ppc\ipi.c David N. Cutler 24-Apr-1993 

\ntos\ke\ppc\thredini.c David N. Cutler (davec) 1-Apr-1990 

\ntos\ke\tests\mipsflt\flpt.c David N. Cutler (davec) 20-Jun-1991 

\ntos\ke\tests\mipsflt\flpt.h David N. Cutler (davec) 1-Jul-1991 

\ntos\ke\tests\mipsflt\flpt2.c David N. Cutler (davec) 1-Jul-1991 

\ntos\ke\tests\xcphnd\xcpt4.c David N. Cutler (davec) 18-Sep-1990 

\ntos\ke\apcobj.c David N. Cutler (davec) 5-Mar-1989 

\ntos\ke\apcsup.c David N. Cutler (davec) 14-Mar-1989 

\ntos\ke\balmgr.c David N. Cutler (davec) 13-Jul-1991 

\ntos\ke\channel.c David N. Cutler (davec) 26-Mar-1995 

\ntos\ke\config.c David N. Cutler (davec) 9-Sep-1991 

\ntos\ke\devquobj.c David N. Cutler (davec) 1-Apr-1989 

\ntos\ke\dpcobj.c David N. Cutler (davec) 6-Mar-1989 

\ntos\ke\dpcsup.c David N. Cutler (davec) 22-Apr-1989 

\ntos\ke\eventobj.c David N. Cutler (davec) 27-Feb-1989 

\ntos\ke\kernldat.c David N. Cutler (davec) 12-Mar-1989 

\ntos\ke\ki.h David N. Cutler (davec) 28-Feb-1989 

\ntos\ke\kiinit.c David N. Cutler 11-May-1993 

\ntos\ke\miscc.c David N. Cutler (davec) 13-May-1989 

\ntos\ke\mutntobj.c David N. Cutler (davec) 16-Oct-1989 

\ntos\ke\procobj.c David N. Cutler (davec) 7-Mar-1989 

\ntos\ke\queueobj.c David N. Cutler (davec) 31-Dec-1993 

\ntos\ke\raisexcp.c David N. Cutler (davec) 8-Aug-1990 

\ntos\ke\semphobj.c David N. Cutler (davec) 28-Feb-1989 

\ntos\ke\thredobj.c David N. Cutler (davec) 4-Mar-1989 

\ntos\ke\thredsup.c David N. Cutler (davec) 5-Mar-1989 

\ntos\ke\timerobj.c David N. Cutler (davec) 2-Mar-1989 

\ntos\ke\timersup.c David N. Cutler (davec) 13-Mar-1989 

\ntos\ke\wait.c David N. Cutler (davec) 23-Mar-89 

\ntos\ke\waitsup.c David N. Cutler (davec) 24-Mar-1989 

\ntos\ke\xipi.c David N. Cutler (davec) 24-Apr-1993 

\ntos\ke\yield.c David N. Cutler (davec) 15-Mar-1996 

\ntos\mm\axp64\debugsup.c David N. Cutler (davec) 24-Feb-1998 

\ntos\mm\flushbuf.c David N. Cutler 24-Apr-1991 

\ntos\ps\alpha\psctxalp.c David N. Cutler (davec) 1-Oct-1990 

\ntos\ps\ia64\psctxi64.c David N. Cutler (davec) 1-Oct-1990 

\ntos\ps\mips\psctxmip.c David N. Cutler (davec) 1-Oct-1990 

\ntos\ps\ppc\psctxppc.c David N. Cutler (davec) 1-Oct-1990 

\ntos\ps\kulookup.c David N. Cutler (davec) 8-Oct-90 

\ntos\rtl\alpha\chandler.c David N. Cutler (davec) 11-Sep-1990 

\ntos\rtl\alpha\context.c David N. Cutler (davec) 18-Apr-1990 

\ntos\rtl\alpha\exdsptch.c David N. Cutler (davec) 11-Sep-1990 

\ntos\rtl\alpha\ntrtlalp.h David N. Cutler (davec) 19-Apr-90 

\ntos\rtl\i386\divlarge.c David N. Cutler 10-Aug-1992 

\ntos\rtl\i386\exdsptch.c David N. Cutler (davec) 13-Aug-1989 

\ntos\rtl\i386\raisests.c David N. Cutler (davec) 8-Aug-1990 

\ntos\rtl\ia64\chandler.c Based on the version by David N. Cutler (davec) 11-Sep-1990 

\ntos\rtl\ia64\exdsptch.c based on the version by David N. Cutler (davec) 11-Sep-1990 

\ntos\rtl\mips\chandler.c David N. Cutler (davec) 11-Sep-1990 

\ntos\rtl\mips\context.c David N. Cutler (davec) 18-Apr-1990 

\ntos\rtl\mips\exdsptch.c David N. Cutler (davec) 11-Sep-1990 

\ntos\rtl\mips\ntrtlmip.h David N. Cutler (davec) 19-Apr-90 

\ntos\rtl\ppc\chandler.c David N. Cutler (davec) 11-Sep-1990 

\ntos\rtl\ppc\context.c David N. Cutler (davec) 18-Apr-1990 

\ntos\rtl\ppc\exdsptch.c based on MIPS version by David N. Cutler (davec) 11-Sep-1990 

\ntos\rtl\ppc\jumps.c David N. Cutler (davec) 15-Sep-1990 

\ntos\rtl\ppc\ntrtlppc.h based on MIPS version by David N. Cutler (davec) 19-Apr-90 

\ntos\rtl\ppc\vunwind.c based on MIPS version by David N. Cutler (davec) 11-Sep-1990 

\ntos\rtl\generr.c David N. Cutler (davec) 2-Dec-1992 

\ntos\rtl\lookasid.c David N. Cutler (davec) 19-Feb-1995 

\ntos\rtl\ntrtlp.h David N. Cutler (davec) 15-Aug-1989 

\ntos\rtl\recip.c David N. Cutler (davec) 13-May-1989 

\sdktools\imagehlp\checksum.c David N. Cutler (davec) 21-Mar-1993



共计有 177 个文件是出自这位 NT 之父。比 Mark Lucovsky 还要多一倍。当之无愧的 NT 之父。


更让人钦佩的是,这位前辈依然奋战在代码的第一线。与国内目前普遍认为 30 岁以后就不适合做 Coding 的态度截然不同。现在业内的心态大多太浮躁了。


就本文讨论的话题,你有什么想法,欢迎在留言区跟大家分享讨论哦~另外

程序人生公开征集程序猿(媛)故事

你是一位心思细腻、文采了得、被代码耽误了的文艺程序猿(媛)么?

你是否在工作或生活中发现过许多编程乐趣想要与大家分享呢?

如果有,欢迎搜索小编微信ID:druidlost 或 duoshangshuang 投稿。

加微信时请备注:#我有个故事想说给你听#

你的文章一经采用,我们会有精美礼品作为奖励。


更多精彩

老公月入五万的程序员夫人70后程序员的启示程序员提升外观王小波程序员我会编程七夕表白程序员最高殊荣程序猿(媛)CP祭天Python歌词特斯拉程序媛直播鄙视链敲代码404结婚Facebook怎么进BAT女友日记高逼格指南计算机专业技能干货编程习惯陆奇演讲自救指南周鸿祎谈创业




    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存