SICP第一版前言

计算机就像小提琴。试想一下,门外汉第一次听留声机,接着就去拉小提琴。之后,他定会说,小提琴听起来真糟糕。此类情节,我们早已从人本主义者和绝大多数计算机科学家口中听闻过。人们常说,计算机程序对特定目标是有效的,但缺乏灵活性。可是,你既不可能拉好小提琴,也不可能码好打字机,除非你学习如何使用它们。

——Marvin Minsky “为什么程序是表达不求甚解、囫囵吞枣之想法的良好媒介(Why Programming is a Good Medium for Expressing Poorly Understood and Sloppily Formulated Ideas)“

本书是MIT计算机科学的入门科目。在MIT,对于所有主修电子工程或计算机科学的学生,这是门必修课,是四门之一的“公共核心课程”。其他还包括:两门电路和线性系统课程、一门数字系统设计课程。自1978年,我们便已致力于本课程的开发。从1980年秋开始,每年都在6到7百名学生中用现在的方式讲授本课程的内容。虽然有些人已使用过计算机,其中还有少数人已有大量的软件或硬件的设计经验,但是绝大多数学生先前几乎都没有过正式的计算训练。

我们对这门计算机科学导论的材料安排反映了两大关注点。第一,我们想要建立一种观念,即计算机语言不仅是指导计算机执行操作的手段,更是表达方法观念的新颖的、规范的媒介。因此,程序必定是写给人阅读的,其次才是给机器执行。第二,我们相信,该层次课程的基本内容的着重点不该是特定程序设计语言的结构的语法,也不该是计算特定函数快速精巧的算法,更不该是算法的数学分析以及计算理论,而该是用于控制大型软件系统复杂度的技巧。

我们的目标是,学生完成本课程后可以对编码风格和编程美学有良好的感知。他们应当掌握控制大型系统复杂度的主要技巧;应当有能力阅读50页长的程序——只要程序的书写风格良好;应当知道程序何时不必去阅读,何时不必去理解;应当有把握修改程序,并保持原作者的本意和风格。

这些技能绝不仅适用于计算机编程。我们教授和使用的技巧适用于所用工程设计。通过构建抽象来控制复杂度,即适时隐藏细节;过建立通用接口来控制复杂度,这使我们构建系统时能够用“拼凑”的方法来组合规范的、易于理解的模块;通过构造描述设计的新语言来控制复杂度,它强调设计的特殊点,弱化其余部分。

我们坚信“计算机科学”不是科学,并且“计算机科学”的重要性和计算机本身无关,这些观念根植于本课程的开发过程。计算机革命是思维方式的革命,是思维表达的革命。这些改变的本质是,过程认识论(最好的称谓)的显露,——从命令式的角度研究知识的结构,这与传统数学学科的说明式的角度截然不同。数学提供精确处理“what is”的框架。计算提供精确处理“how to”的框架。

在教学过程中,我们使用程序设计语言Lisp的一种方言。我们从未正式教这门语言,因为没有必要。我们只管使用,学生便可在几天之内通过实践学会。这是类Lisp语言的一大优势:除了少数组合复合表达式的方法,几乎没有语法结构。所有规范化特性能在一小时内讲完,就像国际象棋。一段短时间后,我们忘掉了该语言的语法细节(因为本来就没有),开始着手实际问题——理解我们要计算什么,如何把问题分解为易处理的几个部分,如何处理各个部分。Lisp的另一优势是,它支持(非强制)程序模块化分解的大规模策略的能力优于其他所有语言。我们可以构造过程和数据抽象,可以使用高阶函数获得惯用法的通用模式,可以使用赋值和数据转换(data mutation)模拟局部状态,可以使用流(stream)和延时求值(delayed evaluation)链接程序的各部分,还可以简易实现嵌入式语言。所有这些都深植于Lisp的交互式环境,该环境极好地支持增量式程序的设计、构造、测试和调试。我们要感谢世代的Lisp巫师(wizard天才),其中首推John McCarthy,他设计了功能极其强大、设计极其优雅的实用工具。

Scheme,我们使用的Lisp方言,试图糅合Lisp和Algol的强大功能和优雅设计。从Lisp那里,获得元语言的能力,这源自Lisp简洁的语法,源自Lisp将程序作为数据对象的统一表示,源自Lisp的数据垃圾回收和堆分配机制。从Algol那里,获得静态域(lexical scoping)和块结构,这是当年Algol委员会的程序设计语言设计先驱赠与我们的礼物。在此,我希望提及John Reynolds和Peter Landin,他们洞悉了Church的Lambda演算与程序设计语言结构间的关系。我们也应该感激计算机出现之前,在这领域不懈探索的数学家们。这些先驱包括:Alonzo Church、Barkley Rosser、Stephen Kleenex,以及Haskell Curry。

你可能感兴趣的:(SICP第一版前言)