计算机科学不等于数学

jopen 10年前

        英文原文:Computer Science is Not Math

        译者:姚睿@大隐于微博

        一些程序员认为“计算机科学就是数学”。诚然,计算机科学是数学的一个分支学科,而如今我们认为,这种作为计算机科学基础的分支应当是“理论计算机科学“。如 Alonzo Church 的“λ-演算”和 Alan Turing 的图灵机,他们为计算机提供了理论基础。当时,二人都自认为是数学家,并明确地从事数学工作。那么如果计算机科学的基础是数学,整个计算机科学怎么不是数学?

        简单说来,计算机科学的发展要远胜于他的纯理论根基的发展。人们发明了真实的计算机,它不再只是理论上的机器,这样一来,人们必须面对复杂麻烦 的设计、实现、编程以及应用,在这些领域的研究同样属于计算机科学。我对计算机科学的工作定义是:一切皆是在抽象或实现层面的计算。

        我认为数学、计算机科学及其理论基础之间的关系见下图:

计算机科学不等于数学

        露营伙伴

        与物理学相似,我们也有两个阵营:理论和实验。然而这两大阵营的关系并不像在物理学中的那样。在物理学中,实验师的工作通常是验证理论家提出的理论。如果实验师走在了理论家前面,即实验师发现了现有理论无法解释的结果,理论家就必须提出新的理论来解释新的实验结果。

        计算机科学中并不存在“我解释你的结果”和“我检验你的理论”的这种关系。所谓的实验师在这里被称为系统研究员,当一个理论计算机科学家证明了矩阵乘法的时间复杂度是O(n^2.3727),一个系统研究员就永远不会得出相悖于这个理论的结果,这位理论家发现了一个数学真相——没错,我直白地使用“数学”一词。

        系统研究员所要做的,就是证明这一理论结果虽然看起来很有趣,但真实的系统无法因此受益。我们(我把自己归为这一阵营)设计和实现新的系统,并从中了解什么是可行的、什么是有用的。

        计算机科学理论家和系统研究员并不独立地工作。我擅长数学和理论,以至于我了解自己什么时候在这两方面做得不够好。在曾经参与的一个项目中,为 了解决一个有趣的系统问题,我需要一个复杂的模型,这超出了我的能力范围。这时跟我一同工作的理论人员就得向我了解信息,例如我们经过可靠测量可以从系统 中得到哪些信息;为了建立模型,还得了解我们的系统能够提供哪些可靠的信息。虽然各自有着非常不同的任务,但我们都在从事“计算机科学”。

        学科点名

        身处系统阵营,我对于整个系统(至少)有一种直觉,从了解编译器将为某一语言的语义生成何种代码,到操作系统在某一负载下如何工作,以及处理器 本身如何执行。我的研究经常得到杂乱的实证结果。宽泛地说,我对提升软件性能感兴趣,那意味着大量的实验、大量的结果和解释。这些过程就不是数学。

        也有人并不只是理论家或系统研究员。我给理论和系统之间划了一道很宽的界线,这样的划分并没有覆盖整个领域,很多人同时从事理论和系统的工作,也可能有人觉得这两类都没有覆盖自己的工作范围。当然,这正是我要说的:计算机科学是一个庞大的学科,远不只是数学。

        有大量的计算机科学家,他们跨越了这条鸿沟,我认为这在编程语言中特别普遍。在编程语言的研究中所得出的结论或许是理论的,而同样的研究人员, 他们能够证明出某些东西,比如一个类型系统,这些人通常即设计语言,又实现了体现理论成果的编译器。总之,理论和系统研究之间的界线并不像在物理学中那样 清晰。

        第二个例子:网络。TCP 拥塞避免算法所负责的部分毫无疑问属于算机科学。也有大量数学推理致力于设计和理解这些算法,然而一切如何实际运转才是真正重要的。这些算法正是设计、实验以及结果解释不断反复再反复的结果。

        若有人简单的认为“计算机科学就是数学”,他们就伤害了这个学科中真心不属于数学的那些领域。我们确实是一直在使用数学推理,但所有的科学和工程都这么做。数学是所有实证学科的共同语言,但他们并不都讲同样的故事。

        除了编程语言和网络,计算机科学还包括操作系统、数据库、人工智能、文件系统和存储系统、处理器设计、图形学、调度学、分布式并行系统等,我无法一一列举,幸而有人这样做了。所有这些领域都不同程度地“使用”数学,甚至有些还产生了理论性非常强的子领域。尽管我同意这其中的一些领域的理论基础可以说是数学。比如,关系代数是数学,同时也是关系型数据库的理论基础。但如果断章取义地说“数据库就是数学”,那就忽略了所有系统层面上的设计和实现,而这些才是使真正的数据库存于世的原因。

        科学!

        要探讨计算机科学的特点,就不能忽略显而易见的事实。它是科学吗?我不会去讨论这个,并非没有这个兴趣,实在是因为有人已经比我做的好了。Cristina Videira Lopes 在她的一篇出色的论文中涉及了这个主题,我从文章中也了解到 Stefan Hanenberg 的一篇论文中有类似的主题。在这个问题上我想说的一切都是源自他们的观点。

        良好初衷

        那些声称“计算机科学就是数学”的人通常初衷都是好的,但他们一般认为计算机科学仅仅是编程,这当然不对。任何曾经指导过新手程序员的人都知道,向新手解释那些偶然的复杂性下面所蕴藏的根本性的东西是多么困难。

        把整个计算机科学的所有学科都称为“数学”过于简单粗暴。与数学相关、根基是数学,这是不错——但是,稍等,把计算机的理论基础同设计以及实现本身分为一类,仍然言之有义。这就是计算机科学。

来自: 伯乐在线