《程序设计实践》译者序

  我最早看到《程序设计实践》的消息是在1999年3/4月IEEE的Software杂志上,在那里有对本书的介绍,还特别摘编了书中第7章“性能”的部分内容。B. Kernighan是全世界计算机界专业人士都非常敬重的程序专家和专业作家,他与C语言创造者D. Ritchie合著的《C程序设计语言》,与Rob Pike合著的《UNIX编程环境》,与P. Plauger合著的《程序设计风格的要素》和《软件工具》等都是程序和程序设计方面风靡世界,口碑极佳的经典之作。Kernighan和Pike的新书自然也非常引人注目。读了该杂志上刊出的摘编,我感到这本书里确实讨论了程序设计中许多非常重要的问题,而它们又是非常实际的,有些也是自己工作中经常遇到的。文中的分析和讨论既通俗浅显,又寓意深远,读后觉得很有收获,我也由此萌生了将这本书介绍给国内同行的念头。后经辗转,了解到机械工业出版社已经购到本书在中国的版权,便自告奋勇承担了翻译工作。经过几个月的努力,我很高兴看到这本书终于可以付印了。

  程序设计是计算机专业领域中最核心的工作。在计算机领域中任何好的创意和设计,最终都需要通过高水平的程序设计实现,才能够真正成为有社会价值、市场价值的制成品和产品。有一件事使我非常感慨。在计算机领域走在世界最前列的美国,确实有那么一大批人,他们几十年如一日地奋斗在程序设计领域里。比如Tompson和Retchie得了图灵奖之后仍在做程序设计工作,Kernighan和Pike也是这些人中的杰出代表。我觉得这些人是真正托起美国计算机业的脊梁。在中国何时能够有这样的一大批人,那么中国的计算机事业也就能在世界上占据一席之地了。中国的计算机事业要有真正的发展,必须造就一大批高水平的程序设计专家,这既是社会对于一批最优秀青年的召唤,也是历史对中国计算机教育界的挑战。

  我认为,本书在这个方面是非常有价值的。它讨论的是程序设计中实际的,又是非常深刻、具有广泛意义的思想、技术和工作方法,填补了国内目前这方面书籍的空白。这本书值得每个梦想并在努力使自己发展成为优秀程序员的人参考,值得每个计算机专业的学生和计算机工作者阅读,也可以作为程序设计高级课程的参考书或教材。我相信,任何在与计算机相关的领域中工作的人们,任何真正的计算机爱好者,都会在本书的阅读中有许多收获。这也正是我愿意来做这件事的原因。

  近年来,程序设计环境确实取得了长足的进步。有人可能会提出疑问,既然许多程序似乎都能在一系列指指点点之中完成,在这种情况下程序设计难道还有多少花招好玩吗?实际情况并不是那么简单。任何一个有点价值的程序都不仅是一个图形界面外壳。虽然在最终的可执行代码里,界面外壳可能占据了相当大的比例,但一个程序的特点恰恰就在那些人们自己动手写出的代码中。而良好的设计,卓越的编码实现永远都是不可替代的,是不可能自动生成的,正是它们形成了一个软件的真正价值。实际上,所有程序设计环境中有价值的东西不过是在一些局部领域中优秀代码的浓缩和沉淀。

  应该看到,功能强大的程序开发环境未必能造就出更优秀的程序员。在我自己的教学实践中,遇到了越来越多这样的学生,他们是玩编程环境的高手,但距离程序设计高手却差得太远。他们对算法和数据结构选择,程序的结构设计和良好编码的各种要素不太得要领,最熟悉的就是排错系统(debugger)和单步执行,最拿手的是在程序上打补丁。一个十行程序就能解决的问题,让他们来做,动则就是几十上百行甚至更多,而到最后自己也不知道做得到底对不对,只知道试过一些例子,单步执行无数遍,打了数不清的补丁。可悲的是,以这类活动方式作为编程要义的不仅是这些学生,这种情况也不仅出现在学校里,不仅出现在我们周围,不仅出现在中国。这可能也是我们经常使用的系统规模庞大,而又不时崩溃的一个重要原因。无论是这些学生,或者是作为一般计算机工作者、作为教师的我们,都应该看看本书作者是如何对待编程和测试问题的,应该从中领略什么样的东西能称得上是真正的代码。

  正如作者在书中反复强调的,程序设计并不就是编码。在程序设计工作中,既有工程也有科学。需要有对所面对的问题的科学分析;考虑各种设计可能性,在各种约束条件中寻找合理的平衡点;选择适当的技术、算法和数据结构,选择合适的语言和语言中合适的描述结构;编码和可能的代码调整;设法排除程序中的错误;通过系统化的测试,努力保证程序能够满足我们的需要,具有相当的可靠性和抵御外部意外事件的能力。这些都是本书中详细讨论了的题目。书中的内容还很多。在阅读本书的过程中,在每一章里,你都会发现许多新鲜生动,而又是非常深刻的东西,会发现一个又一个你确实应该知道,但至今还不知道的东西。这也是我自己在阅读和翻译这本书过程中的切身体会。

  我(相信读者也会)非常感谢机械工业出版社的编辑人员,是他们的见识,使这本好书有可能较早地与中国读者见面。由于本书覆盖面广,翻译难度确实比较大,我虽然在翻译中下了不少功夫,但在译文中仍难免出现一些疏漏,这些当然都只能由我本人负责。我也真诚地希望认真的、有见识的同行们和朋友们不吝赐教。纠正书中的错误也像是debug,可惜的是我们无法对书籍内容设计出一套系统的测试集,也不可能有功能强大的debugger系统。要排除这里的错误,只能靠人的眼睛、专业知识、逻辑思维和语言文字能力。而在所有这些方面,作为译者的我都还需要继续努力。

裘宗燕,2000年4月于北大