抛开Ada Lovelace(被誉为世界上第一位程序员,著名诗人拜伦之女,她为Charles Babbage未完成的分析机设计了算法)的工作不说,人类在计算机编程领域奋斗的时间还不及一个人的寿命长,从1941年Konrad Zuse完成Z3电子机械计算机(首个可运行的通用计算机)算起,只有短短68年。曾有6位女性(Kay Antonelli、Jean Bartik、Betty Holberton、Marlyn Meltzer、Frances Spence和Ruth Teitelbaum)在美军的计算机部队工作,她们手工计算弹道数据表,后来被调去做ENIAC(首台通用电子计算机)最早的程序员。若从这时候算起,人类的编程历史则只有64年。在婴儿潮早期出生的人们以及他们的父母,很多至今仍然健在,他们出生时世界上还不存在计算机程序员。

当然,这些已经是历史了。现在世界上有很多程序员。劳动统计局在2008年对美国125万人进行了统计,大约每106个工作者当中就有1个是计算机程序员或软件工程师。这还没算美国之外的职业程序员、数不清的学生和业余编程爱好者,还有很多人从事其他正式工作,但却花费了一部分或很多时间来试图驯服计算机。虽然有数以百万计的人写过代码,虽然在编程出现后人们写过的代码没有数万亿行也有数十亿行,我们仍然不断地在这一领域进行创造。人们仍然在争论编程到底是数学还是工程,是工艺、艺术还是科学。我们仍然在(经常是带有强烈情绪地)争论编程的最佳方式,因特网上有无数的博客文章和论坛帖子来讨论这些问题。书店也摆满了各种论述新编程语言、新编程方法、新编程思想的书。

enter image description here

Unix的发明者Ken Thompson

本书按照文学期刊《巴黎评论》(The Paris Review)的传统,采取了一种不同的方法来讲述什么是编程。这家期刊曾派了两位教授去采访小说家E. M. Forster,这次采访和随后的一系列问答式的采访后来辑录为Writers at Work一书。

我采访了15位成就斐然、经验丰富的程序员,其中有些人是系统黑客,如Ken Thompson(Unix的发明者)和Bernie Cosell(ARPANET早期实现者之一);有些人既有强大学术实力,本身又是著名黑客,如Donald Knuth、Guy Steele和Simon Peyton Jones;有些人是业界的研究员,如IBM的Fran Allen,爱立信的Joe Armstrong,Google的Peter Norvig,以及曾在施乐帕克研究中心工作过的Dan Ingalls和L Peter Deutsch;有些人是Netscape的早期实现者,如Jamie Zawinski和Brendan Eich;有些人参与设计和实现了现在的万维网,如刚才提到的Eich,以及Douglas Crockford和Joshua Bloch;还有Live Journal的发明人Brad Fitzpatrick(在伴随Web成长起来的一代程序员当中,他是一个当之无愧的典型)。

在采访中,我问他们有关编程的问题,问他们是怎么学习编程的,在编程过程中发现了什么,以及他们对未来的看法。而且我很用心地请他们多谈谈长久以来程序员一直在苦苦思索的那些问题:我们应该如何设计软件?编程语言在帮助我们提高生产力和避免错误方面扮演了什么角色?有什么办法可以更容易地查出难以发现的bug?

这些问题远远还没有解决,所以我的采访对象持有非常不同的观点也就不那么奇怪了。Jamie Zawinski和Dan Ingalls强调尽早让代码跑起来的重要性,而Joshua Bloch则描述了在实现之前,他如何设计API并测试它们能否支持要写的代码。Donald Knuth讲述了他在编写排版软件TeX的时候,怎样在敲代码之前先用铅笔在纸上完整地实现整个系统。Fran Allen大力批判近几十年来人们躺在C语言的脚下对计算机科学的兴趣越来越低,Bernie Cosell称之为“现代计算机最严重的安全问题”,Ken Thompson却认为安全问题是程序员而不是编程语言造成的,Donald Knuth也说C的指针是他所看到过的“最令人赞叹的记法改进之一”。一些受访者对“形式化证明可能有助于改善软件质量”这一观点嗤之以鼻,而Guy Steele则漂亮地展示了这种做法的优点和限制。

然而,仍然有一些主题是大家都认同的。几乎所有人都强调保持代码可读性是很重要的。大部分受访者都认为最难查找的bug出现在并发代码中。没有人认为编程问题已经完全解决了,他们大多数人仍然在寻找编写软件的更好办法,比如怎样自动分析代码,如何让程序员更好地协作,或者寻找(或设计)更好的编程语言。同时几乎所有人都认为多核CPU的大量采用将会给软件开发带来重大改变。

这些谈话发生在计算机发展史的一个特定时刻。因此,本书中讨论的一些话题在当前是紧迫问题,今后将不再是问题而变成了历史。但即使是像编程这种新兴领域,历史也能为我们提供很多教训。除此之外,我觉得我的受访者们可能有一些共识,包括什么是编程,如何更好地编程,等等,不仅现在的程序员会从中受益,未来几代程序员也将从中受益。

最后提一下本书的书名:Coders at Work。这个书名与前面提到的《巴黎评论》出的Writers at Work系列以及Apress的Founders at Work (该书讲述如何创办技术公司,而本书讨论计算机编程)相呼应。我意识到编程涵盖的范围太广了,而“编码”(coding)则可以特指其中一个很窄的部分。我个人从不认为一个糟糕的程序员会是一个优秀的编码者,也不相信好的程序员会不是出色的设计者、沟通者和思考者。毋庸置疑,这些受访者都是优秀的编码者、程序员、设计者和思考者,而且还不仅仅如此。我相信接下来你在阅读他们的谈话内容时一定能够体会到这一点。希望你能喜欢这本书!

enter image description here