
前言
本书基于MIT的一门课程写成,这门课程始于2006年,自2012年起,成为edX和MITx上的一门“大规模在线开放课程”(Massive Online Open Courses, MOOC)。本书第1版基于一个学期的课程,但随着时间的推移,我不得不添加更多内容,再用一学期来讲述课程已经不合适了。现在的这个版本适合于两学期的计算机科学系列导论课程。
当我开始编写第2版时,本以为只要加上几章内容就可以了,但结果远超预料。我重新组织了本书的后半部分,并将整本书中的代码从Python 2换成了Python 3。
本书面向的是那些没有或只有很少编程经验,但希望掌握计算方法来解决问题的学生。书中的内容是一些学生学习更高级计算机科学课程的跳板,但对更多学生来说,则是正式学习计算机科学的一门课程。
正因如此,所以我们更强调课程的广度,而不是深度。课程的目标是为学生简述更多的主题,使他们在想用计算机完成目标时知道自己能做什么。尽管如此,这并不是一门“计算机鉴赏”课程,要求比较严格,而且有一定难度。读者需要花费大量时间和精力才能真正掌握书中内容,使计算机服从自己的调遣。
本书的主要目标是帮助学生掌握并熟练使用各种计算技术,以得到有价值的成果。他们应该学会使用计算思维表述问题,并掌握如何从数据中提取信息。学生从本书中获得的最重要的能力是,使用计算思维解决问题的艺术。
这本书很难纳入传统的计算机科学课程。第1~11章是典型的针对没有或只有很少编程经验的学生的计算机科学课程;第12~14章稍微高级一些,如果想学习进阶技术,可以从这几章挑选些内容,作为导论课程的补充;第15~24章介绍如何使用计算技术来理解数据,我们认为其中的内容应该成为计算机科学课程体系中的第二门课程(代替传统的数据结构课程)。
第1~11章主要包含五个方面的内容:
❑ 编程基础
❑ Python 3编程语言
❑ 计算问题的解决技术
❑ 计算复杂度
❑ 使用图形表示信息
我们会介绍Python语言的大部分特性,但重点在于可以使用编程语言做什么,而不是语言本身。比如,第3章结束时虽然只介绍了Python语言的一小部分,但已经引入穷举的概念、猜测与验证算法、二分查找和高效近似算法。纵贯本书,我们都会介绍Python的特性。同样地,本书从头至尾也会介绍编程方法。我们的理念是帮助学生们掌握Python,并成为一个优秀的程序员,能够使用计算技术解决自己感兴趣的问题。
书中示例都使用Python 3.5进行了测试。Python 3修正了Python 2各种发布版本(通常称为Python 2.x)在设计上的很多不一致性,但它不是向后兼容的,这意味着大多数使用Python 2编写的程序不能在Python 3中正常运行。因为这个原因,Python 2.x还在被广泛使用。第一次使用Python 3中不同于Python 2的特性时,我们都会明确指出如何在Python 2中完成相同功能。书中所有示例都有Python 3.5和Python 2.7的在线版本。
第12~13章介绍了优化,这是一个虽然重要但很少包含在导论课程中的主题。第14~16章介绍了随机规划,这也是一个虽然重要但很少包含在导论课程中的主题。我们在MIT授课的经验是,在一个学期的导论课程中,或者可以讲述第12~13章的内容,或者可以讲述第14~16章的内容,但不能二者兼顾。
第15~24章在设计上是独立成篇的,内容涉及如何使用计算技术来理解数据。其中使用的数学知识不超出高中代数的范围,但要求读者具有严谨的思维能力,且不会被数学概念吓倒。这一部分包括多数导论课程中没有的内容:数据可视化、模拟模型、概率与统计思维,以及机器学习。我们相信对大多数学生来说,这部分内容远比那些典型的第二门计算机科学课程的内容更有意义。
我们没有在每章末尾设置习题,而是在每章的适当部分插入了“实际练习”。有些练习非常简短,目的是使读者确认自己确实明白了刚刚学过的内容。有些练习增加了一点挑战性,适合在考试时使用。其余练习的难度比较大,可以作为课后作业。
本书有三个普适性主题:系统的问题解决方式、抽象能力,以及将计算思维作为思考世界的一种方式。学完本书后,你应该:
❑ 学会使用Python语言进行编程和计算;
❑ 学会系统性地组织、编写、调试中等规模的程序;
❑ 理解计算复杂度;
❑ 将模糊的问题描述转化为明确的计算方法,以此解决问题,并对这个过程有深刻的理解;
❑ 掌握一些有用的算法以及问题简化技术;
❑ 对于那些很难得到封闭解的问题,知道如何使用随机性和模拟技术进行清晰阐述;
❑ 学会使用计算工具(包括简单的统计、可视化以及机器学习工具)对数据进行理解与建模。
编程本身就是一项非常困难的活动。正如那句名言所说:“在几何中,没有专为国王铺设的大道。”对于编程来说,也没有捷径可走。如果你想真正掌握书中的内容,光阅读是不够的,还应该亲自运行书中的代码。2008年以来,本书基于的各种课程都放在MIT的开放课程网站(OpenCourseWare, OCW)上。这里有授课过程的视频录像,以及一系列习题和考题。从2012年秋季开始,我们在edX和MITx上提供了在线课程,其中包括本书的大部分内容。我们强烈推荐你做做OCW和edX上提供的习题。
电子书
如需购买本书电子版,请扫描以下二维码。
