1972 TURING AWARD LECTURE
The Humble Programmer
(卑微的程序员)
Edsger W. Dijkstra
德克萨斯大学奥斯丁分校(UT Austin)
翻译:BerkeleyWolf
在经历了一大串的巧合之后,1952年春天的第一个早上,我正式加入了编程的行业。尽我所能追忆,我是在我的国家里第一个从事这行当的荷兰人。回想起来,最令人惊异的是编程业的形成,至少在我这边的世界里,是如此的缓慢,让今人难以置信的缓慢。但我要感谢那个时期发生的仍历历在目的两件往事,毫无疑问, 是它们奠定了这种缓慢。
在编了大约三年程序后,我和van Wijingaarden教授,他当时是我所在的阿姆斯特丹数学中心的老板,进行了一次讨论---一次让我对他一生都心存感激的讨论。事情是这样的, 我原本打算在Leiden大学同时学习理论物理,但我发现这两种活动越来越难以结合起来。我必须下定决心,或者停止编程而做个真正的,受人尊敬的理论物理学家;或者用最少的精力,正式结束我的物理学习,然后做个……,做个什么呢?一个程序员?但那是个受人尊敬的职业吗?毕竟,什么是编程?可以支撑它成为一项受人尊敬的学科的那些实实在在的知识体系又在哪里呢?我非常清楚的记得我当时是如何地嫉妒我那些搞硬件的同事们,他们一但被询问起专业技能,至少可以指出他们懂得真空管,放大器和其它东西的来龙去脉。而我觉得,一旦面对这个问题,我只能站在那里两手空空。心里充满了疑虑,我敲响了 van Wijngaarden 办公室的门,问他我可不可以跟他谈一小会儿;当几个小时后我离开他办公室的时候,我变成了另一个人。因为在他耐心听了我的问题之后,他认同说编程学科直到当时还没多少东西,但随后他平静的继续解释说,自动化计算机将会在这里落户,我们才仅仅处在开始的阶段,为什么我就不能做一个让编程在未来成为一种受人尊重的职业的人呢?这是我人生的一个转折点,我尽可能迅速地正规地结束了我的物理学习。上面故事的一个启迪是,当然,我们在给年轻人建议的时候必须特别小心:有时候,他们真会照办的!
两年后,在1957年,我结婚了。荷兰人的婚礼仪式要求你要说明自己的职业,于是我说我是程序员。但阿姆斯特丹城的政府主管不能接受,依据是根本没有这个职业。信不信由你,于是,我在结婚登记职业这栏下面填上了那个很可笑的“理论物理学家”。
编程业在我自己国家里的形成是如此之缓慢,我已经目睹了太多太多。从那以后,我见识了更广阔的世界, 我的总体印象是,在别的国家,除了日期可能要变换一下,这种成长的模式几乎是一模一样。
为了能更好的理解当今的情况,让我试着更详细一点的抓取一些过去的细节。若我们一路分析下去,我们就会明白,关于编程的实质,有多少公众的误解可以一直追溯到距今遥远的过去。
第一代自动电子计算机都是独一无二的孤品,它们所安置的环境都带有那种令人激动的实验室的气息。有了建造自动计算机的宏图大愿,实现起来却是对当时电子技术的一个巨大挑战。有一件事情毋庸置疑: 那些决心建成这件奇妙设备的研究小组勇气可嘉,我们不能否定。那是多莫奇妙的设备,现在回想起来,人们只能惊诧于第一代计算机竟真能运行起来, 至少是在某些时候. 其中最大的困难是让机器达到并保持工作良好的状态。当务之急是在电子计算的物理方面,这到现在仍然反映在历史悠久的计算机学会的名字上,比如:美国计算机学会(Association for Computing Machinery),或者是英国计算机学会(British Computer Society),这些名字直接指向物理设备。
可怜的程序员们又如何呢?好吧,说句实话,他很少被注意到。首先,第一代机器是如此庞大,你跟本无法移动它们。另外,它们需要如此大量的维护,很自然,人们就要在建造那个机器的那个实验室中使用它。其次,程序员那点看不见摸不着的工作没有半点魅力:你可以向参观者展示机器,那比几页纸的程序要壮观好几个量级。但最重要的是,程序员本身对他的工作也自惭形秽:他工作的所有重要性是有了那个奇妙的机器才派生出来的。因为那是个独一无二的机器,他很明白自己的程序只在此处才有重要性。而且,机器的寿命是有限的,这再明白也不过了,他明白自己的工作仅有一丁点可能具有永久的价值。最后,还有另一个情况极大的影响着程序员对他工作的态度。除了机器不够稳定以外,一方面,机器通常非常慢,存储空间通常非常小,也就是说,他面对的是个夹脚的小鞋。另一方面,通常是某些稀奇古怪的程序恰恰能迎合那些最难以预测的构造.于是在那个年代,很多聪明的程序员靠使用自己发明的技巧,打破设备的限制,明知不可而为之,并从中获得了巨大的智力满足。
从那时起, 对编程有两种看法。现在提一下,我在后面会返过头来再谈。一种看法是,一个真正合格的程序员得有能急转弯的脑筋,并且非常喜欢小聪明把戏;另一种看法是,编程只不过是或这或那地,对计算过程做效率优化而已。
后一种看法是因为经常会遇到这样的情形:现有的设备实在是只把太夹脚的小鞋,于是在那时人们常常幼稚地期盼,一旦有了更强大的机器,编程就不成问题了。因此,就没有必要费尽心机把机器利用到极限,而那恰恰是那时编程的全部所在,难道不是吗?但在接下来的十年里,大相径庭的事情却发生了:更强大的计算机出现了,不仅仅是强大一个量级,而甚至是好几个量级。但是,我们非但没发觉自己置身于解决了所有编程问题的福地,却发现自己在软件危机中岌岌可危!为什么会是这样?
这里有个次要的原因:在一两点上,现代机器比老式机器更难对付。首先, 我们必须进行输入中断(I/0 interrupt), 它发生在不可预料的,难以重复的时刻, 相比于旧式串行机, 那可是完全可确定性的自动化过程. 这是个巨大的变化, 多少程序员鬓边的华发见证了这一事实, 因此我们不能对这一特性所造成的逻辑问题轻描淡写. 其次,我们已经有了能多级存储的计算机,它给我们带来了管理策略上的难题。虽然在这个领域已是卷轶浩荡,但仍然让人摸不着头脑。计算机体系结构的改变所增加的复杂度, 真是太多太多了。
但我称它为次要原因;主要原因是……计算机已经强大的好几个量级!坦率的说,只要没有计算机,编程就根本不成问题。当我们有了几个差点的计算机时,编程成了不大不小的问题。现在,我们有巨型计算机,编程也早已成了同样巨大的问题。在这种意义上,电子业连一个问题也没解决,它只是制造了问题----它制造了使用它的产品的所带来的问题。换个方式来说,现有的计算机能力增长超过一千倍的因数,社会对应用这些机器的雄心壮志也在成比例增长,于是正是那些可怜的程序员发觉自己的工作在这个被引爆的紧张领域中处于下风。增长的硬件性能,连同也许是更加迅猛增长的硬件可靠性,使几年前程序员做梦都不敢想的解决方案成为可能。而现在,几年之后,他不得不去梦想它们,而且更糟糕的是,他不得不把这个梦转化为现实!我们是不是很惊诧得发现自己竟置身于软件危机中?不,当然不,正如你所猜测的那样,它已被很好的预测到了;但小预言家们的麻烦,当然啦,是仅仅5年后,你也确实地知道他们曾经正确过。
接下来,在60年代中期,可怕的事情发生了....