现在的位置: 首页 > 综合 > 正文

这些并不是计算机科学

2013年01月04日 ⁄ 综合 ⁄ 共 4096字 ⁄ 字号 评论关闭

原文地址:这些并不是计算机科学

*本文由IDF实验室志愿者童进翻译,章典校验,原文《What
Computer Science Isn’t》
由匿名作者撰写。

免责声明:我希望这篇文章能清晰的表达我的意图。我绝不是来宣称编程、软件工程、测试、质量管理以及其他实际工作或相关领域没有计算机科学重要。这些高度相关的学科绝对与计算机科学一样重要和有用。相反,我想表达的是,对于计算机科学应该包含什么存在着普遍的误解,这种误解在很大程度上是大众流行文化的产物和普遍的错误认识根深蒂固的结果;特别是构成计算机科学基础的深厚理论核心不能也不应该被忽视。此外,尽管事实上许多学生(包括我上学时)在学习时不能充分理解这个理论,但这完全与其它更注重实践的知识一样重要。

此外,我也并不是想说:不是可计算性理论或复杂性理论的计算机科学领域不是真的计算机科学、完全没有趣味或不值得研究。但是,我真心想指出:人们在几乎所有计算机科学分支上所做的工作组成了”严格意义上的计算机科学”,其他的则是别的领域了。这并不意味着,这些人不是真正的计算机科学家,或在其它领域所做的工作并不重要。例如,我做计算生物学方面的研究。我每天工作的一部分会是计算机科学,一部分是软件设计和编程,一部分是生物学,其中有很多是统计学或其他数学的分支。这些其他工作与我所从事的计算机科学一样有趣、充实和重要,他们只是不属于计算机科学而已。在下面的文章中,我不是要冒犯计算机科学或其它领域的任何人,而是想帮忙澄清公众对计算机科学的误解。

我原本打算将这篇文章的标题定为“什么是计算机科学?”但是给文章起这样一个标题,感觉更像是一本书或者至少是一份声明,而不像一篇博客。相反,我意识到,关于什么不是计算机科学——特别是人们通常错误的与计算机科学混为一团的东西,我是可以写一篇合适篇幅的文章(或者几篇)的。

这里有两个领域是大家经常和计算机科学混淆的,而且是最普遍。第一个(这在家里经常碰到,如果你是计算机科学家,而你有家人不是)就是“技术支持”。例如,人们认为计算机科学是学习特定计算机或软件是如何工作的,以及当它们损坏时如何修理的。因为,事实很可能是:一个典型计算机科学家安装打印机驱动程序可能比一个典型的外行人更顺利,但这与他们在计算机科学方面的正规教育没有任何关系,更多的是因为他们(通常是这样,但并不总是)花了大量的时间与电脑打交道。

然而,将技术支持与计算机科学混为一团虽然很普遍,但并不有趣。特别是它们如此不同,应该很容易清除这种混淆;可能需要一些类比的帮助。有两个很好的例子(一般是对的,但是对于Edgar Dijkstra来说可能不正确),真的是直奔问题的本质:

“计算机科学不是计算机,就与天文学不是望远镜一样。计算机科学的本质和数学是一样的。”

————Michael R. Fellows (1991) “小学中的计算机科学和数学”

以及

“我们想让我们的孩子们————未来的民众————在学校里学习计算机科学的什么知识呢?我们需要消除计算机科学就是计算机的谎言。与天文学关于望远镜、生物关于显微镜、化学关于烧杯和试管一样,计算机科学不是关于电脑的。科学不是一门研究工具的学问,科学研究的是如何运用工具,并研究当我们利用工具时能有什么发现。”

————Micheal R. Fellows, Ian Parberry (1993)

“SIGACT(美国计算机协会算法和计算理论特别兴趣小组)让儿童对计算机科学感兴趣”.

发表于1993年1月的Computing Research News

好了,言外之意就是:总的来说与天文学(或天体物理学)不是望远镜一样,计算机科学不是电脑或“工具”。你也许会猜测一个天体物理学家对望远镜的了解比一个馆员更多,这仅仅因为他们可能会更频繁地使用它们。但是,他们所做事情的核心与使用望远镜本身没有任何关系。计算机科学家和电脑的关系同样如此。

另一件人们通常与计算机科学混为一团的事情是计算机编程(CP),这个需要更细致的区别。这个误解更难纠正,因为绝大多数的计算机科学家会编程。事实上,他们中的许多人经常编程。然而,编程自身并不构成计算机科学。让我用一件事来引出这个区别。

我的指导教授本学期教学时开设了一门新课,叫做“算法与数据结构(针对科学工作者)”。课程的名字应当相当明确的表明教学目的:这个课程的目的是教科学工作者(如技术主管和数学能力强的(研究生)学生)如何理解、开发和分析算法和数据结构。随着计算机技术在不同的科学领域内变得更加流行,对计算机专家的需求不断增加,因此也需要其它领域的科学家对所采用的计算机技术有一个基本理解。所以有很多人对这个课程感兴趣,许多人报了名。

我的一位已经完成了大约3/4课程的助教朋友在午餐谈论中向我提及:学习该课程的很多同学对缺乏编程作业表示担心和困惑。现在的情况是,原来课程教学大纲明确规定课程本身将包括少量的编程作业(大约2次作业),取而代之的是大量的书面作业。而且很明显,课程主要是关于算法的设计和分析——目标是在课程结束后,学生应该能够设计高效的算法以解决他们遇到的问题,并能分析(如证明)这些算法的正确性、描述运行时间。然而,尽管事实上该课程的内容和目标描述得很清晰,我们仍能理解学生的困惑。特别是,那些自身并不是计算机科学家的人(如其它领域的科学家),对计算机科学家就是程序员,计算机科学是编程的想法已经深入人心。

补充说明:为了不歪曲上面的课程或我的看法,我要对上文进行如下澄清:我不会主张学习这门课的人不要去实现算法。事实上,他应该去实现,学生们应该被鼓励这样做。由于人们对“算法设计与分析”的普遍误解,人们报名课程所能学到的东西不同于他们当初预期学习到的东西(也不同于算法设计与分析)这种情况是可以很常见的。构建最短路径算法,并且用大量例子测试验证计算的最短路径是很有效的,它会帮助你理解这个算法。然而,这并不能正式的证明算法的正确性,对正确性的证明与实现一样也很重要。这就是我想在这里说明的:并不是实践不重要(其实他们是极其最重要的),同时理论也不是愚蠢的、迂腐的浪费时间,而是它们自身都是很重要(值得研究)的。此外,课程本身包含编程作业。然而,从作业的量和重点来讲,编程作业没有其他书面作业那么多。

撇开与计算的理论基础之间的关联,真正的编程语言与计算机科学几乎没什么关系,就像天文望远镜和天文学的关系一样。编程语言非常重要,他们的执行速度、表示形式和特性使得构建高效和可扩展的软件会有很大的不同。然而,从计算机科学正确性的角度看,Haskell和BrainF&K是等价的;他们是图灵完备的语言,有能力执行相同的一组计算
*(见下文)。然而,算法作为设计对象和完成特定实现是不一样的。这个认识是理解计算机编程与计算机科学不同的基础。计算机科学是数学:它是研究什么是可计算、什么是有效计算的科学,它是关于有效计算过程的设计和分析。无需了解源代码的特征便可以设计一个算法、证明其正确性、描述它的运行时间,所有这些工作在计算机科学领域都十分吻合,而且都不需要(或掌握)一点编程。现在,为了使设计的算法有用,我们必须实现它,不仅要考虑理论,还要考虑实际因数(例如算法是理论有效的或实际有效?对于现实世界的数据,为了使实施可行,需要做怎样的设计和工程决策?等等)。

所以,尽管编程与随后的程序执行是极为重要的,尽管它们对于大部分计算机科学研究贡献很多,但是这些工作本身不是严格意义上的计算机科学。也许这里我们还能用另一个比喻。计算机科学中的算法设计与分析可能类似于发现伯努利原理(把关于发明与发现的重大哲学讨论放一边),而工程和算法的高效实现(计算机编程)则类似于在这个原理上构建一个机翼。它不是一个很好的比喻(肯定不及望远镜的例子好),但它确实讲述了相互关联但却有千差万别的计算机科学学科与计算机编程之间的重要差异。

不幸的是,我不认为这种混淆会很快消失,因为计算机科学本身就在他们的课堂上继续更严重的混淆计算机科学和计算机编程。这种混淆本身并不坏。事实上,没有设计和构造软件(计算机编程工作)能力的计算机科学专业的毕业生,和有这种能力的相比,被雇用的机会少得多,尽管也许更多的人在读研究生期间会继续做理论工作。然而,这两个学科间的混淆确实使他们间的差别更加难以区分,并且它使得向其它领域的人解释计算机科学是什么、关于什么变得更加困难(例如它不是关于Python、Matlab或一般的编程)。我不知道如何解决这个问题,但我知道它存在而且看起来不会很快消失。

*gasche在Reddit的帖子引用本博客的链接,原文并不能传达我的实际意图。虽然Haskell和BrainF&* K从可计算性理论的角度来看是等价的,并且它们都体现了图灵完备的计算模型,但对于它们间事实存在的的理论差别并不能视而不见。请注意,不论如何,给你一个BrainF&*
K解释器,你可以写出Haskell的编译器(用其它的方法也可以做——参考这里)。很明显,在它们之间存在着现实差别,但正因为此才把这两个例子摆在第一位。我希望在算法和算法实现的不同之间领悟到的,就正如Landau(大O)所言,其核心思想gasche在Reddit上解释得相当不错:

这里传达的想法是:

尽管一个给定的程序在不同的机器上或用不同的编译器,其执行速率可能要快十倍,我们决定把这些细节抽象出来,并观察在大量输入时的执行性能,这样就能排除机器性能和其它技术的影响,给出结论。(当然,有时你在工作时想做更加精确的分析,采用科学的方法做更少的近似估算,如用改良的抽象机器模型做无缓存算法)。

所以论点是,算法描述了进行计算的过程,在很大程度上它独立于任何特定的语言(语义形式),适用于广泛的计算模型。算法的设计和分析直接处理解决方案的可计算性和高效性(渐进性)问题。显然,运用算法来解决现实世界中的问题,具体实现和实现的特性是极为重要的。然而,算法的设计和分析可以独立于任何特定的实现。虽然理论和实践经常被一起研究并协同作用,但它们往往有着不同的目标,有时解决不同的问题。

(全文完)

【上篇】
【下篇】

抱歉!评论已关闭.