探索计算领域的广度,能帮助我们记住与计算机科学相结合的主要主题。虽然“计算机科学的七大思想”(Seven Big Ideas of Computer Science)的编纂晚于本书的第10版,但这些思想与本书接下来的各章所要讲述的主题思想有很多相似之处。这“七大思想”简单地说就是算法、抽象、创新、数据、程序设计、因特网和影响。在接下来的章节中,我们将介绍各种主题,在每个主题的介绍中都会涉及这个主题的核心思想、目前的研究领域,以及推动该领域知识进步的一些技术。当我们在后面一遍又一遍地提到这些“大思想”的时候,请多留意。
数据存储容量有限,程序设计过程复杂耗时,这些限制了早期计算机器所使用的算法的复杂性。但是,随着这些局限性的消除,机器能完成的任务越来越大、越来越复杂。人们试图用算法表达这些任务,但单凭人类的智力无法做到,于是,越来越多的研究工作转向了算法和程序设计过程的研究。
正是在这种背景下,数学家的理论研究开始有了回报。由于哥德尔不完备性定理,数学家已经在研究有关算法过程的问题了,而这正是先进技术目前面临的问题。由此,孕育出了被称作计算机科学的新学科。
如今,计算机科学已经奠定了它算法科学的地位。这门科学范围很广,涉及数学、工程学、心理学、生物学、商业管理和语言学等多个学科。事实上,研究计算机科学不同分支的研究人员对计算机科学的定义也许会截然不同。例如,计算机体系结构领域的研究人员,主要关注微型电路技术,因此他们将计算机科学视为技术的进步和应用,但数据库系统领域的研究人员则认为,计算机科学就是要寻求方法来提升信息系统的有用性,而人工智能领域的研究人员则把计算机科学视为智能和智能行为的研究。
尽管如此,所有这些研究人员的工作还是都涉及了算法科学的方方面面。鉴于算法在计算机科学中扮演的核心角色(见图0-5),找出焦点问题,对学习算法会非常有益。
〓● 算法过程可以解决哪些问题?
〓● 怎样才能比较容易地发现算法?
〓● 如何改进表示和传达算法的技术?
〓● 如何分析和比较不同算法的特征?
〓● 如何使用算法来操作信息?
〓● 如何应用算法来产生智能行为?
〓● 算法的应用是如何影响社会的?
图0-5 算法在计算机科学中的核心地位
术语抽象(abstraction)在本书中是指一个实体的外部特征与其内部构成细节之间的分离。抽象使我们可以忽略复杂设备(如计算机、汽车或微波炉)的一些内部细节,把它们当作一个单个的、可理解的单元使用。此外,正是通过抽象这种手段,这些复杂的系统才能够被设计和生产出来。计算机、汽车和微波炉都是由若干元件构成的,其中每个元件代表一层抽象,在此层面上,该元件的使用是独立于元件的内部构成细节的。
运用抽象,我们能够构造、分析和管理大型的复杂计算机系统,但如果从细节的层面上看问题,就会不识庐山真面目。在每个抽象层面上,我们都把此系统看成由若干称为抽象工具(abstract tool)的构件组成,而忽略这些构件的内部构成。这样我们的精力就可以集中在每个构件如何与同一层面其他构件发生作用,以及这些构件如何作为一个整体构成更高级别的构件。由此,我们就可以理解该系统中与手头任务有关的那部分,而不会迷失在细节的海洋里。
需要强调的是,抽象并不局限于科学和技术领域。它是一门重要的简化技术,我们的社会形成的任何一种生活方式都离不开抽象。很少有人知道,日常生活中各种各样的便利是如何实现的:我们需要吃饭穿衣,但我们自己无法生产;我们使用电气设备和通信系统,但不了解其底层技术;我们享受其他人提供的服务,但不知道其专业细节。对于每一项新的发展,只有一小部分社会成员专职于其实现,其他人则将实现的结果作为抽象工具来使用。这样,社会的抽象工具仓库扩大了,社会进一步发展的能力也增强了。
抽象这一话题在本书中会被反复提及。我们将了解到,计算设备是通过各个层次的抽象工具构建的。我们还会看到,大型软件系统的开发是以模块化的方式完成的,其中每个模块都是较大模块中的一种抽象工具。此外,在计算机科学本身的发展中,抽象也扮演了很重要的角色,有了它,研究人员可以把精力集中在一个复杂领域中的特定范围上。实际上,本书的编排也反映了计算机科学的这种特征:每一章都围绕着计算机科学的一个特定的方面,而且往往出人意料地独立于其他章,但所有这些章合在一起,又形成了这一巨大研究领域的全面概述。
虽然计算机可能只是复杂的机器,机械地执行着机械式算法指令,但是我们应该看到,计算机科学领域本质上是一个创新性的领域。发现并应用新算法是人类的一项活动,这项活动取决于我们天生的用工具解决我们周围世界中的问题的欲望。计算机科学不仅扩展了表示形式,使其跨越了视觉、语言和音乐艺术,而且还让新的数字表示模式遍及了现代世界。
创建大型软件系统不太像照菜谱做菜,更像是构思一个宏大的新雕塑。构思雕塑的形式和功能需要仔细的规划。制造它的元件需要时间,需要注意细节,还需要熟练的技能。最终的产品体现了设计美学及其创造者的情感。
计算机能表示任何可以被离散化或数字化的信息。算法可以用各种令人眼花缭乱的方式,处理或转换这种数字表示信息。因此,计算机算法不仅能将计算机的一部分数字数据与另一部分混洗,还能让我们搜索模式、创造模拟,通过关联连接产生新知识和新见解。海量存储容量、高速计算机网络以及强大的计算工具,推动着科学、工程和人文领域中许多其他学科的发现。无论是通过模拟复杂蛋白质折叠来预测一种新药的治疗效果,统计分析横跨数个世纪的数字化图书的语言的演化,还是渲染通过非入侵式医学扫描获得的内脏的3D图像,数据都在驱动着现代发现超越人类自身的能力。
在本书中,我们会探讨一些有关数据的问题,包括:
〓● 计算机是如何存储那些与常见的数字人工制品有关的数据(如数字、文本、图像、声音和视频)的?
〓● 计算机是如何粗略估计那些现实世界中模拟人工制品的数据的?
〓● 计算机是如何检测和避免数据中的错误的?
〓● 我们现在所掌控的这个由日益增长的、互连的数据构成的数字宇宙,最后会变成什么样子?
尽管现在涌现的可用语言和工具,与20世纪50年代及20世纪60年代早期的可编程计算机没什么相似之处,但是将人类的意图翻译成可执行的计算机算法的这种行为,现在被广泛称为程序设计/编程(programming)。虽然计算机科学的组成部分并不只有计算机程序设计,还包括许多其他方面,但是通过设计可执行算法(程序)解决问题的能力依然是所有计算机科学家的一项基本技能。
计算机硬件只能执行相对简单的算法步骤,但有了计算机程序设计语言提供的抽象,人类就能针对复杂得多的问题,进行推理并制定出编码解决方案。下面这几个关键的问题为我们这个主题的讨论提供了框架。
〓● 如何构建程序?
〓● 程序中会出现哪些类型的错误?
〓● 如何发现和修复程序中的错误?
〓● 现代程序中的错误会产生什么影响?
〓● 如何对程序进行文档化和评估?
因特网连接着全世界的计算机和电子设备,这对我们这个技术社会存储、检索和共享信息的方式产生了深远的影响。现在,商业、新闻、娱乐和通信都越来越依赖这个由较小的计算机网络组成的互联网络。我们的讨论不仅限于把因特网的机制描述为人工制品,还会涉及人类社会业已被全球网络交织在一起的许多方面。
因特网的覆盖对我们的隐私和个人信息的安全也有着深远的影响。网络空间里有很多危险,所以在我们这个互联的世界里,密码学和网络安全正变得越来越重要。
计算机科学不仅对我们用于通信、工作和娱乐的技术有深远的影响,对我们的社会生活也有巨大的影响。计算机科学的进步正在淡化许多差别,而这些差别正是我们过去做出某些决策的基准;计算机科学的进步也向许多长久以来的社会准则提出了挑战。在法律上,它产生了某些疑问——知识产权的度以及伴随这个所有权的权利和义务。在道德上,人们面临着许多挑战传统社会行为准则的抉择。对于政府,又产生了许多争议——计算机技术及其应用应该规范到什么程度?在哲学上,人们开始争论智能行为的存在与智能本身的存在。同时,整个社会也在争论新的计算机应用是代表的是新的自由还是新的控制。
对于那些想涉足计算或者计算机相关领域的人,这种话题是很重要的。科学中的新发现有时会使许多应用产生争议,这使人们对相关的研究人员产生极大不满。进一步而言,道德上的过错足以摧毁本可以很成功的事业。
计算机技术的发展给人们提出了许多难题,而具备解决这些难题的能力对于非计算机领域的人也十分重要。的确,计算机技术已经在全社会迅速普及,几乎无人不受其影响。
本书提供了一些技术背景,有助于人们以一种理智的思维来处理计算机科学所产生的问题。然而,计算机科学的技术知识本身无法提供全部问题的解决办法。因此,本书的一些章节致力于介绍计算机科学的社会、道德和法律影响,包括安全问题、软件所有权和义务问题、数据库技术的社会影响以及人工智能发展的后果。
此外,一个问题往往没有明确的正确答案,许多有效的解决方案都是在两个对立的(也许都是有理的)观点之间进行折中的。在这些情况下寻找解决方案通常需要能够倾听、辨别其他观点、开展理性的讨论,并在获得新见解时改变自己的观点。因此,本书的每一章最后都会在“社会问题”这样一节收集一些问题,研究一系列计算机科学和社会之间的关系。这些问题不一定是需要回答的,而是需要思考的。在许多情况下,当人们发现其他答案时,就不会再满意于那个最先出现的明显答案了。简而言之,给出这些问题的目的并不是让大家找到“正确”答案,而是要提高大家的意识:要意识到一个问题会牵扯多位利益相关者,一个问题会有多个解决方案,那些解决方案都同时具有长短期效应。
哲学家在基础理论的研究中提出了许多伦理学方法,从而产生了指导决策和行为的原则。
性格伦理(有时称为德行伦理)是由柏拉图和亚里士多德提出的,他们认为“好行为”不是应用可识别规则的结果,而是“良好性格”的自然结果。然而其他伦理基础(如结果伦理、职责伦理和合同伦理)认为,一个人在解决伦理难题时,应该考虑的是:“后果是什么?”“我的职责是什么?”或者“我有什么合同?”而性格伦理考虑的是:“我想成为什么样的人?”因此,好行为是建立在好性格基础上的,而这通常得益于良好的教育以及德行习惯。
在向不同领域的专业人士教授伦理知识时,一般以性格伦理为基础。不用教授专门的伦理理论,只要举一些能够暴露该专业领域中各种伦理问题的案例即可。然后,通过讨论这些案例的利弊,让这些专业人士对职业生活中潜在的危险有一个更清醒、更深入和更敏感的认识,并将这种认识融入他们的性格中。这就是每章最后设计社会问题的精神所在。
推荐一本计算机科学的经典教材:《计算机科学概论》(第13版)
本书是计算机科学的入门教材。在力求保持学科广度的同时,还兼顾深度,以对所涉及的主题给出中肯的评价。
第13版继续使用第12版引入的Python代码示例和类Python的伪代码。我们做出这种改变有几个原因。首先,本书已经包含了相当多的各种语言的代码,有几章还有详细的伪代码。其次,读者已经吸收了相当多的句法方面的知识,似乎可以将句法重新定位为在后续课程中会实际看到的语言。最后,更重要的是,越来越多的使用本书的教师断定,即使优先介绍计算的广度,对学生来讲,如果缺乏用于探索和实验的编程工具,许多课题也会很难掌握。
那为什么选择Python呢?语言的选择始终是一个有争议的问题,任何一种选择,反对的人都至少和支持的人一样多。Python是一个极好的中间选择,因为Python:
〓● 句法简洁易学;
〓● I/O原语简单;
〓● 数据类型和控制结构与先前版本中使用的伪代码原语很接近;
〓● 支持多个程序设计范式。
Python是一种成熟的程序设计语言,它拥有充满活力的开发社区和丰富的在线资源,便于进一步的研究。根据某些衡量标准,Python仍然是业界前5种最常用的程序设计语言之一,并且在计算机科学入门课程中的使用急剧增加。对非计算机专业的学生来讲,它是一门极其受欢迎的入门课程,并且已被其他像物理学和生物学这样的STEM[1]领域广泛接受,作为计算科学应用的首选语言。
本书主题由具体到抽象逐步推进——这是一种很利于教学的顺序,每一个主题自然而然地引导出下一个主题。首先介绍信息编码、数据存储及计算机体系结构的基本原理(第1章和第2章),进而研究操作系统(第3章)和计算机网络(第4章),探讨算法、程序设计语言及软件开发(第5章至第7章),探索如何更好地访问信息(第8章和第9章),考虑计算机图形学技术的一些重要应用(第10章)及人工智能(第11章),最后介绍抽象的计算理论(第12章)。
虽然本书的编排顺序自然连贯,但各个章节都具有很强的独立性,可以单独阅读,也可以根据不同学习顺序重新排列。事实上,本书通常被用作各类课程的教材,内容选择的顺序是多种多样的。其中一种教法是先介绍第5章和第6章(算法和程序设计语言),然后根据需要返回到前面的相应章节。我还知道有一门课程是从第12章有关可计算性的内容开始的。本书还曾作为深入不同领域项目的基础,用于“高级研讨班”课程的教科书。面对不需要了解太多技术的学生,在教学中可以重点讲述第4章(组网及因特网)、第9章(数据库系统)、第10章(计算机图形学)和第11章(人工智能)。
每章开篇都用星号标出了选学章节。这些选学章节要么是讨论更专业的话题,要么是对传统话题作深入探究。此举仅是为那些想采取不同阅读顺序的读者提供一点建议。当然,还有其他读法。尤其对于那些寻求快速阅读的读者,我们建议采取下面的阅读顺序。
章 节 | 主 题 |
---|---|
1.1~1.4 | 数据编码和存储基础 |
2.1~2.3 | 机器体系结构和机器语言 |
3.1~3.3 | 操作系统 |
4.1~4.3 | 组网及因特网 |
5.1~5.4 | 算法和算法设计 |
6.1~6.4 | 程序设计语言 |
7.1~7.2 | 软件工程 |
8.1~8.3 | 数据抽象 |
9.1~9.2 | 数据库系统 |
10.1~10.2 | 计算机图形学 |
11.1~11.3 12.1~12.2 | 人工智能 计算理论 |
在本书中有几条贯穿始终的主线。主线之一为计算机科学是不断发展变化的。本书从历史的角度反复呈现各个主题,讨论其当前的状况,并指出研究方向。另一条主线是抽象的作用以及用抽象工具控制复杂性的方式。该主线在第0章引入,然后在操作系统架构、组网、算法的发展、程序设计语言设计、软件工程、数据组织和计算机图形学等内容中反复体现。