像计算机科学家一样思考:用 Python 学习(第二版)/前言
作者:杰弗里·埃尔克纳
这本书的存在得益于互联网和自由软件运动使合作成为可能。三位作者——一位大学教授、一位高中老师和一位专业程序员——从未面对面地合作过,但我们能够紧密合作,并得到了许多其他人的帮助,他们花时间和精力向我们发送反馈。
我们认为这本书证明了这种合作的好处和未来可能性,这种合作的框架是由理查德·斯托尔曼和自由软件基金会建立的。
1999 年,大学理事会的高级预科(AP)计算机科学考试首次使用 C++ 语言进行。正如全国许多高中一样,更换语言的决定对弗吉尼亚州阿灵顿的约克镇高中的计算机科学课程产生了直接影响,我在那里任教。到目前为止,Pascal 是我们第一年和 AP 课程的教学语言。为了保持过去给学生两年接触同一种语言的做法,我们决定在 1997-98 学年将第一年课程改为 C++,以便与大学理事会下一年对 AP 课程的改变保持一致。
两年后,我确信 C++ 并不是向学生介绍计算机科学的最佳选择。虽然它当然是一种非常强大的编程语言,但它也是一种极其难以学习和教授的语言。我发现自己经常与 C++ 难以理解的语法和多种实现方式作斗争,结果是,我失去了许多本不应该失去的学生。我确信必须有更适合我们第一年课程的语言选择,于是,我开始寻找 C++ 的替代方案。
我需要一种可以在我们的 GNU/Linux 实验室以及大多数学生在家使用的 Windows 和 Macintosh 平台上运行的语言。我希望它是免费软件,这样学生无论收入多少,都可以在家使用它。我希望这种语言能够被专业程序员使用,并且拥有一个活跃的开发者社区。它必须支持过程式和面向对象的编程。最重要的是,它必须易于学习和教授。当我带着这些目标调查各种选择时,Python 脱颖而出,成为最合适的候选者。
我请约克镇的一位有才华的学生马特·阿伦斯试用 Python。两个月后,他不但学会了这门语言,还编写了一个名为 pyTicket 的应用程序,让我们的员工可以通过网络报告技术问题。我知道,马特不可能在这么短的时间内用 C++ 完成如此大规模的应用程序,而这一成就,加上马特对 Python 的积极评价,表明 Python 正是我一直在寻找的解决方案。
在决定下一年在我两门入门计算机科学课程中使用 Python 后,最迫切的问题是缺乏可用的教科书。
免费文档来救场了。早些时候,理查德·斯托尔曼把我介绍给了艾伦·唐尼。我们都写信给理查德,表达了我们对开发免费教育材料的兴趣。艾伦已经写了一本面向第一年计算机科学学生的教科书,《像计算机科学家一样思考》。当我读到这本书时,我立刻意识到我想要在我的课堂上使用它。它是我见过的最清晰、最有帮助的计算机科学教材。它强调了编程中涉及的思维过程,而不是特定语言的特性。阅读它立刻让我成为一名更好的老师。
《像计算机科学家一样思考》不仅是一本优秀的书,而且是在 GNU 公共许可证下发布的,这意味着它可以免费使用,并可以修改以满足用户的需求。当我决定使用 Python 后,我想到可以将艾伦的原始 Java 版本的书翻译成新的语言。虽然我无法独自编写教科书,但有了艾伦的书作为参考,我就可以做到,同时证明了软件中使用的协作开发模型也可以在教育材料中发挥作用。
过去两年,为这本书工作对我自己和我的学生来说都是有益的,我的学生在这个过程中发挥了很大的作用。由于我可以在有人发现拼写错误或难懂的段落时立即进行更改,所以我鼓励他们通过给每个导致文本更改的建议增加一分奖励,让他们在书中寻找错误。这有双重好处:鼓励他们更仔细地阅读文本,以及让文本得到最重要评论者的仔细审查,即使用它学习计算机科学的学生。
对于关于面向对象编程的后半部分内容,我知道需要一个比我更有实际编程经验的人来完成它。这本书在未完成的状态下停留了将近一年,直到开源社区再次提供了完成它的必要手段。
我收到了克里斯·迈尔斯的一封电子邮件,表示对这本书感兴趣。克里斯是一位专业程序员,去年开始在俄勒冈州尤金的莱恩社区学院使用 Python 教授编程课程。教授这门课的前景让克里斯找到了这本书,他立即开始帮助我们。到学年末,他在我们网站上创建了一个配套项目——[http://openbookproject.net http://openbookproject.net]_,名为 Python for Fun_,并与我一些最优秀的学生一起担任大师老师,引导他们超出我的能力范围。
过去两年,翻译和使用《像计算机科学家一样思考》的过程证实了 Python 适合教授初学者。Python 极大地简化了编程示例,使重要的编程概念更容易教授。
文本中的第一个示例说明了这一点。它是传统的 hello, world 程序,在 Java 版本的书中看起来像这样
在 Python 版本中,它变成了
即使这是一个简单的示例,Python 的优势也显而易见。约克镇的计算机科学 I 课程没有先决条件,因此许多看到这个示例的学生正在看他们的第一个程序。他们中有些人无疑有些紧张,因为他们听说计算机编程很难学。Java 版本总是迫使我在两个不令人满意的选择之间做出选择:要么解释 `class Hello`, `public static void main`, `String[] args`, `{`, and `}`, 语句,并冒着在刚开始就让一些学生感到困惑或害怕的风险;要么告诉他们,别担心那些东西,我们以后会讲,并冒着同样的风险。课程中这一阶段的教育目标是向学生介绍编程语句的概念,并让他们编写他们的第一个程序,从而向他们介绍编程环境。Python 程序恰好包含完成这些事情所需的必要内容,仅此而已。
比较每个版本的书中程序的解释文本,可以进一步说明这对初学者的意义。在 Java 版本中,对 Hello, world! 的解释有七段;在 Python 版本中,只有几句话。更重要的是,缺少的六段并不是关于计算机编程中的重大概念,而是关于 Java 语法的细节。我发现整个书中都出现了这种情况。Python 版本的文本中消失了整段,因为 Python 更清晰的语法使它们变得多余。
使用像 Python 这样的高级语言,可以让老师延迟讲解机器低级细节,直到学生拥有足够的背景知识才能更好地理解这些细节。因此,它创造了在教学上优先考虑事物的能力。这方面最好的例子之一是 Python 处理变量的方式。在 Java 中,变量是用来存储值的名称,如果它是一个内置类型,它就是一个存储值的名称;如果它不是,它就是一个对象的引用。解释这种区别需要讨论计算机如何存储数据。因此,变量的概念与机器的硬件密切相关。对于计算机科学和代数的初学者来说,强大的变量概念本身就已经足够困难了。字节和地址并不能帮助解决这个问题。在 Python 中,变量是一个指向事物的名称。对于初学者来说,这是一个更容易理解的概念,也更接近他们在数学课上学到的变量含义。今年,我教授变量时比以前容易多了,而且我花在帮助学生解决变量问题上的时间也更少了。
Python 在教学和学习编程方面另一个例子是它的函数语法。我的学生在理解函数方面一直存在很大的困难。主要问题集中在函数定义和函数调用之间的区别,以及参数和实参之间的相关区别。Python 凭借其简洁的语法,为我们解决了这个难题。函数定义以关键字def开头,所以我只需要告诉学生:当你定义一个函数时,用def开头,后面跟着你要定义的函数名;当你调用一个函数时,只需调用(输入)它的名字。参数与定义相关,实参与调用相关。没有返回值类型、参数类型或引用和值参数来阻碍我们,所以我现在能够在不到之前一半的时间内教授函数,而且学生的理解能力也更高。
使用 Python 提高了我们计算机科学课程对所有学生的有效性。我看到了更高的整体成功率和更低的挫败感,这与我使用 C++ 或 Java 教学时相比有了很大的改善。我以更快的速度获得了更好的结果。更多的学生在课程结束后能够创建有意义的程序,并且对编程的体验抱有积极的态度。
我收到了来自世界各地的电子邮件,人们都在使用这本书来学习或教授编程。一个用户社区已经开始形成,许多人通过向位于 [http://openbookproject.net/pybiblio http://openbookproject.net/pybiblio]_ 的配套网站发送材料来为该项目做出贡献。
随着 Python 的持续增长,我预计用户社区的增长将会持续并加速。这个用户社区的出现以及它为教育工作者之间进行类似合作所带来的可能性,是我参与这个项目中最令人兴奋的部分。通过共同努力,我们可以提高可用材料的质量,节省宝贵的时间。我邀请您加入我们的社区,期待您的来信。请写信至 [mailto:[email protected] [email protected]]_。
Jeffrey Elkner
弗吉尼亚州阿灵顿州长职业技术学院
弗吉尼亚州阿灵顿