我从王垠的计算机科学课学到了什么(2个月版)

2025-08-24

为了行文方便,这篇文章不使用 “王垠老师” 这样的尊称,直接称呼名字 “王垠”。

学习时长

大约 3 个月前,我开始报名学习王垠的 计算机科学视频班(基础班),经过 1 个月的学习后毕业,大概用了 120 个小时的学习时长。“120 个小时” 这个数字是经过认真估算的,包含了观看视频的时间和做练习题的时间。因为视频课的学习节奏由自己把控,毕业速度因人而异。

如果我说学了 1 个月,也许有人很不在乎,1 个月的时间能学到多少知识呢?世界上没有速成班,王垠也不可以。1 个月的时间确实不可能学到各种全面的知识,时间上也不允许。但是 1 个月的时间能不能帮我把过往的编程技能梳理一遍,让我对计算机科学有更加体系化的认识?我在工作中可能见过各种迷雾,王垠的课程能不能让我拨云见日,看清楚很多东西?

学习课程就像是去西天取经,顺利毕业相当于取到了真经。但是学习课程的过程只是老师帮你理解经书内容而已,取到真经不代表你已经对经书中的内容融会贯通,还需要在日后多加修炼、理解透彻才行。想必有的同学拿到经书(毕业)后再也不会打开看一眼,于是认识不到课程真正的价值含量。

课程体会

现在课程毕业后,经过 2 个月时间的沉淀,我想分享一下 “从课程中能学到什么” 这个话题。没有在毕业当天做总结,是因为怕有点浮燥总结不全,或者掺杂太多个人经历。2 个月的时间其实也不够,我没有太多时间复习,课程也远远没来得及发挥出应有的成果,但是现在做总结并不妨碍以后对课程内容有进一步的感悟。

王垠曾经有一篇文章《爱因斯坦谈教育》,里面提到爱因斯坦说, “被传授的知识应该被当成宝贵的礼物”。我在学完课程后,对这句话有了切实的理解。

王垠并不认识我,但我早就认识王垠;我以前不是王垠的学生,但王垠早就是我的老师了。我关注王垠的博客多年,已经从他的博客文章中受益很多。而这次系统学习了视频课的课程,像是打开了新世界的大门。这并不夸张,我可以负责任地站在学习过课程的立场上讲,王垠没有吹牛,他的课程真的有他说的那么好。

你可以不赞同王垠的观点,也可以不喜欢王垠的人生态度,但是不可能怀疑王垠在计算机科学,尤其是编程语言领域的研究水平和造诣,也完全不需要担心王垠这样对自己和世界都如此较真的人,会拿一些没有含量的课程出来忽悠人。

知识深度

因为课程内容是保密的,我不会透露课程具体的学习内容,只基于公开的招生说明中的内容进行解释。

对于计算机初学者来说,从课程中能学到的最直接的知识,就是函数、链表、二叉树等基础的编程概念,涵盖了大学本科整个阶段的学习内容。第 6 课关于解释器的部分,属于课程的 “最终成果”,对应一些美国顶尖大学,本科高年级阶段至硕士低年级阶段的学习内容。

为什么王垠在招生说明里的描述是 “大学博士阶段才可能学到的内容” 呢?因为中国的大学没有编程语言专业,本科课程没有教解释器的,即使到了研究生阶段,lambda 演算也属于选修课,博士早期才会接触到解释器的实现是正常现象。所以王垠的描述真的没有夸大。

解释器这种内容在中国的教育体系里本来就很稀有,比较高级和精练的教程更是少见。举例来说,当你学完了王垠的课,然后去 bilibili 上搜一些解释器相关的教程,你就会明白这些公开教程里的解释器有多么差劲,不但一眼就能看出它们缺什么要素、存在什么问题,还知道如何改进、如何用最简洁的代码写出最可靠的实现。

为什么解释器这个东西重要呢?举个例子,以太坊的虚拟机(EVM)就是一个解释器,只不过 EVM 并不是在对编程语言做解释,而是在对以太坊的操作码(Opcodes)做解释,每个操作码都对应在栈结构上的一个动作。所以学过了解释器之后,对 EVM 的原理会有不一样的理解。

认知提升

对于有计算机经验的学生来说,从课程上可以学到的,就不只是表面上的知识了。比如,课程只用到非常少的编程要素,就表达了第 1 课到第 6 课的全部内容,如果王垠不是对计算机理论有非常深刻的理解,不可能做到这种地步的深入简出。

从学习者的角度,一方面可以思考为什么课程内容能如此精致,组织这些课程内容的思路是什么,这种高度抽象的思维背后,需要怎样的功底,自己距离写出这样的课程,能力上的差距还有多大。另一方面,由于课程内容自成一体,学习者完全有可能做到自己复刻整个课程内容,就像是手里的一个精致的玩物,可以随时拿出来复习把玩。

基础班的知识像是非常高级的原材料,从基础班毕业就意味着拿到了这些原材料。但原材料需要经过反复打磨、锤炼、加工,才能变成更加实际可用的装备。所以猜测有的同学学完之后感觉什么都没学到,而有的同学觉得如获至宝,能够反复加以利用并产生许多价值,大概就是这个原因吧。

自学能力

我最近忽然意识到,学完课程以后,学习其他技术好像变简单了。因为体验了课程中层层递进的教学方式,我自学其他东西也会按照这个思路来,一步一步学,自然而然就学会了.

理解 CPS、基于 continuation 原理实现协程调度,学习 Solana 合约、比特币脚本、比特币 Runes、DeFi,等等。我有点说不上这是怎么回事,明明课程里只教了一些计算机基础,链表、二叉树什么的,竟然有这样的威力。

也许从课程里学到的不只是知识,还有很好的学习方法。难怪王垠把课程内容称为 “计算机科学的精华”。

超越工程的技术

虽然我有多年在区块链行业实际的工作经验,但是我却越来越搞不懂,区块链技术到底是什么。

我曾经大量研究区块链共识的原理,为什么关注的不是其他技术原理,比如加密学、分布式网络、储存系统等内容?因为只有共识是区块链特有的,其他都是普通的工程上的技术,包括智能合约的实现也是,而且智能合约还不是区块链必需,可以有也可以没有。至于 Layer 2 之类,也完全是工程上的尝试,哪有什么可以抽象的理论依据,挑战期、赎回期等都是业务定义的逻辑。

可以剧透一下,王垠的计算机课程,还涉及到了一部分区块链最本质的技术原理,是不是难以想象?

我发现,与不成体系的区块链工程技术相比,拥有基础而扎实的计算机功底更重要,尤其是高度抽象的思维方式,能够脱离语法但理解编程语言本质的学习方式,值得反复琢磨和理解。

我曾经以为,只要好好钻研区块链技术,就可以逐步提高自己的技术能力,就可以深入研究某些区块链原理,深入再深入,水平上自然而然超越所谓的计算机基础班,这也是我前几年没有报名学习课程的原因。然而事实上不是那样,经过几年切实的工作,我越发认识到课程内容的重要性。所以现在学习了课程,并且学到了很多。

课程的启发性

学完课程以后,我其实一度怀疑自己,难道这几年折腾区块链技术都是没有意义的吗?为什么学了一个零基础入门性质的计算机课,反而感觉学到了能 “改变人生” 的东西?

一直没想通这个问题,直到后来,偶然看到王垠讲述课程设计的文章《计算机科学课程》,尤其是看到 “苏格拉底方法” 段落的时候,恍然大悟,原来我的很多知识早已散落在我的头脑中,只是这门课程帮我把知识都 “生产” 了下来。我现在拥有的知识,离不开经年累月工作和学习的 “怀胎”,也离不开这门计算机课程在恰当时候的 “助产”。

苏格拉底承认他自己本来没有知识,而他又要教授别人知识。这个矛盾,他是这样解决的:这些知识并不是由他灌输给人的,而是人们原来已经具有的;人们已在心上怀了“胎”,不过自己还不知道,苏格拉底像一个“助产婆”,帮助别人产生知识。

这就好比,在一个陌生的城市里,你没有地图,搞不清方向,但是也可以四处游荡,有时候能走的很远。而王垠的计算机课程,像是一张完整的地图,你有了地图,各个方向和岔路口都清清楚楚,但是你未必出发,也未必耗费力气去探索远方。

我的情况相当于,已经在城市里走过了很多路,偶然有一天,拿到了整个城市的地图,幡然醒悟,明白了自己所处的位置,知道了自己原先走过哪些路。这是课程对我帮助很直接的地方。

真正的编程

前几天面试的时候,面试官出了一道算法题,我拿到题目后,下意识说 “这看起来不是一道编程题,而是一些数字游戏”。我猜面试官听到我的话后,内心是充满鄙夷的,他也许会想,“这怎么不是编程题?”

我事后也惊讶,当时为什么会那样评价面试官出的题目。那是一种下意识的感受。

后来想明白,因为你一旦上过王垠的课,就会知道真正的 “编程题” 是什么。LeetCode 上那些算法题,“编程” 的含量有多少呢?学完后课程后,你可以轻易看穿那些低水平面试官的把戏。

代码质量

王垠最近在微博上评论 AI 编程的时候提到,AI 很厉害,但 AI 无法写出 “王垠级别” 的代码。

什么是 “王垠级别” 的代码呢?上过课就知道了。我在做练习题的时候,被助教提醒最多次的问题,就是 “代码复杂”,有时候是写法上的复杂,有时候是复杂度上的复杂,但是每一次把代码写到符合课程标准之后,又不禁感叹原来代码可以如此精巧。

我有多年的编程经验,让代码运行出练习题的结果并不难,但是把代码写的足够漂亮却不容易。“代码能运行” 和 “把代码写对” 之间,差距不是一般的大。假如以前给公司写的都是这种质量的代码,那公司可就太占便宜了。

掌握新语言

也许有人看到招生说明会怀疑,一节选修课真能让人学会一种新的编程语言吗?

我想提醒的是,不要忘了给你讲课的人是谁,是曾经写出了《如何掌握所有的程序语言》文章的作者,是真正的编程语言专家。

课程的定位

我上面的描述,可能存在大量情绪表达,会让人看不懂是什么意思。

我觉得王垠的课,像是某种核心(因为基础),只要掌握了这些核心内容,你就始终算是会编程、懂计算机科学的人。

这里说的基础,不是 Hello World 那种基础,而是某种结构化的基础。这些基础知识,会帮你理解 “计算” 的本质。这些核心的基础知识,才是日后真正支撑你前进、给你力量的来源。无论上层的表达形式如何变化,本质都不会变。

我以前经常担心,会不会因为做了某些工作,导致自己偏离原先的技术道路?做一些运维相关的工作,是不是就偏离了自己开发者的初心?原本做 Go 语言开发,工作需要写一些 node.js 代码,是不是就偏离后端开发的职业路径?等等。

王垠的课程内容,就属于有 “定心丸” 功效的那种。课程教给你的,是如何搭建一套自己的 “计算模型”,而不是告诉你某些已经存在的项目具体是怎么回事。所以不要纠结于课程内容是不是全面、是不是高级,因为课程本身是讲心法的,不是讲招式的。至于具体的招式,你得自己学、自己练。

学习课程以前,我在挑选工作的时候,能不能从工作中学到东西、工作有没有成长空间、有没有发展前景,都是重点需要考虑的。学完课程以后,我在考虑的,是如何根据已经掌握的知识和技能,给团队带来帮助、给公司创造价值。心态完全不一样了。因为我不再需要从工作中学到什么,我已经知道从哪里可以学到真正的技术。

当然,这事我觉得,也要看悟性。课程教归教,能收获多少,还得靠自己。