没鸽,这个链接里面已经给出了按这个大纲完成的教材的试读版链接。说是试读版只是缺少习题,并不缺章节。王垠是PL领域的专家,所以这本书很自然地聚焦了他最专业的领域——一个函数式语言的实现,如果这么简陋的语言还能称得上是函数式语言的话。这么单一的一个领域的内容很难撑起标题中的CS这个标签。即使是在函数式语言实现这一块内容也没有太多的亮点,只能说在尝试向完全不懂CS的人说清楚解释器是什么这一块比较有原创性。
本文来源:XXXXXXXXXXXXXXXXXXXXXXX/blog-cn/2022/02/07/reading-course
第一课:函数。跟一般课程不同,课程不从所谓“Hello World”程序开始,也不会叫学生做一些好像有趣而其实无聊的小游戏。一开头我就讲最核心的内容:函数。关于函数只有很少几个知识点,但它们却是一切的核心。只知道很少的知识点的时候,对它们进行反复的练习,让头脑能够自如地对它们进行思考和变换,这是教学的要点。我为每个知识点设计了恰当的练习。
第一课的练习每个都很小,只需要一两行代码,却蕴含了深刻的原理。练习逐渐加大难度,直至超过博士课程的水平。我把术语都改头换面,要求学生不上网搜索相关内容,为的是他们的思维不受任何已有信息的干扰,独立做出这些练习。练习自成系统,一环扣一环。后面的练习需要从前面的练习获得的灵感,却不需要其它基础。有趣的是,经过正确的引导,好些学生把最难的练习都做出来了,完全零基础的学生也能做出绝大部分,这是我在世界名校的学生里都没有看到过的。具体的内容因为不剧透的原因,我就不继续说了。
第二课:递归。递归可以说是计算机科学(或数学)最重要的概念。我从最简单的递归函数开始,引导理解递归的本质,掌握对递归进行系统化思考的思路。递归是一个很多人自以为理解了的概念,而其实很多人都被错误的教学方式误导了。很多人提到递归,只能想起“汉诺塔”或者“八皇后”问题,却不能拿来解决实际问题。很多编程书籍片面强调递归的“缺点”,教学生如何“消除递归”,却看不到问题的真正所在——某些语言(比如 C 语言)早期的函数调用实现是错误而效率低下的,以至于学生被教导要避免递归。由于对于递归从来没有掌握清晰的思路,在将来的工作中一旦遇到复杂点的递归函数就觉得深不可测。
第三课:链表。从零开始,学生不依赖于任何语言的特性,实现最基本的数据结构。第一个数据结构就是链表,学生会在练习中实现许多操作链表的函数。这些函数经过了精心挑选安排,很多是函数式编程语言的基本函数,但通过独立把它们写出来,学生掌握的是递归的系统化思路。这使得他们能自如地对这类数据结构进行思考,解决新的递归问题。
与一般的数据结构课程不同,这个课程实现的大部分都是「函数式数据结构」,它们具有一些特别的,有用的性质。因为它们逻辑结构清晰,比起普通数据结构书籍会更容易理解。与 Haskell 社区的教学方式不同,我不会宗教式的强调纯函数的优点,而是客观地让学生领会到其中的优点,并且发现它们的弱点。学会了这些结构,在将来也容易推广到非函数式的结构,把两种看似不同的风格有机地结合在一起。
第四课:树结构。从链表逐渐推广出更复杂的数据结构——树。在后来的内容中,会常常用到这种结构。树可能是计算机科学中最常用,最重要的数据结构了,所以理解树的各种操作是很重要的。我们的树也都是纯函数式的。
第五课:计算器。在熟悉了树的基本操作之后,实现一个比较高级的计算器,它可以计算任意嵌套的算术表达式。算术表达式是一种“语法树”,从这个练习学生会理解“表达式是一棵树”这样的原理。
第六课:查找结构。理解如何实现 key-value 查找结构,并且亲手实现两种重要的查找数据结构。我们的查找结构也都是函数式数据结构。这些结构会在后来的解释器里派上大的用场,对它们的理解会巩固加深。
第七课:解释器。利用之前打好的基础,亲手实现计算机科学中最重要,也是通常认为最难理解的概念——解释器。解释器是理解各种计算机科学概念的关键,比如编程语言,操作系统,数据库,网络协议,Web 框架。计算机最核心的部件 CPU 其实就是一个解释器,所以解释器的认识能帮助你理解「计算机体系构架」,也就是计算机的“硬件”。你会发现这种硬件其实和软件差别不是很大。你可以认为解释器就是「计算」本身,所以它非常值得研究。对解释器的深入理解,也能帮助理解很多其它学科,比如自然语言,逻辑学。
我不知道鸽了没有,欢迎大家发表看法。
没鸽,这个链接里面已经给出了按这个大纲完成的教材的试读版链接。说是试读版只是缺少习题,并不缺章节。王垠是PL领域的专家,所以这本书很自然地聚焦了他最专业的领域——一个函数式语言的实现,如果这么简陋的语言还能称得上是函数式语言的话。这么单一的一个领域的内容很难撑起标题中的CS这个标签。即使是在函数式语言实现这一块内容也没有太多的亮点,只能说在尝试向完全不懂CS的人说清楚解释器是什么这一块比较有原创性。
其实可以直接看SICP,王垠的这份大纲前半部分,很大程度上参考了SICP的编排逻辑。
这本书的编排对于培养编程所需的抽象意识较为科学,也能够很好地表达出以符号系统为根基的软件编码和对应的各个数学分支的联系(这也是大部分现有计算机入门教材所缺失的)。
准确来说,对于计算机编程中,符号系统与编码抽象这个子领域,SICP是公认的最佳教材之一,而这个子领域,由于其能够很好地塑造相关的思维结构,也是对现代计算机软件编码一个非常好的入手领域(换言之,这个领域非常深,上限极高,但是从这个领域的入门级知识入手学习CS是非常好的选择)。
回到王垠的话,我对他推出的课程始终保持观望态度。因为他平常发的文章往往个人主义浓厚,有一半多的篇幅是在攻击(不仅仅是批判,而是攻击)同僚而非讨论技术;并且他的大部分文章都有着浓厚的重理论而轻实践的风味,这也是他虽然在特定方面有着极高的学术能力,却在职业道路上充满坎坷和争议的原因之一(另一个原因就是他无差别地蔑视和攻击所有意见不合的人这个事实)。 并且对于他所专精的领域(PLT)之外的一切,他都有天然的蔑视,甚至缺少常识(举个专业领域以外的例子,他坚定地支持过“911自导自演”和“阿波罗登月作假”这两个著名阴谋论;而专业领域以内的例子,就比如这份教材大纲,所有的章节样本都在围绕他所专精的子领域中的内容,但是他的书的标题却叫做Ground-Up Computer Science)。
不精确地来说,他在他的文章里始终在营造一个教主而非导师的形象,我很担心如果新人从他的课程来着手学习CS,视野会不会严重受限,以及心态会不会先于知识体系而膨胀的问题。
其实可以直接看SICP,王垠的这份大纲前半部分,很大程度上参考了SICP的编排逻辑。这本书的编排对于...
另外,SICP的全称“Structure and Interpretation of Computer Programs”,中文版名字“计算机程序的构造与解释”。需要的从这两个名字入手搜索就好。
时段 | 个数 |
---|---|
{{f.startingTime}}点 - {{f.endTime}}点 | {{f.fileCount}} |
200字以内,仅用于支线交流,主线讨论请采用回复功能。