有关软件工程问题答学生问
作者:Edsger W. Dijkstra
翻译:刘 焱(Gallen)
[有可能需要对问题重新组织一下,这就留给读者作为一个练习吧]
l 无关紧要的东西不必要改进,请看下面的序列:
背景—>过度应用的投影仪—>PowerPoint
l 正因为我是一个计算机科学家,我才没有必要在一台计算机面前浪费我的时间。
[一个病理学家没有必要非得要受他所研究的病痛的折磨]
l 促进“计算机化”不是计算机科学家的责任,据说这种“促进”是通过开发一些受欢迎的应用程序来给下一代的硬件创造出一个市场。
[病理学家并没有被要求为了给更多的药物创造市场而开发什么新的疾病。]
l 大学的责任不是提供“社会要求什么”(的问题),而是满足社会的需求。
[社会要求的东西是被广泛的理解的,用不着一所大学来说三道四;大学必须去提供别人所不能提供的东西]
l 我们所用的工具塑造着我们,尤其是:我们所采用的形式塑造着我们的思维习惯,不管是好是坏。这就意味着我们在选择所学和所教的时候必须谨慎,因为不学是不可能的。
[许多年以前,如果让我招一名助手,一个前提条件就是“从来也没用过 FORTRAN”,还有:在西伯利亚的高中教过 BASIC 也是不允许的。]
l 一个程序员必须能够论证他的程序所需要的特性。如果只是事后的论证,那几乎可以肯定他没有尽到这个责任:只有当他允许这个责任影响他的设计时,他才有希望尽到这个责任。纯粹事后的否定性的检验是会有好的影响,但却是把马车放到了马的前面(本末倒置)。可是这恰恰正是在软件工场里所发生的,在那里“编程”和“质量保证”是由两个不同的小组来做的。[用不着说,从这种工场里交出来的东西是没有保证的]
l 必要的有效推理技术是非常正式的,只要编程还是由一些没有掌握这种技术的人来完成,软件危机就会一直伴随着我们,并且会被看作一种不治之症。如你所知,不治之症会做些什么:它们会请来一些江湖郎中和庸医骗子,这些人在上面所说的不治之症中所打的旗号就是软件工程专家。
l 你们有些人会怀疑前面提到的“有效推理的技术”,它对于一些小的程序来说是很好,但随着程序规模的增大它的效用会按比例增加吗?这里我强调的是那种“规模宏大绝对复杂的程序”。噢,如果你试图用它去缠清那些被一群不称职的、没有组织的程序员搞得一团糟的程序,那当然是毫无用处的。它的威力表现在程序创建阶段:(i)和其他技术比较起来它使得文字(代码)更短;(ii)它使得导出程序的长度不会随着被导出程序的增长而线性增长。最终结果就是,这样产生的程序比起通常的那些垃圾程序来说,要好上无数倍。
我们永远也不要忘记程序员是生活在一个人造的世界中,这是他们与其他科学家的本质区别。一个程序员不应当问这种问题:一种好的编程技术的适用性如何?而应该去创造一个使它适用的环境。这是他能够提交高质量设计的唯一途径。在这里,让我引用一段我在1984年写的话。
“当今机器的容量给我们提供了大量的空间,让我们可以在其中做些乌七八糟的事情,也给一些肮脏东西的滋生产生了无穷的机会!在这样的环境下,要培养一种保持事情足够简单的严格的智力上的操守,在技术上和教育上都将是一个严峻的挑战。”
l 回答“为什么我们要教一些为业界所漠视的无用的东西”的问题,让我引用一段我在1985年写的话。
“回到我们最初的问题:计算机科学能够拯救计算机业吗?我的回答是‘如果计算机业还有救的话,救它的只能是计算机科学’。但是要让计算机行业——尤其是那些优秀的公司——认识到这一点还需要很长一段时间。几乎可以肯定这段时间要比他们计划中的‘未来’的时间要长。同时,学术界——在传统上他们的计划要更长远一些——别无选择,它必须精心挑选一流的人才,教他们如何做计算;如果它屈服于当前正流行的不正之风,那它最好还是垮台吧。”
为了强调我们需要多大的耐心,让我再来引用我的另一句老话吧(1990)。
“很少有人认识到当今倍受赞扬的高科技本质上讲是一门数学技术”
l 不,恐怕是Internet的流行让计算机科学深受其害。它吸引了数量越来越多的——不如说:数量压倒性的——有一点点科学爱好的学生,在科研上它只是以其速度和容量上的优势加强了流行的(有些庸俗的)观念。
l 好的,我来谈一谈你们所关注的:怎样更好地编程——虽然是可以教授的——是很难教授的。这种情形类似于数学,数学中大部分的课程局限在数学结论上;坦率地说,怎么去做数学只能由学生慢慢地去参悟。比起语言式的或图示式的论证,符号操纵式的和计算式的论证更受欢迎,其中一个原因就是后一种方式更容易教授。可是,大规模地引入计算方法学方面的课程将遇到难以克服的政治上的问题。
l 在软件行业中有许多公司,计算机科学应不应该,能不能够帮助它们还不是那么清楚。
Austin, 2000/11/28