为了行文方便,这篇文章不使用 “王垠老师” 这样的尊称,直接称呼名字 “王垠”。
大约 2 个月前,我开始报名学习王垠的 计算机科学视频班(基础班),经过 1 个月的学习后毕业,大概用了 120 个小时的学习时长。“120 个小时” 这个数字是经过认真估算的,包含了观看视频的时间和做练习题的时间。因为视频课的学习节奏由自己把控,毕业速度因人而异,所以 “1 个月” 这样的描述不够直观,用小时数更加容易理解。 120 个小时意味着,如果一天学 2 个小时的话,不包括节假日需要 60 天。
如果我说学了 1 个月,也许有人会很不在乎,1 个月的时间能学到多少知识呢?世界上没有速成班,王垠也不可以。1 个月的时间确实不可能学到各种全面的知识,时间上也不允许。但是 1 个月的时间能不能帮我把过往的编程技能梳理一遍,让我对计算机科学有更加体系化的认识?我在工作中可能见过各种迷雾,王垠的课程能不能让我拨云见日,看清楚很多东西?我对课程的学习有比较快的速度,因为我远不是零基础,我大多数情况都可以轻松写出能运行的代码,虽然代码不简洁也不优雅。这些编程能力已经形成肌肉记忆,就像生活在原始森林里的野人,即使没有经历过系统的科学的格斗训练,身体素质和格斗技巧也要远超过普通人。
现在毕业后经过 1 个月时间的沉淀,我想分享一下 “从课程中能学到什么” 这个话题。没有在毕业当天做总结,是因为怕有点浮燥总结不全,或者掺杂太多个人经历。1 个月的时间其实也不够,我没有太多时间复习,课程也远远没来得及发挥出应有的成果,但是现在做总结并不妨碍以后对课程内容有进一步的感悟。王垠曾经有一篇文章《爱因斯坦谈教育》,里面提到爱因斯坦说 “被传授的知识应该被当成宝贵的礼物”,我在学完课程后无意间翻到这篇文章,看到这句话后,突然对这句话有了切实的理解。
王垠并不认识我,但我早就认识王垠;我以前不是王垠的学生,但王垠早就是我的老师了。我关注王垠的博客多年,已经从他的博客文章中受益很多。而这次系统学习了视频课的课程,像是打开了新世界的大门。这并不夸张,我可以负责任地站在学习过课程的立场上说,王垠没有吹牛,他的课程真的有他说的那么好。你可以不赞同王垠的观点,也可以不喜欢王垠的人生态度,但是不可能怀疑王垠在计算机科学,尤其是编程语言领域的研究水平,也完全不需要担心王垠这样对自己和世界都如此较真的人,会拿一些没有含量的课程出来忽悠人。
因为课程内容是保密的,我不会透露课程具体的学习内容,只基于公开的招生说明中的内容进行解释。对于计算机初学者来说,从课程中能学到的最直接的知识,就是函数、链表、二叉树等基础的编程概念,涵盖了大学本科阶段整个过程的学习内容。而第 6 课关于解释器的部分,属于课程的 “最终成果”,对应一些美国顶尖大学本科高年级,至硕士低年级阶段的学习内容。为什么王垠在招生说明里的描述是 “大学博士阶段才可能学到的内容” 呢?因为中国的大学没有编程语言专业,本科课程没有教解释器的,即使到了研究生阶段,lambda 演算也属于选修课,博士早期才会接触到解释器的实现是正常现象。所以王垠的描述真的没有夸大。
解释器这种内容在中国的教育体系里本来就很稀有,比较高级和精练的教程更是少见。举例来说,当你学完了王垠的课,然后去 bilibili 上搜一些解释器相关的教程,你就会明白这些公开教程里的解释器有多么差劲,不但一眼就能看出它们缺什么要素、存在什么问题,还知道如何改进、如何用最简洁的代码写出最可靠的实现。为什么解释器这个东西重要呢?同样举个例子,以太坊的虚拟机(EVM)就是一个解释器,只不过 EVM 并不是在对编程语言做解释,而是在对以太坊的操作码(Opcodes)做解释,每个操作码都对应在栈结构上的一个动作。所以学过了解释器之后,对 EVM 的原理会有不一样的理解。
对于有计算机经验的学生来说,从课程上可以学到的,就不只是表面上的知识了。比如,课程只用到非常少的编程要素,就表达了第 1 课到第 6 课的全部内容,如果王垠不是对计算机理论有非常深刻的理解,不可能做到这种地步的深入简出。从学习者的角度,一方面可以思考一下为什么课程内容能如此精致,组织这些课程内容的思路是什么,这种高度抽象的思维背后,需要怎样的功底,自己距离写出这样的课程,能力上的差距还有多大。
另一方面,由于课程内容自成一体,学习者完全有可能做到自己复刻整个课程内容,就像是手里的一个精致的玩物,随时可以拿出来复习把玩。基础班的知识好比非常高级的原材料,从基础班毕业就意味着拿到了这些原材料。但原材料需要经过反复打磨、锤炼、加工,才能变成更加实际可用的装备。所以我猜测有的同学学完之后感觉什么都没学到,而有的同学觉得如获至宝,能够反复加以利用并产生许多价值,大概就是这个原因吧。
我最近就忽然意识到,学完课程以后,学习其他技术好像变简单了。因为体验了课程中层层递进的教学方式,我自学其他东西也会按照这个思路来,一步一步学,自然而然就学会了,Solana 合约、比特币脚本、比特币 Runes、理解 CPS、用 continuation 原理实现协程调度等。我有点说不上这是怎么回事,明明课程里只是学了一些计算机基础,链表、二叉树什么的,竟然有这样的威力。也许从课程里学到的不只是知识,还有很好的学习方法。难怪王垠把基础课的内容称为 “计算机科学的精华”。
虽然我有多年在区块链行业实际的工作经验,我却越来越搞不清楚区块链技术是什么。我之前大量关注区块链共识的原理,为什么关注的不是其他技术原理,比如加密学、分布式网络、储存系统等内容?因为只有共识是区块链特有的,其他都是普通的工程上的技术,包括智能合约的实现,而且智能合约还不是区块链必需,可以有也可以没有。至于 Layer 2 之类,也完全是工程上的尝试,哪有什么可以抽象的理论依据,挑战期、赎回期等都是业务定义的逻辑。另外我可以剧透一下,王垠的计算机课程,还提到了区块链最本质的技术原理,是不是难以想象?是真的。
与不成体系的区块链工程相比,拥有基础但扎实的计算机功底很重要,尤其是高度抽象的思维方式,能够脱离语法但理解编程语言本质的学习方式,值得反复琢磨和掌握。我曾经以为好好钻研区块链技术,就可以逐步提高自己的技术能力,就可以深入研究到某些区块链原理,深入再深入,水平上自然而然超越所谓的计算机基础班。然而事实上不是那样。所以我学习了课程,并且学到了很多。
学完课程以后,我其实一度怀疑自己,难道这几年折腾的区块链技术都没有意义吗?为什么我学了一个零基础入门性质的计算机课,反而感觉学到了 “改变人生” 一样的东西?我一直没想通这件事。直到后来,我偶然看到王垠这篇讲述课程设计的文章《计算机科学课程》,尤其是看到 “苏格拉底方法” 段落的时候,恍然大悟,原来我的知识早已散落在我的头脑中,只是这门课程帮我把知识都 “生产” 了下来。我现在拥有的知识,离不开经年累月工作和学习的 “怀胎”,也离不开这门计算机课程在恰当时候的 “助产”。
苏格拉底承认他自己本来没有知识,而他又要教授别人知识。这个矛盾,他是这样解决的:这些知识并不是由他灌输给人的,而是人们原来已经具有的;人们已在心上怀了“胎”,不过自己还不知道,苏格拉底像一个“助产婆”,帮助别人产生知识。
就好比,在一个陌生的城市里,你没有地图,搞不清方向,但是也可以四处游荡,有时候能走的很远。而计算机基础课,就像是一张完整的地图,你有了地图,各个方向和岔路口都清清楚楚,但是你未必出发,也未必耗费力气去探索远方。我的情况属于,已经在城市里走过了很多路,偶然有一天,拿到了整个城市的地图,幡然醒悟,明白了自己所处的位置,知道了自己原先走过哪些路。
另外,王垠最近在微博上评论 AI 编程的时候提到,AI 无法写出 “王垠级别” 的代码。什么是 “王垠级别” 的代码呢?上过课就知道了。我在做练习题的时候,被助教提醒最多次的问题,就是 “代码复杂”,有时候是写法上的复杂,有时候是复杂度上的复杂,但是每一次把代码写到符合课程标准之后,又不禁感叹原来代码可以如此精巧。我已经有多年的编程经验,让代码运行出练习题的结果并不难,但是把代码写的足够漂亮却不容易。假如以前给公司写的都是这种质量的代码,那公司可就太占便宜了。
还不止这些,也许有人看到招生说明会怀疑,一节选修课真能让人学会一种新的编程语言吗?我想提醒的是,不要忘了给你讲课的人是谁,是真正的编程语言专家。