王垠学长搞了个教学大纲
虎哥2023/10/30软件综合 IP:四川

本文来源:XXXXXXXXXXXXXXXXXXXXXXX/blog-cn/2022/02/07/reading-course 

第一课:函数。跟一般课程不同,课程不从所谓“Hello World”程序开始,也不会叫学生做一些好像有趣而其实无聊的小游戏。一开头我就讲最核心的内容:函数。关于函数只有很少几个知识点,但它们却是一切的核心。只知道很少的知识点的时候,对它们进行反复的练习,让头脑能够自如地对它们进行思考和变换,这是教学的要点。我为每个知识点设计了恰当的练习。

第一课的练习每个都很小,只需要一两行代码,却蕴含了深刻的原理。练习逐渐加大难度,直至超过博士课程的水平。我把术语都改头换面,要求学生不上网搜索相关内容,为的是他们的思维不受任何已有信息的干扰,独立做出这些练习。练习自成系统,一环扣一环。后面的练习需要从前面的练习获得的灵感,却不需要其它基础。有趣的是,经过正确的引导,好些学生把最难的练习都做出来了,完全零基础的学生也能做出绝大部分,这是我在世界名校的学生里都没有看到过的。具体的内容因为不剧透的原因,我就不继续说了。

第二课:递归。递归可以说是计算机科学(或数学)最重要的概念。我从最简单的递归函数开始,引导理解递归的本质,掌握对递归进行系统化思考的思路。递归是一个很多人自以为理解了的概念,而其实很多人都被错误的教学方式误导了。很多人提到递归,只能想起“汉诺塔”或者“八皇后”问题,却不能拿来解决实际问题。很多编程书籍片面强调递归的“缺点”,教学生如何“消除递归”,却看不到问题的真正所在——某些语言(比如 C 语言)早期的函数调用实现是错误而效率低下的,以至于学生被教导要避免递归。由于对于递归从来没有掌握清晰的思路,在将来的工作中一旦遇到复杂点的递归函数就觉得深不可测。

第三课:链表。从零开始,学生不依赖于任何语言的特性,实现最基本的数据结构。第一个数据结构就是链表,学生会在练习中实现许多操作链表的函数。这些函数经过了精心挑选安排,很多是函数式编程语言的基本函数,但通过独立把它们写出来,学生掌握的是递归的系统化思路。这使得他们能自如地对这类数据结构进行思考,解决新的递归问题。

与一般的数据结构课程不同,这个课程实现的大部分都是「函数式数据结构」,它们具有一些特别的,有用的性质。因为它们逻辑结构清晰,比起普通数据结构书籍会更容易理解。与 Haskell 社区的教学方式不同,我不会宗教式的强调纯函数的优点,而是客观地让学生领会到其中的优点,并且发现它们的弱点。学会了这些结构,在将来也容易推广到非函数式的结构,把两种看似不同的风格有机地结合在一起。

第四课:树结构。从链表逐渐推广出更复杂的数据结构——树。在后来的内容中,会常常用到这种结构。树可能是计算机科学中最常用,最重要的数据结构了,所以理解树的各种操作是很重要的。我们的树也都是纯函数式的。

第五课:计算器。在熟悉了树的基本操作之后,实现一个比较高级的计算器,它可以计算任意嵌套的算术表达式。算术表达式是一种“语法树”,从这个练习学生会理解“表达式是一棵树”这样的原理。

第六课:查找结构。理解如何实现 key-value 查找结构,并且亲手实现两种重要的查找数据结构。我们的查找结构也都是函数式数据结构。这些结构会在后来的解释器里派上大的用场,对它们的理解会巩固加深。

第七课:解释器。利用之前打好的基础,亲手实现计算机科学中最重要,也是通常认为最难理解的概念——解释器。解释器是理解各种计算机科学概念的关键,比如编程语言,操作系统,数据库,网络协议,Web 框架。计算机最核心的部件 CPU 其实就是一个解释器,所以解释器的认识能帮助你理解「计算机体系构架」,也就是计算机的“硬件”。你会发现这种硬件其实和软件差别不是很大。你可以认为解释器就是「计算」本身,所以它非常值得研究。对解释器的深入理解,也能帮助理解很多其它学科,比如自然语言,逻辑学。

我不知道鸽了没有,欢迎大家发表看法。

来自:计算机科学 / 软件综合
4
4
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
SdtEE
11个月11天前 IP:美国
926656

没鸽,这个链接里面已经给出了按这个大纲完成的教材的试读版链接。说是试读版只是缺少习题,并不缺章节。王垠是PL领域的专家,所以这本书很自然地聚焦了他最专业的领域——一个函数式语言的实现,如果这么简陋的语言还能称得上是函数式语言的话。这么单一的一个领域的内容很难撑起标题中的CS这个标签。即使是在函数式语言实现这一块内容也没有太多的亮点,只能说在尝试向完全不懂CS的人说清楚解释器是什么这一块比较有原创性。

引用
评论
2
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
epi.clyce
10个月20天前 IP:上海
927124

其实可以直接看SICP,王垠的这份大纲前半部分,很大程度上参考了SICP的编排逻辑。

这本书的编排对于培养编程所需的抽象意识较为科学,也能够很好地表达出以符号系统为根基的软件编码和对应的各个数学分支的联系(这也是大部分现有计算机入门教材所缺失的)。

准确来说,对于计算机编程中,符号系统与编码抽象这个子领域,SICP是公认的最佳教材之一,而这个子领域,由于其能够很好地塑造相关的思维结构,也是对现代计算机软件编码一个非常好的入手领域(换言之,这个领域非常深,上限极高,但是从这个领域的入门级知识入手学习CS是非常好的选择)。

回到王垠的话,我对他推出的课程始终保持观望态度。因为他平常发的文章往往个人主义浓厚,有一半多的篇幅是在攻击(不仅仅是批判,而是攻击)同僚而非讨论技术;并且他的大部分文章都有着浓厚的重理论而轻实践的风味,这也是他虽然在特定方面有着极高的学术能力,却在职业道路上充满坎坷和争议的原因之一(另一个原因就是他无差别地蔑视和攻击所有意见不合的人这个事实)。 并且对于他所专精的领域(PLT)之外的一切,他都有天然的蔑视,甚至缺少常识(举个专业领域以外的例子,他坚定地支持过“911自导自演”和“阿波罗登月作假”这两个著名阴谋论;而专业领域以内的例子,就比如这份教材大纲,所有的章节样本都在围绕他所专精的子领域中的内容,但是他的书的标题却叫做Ground-Up Computer Science)。

不精确地来说,他在他的文章里始终在营造一个教主而非导师的形象,我很担心如果新人从他的课程来着手学习CS,视野会不会严重受限,以及心态会不会先于知识体系而膨胀的问题。


引用
评论
1
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
epi.clyce
10个月20天前 IP:上海
927125
引用epi.clyce发表于2楼的内容
其实可以直接看SICP,王垠的这份大纲前半部分,很大程度上参考了SICP的编排逻辑。这本书的编排对于...

另外,SICP的全称“Structure and Interpretation of Computer Programs”,中文版名字“计算机程序的构造与解释”。需要的从这两个名字入手搜索就好。

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
tariel
10个月2天前 IP:北京
927530
引用epi.clyce发表于2楼的内容
其实可以直接看SICP,王垠的这份大纲前半部分,很大程度上参考了SICP的编排逻辑。这本书的编排对于...

SICP最后也是写了个解释器吧。他那个就相当于把中间扩写了一下。

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
所属分类
上级专业
同级专业
虎哥
专家 进士 学者 机友 笔友
文章
1549
回复
13324
学术分
39
2005/08/24注册,14分34秒前活动

刘 虎

创新工程局主席

主体类型:个人
所属领域:无
认证方式:身份证号
IP归属地:未同步
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}