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