计算机科学与人物

一个人对计算机科学的观点-R.W.HAMMING(zz)

2011年11月19日 阅读(314)

【原文】 One Man’s View of Computer Science 

【作者】R.W.HAMMING

Bell  Telephone  Laboratories, 

【原刊】Journal of the Association for Computing Machinery Vol l6, No1. Juauary 1969, pp. 3-12.

一系列的观察以及评论直接对“考虑到计算机科学的普通工程学的品位”提出建议。工程学的角度之所以重要,是因为当前该领域大多数难点都还没有涉及到“特定的事情是否可以完成”的理论问题,但更实际的问题是它们可以怎样即简洁有有效的完成。

计算机科学的教育其实可以通过不同的选择而更有效率,譬如,在编程中增加实验课程(the inclusion of a laboratory course in programming),比如,对数学之外的强化的副修科目需求,更多实际的编程以及更少的抽象理论, 以及更多的严肃认真性而非游戏。

关键字与短语:计算机科学(computer science), 计算机工程(computer engineering), 实际编程(practical programming),数学游戏(mathematical game playing),计算机技术员(computer  technician), 计算机专家(computer professional), 写实编程(true-to-life  programming),计算机科学课程(computer science curriculum),软件(software), 基础研究(basic research),无向研究(undirected research), 程序员伦理准则(programmers’ ethical standards), 程序员社会职责(programmers’ social responsibility)

CR: 1.3, 1.50

(译注:根据1964年版CR分类系统:1.3指 文献概览与引述 Introductory and Survey Articles, 1.50指 教育-概论 Education-General)

请允许我以少数的私人发言作为开始,当某人发现他被选为当年的ACM图灵演讲者(ACM Turing lecturer)时,他首先感到的就是惊讶 --特别是一个学院派作风的人被授予ACM奖之候。时间稍逝,这种惊讶就被一种愉悦感取而代之了。再之后就是这样一种感觉“为什么是我啊?”。在所有已经完成和正在完成的计算方面的工作中(With all that has been done and is being done in computing),为什么选了我和我的工作呢?好吧,我假设这必须年年都花开某人(it has to happen to someone each year),这次我就是那个幸运的人。无论如何,让我感谢您们给予我的,以及我所工作的贝尔电话实验室,还有使这成为可能的我所做的一些工作。

我的图灵演讲主题是“一个人对计算机科学的观点”,之所以选择这个主题是因为有这样一个话题被在该领域内的人们无休止的争论着:什么是计算机科学?(译注:确实是无休止的争论,《黑客与计算机》的作者对此颇有异议)。进一步而言, 作为在精彩的课程68报告的引介(introduction)中所标示出的【参看1】“委员会强烈认为在计算机科学教育目标与进程方面之持续对话在将来会及其重要(be vital in the years to come) ”。最后,把图灵,这个奖项的命名者,认为是只对图灵机感兴趣(as being  exclusively interested in Tauring machines)话,那就错待他了:事实是他对许多领域(many aspects of the field)都有所贡献,并很有可能对这个主题非常感兴趣,尽管可能不是我所说的。

“什么是计算机科学”这个问题实际上是以许多形式展现的,其中之一是:现在的计算机科学是什么?它可以发展成什么样子( What can it develop into)?它应当发展成什么样子?它,将会发展成什么样子( What, will it develop into)?

对这所有的问题不可能给出一个精准的答案。许多年以前,一位杰出的数学家写了一本书《什么是数学》(What is Mathematics),在书里他没有在任何地方试图去对数学这个名词下定义(nowhere did he try to define mathematics)他只是写数学(wrote mathematics)。尽管你们可能现在或以后发现数学的某些方面的定义非常之尖锐(sharply),大家之于数学都普遍同意的唯一一点是:“数学就是数学家在干的活”(Mathematics is what mathematician’s do),也可以这么说“数学家就是那些鼓捣数学的家伙”(Mathematicim’s are people who do mthematics)。对数学的这种真实定义也适用于其它许多领域:在该领域通常是没有客套的,也没有尖锐的定义(no dear, sharp definition)(译注:中庸的定义?)

该种困难绊住了许多人,有时候我自己也感到困惑,感觉我们应当忽略讨论而去摸着石头过河(

feel  that we should ignore the discussion and get on with doing it.)。但就像George Forsyths在最近的文章中所指出的【参见2】,在华盛顿特区的人所想的计算机科学的样子是很有影响的。根据他所述,他们倾向于认为这是应用数学的一部分,从而会求助于数学家以作为基金准予之建言。且在其它许多领域这种差异不是巨大的:在工业界以及大学你还可以常常看到计算刚开始时的踪迹(traces of where computing first  started),无论电子工程,物理,数学,甚至是商业。 很显然,人们对某一主题所拥有的图景将会显著的影响到其之后的发展。因此,尽管我们不可能期望给给该问题以最终解决(we cannot hope to set the question definitively),我们应当经常的去检验(examine ),以及发表我们关于“我们的主题是什么,以及应当会变成什么”的看法(air views )。

从许多角度来说,对我而言,探讨一些小的,计算机科学方面的技术点,这肯定更加的容易,更加的能令人满足。但有一件事我特别想强调一下 :迷失于该领域的细节之危险(the danger of getting lost in the details of the field),特别是在将来的那种“名副其实的暴风雪一般的论文在每个月的期刊上出现的(here will be a veritable blizzard of papers appearing each month in the journals)”日子。我们必须对该领域的广泛训练给予充份考虑 ,该领域直面不断增加的关于专门化的更高需求以获取一个论点问题(a thesis problem),发行许多论文等等。我们需要提前为我们的学生作预备(译注:预则立,不预则废), 在2000年的时候,他/她们中的许多会站在其事业的巅峰。对我而言计算机科学较之其它许多领域 “专门化导致肤浅”这句话更加的真实。

我敢确定你们都听说过我们的科学只是每15年到17年就会倍增(doubling)。我强烈的认该速率在计算机科学领域要高出许多;在过去的15年中也一定很高。在我们所有的计划中, 我们必须正视这种信息的增长(take this growth of information into account),并切身的(in a very real sense )了解到我们所面对的“半无限”(semi-infnite)的知识数量。在许多领域里,指称一个学者的经典观念是他/她知晓至少90%的相关领域知识,这时一个正在消亡的观念(译注:今天指称一个人为学者的依凭是什么?)。越来越窄的专门化不是答案(译注:对此杨叔子院士一定有话要所),因为在过去困难在于领域之间相互交融趋势的快速增长(in part the difficulty is in the rapid growth of the interrelationship between fields. )。我的私人意见是我们需要将相对更多的精力放在质量上,而不是数量上,且仔细严谨,深思熟虑的评审文献常常对于“提升领域”会较之新的不重要的材料更加的重要。

我们生活在一个有阴影的世界中(译注:越南战争在这期间将美国拖入了谷底,故作者有此说,大环境使然),但为了争论, 实际上更是为了进行非黑即白的二分化思考之必要。这样做当然会撼动真相(do violence to the truth), 但看上去没有其他什么办法。因此我相信你们会这样来考虑我的些微差异, 我不相信我自己,但看上去没有其它什么简单的方式讨论这个话题了。

比如, 请允许我在科学与技术之间做一个粗浅的区分,科学就是关心什么是可能的( is concerned with what is possible),工程就是关心选择( while engineering is concerned with choosing ),来自于许多可能的方式下的选择,其中之一符合一系列常常是没有准确表述的(poorly  stated )经济上的以及实际上的对象。我们所称计算机科学的领域,我认为更准确的标签应当是“计算机工程”,若非如此,很容易引起误解(were not  this  too likely to be misunderstood)。我们所做的大多数工作不是“这是否能完成”这样类型的问题,而是找寻到实际方案的一类问题(it is a question of finding a practical  way)。这不是能否存在一个监控系统,算法,排产器或者编译器这种类型的问题,这是一类“找到实际的可工作的关乎时间以及效率的合理支出”这样的问题。虽然我不会把“计算机科学”的名字改成“计算机工程”,我将乐见其成的看到一个我们所教授的更加实际的,工程的品位(flavor)而非我常在课程大纲中所见到的那种。

我们所以强调实践(stress the practical side)还有第二个原因。在我可以看到的将来,计算机科学系将需要大量的资金。现在的社会通常会,尽管不是长长,更愿意投入资金到有实际可见的回报之时,而非被其认为不实际的活动,娱乐游戏等等。如果我们想要获取大量资金的话,我相信我们之后最好给我们的领域设定一个实践的品位。你们中许多人对此非常清楚,我们喝稀饭已经有好多年了(we have already acquired a bad reputation in many areas)。这当然也有例外, 但你们都知道到目前为止我们在因应软件需求方面有多贫乏(译注:外部环境良好,没有来自他国的压力,这方面我国就很不相同了;译者陋见,我们更要加强计算机工程的教育)。

计算机科学的核心存在着一种技术设备,就是计算机器(the computing machine)。若没有这种机器的话,那我们所做的几乎就都会是水中捞月了(idle speculation),那就会和声名狼藉的中世纪学究没有什么分别了。ACM的建立者清晰的认识到大多数我们所做的,或者即将做的,依赖于该技术设备,故他们特意冠名,名之曰:机器(machinery)。有一些人想消灭,“从相对于现实而言的绝对自由角度去说的”世界,但是到目前为止他们都失败了(译注:?)。我不后悔最初的选择。我仍旧认为对我们而言“认识到计算机,信息处理机器是我们领域的夯实地基”这一点是很重要的。

那我们如何来产生这种我所期望的实践的品位,以及如何产生“急现时社会所急”的名声(the reputation for delivering what society needs at the time it is needed)?可能最重要的是我们的营生方式以及我们的教学(teaching),尽管我们所做的研究也是非常重要的。我们需要避免对“无用”的自夸(avoid the bragging of  uselessness )(译注:那是科学干的事),以及避免纯数学家通常介入的所谓游戏(game-playing)。无论纯数学家“今日完全没用的无用之学,明日会有其用处”的说法是否正确(在当前情况下,我很怀疑这种说法),为续该领域的增长所需的大量资金需要的宣传粒度实在是杯水车薪(simply poor propaganda for)。我们应当避免将计算机科学看作是纯数学:我们可接受的准绳应当是真实世界,而不是雅典。

当我设立计算机科学大纲时,我会较之课程68体系(译注:参见1)而言,给实验课程更多的强调,而且,我要求每一个主修计算机科学的,未毕业的或者已毕业的人,参与到“设计,构建,调试, 以及对一个合理大小的程序进行文档化, 这个程序可能是一个模拟器,或者一个对特定机器而言的简化编译器”的实验课程中来。结果是基于“编程风格,特定效率, 避免程序缺陷, 文档”的判断。如果这几点中任一表现过差,我是不会让候选人PASS的。在判断他的工作时,我们应当明确的在表面的聪智(superficial cleverness)和真实的理解之间进行区分。聪智在过去是必要的(essential);但不再是充份的了(sufficient)。

这,也是我对除了计算机科学以及数学之外的一些领域中作为辅修的要求。若没有使用计算机以或缺有用结果的真实经验话,计算机科学主修就会倾向于(is apt to)知道所有大名鼎鼎的工具,但是不知道怎么使用它。若如此,那只是技术人员,精于操作(译注:唯手熟尔),但是却对如何以及何时为其基础意图去使用所知甚少(with little sense of how and when to use it for its basic purposes )。我认为我们应当避免产出(turning out)更多的背书型专家(idiot savants) -- 我们已经有足够的“computniks(译注:具有计算机特征的**)”让我们够受一阵子了。我们需要的是专业(professionals)!

课程 68认识到了这种真实的(true-to-life)需要,所以说道“这可以通过暑期(summer  employment)雇佣,工作学习计划之间的协调(a cooperative workstudy  program), 计算机中心的临时雇佣,有特色的项目课程( special projects courses),或者其它适宜的意义上来安排”。我的建议是,一个适宜的尺度(meters )就是在你们控制之下的严格的实验课程,而且上面委员会的建议很少会凑效或者令人满意的(译注:HAMMING的演讲对象是?)。

在决定一个计算机科学课程时可能最恼人的问题就是去决定那些把该领域作为主修的人所需的数学课程了。我们中的许多人之于计算是带有强烈数学背景介入的,因之自然倾向于认为所有人都需要许多数学。(译注:民各有所好,但肯定不是西方所能欣赏的观念)。很多时候老师总是试图使学生也变成他那样(make the student into a copy of himself)。但很容易看出,在过去许许多多高阶(highly rated )软件人,尽管他/她们中的许多人看上去有天生的数学才能 (就像它应该是这样,而非被教成的样子),但却是不屑于中规中矩的数学的。

以前我讲到过如果需要强的数学背景才能介入计算机科学领域话就会排除掉许多该领域内的杰出人士。不过,随着排产(scheduling)以及分配计算资源(allocating of the resources of the computer)之重要性的来临,我不得不重新考虑我先前的主张。随着一些迹象显示这些之中的一部分会被合并到(be incorporated into)硬件之中, 我发现“不会有一长段时间(意思是至少5年)在软件中许多排产以及资源的分配 (there will not be for a long time a lot of scheduling and allocating of resources in software)”是难以置信的。如果模式就是这样的话,那么我们需要在该领域内进行训练。如果我们没有这样的训练, 那么计算机科学的主修生会发现他是一个“仅仅对其他人告诉他要编的程序的”技术人员。更有甚者, 程序的类型在过去被视为是极大依赖于聪慧以及工巧,并且需要一点或者就是不需要规范的数学。这个阶段看来正在成为过去, 而且我不得不相信在未来,拥有一个良好的数学背景是必须的,如果我们的毕业生要从事有重大意义的工作的话。

历史告诉我们相对的,只有少数人在他们30多岁时候还可以学习数学,就更别提生命中以后的岁月了;所以,如果数学在将来要扮演一个显要的角色, 那我们就需要当学生还在中学的时候,就给他/她们更多的数学训练(译注:译者陋见,我们国情不一样,需要更多的是数学思想而非算术训练)。我们当然可以通过提供两条路径来规避(evade)资金问题,一条是数学,另一条则是没有数学, 不过要事前警告:就未来的大学教育所关注而言(as further university training is  concerned),没有数学的那条路到目前为止是死胡同(假设我们认为数学对于计算机科学的高阶训练是本质必须的话)。

一旦我们同意需要许多数学的话, 那么随之而来的更加困难的任务就是指明何种课程。尽管众多分析师(analyst)宣称他们领域的本质重要性(the fundamental importance ),数量惊人的计算机科学领域 活动却相对需要更少(译注:对fundamental importance 的宣称么?)。但我认为我们可以捍卫“每个主修计算机科学的人至少需要参与到该领域的一门课程中来(that every computer science major take at least one course in the  field. )”的需求。我们的困难可能在于这样的事实:目前正式的数学课程的安排不适用于我们的需要,就如我们所见。看上去我们需要一些抽象代数(abstract algebra);一些排队理论( queuing theory);大量的包含了实验设计的统计学(statistics);以及适量的概率论(probability),可能还有一些马尔可夫链的元素;一部分信息与编码理论(译注:香农信息论论及);少部分的带宽 (bandwidth) 以及信号速率(signaling rates),以及一些图论(graph theory)等等,但我们也知道该领域变化不息,所以明天我们可能需要复变数(complex variables)(译注:复分析是一个较接近的概念),拓扑(topology)以及其它主题。

像我所过的那样,对数学课程的计划很可能是设计课程体系中最恼人的部分了(the planning of the mathematics courses is probably the most vexing part of the curriculum.)。在对这事三思之后,我现在觉得若我们的毕业生想要取得重大贡献,并不会被限制在“就运行被告知应当运行的工具 而言的”技术员水平上的话 (译注:似乎依稀看到了钱学森之问的答案) ,那么就要给他们尽可能多的数学而不是尽可能少的数学。我太清楚的知道这将会排除掉许多在过去做出过贡献的人, 我也很不乐意于我的结论,但事实就是这样。在未来, 计算机科学领域的成功倾向于需要对数学的熟练掌握(a command of)。

一个常见的关于计算机科学课程的抱怨是它们似乎完全对商业应用和COBOL视而不见。我认为关于该应用是如何如何的重要不会是个问题, 类似CoboL 这样的语言使用范围是多么多么广泛也不会是个问题,是否应当在计算机科学系进行教授的准绳,我认为存在于“商业管理系是否可以做的比我们更好”, 也存在于“对商业应用而言是特殊宝贵的东西是否对于计算机科学的其它领域亦然(fundamental)”之中。我对商用程序之应用的意见是(what I have indicated about),我相信,对大多数其它领域的应用之学习而言,这是可以在其它系完成的。我抱有强烈的感觉,就是以我们所有的有限资源,看样子还要熬上一大段时间,我们不应当试图在计算机科学系进行计算机应用的教育(should not attempt teach applications of computers  in the  computer science department), 而是说,这些应用应当由相应的系在它们原本的环境下受教育。

对计算机科学的课程中的模拟计算的角色问题(The problem of the role of analog computation)

和“特定领域的应用”不是很相似,这是由于确实没有其它什么地方让它可去了。对“ 模拟计算机(analog computers)在经济上是重要的并且会持续上一段时间”这一点是没多少疑问的。但是在“即便包括了混合计算机(hybrid computers)”的领域的争论也是很少的,还不似数字计算机那般思想混乱( intellectual  ferment)。进一步而言, 好的模拟计算的本质在于便于理解设备的物理限制,以及为缩放所特有的艺术(in the peculiar art of scaling), 特别就时间变量(time variable)而言, 对剩下的计算机科学而言尤其陌生。因此它就倾向于被忽视而不是被拒绝(to be ignored rather than to be rejected);它既不能教授也不能被选修(either not taught or else it is an elective),而且,当兴趣的中心是通用数字计算机(general purpose digital computer)时, 这可能是目前我们所能期望的最好结局了。

目前在计算机科学的许多课程中都有一种游戏的品位(a flavor of "game-playing" )。我反复从那些希望招到好的软件人才的朋友那里听说“他们发现所招的计算机科学专家不是他们所想要的”。他们的经验所得是从我们的流程(programs)走出去的毕业生看上去好像主要的兴趣是玩游戏(playing games),做一些没什么实际用途的小玩意(fancy programs, w writing trick programs)之类的,所以没发对其“据他们自己所称的他们会及时以实际形式完成”的努力进行训练(unable to discipline their own efforts)(译注:南辕北辙,作无用功)。要是我只是从我的一个“幻想他只是一个极端理性的工程师(who fancied that he was a hard-boiled engineer)”的朋友的口中听闻这个抱怨之声的话,那我就会听过算过,但不幸的是,我却从一大群有能力且理解力强的智力人物那里也听说过这事(译注:指 flavor of "game-playing")。我早先已近说过, 既然我们有这样的“支持当前和未来的设备扩张”需求,那我们就最好考虑我们怎样才能避免对我们的在将来的日子里毕业生产生这种论调(avoid such remarks)。我们还要继续制造一种在许多领域都不想要的产品么?或者这么问:我们需要培养负责的、高效的、能真正急社会所急的人才么?但愿对后者的选择大量增加;因此,我强调的是,计算机科学的实践层面(practical aspects)。

强调计算机科学的实践层面. . . . .我们培养的计算机科学家之所以对精巧的(cute)程序之关注超过了对结果的关注的一个原因是,我们许多的课程是由那些追求纯数学直觉的人来教授的。请允许我作另一个粗浅的区分,这可能只在一定意义上是真的。纯数学是源于一个给定的问题的,或者是源于他从给定问题所作出的某些变换,他所述的结果就是答案。在应用数学中,还需要加上两个关键步骤 (1)对数学模型之于实际情况的相关性要做检验(an examination of the relevance of the mathe matical model to the actual situation), (2) 相关性,或者如果你们愿意这样解释的话,数学模型的结果反馈到原初情形(the results of the mathematical model back to the original situaition )。这里存在这尖锐的差异:应用数学铁定愿意这样宣称“如果你这样做了并继续下去,你会看到这种非常接近,所以你就有正当理由去花钱或者努力下去了,就像表明的一样去做这工作好了 ”(stake part of his reputation on the remark);而此时, 数学家通常会耸耸肩并说道“这可不是我的责任(responsibility)”。一定要有一些人担负起决定走这条亦或是那条路的责任,假设这种职责的人,于我而言看上去会取得更大信誉,平均而论,这只能被社会所救济(be doled  out)(?)。因此我们需要,在我们的计算机科学教育中,强调对整个问题的责任假设,而非仅仅精巧的数学那部分。这就是“我为什么强调工程的不同主题方面,并试图把纯数学层面限制到最小”的另外一个原因。

困难当然就是我们在计算机系里面的这么多教师是纯数学家,而纯数学又是相对于应用工作而言容易教授的(译注:对此译者持怀疑态度)。只有相对少数的教师可以进行我所要球的那种教授。这意味着我们必须全力以赴(we must do the best we can with what we have),不过我们应当留心我们所努力的方向(be conscious of the direction we want to take )以及我们所想要的,在可能地地方, 给以一个负责任的、工程的实践品位,而不仅仅是结果存在(existence of results)。(译注:刻舟求剑?)

不幸的是在计算机科学的早期阶段,是才华和能力(talent and ability)在主导着汪洋细节(a sea of minutiae),这是成功的关键。但是如果学生成长成为可以独当一面的处理计算机科学的更大层面话,那么他就必须、以及培养出(develop)其它的“不为早先阶段所使用或者练习的”才华。我们许多的毕业生从不会达到这个第二阶段。这种情形很类似于数学领域:在早先几年中,为所必需的算术以及代数的形式逻辑操纵的琐碎细节所困扰,但是胜任高阶数学所需要的,是完全不同的才能。如我所述, 计算机科学中的许多“在细节所统摄的领域里榜上有名(make their mark)”的人,却不会发展出更高的才能, 他们仍旧在螺丝壳里做道场(still around teaching and propagating their brand of detail)。高阶计算机科学所需要的不是“非黑即白”的心态,这也同样可以用于描述数学,所需要的是用于刻画工程的在目标有冲突时的平衡与判断能力(the judgment and balancing of conflicting aims that characterize engineering.)

到目前为止,我回避了(skirted)软件领域,或者像我的一个朋友曾经和我说过的“临时方针(adhocery)”。在他对软件作为临时方针的描绘中有如此多的真相,以至于在讨论到“在软件课程中应该教授什么”该主题时候,会使人很为难(There is so much truth in his characterization of software as adhocery that it is embarrassing to discuss the topic of what to teach in software courses.)。我们所做的许多工作已经变成是三分钟热度了(has been in an ad hoc fashion),而且我们很有点来自“让某些事尽快去做的”压力,这在先前是很少的(译注:无欲速,欲速不达),这有“带怀疑论眼光的科学家或工程师所说”为证(stand examination  by):“软件里有什么干货么?”。在这个领域里要把握的困难概念之稀少若此!没有审慎的分析就仅仅在细节上日复一日的下功夫,这又如此之多(How much is mere piling on of detail after detail without any careful analysis)!且当50,000个单词的编译器之后用大约5000个单词重构(remade)了时,这离重构前的合理所需又是何其遥远!

我已经不再是一个软件专家了,所以让我来对“在软件领域里面要做些什么”进行严肃的考评实在为难了(译注:不在其位,不谋其道),不过我感觉到我们对于“我们对自己犯下的,以及所作出的这么低的品质(with such a low level of quality that we have done ourselves harm in the process.)”好像还是太容易满足了。我们看上去不会使用(not to be able to)这个机器,这么一个“我们都相信用于操纵和转换信息是非常有力的”工具,在这个特定领域做我们自己的工作。我们已经有编译器,汇编机器(assembler),监控器等等,就其它而言,当我检查典型的软件人做的是什么时, 我通常被“他在自己的工作中使用这个机器如此的少”给吓到了。我已经掌握了足够的辅修且获得成绩的人,可以和软件人进行论争 (I have had enough minor successes in arguments with software people)(译注:请教大家minor successes 这样翻译托当否?):在我坚持“我们应当在几乎所有我们在做的阶段里学习去使用这个机器(we should learn to use the machine at almost every stage of what we are doing)”这一点上面我是基本正确的。太少有软件人在他们自己的工作中试图去使用机器了。对于“小小机器计算可以极大的帮助程序员的地方”,有一打这样的情形。我记得有一个非常简单的这么一个东西,一个非专业人士(nonexpert)外头搞到一段非常长的FORTRAN 程序,他希望将其转换到我们本地使用(convert it to our local use),所以他就写了一个简单的FORTRAN 程序,对“所有的输入输出状态,以及库引用”作了说明。在我的印象中, 大多数程序员都会去检视(personally  scanned)程序长长的列表,以发现它们,并由于人不完美的天性而在第一次遗漏了一个括号(couple ?)。我认为我们需要说服计算机专家相信机器是它最得力的工具,而且他应当尽其所能的去学习它,而不是人为的去扫描长长的列表, 这却是我走遍全国所普遍看到的情形。如果我所陈述都是真的话,那我们关于这个的教育在过去就是失败的。当然,是有一些最杰出的人在以我所推荐的方式去使用计算机;我的观察是普遍的程序员(run-of-the-mill)不是这么做的。

对当下教授编程的方法做一个拙劣的模仿(parody),我们给初学者一本语法书和一本字典,然后就告诉说他们现在是伟大的作家了(great writers)。我们很少,如果有的话, 给他们任何严肃的且是与时俱进的(in style)训练。实际上我已经观察“风格指南(a Manual of Style),以及有时候,好的运行编程集(an Anthology of)”的表现(appearance)好几年了,不过至今没有发现。就像写作一样, 编程是一个艰难复杂的艺术(programming is a difficult and complex art)。在写作与编程中,紧凑(compactness )是令人向往的,不过在进行这两种活动时,都容易陷入过度的缩减(译注:过犹不及)。当你们考虑我们是怎样教授的一个良好写作 ,“ 练习,作文,学生在他的英语训练中所给出的话题以及教师对其品评(is graded on by)”,  看上去我们在教授编程风格中却很糊涂(very remiss)。不幸的是只有少数程序员承认,在我所说的“风格”中确乎有那么一些东西对于“他们感觉的成形,以及似曾相识的感觉(to give specific examples)”是有助益的(are willing to formulate)。作为结果,少数的程序员写出流动的诗歌旋律(flowing poetry) ;大多数写出的是蹒跚颠簸的平调(halting prose)。

我认为(I doubt)编程风格是和任何特定机器、语言的联系相当的紧密, 任何用一种自然语言作出的,被认为是好的书写方式在另一种语言中就是另外一回事了。当然会存在特定的方言,以及“更倾向于使用这种方式而不是那种方式去表达的” 某语言中的弯弯道道的细节,但一个所谓“好的写作”的基本要件(essentials)看上去要超过我所熟悉的西欧语言(Western European languages)的差异(译注:很难对其下定义?)。而且我认为(And I doubt)对大多数这年头可以得到的通用数字计算机而言,差异更大(it is much different for most general purpose digital machines)。

由于我声称我们需要更多的工程品位而不是科学品位 (more of an engineering flavor and less of a science one) ,我可能会被误解(Since I am apt to be misunderstood),我可能需要指出我本人是以一个获得纯数学领域里哲学博士学位这么一个身份介入到计算机科学来的。当我要求软件领域里的训练需要更多的实践、工程的品位之时,我也要大声呼告:我们对自己在做的到底是什么知之甚少(we have too little understanding of what we are doing),而且我们及其渴望相关理论的壮大(译注:译者陋见,当下的云计算很适用Hamming振聋发聩的这段呼告)。

事实上,我之于计算邻域的一个主要诉求(complaints)是和牛顿的话反着说的,他说过“如果说我看的比别人远了点,那是因为我站在巨人的肩膀上(If I have seen a little farther than others it is because I have stood on the shoulders of giants)”,我不得不说,“今天我们是站在你我大家脚上(Today we stand on each other’s feet.)”。可能我们在计算机科学领驭所面对的核心问题是 我们怎样才能达到一种“可以在其他人的工作上进行构建,而不是仅以有琐碎差异的方式进行重复工作(where we build on top of the work of others rather than redoing so much of it in a trivially different way)”的这么一个境地。科学被认为是累积的,而非无止尽的重复相同类型的事。

这把我引向另一个差异(distinction),一个在乎“非直接研究和基础研究(between undirected research and basic research)”之间的差异。每个人都喜欢做非直接研究,而且大多数人喜欢去相信说:非直接研究就是基础研究(like to believe that undirected research is basic research)。我倾向于把基础研究定义为“未来的人们会把他们的许多工作放在我们现在做的工作之上”(being work upon which people will in the future base a lot of their work)。话说回来,如果不用“那种其后许多工作会基于先前所做的这个工作”这样一种方式去指称基础研究,那还能有什么其它东西让我们可以去对“基础研究(basic research )”做合理的指称呢?我相信经验已近显示说只有相对的少数人能够从事基础研究。虽然某人不能确定某特定工作会否成为未来的一个基础,不过他还是常常可以对产出给一个相对精确的估计。基于(Upon)检视了基础研究之性质方面的问题,我已经可以总结了(I have come to the conclusion that):何者决定了一种工作有否可能有更大的机会博得一个基础地位 (what determines whether or not a piece of work has much chance to become basic ),这一点和问题“就是用这种方式去应对问题(it is the way the problem is attacked)”不是同一类的。

数值分析(Numerical analysis)由于有其自身价值,所以 广泛的被接受,故是我们课程体系中的一个有价值的部分。但是(Yet)“许多教科书是为数学家写的(many of the textbooks are written for mathematicians )”这么一个现象还是常常有些道理在其中的(all too often there is some justice in the remark),而且实际上是包含了相对“他们实际进行的计算”而言的,过多的数学运算了。之所以如此,当然是因为该领域(译注:似指纯数学领域)内的许多“ 对他们头脑里的数学仍旧没有一个不甚明确的标准(who still have the unconscious standards of mathematics in the back of their minds)的” 数学家都作了转变了(are converted), 或者甚至只是部分进行了这种转变(partially converted)。我敢肯定,你们中的许多人很了解我的异议【参见3】,我在这里就不会重复它们了。

我已经注意到有那么些人(It has been remarked to me by several persons),而且我也已经察知,在计划的计算机科学课程体系(the proposed computer science curriculum)中 已经加入了(are padded)许多课程(courses)。它们常常是表现出要覆盖所有细节(every detail),而不是将自己限制在主题思想之中(confining themselves to the main ideas)。我们无需教授每一种方法以找到一个函数的实数0:我们的所需是教授少量典型的“即有效,又能够阐明数值分析中的基础概念”的那么一些方法。而且我刚刚才说道的关于数值分析的那些东西对软件课程来说是更需要的(goes even more for)。对我(以及有些人)而言,好像看不出有足够的“之于我们所知的软件的”基础性观念(fundamental  ideas)让我可以 对 花在这个主题上的大量时间作出解释(译注:当时的软件似乎没有什么内容,HAMMING 担心言之无物吧)。我们应当对我们所教授的进行这样的定义,在观念之中什么才是重要的(which is important in ideas ),而且“无意识的围绕在大量琐碎细节之中的活动 (the plodding through a mass of minutiae )”这样的技术是应当避免的。

请允许我现在把主题转到有些微妙的道德问题上来。一系列场合中已经观察到这么一种现象:在“计算站记账(accounting installations)”方面的程序员伦理行为(ethical behavior 还有许多要向训练有素的会计人员学习【参见4】。我们看上去可不要把“神坛上的”信息教授给个人和私人公司的(We seem not to teach the "sacredness" of information about people and private company material.)。我对计算机专家的有限观察是他们对这些事只是偶尔会过过脑(only the slightest regard for)。比如,大多数程序员理所当然的认为,在他们换雇主的时候,他们有权利拿走任何他们希望的程序。我们应当考虑(look at)伦理准则是如何被纳入到(how ethical standards are incorporated into)传统的会计课程的(其它地方也是这样),并依样画葫芦一般的记下来,因为它们会产出一个较我们所做的更加道德的产品(a more ethical product than we do)。我们在公众场合已经谈论许多关于大数据银行个人记录安全方面的风险了(the dangers of large data banks of personnel records),但我们在“教导我们自己的计算机科学主修生(indoctrination of our own computer science majors)”层面却又不进行分享了。

跟着这条主线下来,请允许我简短的对所谓专业标准做一些品评。我们目前有一个这样的标准【参见:5】,在我看来不错,不过我再次感到我有充份的理由问这样的问题:这怎样才能纳入到我们培养学生的总体目标中(how this is being incorporated into the training of our students)?他/她们怎么学才可能某一天会表现出这个标准所要求的样子(how they are to learn to behave that way)?当然让班级每天早上阅读它是不够的;伦理的以及专业的表现行为两者都不能以那种方式进行有效的教育。有大量证据显示说,其它专业确实会设法去与其学生就该专业的标准一事进行交流,虽然不总是指每一个学生,而且肯定要比我们当下给我们专业的学生所提供的要人性化的多(a lot better instilled)。再一次的,我们需要检查他们是如何做这种培养的,并为我所用(try to adapt their methods to our needs)。

最后,请允许我简要的提及常常被讨论的社会责任的话题。我们有会议期间的关于这个话题的会话(have sessions at meetings on this topic), 我们在大厅里、在咖啡吧里、在啤酒屋里讨论它, 但我又一次要问:它怎样才能包含进我们的培养计划中来?“我们无规可依( we do not have exact rules to follow)”的事实不是“忽略在这个事情上的培养”的充份原因。

我觉得“伦理、专业表现、社会责任”这三个主题,必须整合到计算机科学体系里面来。我个人不相信这些主题如果单独开课会有什么效果( do not believe that a separate course on these topics will be effective)。从我对教授这种类型的事的为数不多的所知来看, “例子,以及教授本人的行为”是最好的教授办法(they can best be taught by example)(译注:译者陋见,以身作责从来就是最好的教育方式)。他们只是在临时(odd moments)被以“通过教授的评论发言(phrases his remarks ),以及自控”的方式教授。从而教授本人必须首先对其所扮演的教授角色在“在这些微妙难懂的地方上的交流(in communicating these delicate)”方面之重要性有清晰认识,而且他没有理由这么说“它们不关我的事”。这些事必须在所有时间,对所有人不断的进行教育,或者和它们有关的一切都不要教。而且,若它们不是以某种方式上教给我们的主修学生话,那么我们这个领域还是只能喝稀饭(the field  will justly keep its present reputation )(如果你问问其他系你的大学同学的坦诚的意见话,你可能会被吓一跳的)。

最后,请允许我转到计算机科学领域的合理远景上去(a reasonable perspective of)。这个邻域相当之新,必须把持跟进才不会落下(had to run constantly just to keep up),而且时间已近不多了,而关于我们所知的东西要讲的还有许多, 容我日后再说。但至少在大学里我们最终还是达到了:我们已近建立起来了独立的科系,合理的课程,教员以及设备。我们现在已经有了一个好的开始, 是时候深化、强化、进化我们的领域了,这样我们就会自豪于“我们所教的,我们怎么教,以及我们所培养出来的学生”了。我们不是要忙于(engaged in)生成技术员,背书专家, 具有计算机特征的**;我们都知道在这个现代复杂社会中我们必须培养出能适应飞速发展的社会所需的人才(play responsible major roles),或者说,我们必须承认我们在这个激动人心的,重要的领域 --计算机科学,没有担起为人师的责任。

 

【1】A Report of the ACM Curriculum Committee on computer Science ; Comm ACM 11.3 (Mar 1968) 151-197

【2】Forsythe G.E. What to do till the computer scientist comes. Am. Math. Monthly 75,5 (May 1968) 454-461

【3】HAMMING , R.W. Numerical analysis vs. msthematics. Science 148 (Apr. 1965), 473-475.

【4】CAREY, J. L., AND DOHERTY, W.A. Ethical Standards of the Accounting Profession. Am. Inst. CPAs., 1906.

【5】Comm. ACM 11, 3 (Mar. 1968), 198-220.

-------------------------

译注:感谢先进人机通信技术联合实验室提供历届图灵奖得主简介以及演讲稿,本文译自1968年图灵奖得主 R.W.HAMMING  当年的演讲稿。         

(完)

You Might Also Like