《编程人生》,原书名《Coders at Work》,是一本访谈笔录,记录了当今最具个人魅力的15 位软件先驱的编程生涯。包括DonaldKnuth、Jamie Zawinski、Joshua Bloch、Ken Thompson 等在内的业界传奇人物,为我们讲述了他们是怎么学习编程的,在编程过程中发现了什么以及他们对未来的看法,并对诸如应该如何设计软件等长久以来一直困扰很多程序员的问题谈了自己的观点。
本书适合所有程序员,也适合所有对计算机行业、对软件开发感兴趣的人。


15业界传奇人物介绍: No.1 Jamie Zawinski 

    

  名字的三字母简写与全名同样知名的黑客并不多,Lisp黑客、Netscape早期开发者和夜总会老板Jamie Zawinski,又称jwz,便是其中之一。
Zawinski十几岁就开始编程,当时受雇于卡内基 梅隆大学(CMU)人工智能实验室,从事Lisp开发。他在大学没待多久就选择了退学,因为他发现自己厌恶大学。随后近十年他一直投身Lisp和人工智能(AI)领域,阴差阳错地浸染于一种日渐式微的黑客亚文化中,而同年龄段的其他程序员则是伴着微型计算机一起成长。
Zawinski曾在加州大学伯克利分校(UC Berkeley)为Peter Norvig工作过,后者形容他是“自己雇过的最优秀的程序员”。后来Zawinski去了Lisp公司Lucid,最终领导开发了Lucid Emacs。Lucid Emacs后来更名为XEmacs,终成一大Emacs流派,堪称最著名的开源分支之一。
1994年,Zawinski最终离开了Lucid公司和Lisp领域。随后他加入当时羽翼未丰的初创公司Netscape。他是Netscape浏览器Unix版本及其后Netscape邮件阅读器最初的开发人员之一。
1998年,作为主要推动者之一,Zawinski与Brendan Eich一道,通过mozilla.org促成了Netscape浏览器的开源。一年后,因对发布遥遥无期备感失望,他退出了该项目,在旧金山买了一家夜总会,这就是他现在运营的DNA Lounge。目前,他正集中精力与加州酒类管制局打官司,力争让这家夜总会成为各年龄层都能进入的现场音乐表演场所。
在这次访谈中,我们谈到C++为什么令人厌恶,几百万人使用其软件给他带来的快乐,以及新手程序员多动手实践的重要性。

No.2 Brad Fitzpatrick

所有受访者中最年轻的一位,也是其中唯一一位从未在没有因特网或个人电脑的世界里生活过的。他出生于1980年,很早就开始了自己的程序员生涯,5岁时就在一台自制的Apple II克隆机上学习编程。在十几岁时,正好赶上因特网革命的大潮,他一头扎入其中,在高中时就建立了自己的第一个商业网站,在进入大学前的那个夏天创立了著名社区LiveJournal。
LiveJournal的日渐流行迫使Fitzpatrick走上了学习构建可伸缩网站的艰难之旅,期间他和他创办的Danga交互技术公司里的程序员们开发了几个开源软件,其中包括memcached、Perlbal和MogileFS,现在被用于很多世界上最繁忙的网站的服务器上。
Fitzpatrick是个典型的极有才华的世纪之交的Web程序员,他的主要编程语言是Perl和C,需要时也会用Java、C++、Python、JavaScript和C#。他做的所有编程工作基本都与网络相关,比如为网站构建更好的后端基础设施,设计协议和软件来让博客阅读软件获知博客更新,甚至为他的手机编写代码以便在摩托车上就能自动打开车库门。
我们将谈到他在读著名儿童系列丛书《Clifford the Big Red Dog》的年龄就开始学习编程,为什么能够很高兴地一边念大学,一边运行LiveJournal,以及他是如何学会不惧怕去阅读他人的代码的。

No.3 Douglas Crockford

 

  

 

Yahoo!的资深JavaScript架构师,他在上世纪70年代初求学期间就开始从事程序开发工作了,那时的他主修电视广播专业,但苦于无法进入演播室工作,转而学习了学校开设的Fortran课程。在其职业生涯中,Crockford曾先后供职于Atari、Lucasfilm和Electric Communities,以各种方式联姻计算机与传播媒介,现在他就职于Yahoo!。
Crockford生来就是一个至纯至简的人。深感于XML的复杂性,他发明了JSON这一广泛用于Ajax应用的数据交换格式。Crockford在最近出版的新书《JavaScript: The Good Parts》中谈到如果能避免使用某些特性的话,JavaScript实际上是一门相当优雅的语言。在接受采访的时候他强调了以子集方式来管理复杂度的重要性,同时介绍了他所使用的一种代码阅读方法:从清理代码开始。
在采访之际,Crockford就已经因极力反对将ECMAScript 4(ES4)纳入到ECMAScript(JavaScript)语言标准中而名声大噪,因为ECMAScript 4实在是太复杂了。他倾向于更加简洁的ES3.1提案,最后Crockford与其他ES3.1拥护者大获全胜——ES3.1更名为ES5而ES4则被官方彻底抛弃。
在本次采访中,Crockford谈到了ES4提案的缺陷,作为团队行为的代码阅读的重要性,以及在现有系统当道的情况下如何推进Web向前发展。

No.4 Brendan Eich


现任Mozilla公司CTO,是JavaScript的发明者,这种脚本语言是现代Web开发中使用最普遍却又最受争议的语言。Mozilla公司是Mozilla基金会的附属公司,专注于火狐浏览器 Firefox)的持续开发。
Eich拥有坚实的理论基础和较强的工程实践能力,早期在Silicon Graphics和MicroUnity公司从事网络和系统内核开发。离开MicroUnity之后,Eich去了网景(Netscape)。在开发网景浏览器的巨大时间压力下,他创造了JavaScript。
1998年,Eich和Jamie Zawinsk带头劝说网景公司将浏览器变成开源项目,并最终成立mozilla.org组织,Eich在该组织中担任首席构架师。
近几年来,Eich既参与确定Mozilla平台发展的大方向,也会深入到底层去开发那个新的JavaScript即时虚拟机TraceMonkey。并且,采访中他还强调正在尝试让Mozilla的项目“引领科学方向”,会吸收更多的具有务实精神的研究机构人员参与到Mozilla当中,让理论研究和行业实践结合得更紧密。
另外,我们还谈到了JavaScript和Java看起来有几分相似的原因;为什么ECMAScript 4的失败并不会阻碍JavaScript成长为一门真正的语言;以及JavaScript对类似于静态代码分析方法多样化的需求。 

No.5 Joshua Bloch

现任Google公司首席Java架构师。之前他在Sun公司工作,曾获杰出工程师称号,领导并实现了Java 2中的Java Collection Framework,还参与了Java 5发行版中几项语言附加特性的设计。Bloch在哥伦比亚大学获得学士学位,在卡内基梅隆大学获得博士学位。读博期间他参与设计了Camelot分布式交易处理系统,这个系统后来演变为Transarc公司的产品Encina,而他则成为Transarc的资深系统设计师。他编写的Effective Java一书(该书中英文版均已由人民邮电出版社出版)获得了2001年Jolt大奖,他还与人合著了《Java解惑》和《Java并发编程实践》。
没错,Bloch是Java的忠实拥护者,他的工作就是推动Java在Google公司的广泛使用。最近风行于世的并发解决方案,如软件事务内存或者Erlang的消息传递机制等,Bloch都不太看重,他认为Java是并发运算的“最佳语言”并预言随着越来越多程序员需要开发应用于多核CPU的程序,Java将会再次风行起来。
Bloch也很推崇把编程看作API设计,我们探讨了这对他自己的设计流程有何影响,同时还讨论了Java是不是太复杂了,以及为什么说选择编程语言就像选择酒吧。

No.6 Joe Armstrong

 

   

最广为人知的是他发明了Erlang编程语言,并且创建了用于构建Erlang应用程序的框架——开放电信平台(Open Telecom Platform,OTP)。
在现代语言的版图中,Erlang有点另类。同很多流行的语言相比,它既老又新。早在1986年,也就是Perl出现的前一年,Armstrong就已经开始了Erlang的工作,当时它只作为商用产品出售并且主要在爱立信公司内部使用。这种情况直到1998年Erlang作为开源项目发布后才发生变化,那时Java和Ruby已经问世3年了。Erlang并非起源于Algol系列中的某个成员,而是源于逻辑编程语言Prolog。当时Erlang设计初衷也相当明确,它针对的软件是类似于电话交换机那样的高可用性、高可靠性系统。
但是几乎在不经意间,Erlang适合于构建电话交换机的那些特征也让它非常适合于编写并发软件,当程序员们开始努力应对多核系统未来的发展趋势时,并发性引起了他们的注意。
Armstrong本人也有点另类。他起初是一名物理工作者,在攻读物理学博士学位时因为用完积蓄而转向了计算机科学,找到一份研究员的工作,为英国人工智能领域奠基人之一的Donald Michie工作。在Michie的实验室,Armstrong接触了人工智能领域各个方面的杰作,成为英国机器人学会的创始成员并撰写了一些有关机器人视觉的论文。
由于Lighthill所做的那份非常有名的调查报告,人工智能的资金来源枯竭,Armstrong又回到了物理学领域,从事了5年多与物理学编程相关的工作。开始时他在欧洲非相干散射科学协会(EISCAT)工作,后来又到了瑞典空间研究中心,最后加入了爱立信计算机科学实验室,Erlang就是在那里发明的。
我们在他斯德哥尔摩家中的餐桌上交谈了几天,谈论的话题很多,包括Erlang对并发的处理机制,为什么需要更好、更简单的方法来连接程序,以及打开黑盒的重要性。

No.7Simon Peyton Jones


作为发起人之一,Simon Peyton Jones于1987年参与的那个项目最终促成了编程语言Haskell的定义。他现在是英国微软剑桥研究院的高级研究员。他编辑的《Haskell 98修订报告》是这种语言当前最稳定的定义。他是格拉斯哥Haskell编译器(GHC)的架构师和首席开发人员,按照haskell.org的说法,GHC是“事实上的标准编译器”。他所讲的一句话“不惜一切代价避免成功”被作为Haskell的非官方格言广为引用。
Peyton Jones从未拿过博士学位,曾是大学教授,做起研究来干劲十足,他认为理论与实践中都能发现美感。他开始学习编程用的机器没有永久存储器,只有100个存储单元,读大学后,他用学校里昂贵的大型计算机编写高级编译器,并用学生收入购置的零部件组装了自己的简陋计算机。某次看到一位教授演示了不使用变量修改(mutation)如何构建双向链表,并领略到惰性求值思想的优美,他就被函数式编程深深吸引了。Peyton Jones把函数式编程看做是“对整个编程体系的一次彻底而优雅的攻击”:这种方法“建造了一面新墙”而不“仅仅是在墙上添一块砖”。2004年,美国计算机协会(ACM)选举他为会士,以表彰他“对函数式编程语言的贡献”。
这次访谈的话题包括:为什么他认为函数式编程越来越有可能改变软件的编写方式;在编写并发软件时,为什么软件事务内存(Software Transactional Memory,STM)在编写并发软件时要远优于锁和条件变量;为什么很难真正地研究并弄清楚不同的编程语言是否会提高或降低程序员的效率,即使在微软研究院也很难做到。

No.8 Peter Norvig

 

 他是一位渊博的思想家,实际上也是一名黑客。他写过一个程序,能从Google的搜索日志中找到同一用户连续3次搜索输入的关键字,而且这3个关键字还恰好能连成一首俳句。这其中,我印象最深的俳句是:“Java ECC / Java elliptical curve / playboy faq”。
他的个人网站上,页面链接有些平淡无奇,比如他所著的书和论文、演讲时用的幻灯片,还有他写的各种小程序;但也有不少链接很有意思,比如他在《McSweeney’s Quarterly Concern》发表的短文 ,他对如何编写世界上最长回文生成器的精妙解读,以及他为讽刺微软的PowerPoint软件而作的“葛底斯堡PowerPoint演示”——Edward Tufte曾引用过这份文档,而且如果你在Google搜索“PowerPoint”,它还会出现在搜索结果的第一页中。
如今他担任Google的研究总监,在这之前也曾担任Google的搜索质量总监。加入Google前,他是NASA Ames研究中心的计算科学部主任。再往前追溯,他还是上世纪90年代末诞生的互联网创业公司——Junglee的创始员工。2001年,他获得了NASA杰出成就奖。他还是美国人工智能协会(American Association for Artificial Intelligence,AAAI)和计算机协会(Association for Computing Machinery,ACM)的成员。
从Junglee到NASA再到Google,Norvig体会到了“黑客”和“工程师”开发软件的不同方式。在这次访谈中,他指出这两种方式各自的优劣所在。曾经是计算机教授,如今任职于全球最大的软件企业之一,因此他对计算机科学学术研究和行业实践之间的关系的看法也生动有趣。
我们在访谈中涉及的话题还包括:近几年编程发展得如何;为什么设计技术无法弥补需求分析不充分带来的缺陷;假如NASA采用可靠性较低却更廉价的软件,其处境为什么较之当下或许会有所改善。 
No.9 Guy Steele

 

 他是个真正的程序语言多面手。当我问他曾经认真地使用过哪些语言的时候,他列出了下面这一长串:COBOL、Fortran、IBM 1130汇编、PDP-10机器语言、APL、C、C++、Bliss、GNAL、Common Lisp、Scheme、Maclisp、S-1 Lisp、*Lisp、C*、Java、JavaScript、Tcl、Haskell FOCAL、BASIC、TECO以及TeX。他还说:“这些是其中主要的语言。”
他参与了现存两种主要的通用Lisp方言——Common Lisp和Scheme的创建。他也在Common Lisp、Fortran、C、ECMAScript和Scheme的标准化组织中工作,Bill Joy还邀请他帮助制定Java的官方语言规范。现在他正致力于Fortress的设计,这是一种用于高性能科学计算的新语言。
Steele在哈佛大学获得文学学士学位,在MIT获得科学硕士学位和博士学位。在MIT期间,他和Gerald Sussman合作编写了一系列著名的论文,现在被称作“The Lambda Papers”,其中包括了Scheme程序语言的初始定义。
他还曾经是一名黑客文化编年史的作者,JargonFile的最初编撰者之一,以及《黑客词典》一书的编者(该书后来由Eric S. Raymond更新修订为《新黑客词典》)。他还在Emacs的诞生中扮演了重要角色,同时也是最早移植Donald Knuth的程序TeX的程序员之一。
Steele是ACM(美国计算机协会)会员和美国艺术与科学院院士,也是美国国家工程院院士。1988年他获得ACM Grace Murray Hopper奖,2005年获得Dr. Dobb's程序设计杰出奖。
在这篇访谈中,他讨论了软件设计,以及写作和编程的关系,他还给出了我所听过的关于正确性的形式证明的价值及其局限的最佳解释。

No.10Dan Ingalls

 

 


如果说Alan Kay是Smalltalk之父,那Dan Ingalls就是Smalltalk之母,因为Smalltalk或许肇始于Alan Kay尚未成形的想法,但却是Ingalls的辛勤劳动才将其带到这个世界。从Smalltalk第一版实现开始(该版本是在Kay一页备忘录的基础上用BASIC写就的),Ingalls一直参与七代Smalltalk的实现,从第一个原型版本,直到现在的开源实现Squeak。
Ingalls最初是个物理学家,一开始使用Fortran编程,开了家公司,推销他读研时开发的性能分析工具(profiler),最后去了施乐帕洛阿尔托研究中心(Xerox PARC),加入Kay的学习研究小组(Learning Research Group),该小组创建了Smalltalk,主要探索计算机在儿童教育中的应用。
在PARC期间,Ingalls还发明了用于位图的BitBlt运算,并通过PARC Alto计算机的微程序实现了该运算。它支持高性能位图,使得用户界面创新成为可能,比如我们今天习以为常的弹出菜单。(在Ingalls一次Smalltalk系统内部演示中,弹出菜单曾让本书下一章的采访对象L Peter Deutsch惊叫着跳起来,“你们做的竟然和我想的一模一样啊?”)
目前,Ingalls是Sun公司的杰出工程师,从事Lively Kernel项目研究。这是一个类似Smalltalk的编程环境,整个运行在浏览器里,使用JavaScript和浏览器提供的图形开发。Ingalls凭借在Smalltalk上的工作成就获得1984年ACM Grace Murray Hopper奖,1987年ACM Software System奖。2002年,他获颁Dr. Dobb’s程序设计杰出奖。
在这次交谈中,我们讨论了交互式编程环境的重要性,为什么他没学过Lisp是件幸事,以及,相比构建静态系统而后试图添加动态特性,构建灵活的动态系统然后锁定下来为什么更好。 

No.11 L Peter Deutsch

“神童”L Peter Deutsch在20世纪50年代末就开始写程序了,那时他只有11岁。他爸爸带回家一份备忘录,上面写着为实现哈佛那台剑桥电子加速器的计算功能程序的资料,激发了他的兴趣。很快,他就出没于MIT,在PDP-1上实现Lisp,修改并改进MIT程序员的程序,而这些程序员的年纪几乎大他一倍。
在加州伯克利大学上二年级的时候,他加入了Genie计划,这是最早的一个基于微型计算机的分时系统,Deutsch写了大部分的操作系统内核。(第12章要谈到的Unix之父Ken Thompson也参加了这个项目,那时他是研究生,这个项目对他后来发明Unix产生了影响。)Genie计划商业化失败之后,Deutsch加入了施乐公司帕洛阿尔托研究中心(PARC),在那里,他从事Interlisp系统和Smalltalk的虚拟机的研究,并协助发明了即时编译的技术。
他曾是PARC衍生公司ParcPlace的首席科学家,Sun公司的院士,在Sun公司他发表了题为“分布式计算的七个谬论”的著名论文。他还是Ghostscript的开发者,Ghostscript是PostScript的解释程序。1992年,Deutsch所在的小组因为Interlisp获得了ACM软件系统奖。1994年他当选ACM会士。
2002年,Deutsch退出了Ghostscript的开发工作,转而学习作曲。现在,他更愿意研究作曲而不是程序。但他常常抑制不住编程的欲望,主要开发他自己设计的乐谱编辑软件。
访谈中,我们谈及了他觉察到的计算机程序语言存在的深层问题,包括对指针和引用的看法,为什么软件应该被当成资产而不是支出,以及他不做职业程序员的原因。

No.12 Ken Thompson
他是属于传统意义上的Unix黑客,长须连鬓,痴于编程。纵观他的职业生涯,他从事过各式各样自己感兴趣的工作,从模拟计算电路、系统软件,到正则表达式,再到国际象棋软件,涉猎很广。
最初,他以一名研究员的身份受聘于贝尔实验室,加入到MULTICS操作系统项目中。在贝尔实验室撤出该项目后,Thompson仍坚持研发,终于与Dennis Ritchie一同创造了Unix。这期间他曾担心会因不务正业而被解雇。在开发Unix的过程中,他还发明了B语言,这可是Dennis Ritchie C语言的前身。
后来,他着迷于用计算机下国际象棋,造出了世界上第一台专用的国际象棋计算机Belle,它是当时最厉害的电脑棋手。他也顺便收集齐了全部4子和5子残局,补充进国际象棋残局库。
在贝尔实验室研发Plan 9操作系统期间,他又设计出了目前广泛使用的UTF-8 Unicode编码。
1983年,Thompson和Ritchie凭借“对通用操作系统理论的发展的贡献,尤其是实现了Unix操作系统”而荣获图灵奖。同样由于在Unix开发中的贡献,他还获得过美国国家技术奖章和美国电气与电子工程师学会(IEEE)颁发的金井务奖(Tsutomu Kanai奖)。
在这次访谈中,Thompson谈及了自己早年对电子技术的热衷,还有身为学生即已开始授课的传奇学术经历,以及他缘何不齿当下某些编程方式。

No.13Fran Allen

最初,Fran Allen只是打算做一名数学老师,可为了还清助学贷款不得不先临时找份工作,结果自1957年加入IBM研究院之后,竟阴差阳错地开始了自已的程序员生涯。有趣的是,她最初的工作还是教书,只不过不是教数学,而是教那些对高级语言有着严重抵触情节的IBM科学家们使用刚刚发明的Fortran语言编程。
后来,Allen没有再回到学校教书,反而在IBM一干就是45个春秋。这期间, 她参与了一系列编译器项目的研发,诸如STRETCH-HARVEST机的编译器、雄心勃勃却未能实现的ACS-1超级计算机的编译器,以及她自己创立的并行翻译项目(PTRAN)。并行翻译项目中,开创了针对Fortran程序的自动并行化技术和静态单一赋值中间表示 Static Single Assignment
intermediate representation),后者目前广泛使用在静态编译器和即时(JIT)编译器中。
2002年,Allen凭借“在优化编译器技术的理论和实践领域中的开拓性贡献”荣获图灵奖,成为40年来第一位获此殊荣的女性,同时她也是IBM第一位女院士。此外,她还是电气和电子工程师协会(IEEE)院士、美国计算机协会院士、美国国家工程院院士、美国艺术与科学院院士,以及美国哲学协会会士。
回顾自己的职业生涯,Allen见证了女性在计算科学领域的地位变迁。计算机行业发展之初,尽管程序员作为新兴职业定位还不明确,IBM等大公司却多招募女性做程序员;几十年过后,结果竟是男性在这一领域占绝对主导地位。
在我们的谈话中,她谈及计算科学领域中女性地位的变迁,还有增加计算机领域多样性的重要性,以及为什么C语言令人惋惜地伤害了计算机科学的研究。

No.14 Bernie Cosell

1969年,后来成为Internet核心的ARPANET最早的两个节点上线。当时,在速率为50kbit/s的专线上传输的所有数据包都会流经两台专用计算机,即所谓的IMP(Interface Message Processor,接口消息处理机)。这两台IMP由BBN公司(Bolt Beranek & Newman)设计和制造,其上运行的软件则由三名程序员组成的小组编写,其中一位就是Bernie Cosell,三年之前,刚念大三的他离开MIT,加入了BBN。
最初,Cosell是作为应用程序开发人员进入公司的,参与的项目是构建最早的分时系统。很快,Cosell转做项目的系统编程,没过多久,他就完成了操作系统代码,并让整个系统运转起来,因此赢得“PDP-1分时系统沙皇”的称号。
在BBN公司26年多的职业生涯里,Cosell几乎无所不做,涉及所有产品,赢得了调试和修复大师的美名,即便被派去处理处境维艰的项目,也能让软件运行起来。另外,他也会出于好玩编写些程序:为了磨练自己的Lisp技能,他根据Joseph Weizenbaum的一篇杂志文章,写成了ELIZA的Doctor版本。Cosell的Doctor用BBN-LISP编写,随TENEX操作系统一起流传于ARPANET网络,影响范围比Weizenbaum的原始版本还要广,由此造就了一大批新的实现和相关程序。
1991年,Cosell离开BBN,在弗吉尼亚买下一个牧场,与妻子Lynn以及三条狗、数量众多的猫和羊一同生活在农场里。他间或为当地ISP(网络服务提供商)写些程序,搞点自己的项目,讲授几门编程和计算机安全方面的课程,对自己不再当全职程序员感到心满意足。带有讽刺意味的是,搬到乡下之后,作为Internet奠基人之一的Cosell眼下在家只能拨号上网。
在这次访谈中,我们谈到他是怎么赢得调试大师的美名,编写清晰代码的重要性,以及他如何说服IMP项目的其他程序员不要再给二进制程序打补丁。

No.15Donald Knuth

 

 


本书所有主人公中,Donald Knuth或许最为闻名遐迩。他笔耕逾四十载的多卷本巨著《计算机程序设计艺术》,如今已成为基础算法与数据结构领域的传世经典。《美国科学家》杂志将其评为20世纪最重要的12部自然科学专著之一,与罗素和怀特海、爱因斯坦、狄拉克、费曼、冯 诺依曼等人的著作齐名。他推广了算法分析中的渐近符号(即大O符号),发明了LR语法分析,还反驳了Dijkstra对goto语句的批判 。
Knuth不只是理论家。1976年写完《计算机程序设计艺术》第三卷后,他本打算花一年时间写个排版系统,包括TeX和METAFONT,好让自己的著作看起来更加赏心悦目。结果十年时光过去,他才完成了这款软件。同时,他还发明了一种称为“文学编程”(literate programming)的编程风格,以及一种用于排版、至今仍很先进的文章段落断行算法。
他一生获奖无数,包括首届美国计算机协会Grace Murray Hopper奖(1971年)、图灵奖(1974年)和美国国家科学奖(1979年)。自1990年起,他不再使用电子邮件。据他自己解释,这样做是因为他追求的不是“高屋建瓴”而是“寻根究底”,他必须深刻理解与领悟计算机科学的广袤领域,从而在书中加以解释。
在这篇访谈中,我们谈到了Knuth对文学编程的由衷热爱,对黑箱的矛盾心态,以及对过分注重软件复用的遗憾之情。