《计算机科学基础班和牛校教育的差别》
每次的基础班,都有零基础的同学误解第一课练习的意义和难度,以至于开始怀疑人生。之前的教育中,他们做的“作业”,本质都是一种考试。做完了作业交上去,老师批改了,打一个分数下来。分数不高的同学就沮丧自己怎么那么笨,提心吊胆的。所以当他们遇到我的练习,有可能产生同样的沮丧思想,因为之前的经历让他们误解了“练习”的意义。
我的练习并不是用来“判断”学生对课堂内容的理解程度的,而是用来增强和提高他们的理解程度。所以我的练习里故意有少数没讲的细节,需要他们犯了错误才会发现其中的要点。有的练习因为一般无法直接想出来,所以提供了一些提示和“桥梁练习”。通过做一些更简单的练习,他们会逐步理解更难的练习要怎么做出来。这些都是以前的教育没有提供的,但同时这些练习往往也无法不经纠正就顺利做出来。
及时得到反馈和指点,是我的课程最重要的方面。我的课程给每个同学建立了一个“辅导群”,里面只有三个人:同学,助教和我。这个群就是课堂的延续,它会不断地给学生提供恰到好处的指引。没有任何其它教育是这样的做的,学生往往无法得到及时的指点,无法随时提问。一般大学里作业布置了之后,学生在一周中只有一两个小时的机会可以去助教的办公室提问,叫做“office hours”。下课之后基本是找不到教授的,只有下次上课才会有机会直接提问。而我的课程把 office hours 扩展到了整个星期,通过微信群进行,所以大大方便了提问和交流。
第一课的练习后面的部分,基本上都是 lambda calculus 里面最烧脑的部分,叫做 Church numeral,也就是用 lambda calculus 的函数来表示自然数和算术操作。到了后面的一些函数就比较困难了,特别是 pred(找到某个自然数的前一个)。有些同学还没做到 pred 就开始难过了,以为做不出来就是自己不够聪明。甚至有人明明做出来了,还因为是看了提示或者通过“桥梁练习”,所以仍然觉得自己不聪明。所以他们就误解了这些练习的意义。
最初的 pred 函数是谁写出来的?是 Stephen Kleene,Alonzo Church 最得意的门生,也是图灵的师兄。据说 Stephen Kleene 当年为了想出 pred,住到深山里清心寡欲思索了两个月,最后才想出来。所以如果在基础班一周之内做出来,已经超级好了。
诚然,我提供了提示和帮助。但要注意,练习的目的并不是为了证明自己聪明,而是为了掌握其中的思路。如果你能通过提示和“桥梁练习”,一步步地自己写出 succ,pred 这样的函数,那你就掌握了它们。至于你是不是“完全独立”想出来的,这并不重要。
pred 前面的那些函数也都不容易的,当年都是 Alonzo Church 的门徒们思索很久才弄出来的。他们当年想用这些东西来建立数学的基础,所以才那么努力。但后来的事实证明,Church numeral 用作数学的基础,其实并不是很好用。所以这些东西没做出来,也不能说明自己不够聪明,也不是什么失败。这些函数虽然烧脑,却是不实用的,你不能用它们来做什么有用的事情。我把它们作为第一课(函数)的练习,纯粹是为了帮助学生思考“函数作为值”和“高阶函数”等概念,而并不是会用它们来做什么有用的事情。这是一些思维练习,而不是实用的知识。所以即使不能明白,其实也无所谓的。
实话说,我在 Cornell 读博的时候,上了第一堂编程语言课程,授课的教授是 Dexter Kozen。其中就有一些 Church numeral 的作业。但 Cornell 也没有把整个 Church numeral 的函数让同学从头写出来,他们的练习里最多只到 succ(找到自然数的下一个)。succ 是相对没那么难的,但也很让人头痛了。Cornell 的作业只是让自己写出来,没有任何提示和帮助,而且还临时丢给你一个从未学过的编程语言(SML),让你用它写。实话说,当年我是没能自己想出 succ 的,而且上完课也仍然没有理解它。
直到后来过了很多年,又上了 Dan Friedman 的课,让我们写 pred。自己再次琢磨,才弄明白这些东西是怎么回事。计算机科学基础班开课之后,我把这些作为了练习。在辅导学生的同时,又再次加强了自己的理解深度。以至于到后来,我认为已经超越了 Alonzo Church 和 Stephen Kleene 等人对它的理解。很多我的学生也对此理解很深刻。
Cornell(以及其他“牛校”)的教育,基本不给你应有的帮助,基本靠自己去碰壁。作业分数不好,是会算进最后的课堂成绩的,所以大家作业压力都很大。因为同学之间存在竞争,所以“优秀生”往往不跟别人透露自己的方法或者思维。这样没听懂的同学就一直不懂,作业做不出来,课程结束了也没学到什么。这其实不能叫做教育。
离开 Cornell 之后,我发现一个 Facebook 群,是专门嘲笑 Cornell 教育的。我看到其中一篇帖子写道:
Cornell 说要教你游泳,他就把你推进池塘里,等你自己扑腾上岸。能你自己痛苦万分,快要到岸边了,它又拿起一块石头扔到你头上,这样你就沉入水底。等你再次快要上岸的时候,它又拿起一个榔头往你的头上猛砸,这样你就可以死了。但 Cornell 仍然等着你上岸……
所以我希望基础班的同学以及其它在乎学识的人都理解这是怎么回事。真正的教育不应该是这样的。教育应该是让不会的人学会东西,而不是像很多“牛校”那样不真的教会人东西,而只是给能通过他们考试的人加一个标签(学位)。

