原文很长, 贴前3页. 反正我的翻译已经废了...
1974 TURING AWARD LECTURE
Computer Programming as an Art
(计算机编程:一门艺术)
Donald E. Knuth 斯坦福大学
翻译:BerkeleyWolf
“1974年ACM 图灵奖授予Stanford大学的Donald E. Knuth教授,以表彰其在算法分析和程序语言设计等多方面的主要贡献。特别是表彰他的著名丛书对“计算机编程艺术”作出的最重大的贡献。该丛书中所辑录的技术,算法和相关理论已成为学科发展的核心,对计算机科学具有建设性影响。”
早在1959年 “美国计算机学会通讯”(Communications of the ACM) 刊行之初,通讯编委会就学会期刊发行之目的做出过如下说明:“如果计算机编程要想成为计算机研究和发展中的重要一环,就必须实现其从一门艺术到一门严肃科学的转变”。这个目标一直是接下若干年来被不断重申的主题;例如,我们在1970年曾读到 “编程从艺术变为科学的首要几步”[26]。与此同时,我们确实已经成功地将我们的学科打造成一门科学,而且是以一种不费吹灰之力的方式:仅仅是决定把它叫做“计算机科学”。
在那些言论之中暗藏着一种观念,就是认为有某种不太对劲的东西存在于那个被划归为“艺术”的人类活动领域中;它必须得是一门科学才能具有一点真正的地位。另一方面,十二多年以来,我一直在编写一部丛书,名为“计算机编程的艺术”(The Art of Computer Programming)。人们经常问我为什么选用了这么一个书名;事实上,一些人显然并不相信我的确取了这么个书名,因为我见到过至少有一个参考文献上列出了某些书, 名字叫做“计算机编程的行为”(The Act of Computer Programming){译者注}
在本次讲演中,我将试图解释为什么我认为“艺术”是个合适的字眼。我要讨论某件东西若成为一门艺术,比照它成为一门科学,将会意味着什么;而且我将阐述,一种对该学科恰当的看法将会帮助我们所有人提高当前从事的工作的质量。
被问及书名的事最初是发生在1966年,是在上次南加州举行的ACM全国大会期间。那时丛书一本也还没出版,并且我记得是在和一个朋友在举行会议的宾馆共进午餐。他知道我是多么自负,在那时候就就这样了,所以他问我能不能给书起名叫“Don Knuth 导论”(An Introduction to Don Knuth)。我回答说,恰恰相反,我将用他的名字给书命名。他的名字叫: Art Evans.{译者注}
从这个故事中,我们可以得出结论,“艺术”这个字不仅仅只有一个意思。事实上,这个词最妙的地方在于,它能用在很多语境中,而每一个语义都能和计算机编程很恰当的联系起来。在准备本次演讲时,我去图书馆查找了历年来人们对“艺术”这个词都说道了些什么;在书库里迷恋几天后,我得出结论:“艺术”(Art)一定是英语语言中最有趣的词之一。
艺术的古义
如果我们追查到拉丁词根,我们发现 ars, artis 是表示“技能”的意思。或许重要的是,它所对应的希腊词为 , 是“科技”和“技术”两个词共同的词根。
如今,当人们说起“art”,你可能最先想到的是“工艺美术”,比如绘画和雕塑。但在12世纪以前,这个词通常被用于相当不同的涵义。由于“art”的这种旧义在很多成语中仍具有生命力,特别是当我们把艺术和科学做对比的时候, 所以我想接下来化几分钟讲一讲艺术(art)的经典涵义。
在中世纪,最初的一批大学建成,讲授所谓的七种“文科”(liberal arts),即语法,修辞,逻辑,算术,几何,音乐和天文。注意这和今天的文科院校的课程设置大相径庭. 最初的七门liberal arts中至少有三门是计算机科学的重要组成。在那个时期,“art”指人的智力构想出来的东西,它与源自于自然或出于本能的行为相对。“liberal”art是指被解放的或自由的,与manual art,例如耕种相对。(cf [6])。在中世纪,“art”一词本身通常指逻辑学[4],而且通常指对三段论(演绎)的研究。
科学vs 艺术
看起来,在相当长的岁月中,“科学”(Science)几乎被用做和“艺术”(art)同义;例如,人们也有七种liberal sciences的说法,这与七种liberal arts说的是同一个意思。(参见[12, p.34f])。随着文明和知识的发展,两个词的涵义越来越独立,“科学”被用来代表知识,而“艺术”代表对知识的应用。因此,天文科学是航海艺术的基础。这种情况和我们现在区分“科学”和“工程”几乎是一模一样。
在19世纪, 有很多人著述艺术和科学的关系,我认为最好讨论是John Stuart Mill提出的。他在1843年,说了包括在下面的一段话:[28]
单单一门艺术通常需要几门科学做基础。这是由于人类活动的复杂性,以致于若想做成一件事,通常需要了解 很多事情的本质和特性…… 艺术一般包含着科学的真理,以最便于实践,而不是以最便于思考的方式组织起来。科学归类并组织其真理,以便让我们对尽可能多的宇宙普遍秩序建立起统一的看法。艺术…把相互之间有天壤之别的科学领域融合起来,即,那些人类各种现实生活所密切需要的, 创造不同的、各向异性条件所相关的真理。
当我考究“艺术”涵义的时候,我发现在至少两个世纪中,著作者们一直在倡导艺术向科学转变。例如,在一本写于1784年的矿物学教科书的前言中,是这样写的:“在1780年之前,矿物学,虽然被很多人大度地理解为一门艺术,但若视之为科学, 却是惊世骇俗。”
依照大多数字典,“科学”指能逻辑地条理和系统化为普遍“定律”的知识。科学的优点是使我们不必通过个例来思考事情;我们能把思维转向更高层次的概念。正如John Ruskin在1853年写道:“科学的工作是用事实取代表象,用实证取代印象”。
在我看来,如果我研究过的那些作者们今天仍在写作的话,他们也许同意以下的划分:科学是这样一种知识, 我们能如此透彻理解, 以至于我们可以把它教授给一台计算机;如果我们不能完全理解某件事物,对付它将是一门艺术。因为一个算法概念或者一段计算机程序提供给我们一种极其有用的测试手段,可以用来检测我们对某个特定知识掌握的深度,因此,从艺术走向科学的过程便意味着我们学会如何实现自动化。
人工智能已经取得了重要的进展,然而,在可预见的将来,计算机所能做的比起普通人所能做的还存在着巨大的差距。人们在听,说,创造,甚至在编程时所具有的神奇的洞察力依然超越了科学之所能及;我们所做的几乎每件事依然是一门艺术。
从这个观点来看,让计算机编程成为一种科学当然是很诱人的,而且,从我演讲开始时所引用的那个观点发表算起,我们在15年里确实走过了很长的一段路。十五年前,人们对计算机编程的理解是如此贫乏,以致于没有人甚至想过要证明程序的正确性;我们只是一味鼓捣一道程序直到我们“知道”它能运行了。那时,我们甚至不知道如何用一种严格的方式来表达一种概念, 说明一段程序是正确。只是在近年来,我们才开始学习编写及理解程序时所运用的抽象过程;这种关于编程的新知识正在实践中取得很大的成效,因为我们正在开始理解程序结构的原理, 即便是在实际中, 很少有程序能被完全严格地证明为正确的。问题的要点是, 当我们今天编程时,我们知道在原则上, 我们能构造出正规证明来证明程序的正确性,如果我们确实想这样做的话. 而且现在我们也理解这种证明是如何表述出来的。这种科学基础正让程序的可靠性显著提高, 比起过去我们写程序时, 正确性与否全要靠直觉。
“自动编程” 是当今人工智能研究的主要领域之一。它的支持者也许喜欢能做个题为“计算机编程: 一种手工艺” 的讲座(Computer Programming as an Artifact)( 意思是编程已成为昔日黄花) ,因为他们的目标是创造出仅仅给出说明书,就能编写程序的机器,而且编写的比我们更好。我个人的观点,并不认为这种目标将能完全实现,但我的确认为他们的研究极其重要,因为我们从编程中学到的每一点都帮助我们提高自身的艺术修养。在这种意义上,我们应该继续努力,把每一种艺术转变成科学: 在这个过程中,我们把艺术推向前进.
.....