1.1 计算科学与问题求解

维基百科(Wikipedia)关于计算机科学(Computer Science,CS)的定义是:系统性研究信息与计算的理论基础以及它们在计算机系统中如何实现与应用的实用技术的学科。它通常被形容为对那些创造、描述以及转换信息的算法处理的系统研究。计算机科学包含很多分支领域;有些强调特定结果的计算,如计算机图形学;而有些是探讨计算问题的性质,如计算复杂性理论;还有一些领域专注于怎样实现计算。例如,程序设计是应用特定的编程语言解决特定的计算问题,人机交互则是专注于怎样使计算机和计算变得有用、好用,以及随时随地为人所用。

美国计算机学会(ACM)指出“计算机科学是计算机和算法过程的研究,包括它们的原理、它们的硬件和软件设计、它们的应用以及它们对社会的影响”。

从第一台电子计算机诞生到现在的几十年来,计算机科学得到了蓬勃发展和广泛普及,计算机科学正深刻影响着人类的生产方式、认知方式和社会生活方式。尤其是近十年来,随着网络和WWW技术的发展,更是极大地丰富了计算机科学的内涵,以至于ACM/IEEE-CS的专家们认为,目前已经无法用计算机学科来称谓它,而改称为计算学科(Computing Discipline)。总体而言,计算机科学的发展和应用水平已是衡量一个国家综合竞争力的重要标志之一,它已成为现代科学体系的主要基石之一。

问题求解是指人们在生产、生活中面对新的问题时,由于缺少现成的有效对策所引起的一种积极寻求问题答案的活动过程。

问题求解是计算科学的根本目的,计算科学多半也是在问题求解的实践中发展起来的。既可用计算机来求解如数据处理、数值分析等问题,也可用计算机来求解如生物学(如基因测序)、物理学(如研究准原子核的结构)和心理学(如对求解问题的意图和连续性行为的分析)所提出的问题。问题求解是一个非常复杂的思维活动过程,它不仅包括整个认识活动,而且也渗透了许多非智力因素的作用,但思维活动是解决问题的核心成分。

利用计算机进行问题求解前,人们必须给出问题的适当描述,通过抽象将问题模型化并用适当的符号表示出来,然后计算机通过对这些符号实施规定的“计算”完成问题求解,如图1-1所示。

图1-1 借助于计算机的问题求解过程

图灵奖获得者Nicklaus Wirth指出:“在较高的认识层次上,硬件和软件是一样的”。因此它们最终都可以归结为一定形式的数据表示物质世界的某一系统,并使用算法通过对这些数据的变换来获得相应的处理结果。然而,并不是所有的问题都是“可计算”的。所以计算机学科不仅要研究什么可以被有效地自动计算,而且还要研究如何进行有效的计算,因此,可以认为,计算机学科的根本问题是:什么能、且如何被有效地自动计算。

综上所述,尽管关于计算机科学的定义有多种,但它们实质上都强调了算法的研究。

算法是一组明确的、有效可计算操作的有序集合,它能在有限的时间内结束,并产生计算结果。如果我们可以指定一个算法来解决问题,那么我们就可以对该问题进行自动化的求解。计算机算法最终需要通过程序设计来实现,程序设计使计算机科学成为实验学科而非纯理论学科。

一段时期以来,计算机和信息技术被社会看成是一种高科技工具,计算机科学也被构造成一门专业性很强的工具学科,这种社会认知很容易导致负面的狭义工具论。这种狭义的认识是计算机科技向各行各业渗透的最大障碍,对计算机和信息科技的全面普及极其有害。2006年,美国Carnegie Mellon大学计算机科学系前系主任周以真(Jeannette M. Wing)教授在(Communications of the ACM)杂志发表了一篇名为《计算思维》(Computational Thinking)的文章,在国内外计算机教育界产生了广泛的影响。计算思维是指运用计算机科学的基础概念进行问题求解、系统设计以及人类行为理解等涵盖计算机科学之广度的一系列思维活动。今天,计算思维应成为一种普适思维,是每个人应具有的基本技能。计算思维强调一切皆可计算,从物理世界模拟到人类社会的模拟,从人类社会模拟再到智能活动,都可以认为是计算的某种形式。将计算思维贯穿于理论教学和实践应用,将有助于促进知识向能力的转化。因此,程序设计的学习也是传播计算思维的一种重要途径。以“程序设计”为载体培养读者计算思维能力正是编者撰写本书的主要目的之一。