跳转到内容

编程科学/导论

来自维基教科书,开放书籍,开放世界

我的一个学生曾经在学习完我的编程语言课程后评论道,她从一个“语法编码者”成长为了一名计算机科学家。她曾经只知道足够的语法才能让程序编译并运行,但现在她可以识别一个可计算的问题,筛选出一组解决问题的策略,权衡它们的优缺点,并用一个健壮的程序实现所选策略。

我对此转变可以稍微自豪一下,但我认为荣誉应该归功于我选择的教科书,SICP:“程序的结构与解释”由哈罗德·阿贝尔森、杰拉尔德·杰伊·萨斯曼和朱莉·萨斯曼撰写。这本书被亲切地称为“巫师书”,是一本很棒的教材,它挑战学生去学习计算和数据的本质。早期版本的这本书把我带上了从语法编码者到计算机科学家的相同旅程。这本书非常多才多艺,在一些大学被用作计算机科学入门教材,在另一些大学被用作编程语言教材。事实上,我告诉我的学生,如果他们被困在荒岛上,只能带一本计算机科学教材[1],SICP应该是他们的首选。

像SICP这样的教材的存在,无疑阻碍了创建这本教材,但我们还是开始了这项任务。如果SICP有什么缺点,那就是它选择了Scheme作为编程语言来阐释其中的概念。虽然作者很好地解释了他们的选择,但使用Scheme可能阻止了SICP作为计算机科学入门课程教材的更广泛采用。

这不是Scheme的缺点,Scheme是一种优雅、有趣且易于学习的语言,而是因为学生需要学习“实用”语言的狭隘观点。如今,实用意味着编程语言C以及从中衍生出来的语言,C++和Java,它们都添加了面向对象,同时保持了类似C的语法。这种转向面向对象的趋势是Scheme的第二个,也许是更有效的批评,因此SICP作为入门教材的选择也是如此;Scheme缺乏正式的面向对象[2]。虽然已经有很多尝试将面向对象添加到Scheme和LISP类语言中,但结果看起来很像一个维多利亚风格的房屋加了一个牧场风格的扩展——实用,但美学上令人不快。

Sway编程语言

[edit | edit source]

Sway编程语言的想法源于这种环境。我一直使用简化的C类伪代码来教授算法课程[3],而我教授编程语言的经验让我相信我可以实现伪代码语言的很大一部分。我选择了Sway这个名字,因为我经常会把伪代码拼错成psuedocode,我认为应该读作Sway-dough-code。

我设计Sway是为了让它拥有几乎与Scheme相同的优雅和所有乐趣,但使用类似C的语法来帮助学生从Sway过渡到C、C++或Java等工业级语言。此外,Sway结合了之前其他人发表的面向对象研究和我在这个领域的研究,包含了一个非常简单但令人讨厌的面向对象和继承系统。Sway应该很有趣的想法,让新手更容易接触到这种语言。重点是:我想要教授关于计算和计算策略的知识,而不是如何用一些玩具语言编写一个for循环。为此,教学语言需要具有表现力,越具有表现力越好。此外,我希望避免Niklaus Wirth的Pascal编程语言的陷阱,这种语言(如Sway)是为教学而设计的。Wirth选择了相当严格的语言模型,以便语言更容易学习。在这种模型下,语言处理器生成的错误信息通常会非常直接地指出导致问题的错误[4]。不幸的是,这种语言缺乏灵活性,无法发展。这种僵化导致Pascal在很大程度上被边缘化了。

Sway被设计为以我无法预料的方式发展,并且我赋予Sway一些特性,我相信这些特性为语言提供了坚实的基础,使其能够发展。不利的一面是,这种内置的灵活性有时会导致一些相当模糊的错误信息。例如,缺少一个分号可能会生成一个“缺少表达式”的错误信息,而不是期望的“缺少分号”信息。为了弥补这种权衡,我们特别注意使Sway成为单语言[5]。也就是说,编写程序的完全相同的结构可以用来调试(修复错误)。事实上,与大多数教科书不同,这本书提供了一个链接,指向关于Sway程序调试的完整章节,从平凡的(打印表达式)到崇高的(在程序中运行交互式解释器)。

本书的组织结构

[edit | edit source]

这本教科书是为那些希望在继续学习传统的CS1课程之前进行一些编程练习的学生设计的。编程科学通过非传统的方式学习教材内容。与专注于语言特性不同,重点是使用编程语言帮助学生理解完全不同的领域中的材料。在这种情况下,这个领域是微积分入门。学生通过编写解决微积分问题的简短算法来学习编程。同时,学生学习微积分,从而在学习第一门微积分课程之前获得一些练习机会。

在我看来,目前的CS1教科书存在一些缺陷。第一个是它们倾向于百科全书式。因此,计算机科学中许多伟大的概念都被大量细节所掩盖。我不希望,而且我怀疑许多学生也不希望,去阅读一本800页(甚至更厚)的教科书。另一个缺陷是,当使用例子来激发语言特性时,会偏离例子来介绍一些新的语言结构,从而破坏了叙述。另一个缺陷是,例子通常是人为编造的,并没有多少说服力来激励学习CS。

TSOP试图通过利用在线托管教科书带来的优势来解决前两个缺陷。当在TSOP中完成某些任务时需要特定的语言结构时,读者会被告知按照链接学习有关该结构的信息(如果需要)。这些链接指向Sway参考手册中的部分,Sway参考手册是TSOP的配套教材。这些小提示不会干扰整体叙述的流程。最后的缺陷通过使用例子(微积分)得到改善,这些例子无疑对计算机科学专业学生有益。

TSOP的章节完全遵循西尔瓦努斯·P·汤普森编著的《微积分变得容易》,并由马丁·加德纳更新。对于已经了解微积分的学生来说,TSOP(以及Sway参考手册)可以独立使用。对于希望同时学习微积分和编程的学生来说,《微积分变得容易》是必要的,也是令人安慰的伴侣。

注释

[edit | edit source]
  1. 没有学生曾经询问过这种情况如何发生。
  2. 可以通过使用函数闭包来实现封装的效果,但Scheme缺乏允许这些类似对象的闭包从其他闭包继承功能的方法。
  3. 我使用科曼、莱瑟森和里维斯特的“算法导论”教材来教授这门课。这是另一本伟大的计算机科学教材,被亲切地称为CLR或“白皮书”,尽管后来的版本不再是白色的。不幸的是,学生觉得书中使用的伪代码比不使用更令人困惑。
  4. 新手学生常见的抱怨是“这个错误信息毫无意义”。大多数实用语言都会遇到与实际错误不一致的错误信息。为了证明Pascal的错误系统,我记得作为一名学生,Pascal编译器告诉我我在某个地方忘记了一个分号,并询问我是否希望它为我插入分号!
  5. 作为单语言的例子,据说要精通C编程需要学习三种语言:C,语言本身,cpp,C预处理器,以及gdb,C的调试器。


令人恐惧的概念

华夏公益教科书