前言

2006 年 3 月,美国计算机科学家 Jeannette M. Wing(周以真)在 CACM 上发表文章《计 算思维》(Computational Thinking),主张计算机科学家应该向大学新生讲授一门关于如何“像 计算机科学家那样思考”的课程,这门课并非仅为计算机科学专业学生开设,更重要的是面 向所有非计算机专业的学生,甚至是面向中小学学生。进行计算思维教学的目标是使计算思 维像阅读、写字、算术一样成为每个人的基本技能。

所谓“计算思维”,是指运用计算机科学的基础概念、思想和方法去解决问题时的思维活 动,涉及如何在计算机中表示问题、如何让计算机通过执行有效的算法过程来解决问题。计 算机原本只是人们解决问题的工具,但当这种工具在几乎每一个领域中都得到广泛使用后, 工具就会反过来影响人们的思维方式。因此,将计算思维向所有人进行普及,使普通人群也 能像计算机科学家那样利用计算机来解决自己生活、工作中的问题,对于人们适应未来的、 计算机无处不在的社会,具有重要意义。

上海交通大学为全校学生开设一门称为“程序设计思想与方法”的通识课程已有多年, 从 2010 学年秋季学期开始,我们对该课程进行改革,试图将它转变成计算思维课程。由于计 算思维是一门崭新的课程,国内外都没有合适的教材,甚至计算思维课程应当讲授的内容也 没有定论,这促使我们按照自己的理解编写了这本计算思维教材。

目标

本书向计算机专业和非计算机专业的学生介绍计算机科学的基本概念、思想和方法,目 的是使学生理解计算机科学家的思维特点和方式,并最终能够利用计算机解决自己专业领域 的问题。

内容

本书内容覆盖利用计算机解决问题的全过程。

第 1 章首先界定“计算”的含义,然后介绍“计算思维”的基本内容。计算是指利用计 算机解决问题的过程,而非传统意义的数学计算,其实质是“算法化”,即按照一定的步骤执 行基本指令的过程。为了让学生实践所学到的计算机问题求解的思想和方法,需要利用某种 编程语言来实现算法,本书采用 Python 语言作为编程的教学工具。

计算机可以看作是信息处理机器,所有问题的解决都是对特定信息进行特定处理的过程。 第 2 章和第 6 章介绍如何在计算机中表示现实世界信息,其中第 2 章介绍简单信息的表示,包括数值、字符串等;第 6 章介绍复杂信息的表示,包括各种集合体数据和数据结构。

第 3 章介绍如何表示对信息的处理过程,包括顺序、条件、循环等控制流程的表示以及结构化编程的思想。第 4 章介绍如何将信息处理过程按照良好的结构组织起来,模块化编程 和自顶向下设计可以帮助我们建立复杂问题的处理过程。

第 5 章介绍图形编程。图形是传达信息的最高效的手段,在利用计算机解决问题时经常 用图形来实现可视化计算,因此图形编程的重要性不言而喻。同时,早早地让学生学会图形 编程并编制一些有意思的程序,能够激发他们的学习兴趣。第 8 章介绍的图形用户界面是图 形编程的进一步延伸。

第 7 章详细介绍当前流行的面向对象编程。面向对象不只是一种编程范型,它还是一种 强大的思维工具,可以说是本书的重点内容。

传统计算都是确定性的,第 9 章介绍两个与不确定性打交道的内容。计算机模拟是在各 行各业中广泛应用的方法,本章介绍如何利用蒙特卡洛方法模拟现实世界中的不确定性。另 外,本章还简单介绍了多线程并发计算。

第 10 章介绍算法设计和分析。这章内容涉及理论计算机科学,旨在使读者了解计算机的 计算能力和局限。

第 11 章介绍所谓“计算+X”,说明计算机与各专业的结合能够形成多种交叉学科,同时 也证明了计算思维课程的重要意义。笔者不可能了解各专业的知识,所以本章只能是浅尝辄 止。

为什么选用 Python

由于计算思维课程要面向广大的非计算机专业学生,我们希望他们能够轻松地学会一种 编程语言,以便动手实践随后学到的知识。Python 语言非常简单,易学易用,可以让学生在 第一堂课就学会编写简单程序。另外,我们希望能用直观形象的方式来展开课程教学,Python 语言正好能满足我们的需求。Python 是一种编译/解释混合的高级编程语言,这使我们在课堂 上可以通过会话方式来与 Python 解释器进行交互,即时演示教学内容。最后,Python 语言支 持我们希望在本课程中介绍的各种特性,如结构化编程、面向对象编程、图形和 GUI 编程多 线程等等,它完全可以用于开发实际的应用程序。

要说明的是,尽管本书介绍了很多 Python 语言的知识,但本书并不是“Python 语言”教 材,没有像编程语言教材那样介绍 Python。更多关于 Python 语言的内容,请参考专门的资料。

教学建议

首先,本教材包含的内容适合各专业学生的学习。对于非计算机专业的学生,可以忽略 那些较为深入的、涉及更多技术细节的内容,本书为这样的内容加上了“*”标记。

其次,在课堂上演示所教内容对于非计算机专业学生来说具有良好的效果,本书在编写 时充分考虑了这一点。在书中,有许多以下列形式出现的代码:

  1. >>> print "Hello, World!"
  2. Hello, World!

其中特意保留了 Python 解释器提示符“>>>”(并不是自己输入的),以提醒教师这样的代码 可以当场演示。当然,任何阅读本书的读者都可以模仿这样的代码,边读书边动手实践。

致谢

上海交大计算机系有许多教师从事《程序设计思想与方法》课程的教学,笔者在与他们 的讨论、交流中获益匪浅。尤其是本课程改革的牵头人黄林鹏师兄,向笔者提供了很多资料、 建议和外校同行们的做法,非常感谢他的帮助。

感谢来自各专业的学生,他们在课堂内外的表现和提问,使笔者获得了向非计算机专业 学生讲授计算思维课程的经验。而很多学生在期末大作业中利用所学知识解决自己专业问题, 也令笔者很欣慰,说明本课程确实达到了目的。

为了了解本书是否适合非计算机专业的专业人士阅读,笔者请好友杨耀志、王爱琴伉俪 阅读了部分内容,非常感谢他们的反馈意见。

最后要感谢妻子和女儿的支持,忙碌的写作使笔者有些忽略了对她们的照顾。 由于作者水平有限,书中错误一定不少,恳请读者不吝赐教!