什么是计算机科学?在看了SCIP的vedio lecture1A之后,真是有了新的认识。就像Hal Abelson所说,计算机科学是个很”糟糕“的名字:
首先,”它“不是科学(science),它更接近是一种工程学(engineering);
其次,”它“和计算机没有那么大的关系,计算机只是”它“使用的一个工具,就好像物理学不是学习怎么使用粒子加速器,或者几何学不是学习怎么使用测量工具一样。
以几何学类比。它最初确实是在做测量,尤其是土地的测量。但是,随着后续的发展,测量与测量工具逐渐变成了辅助的,不那么紧要的东西。几何学更重要的是在研究”空间(space)“和”时间(time)“。几何学精确的定义、说明了什么是空间。使用几何学的术语,人们可以准确地针对空间进行交流。几何学提供的是一种”声明式(declarative)“的知识,即,它在说明”什么是XXX(what is)“,例如,”什么是X的平方根“。
那么我们口中的计算机科学到底是什么?我们可以从两个角度来理解它。
第一,它研究的是”处理过程(Process)“。在这方面,它在精确的定义、说明怎么样完成一件事情。使用计算机的术语,人们可以准确的针对做一件事情的过程进行交流。计算机科学提供的是一种”命令式(imperative)“的知识,即,它在说明”怎么做XXX(how to)“,例如,”怎么计算x的平方根“。这也是我们对算法的定义。计算机科学使用程序设计语言来精确地描述这些命令式的知识。任何一个程序设计语言,我们都可以从以下三个方面来考察它:
- 它提供了哪些原子(primitive,包括数据和procedure);
- 它提供了哪些组合这些原子的方式;
- 它提供了哪些抽象方式,使得复杂的“组合”可以被方便的命名、使用,就像内置的原子一样。
第二,计算机是一种工程技术,我们在用这个技术建造及其复杂的系统。这些系统是思想(ideas)的系统,而不是实际的某个物理系统,它们仅仅受到思想的制约。计算机科学关注的第二个方面,就是”控制复杂度的技术(Techniques of Controlling Complexity)“。在计算机里面,常用的控制复杂度的技术包括以下三个:
- 抽象(black-box abstraction):我们不断地将系统的一个部分做抽象,将它抽象成一个有确定行为的实体,通过抽象掩盖实现它的细节。例如,我们可以把求x平方根的算法抽象成一个实体。在建造更大的系统的时候,你不需要知道这个实体是如何实现的,只要知道它能求平方根就可以了。我们通过一层层的抽象,来控制每一层的复杂度。
- 公约的接口(conventional interfaces):这一层主要的思想是模块化,每个模块通过确定的接口与其它部分进行交互。面向对象思想和逻辑编程的思想是两种重要的接口公约的形式。
- 语言(metalinguist abstraction):通过为问题抽象、定义新的语言,来达到掩盖不重要的方面,突出另一些重点关注的方面的目的。
强烈推荐一下SICP及其vedio lectures。假如能够在刚刚开始学习计算机的时候,接触到这种课程,那是多么幸运。只可惜,7年前我错过了,我只是学习了一个讲C语言的计算机入门课程。
阅读(1649) | 评论(1) | 转发(0) |