Logo

site iconsmallyu

区块链行业的开发者。
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

smallyu RSS 预览

区块链技术世界的三大真理

2025-11-03 15:37:35

有这样两个事实:

  1. 王垠是编程语言理论、计算机科学理论方面的专家
  2. 在区块链技术理论方面,目前看不到这种级别的专家,尤其是愿意公开发声、开课、讲授知识的

这样的事实背后是有原因的:

  1. 计算机科学经过了几十年发展,区块链大概十几年
  2. 区块链本身、从诞生之初就是工程化集成的产物,而不是理论创新

这会带来不同的现象:

  1. 掌握计算机科学的基础理论,lambda 演算、图灵机、计算模型,理解计算的本质后,在编程语言方面可以长久复用、不会过时,无论上层语言、框架如何变化,计算的核心不会变化
  2. 区块链工程似乎没有基础理论,没有什么技术是不会变的,也没有什么技术是需要长期积累的。从业者年龄小、新人多、工作内容以系统集成、调 SDK 为主

所以区块链的技术世界中,有没有什么理论性质的 “真理”,是长久不变、可以复用、无论上层框架如何变化都不需要担心的?

区块链技术世界的三大真理:

  1. 共识。如何解决拜占庭将军问题。
  2. 加密。以数学为根基的不可篡改、验证。
  3. 激励。社会学博弈引擎,让共识长久运转。

掌握了这三个部分的技术,无论区块链形式上怎么推陈出新,无论行业热点如何变化,都不用担心,因为区块链本质上就是在解决这些问题。

怎么样才算是掌握了 “真理”?我看懂了、我理解了,算是我会了吗?算是我掌握了吗?

掌握真理的标准是,可以根据真理,从头构建出知识。

在计算机科学的世界里,假如世界毁灭了,给你一张纸和笔,你可以从头实现 lambda 演算、实现数据结构、实现一个解释器、实现一种编程语言,甚至构造出更多东西,不依赖于教材、框架、API,这叫掌握真理。

真理的意义在于,让你明白知识为何必须如此存在。——这也是王垠的课程在试图教会你的东西,王垠不教知识,只教 “王垠式真理”。所以我一直认为王垠的课程好、价值高。

类似的,在区块链的世界里,如果你可以从脚本写起,实现共识、加密、激励,不一定重建全部细节,但一定要理解现有系统为何那样设计,就差不多了。

要注意,智能合约的编程语言不在真理的范畴之内,无论是比特币脚本、Solidity、Move、Cairo,都只是表达交易逻辑的 DSL,都是在用不同形式,定义区块链执行交易的规则,很重要但是还没到 “真理层”。

非要说智能合约的真理层,可能可以表达为一个确定性的状态转移函数,无论语言如何变化,这个 “真理” 都始终存在:

State_t+1 = f(State_t, Transaction)

下一个状态来自于上一个状态加上一些交易引起的状态变化,简单吧。但我们这篇文章重点关注区块链世界中的 “王垠式真理”,所以依然是三大真理:共识、加密、激励。

以太坊 AA 钱包的致命问题是什么

2025-10-24 00:55:34

到目前为止,最新的 AA(Account Abstraction)钱包规范仍然是基于 EIP-4337 实现的。

对于 AA 钱包存在的问题,像操作繁琐、Bundler 中心化、可用性低、生态支持不完善、合约安全风险高等表面上的问题就不多说了。

一句话描述 AA 钱包在干什么事情:AA 钱包能实现 “对账户资金的授权” 与 “把交易广播到链上” 这两个行为的分离。

AA 钱包的功能

AA 钱包的功能,体现到具体的交易行为上,就是如果没有 AA 钱包,你得自己发交易。有了 AA 钱包,你可以只签名,不发交易,让其他人代替你把交易发到链上就行。

为什么 AA 钱包能做到这一点?因为 AA 钱包本质上就是一个合约,所以你会发现,AA 钱包的大多数 “优点”,其实是智能合约本身就具备的功能,像什么社交恢复、批量操作等。唯一能带来特殊体验的,只有 “代付手续费” 这个特性。

那为什么 AA 钱包能实现代付手续费这个功能?因为 AA 钱包的所有操作实际上不是交易,而是 UserOperation,有一个链下的 Bunlder 程序会把这些用户操作,通过发交易批量提交到链上。

为什么以太坊需要 AA 钱包

为什么以太坊需要 AA 钱包?因为以太坊的共识层协议要求,交易必须由一个 EOA 地址来发起。这个 EOA 地址,就是交易结构中的 from 字段,以太坊节点会从这个 from 地址计算手续费、扣手续费、验证交易有效性等。

合约没有私钥,交易不可能由合约发起。在这样的规则约束下,就导致以太坊所有的链上行为,都必须由某一个 EOA 地址来发起交易。

你可能觉得不对,部署一个合约,然后让合约来验证 data 里得签名数据就好了。data 里的签名数据,未必需要和发起交易的地址一致。

没错,事实上,AA 钱包的发展链路是:meta-transcations -> EIP-2771 -> EIP-4337。

这些方案在解决的问题本质上都是:如何让使用资金的权限,与发起链上交易的行为分离。

而引起这一系列复杂协议的根源,来自于以太坊 “交易必须由一个 EOA 地址来发起” 的规则。

为什么以太坊有这个规则

为什么以太坊要有 “交易必须由一个 EOA 地址来发起” 这个规则?

因为以太坊的账户模型,是账户-余额模型。协议必须要知道,一笔交易的手续费从哪里扣。

比特币不存在这个问题

比特币的 PSBT 交易格式,可以实现原生的多签。功能是多个钱包只负责签名,最终由另外一个钱包把交易广播出去就可以。

多签交易,就是典型的把对资金的授权,与广播交易行为分离开的场景。

为什么比特币不存在以太坊的这个问题?因为比特币使用的是 UTXO 模型,交易根本没有 from 地址,有的是多个输入脚本,节点只需要校验交易是否符合脚本的解锁规则,而不需要考虑手续费从哪里扣的问题。

AA 钱包的定位

我们梳理一下这个链条:以太坊使用账户-余额模型 -> 交易必须由 EOA 地址发起 -> 需要 AA 钱包。

AA 钱包在干的事情,实际上是在给以太坊的账户模型打补丁,为了修补账户-余额模型相比 UTXO 模型的不足,才有了 AA 钱包这个东西。AA 钱包是在不涉及以太坊协议变更的前提下,诞生出的一种 workaround 方案。

从地位上来说,AA 钱包对于以太坊的地位,类似于铭文/符文/RGB 对于比特币的地位。在比特币生态里,因为没有图灵完备的脚本,所以在不触及比特币协议变更的前提下,搞出了铭文/符文/RGB 这些 workaround方案。

AA 钱包需要链下的 bundler 来提交交易,与符文需要链下的索引器来维护符文的数据状态,是不是一个意思,都严重依赖于链下的程序?

而事实上我们都知道,比特币生态的玩法,至今都还没有被主流社会认可。

假如 AA 钱包未来有一天能被社会大众认可,那也就意味着 workaround 方案在区块链世界中是可行的。对于整个生态的叙事都将引起巨大的改变。

AA 钱包的未来

综上所述,我们能得出的结论是,以太坊永远不可能支持 “原生” 的 AA 的钱包(在协议层面支持)。

总结

这些结论,对于技术人员的指导意义在于:

  1. 对 AA 钱包祛魅,不要以为 AA 钱包是高级、先进的技术。
  2. 可以学习、使用、研究 AA 钱包,但是千万不要真的 “相信” AA 钱包的技术理念。

最近一年的工作回顾

2025-10-18 19:17:40

前几年写过的关于工作内容方面的回顾:

这些事情只涵盖已经结束的工作,不包括正在进行的工作:

以太坊 PoS 网络的质押生态建设

不是以太坊主网,是自己发行的网络,因为用了以太坊 PoS 的共识模式,所以涉及到 32 ETH 质押的流程。这件事情也简单也不简单,简单之处在于,不就是以太坊节点的使用么?不简单的地方在于,以太坊一共有 5 种执行层客户端和 5 种共识层客户端,虽然都支持标准的 EIP 协议,但是节点关于 key 的导入、管理、发起请求的方式各不相同,节点的启动参数方面也有一些隐藏的坑。

写文档教程、在社区里引导用户、一对一 “辅导” 用户如何自己搭建 Solo Staker 节点,从前端页面发起质押交易,到后端节点拿着质押凭证启动 Validator 等,主要就这些事情。期间还尝试了用 Flashbots 搭建 MEV 节点、给以太坊客户端提交小的功能性 PR、测试不同客户端 EVM 执行效率的 Benchmark 等。

Hyperlane 跨链

Hyperlane 是一个去中心化的跨链协议,用 Relayer 和 Validator 两种链下角色,来保证跨链消息的有效和正确。当时做的事情是把 USDC 跨链到自己的网络上,印象最深的一个坑是那个时候 Hyperlane 还处于 heavy development 阶段,Relayer 节点直接把黑名单的变量名赋值给白名单来用,就上下两段逻辑,变量名复制错那种,用起来非常迷惑。然后还给他们提了 PR。

最后虽然自己搞明白了 Hyperlane 的原理,有能力搭建起一整套跨链环境,但仍然是以官方合作的形式,由他们的团队来维护一些链下节点,相当于给我们链开白名单、增加对我们链的支持。期间他们还有个对接的人离职了,说明团队成员的变动也大。

ZetaChain 的二次开发

ZetaChain 是一条 Cosmos 的链,提供了一种去中心化的资产跨链的方案。我们的项目主要做 Restaking,涉及到多链之间质押状态的同步,所以基于 ZetaChain 的机制做二次开发。

这件事情的难点在于当然得首先搞懂 ZetaChain 的代码逻辑,才能做二次开发。再一个是需要搞懂 Restaking 的业务逻辑,大意好理解,具体的细节不少。然后是 Cosmos 节点的开发和运维,链的部署、升级、回滚等。还有需要参考 CometBFT、Cosmos SDK 的源码结构以及代码流程,开发用于 Restaking 的 AVS 框架什么的。也就这些。

钱包后端开发

主要指非托管式钱包的服务端程序,给客户端提供数据来源,构建交易请求、返回余额、交易记录等,包括比特币和以太坊两个网络。还体验了一下用 Swift 写一个 iOS APP 的 Demo 界面,来演示给比特币交易签名的过程。

基于 AI 语义执行的 MCP 区块链的设计

2025-10-13 17:22:58

MCP 区块链

MCP(Modal Content Protocol)是 AI Agent 在使用的一种协议规范,用于 AI 和外部的工具进行交互,MCP Server 则是具体执行外部交互的组件。

MCP 区块链的含义是,首先它是一条区块链,然后每个节点都原生支持 MCP 协议的 RPC 接口,可以直接接受来自 AI Agent 的请求。每一个 MCP 请求,都是一笔交易(智能合约调用),这也就意味着,区块链会记录下所有的 MCP 交互历史。

节点内部的 MCP 执行引擎,功能分两部分,对于内部交互(EVM 在干的事情),只需要维护好内部的状态转移,把结果写入本地的 KV 数据库就可以了。对于外部交互,则只记录下要执行的请求本身,先不做外部调用。那么实际上对于每一个请求,都会改变本地的状态,所以这些交易是可以重放的,也就可以根据哈希值来确认节点数据的完整性。

至于对外部的执行请求,可以由外部的执行节点(一种角色)来完成。每一个外部请求都包含一些详细的参数,比如需要几个执行者、结果如何验证。交易会把一部分手续费作为执行费用,奖励给执行节点。如果执行节点作恶,自然也会有相应的惩罚机制。

对于外部的调用,关键在于如何验证外部执行的结果,这个问题可以交给调用者来定义,比如要创建一个 GitHub 仓库,验证方式就是,可以通过 API 查询到这个仓库的信息。

这就是 MCP 区块链的大体思路。

设计来源

解释一下这个想法的来源。MCP 区块链并不是想要 “把 MCP Server 去中心化”,而是想要 “给区块链带来与 AI 交互的能力”。这两种动机是截然不同的。

这个想法背后的逻辑很简单,比特币其实有脚本,只不过是生硬的操作码形式。以太坊干了一件很厉害的事情,给操作码加上了编译器,让开发者可以用编程语言来表达操作码。那么如今的 AI,很厉害的一点在于,打通了从自然语言到编程语言的路径。也就是说,未来的区块链,也许可以做到自然语言直接与状态机交互,而不需要经过 自然语言 -> 编程语言 -> 状态机 这样的路径。明显编程语言是一个中间层,MCP 区块链的设想在于消除这个中间层。

另一个边界在于,让区块链完全按照自然语言的意图执行是不切实际的,因为哪怕是人类,也需要书面形式的合同这种东西,所以代码本身不会消失,状态转移也不会消失。目前能够实现自然语言和状态机直接交互的技术方式,就是 MCP。

区块链的技术趋势

最近在思考一个问题,区块链的下一个技术趋势是什么?能明确的几个事实是:

  1. 大家已经不再怀疑加密货币是一种支付手段这件事情
  2. 依靠开发区块链发币的路线,已经完全没有叙事空间
  3. 下一个技术趋势,绝不会是以太坊路线图的扩展

行业内已经提过的方向也都不大有机会,DeAI、ZK、Layer2、DeFi、跨链、RWA、GameFi、BaaS、NFT、元宇宙、DAO、DID 等等,都是陈词滥调了。

所以区块链在技术趋势上,需要的一个原语级别的新叙事。

我从王垠的计算机科学课学到了什么

2025-09-24 12:12:12

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

学习时长

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

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

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

课程体会

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

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

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

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

知识深度

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

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

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

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

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

认知提升

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

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

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

自学能力

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

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

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

超越工程的技术

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

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

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

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

课程的启发性

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

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

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

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

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

真正的编程

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

我事后也惊讶,当时为什么会那样评价面试官出的题目,那是一种下意识的感受。后来想明白,因为你一旦上过王垠的课,就会知道真正的 “编程题” 是什么。LeetCode 上那些算法题,“编程” 的含量有多少呢?学完后课程后,你可以轻易看穿那些低水平面试官的把戏。

换个角度想,每一节课程之后,都有大量练习题需要做。如果把那些练习题,看作面试题呢?你让那些面试官来做一道试试?那可是王垠设计出的题目啊!而每一个顺利从课程毕业的同学,都必须自己做出那些题目。

代码质量

王垠在微博上评论 AI 编程的时候提到,现在的 AI 很厉害,但 AI 在不经过王垠本人调教的情况下,无法写出 “王垠级别” 的代码。什么是 “王垠级别” 的代码呢?上过课就知道了。

我在做练习题的时候,被助教提醒最多次的问题,就是 “代码复杂”,有时候是写法上的复杂,有时候是复杂度上的复杂,但是每一次把代码写到符合课程标准之后,又不禁感叹原来代码可以如此精巧。我有多年的编程经验,让代码运行出练习题的结果并不难,但是把代码写的足够漂亮却不容易。“代码能运行” 和 “把代码写对” 之间,差距非常大。

有一个神奇的现象是,同一道题目,无论反复做多少次,比如做过一次后,放一个月再做一次,之前的记忆已经没有了,但是最终写出来的代码,和之前一模一样。这肯定不是偶然,因为在课程的要求下,你不得不用最简单的思路,写出最精炼的代码,而且还有代码风格和格式方面的约束,自然就会把答案的写法框定在某种形式上。

这不是一件坏事,并不是说要课程要求你教条式地背诵答案,而是在用固定的标准动作训练你的头脑,就想运动员一样,动作要标准规范,才能有好的训练效果。经过这样的训练,在日后写代码的时候,自然而然也会维持同样的动作,写出来的代码会规范和简洁。

掌握新语言

也许有人看到招生说明会怀疑,一节选修课真能让人学会一种新的编程语言吗?我想提醒的是,不要忘了给你讲课的人是谁,是曾经写出了《如何掌握所有的程序语言》文章的作者,是真正的编程语言专家。

课程的稀缺性

设想一下,假如你不想学王垠的课,但是又想掌握课程中的知识,有哪些渠道?

你花同样的钱,是没有其他地方可买的。世界上还有其他华人,能有王垠的学识背景,并且在经过几年的教学试验后,整理出如此精品的课程吗?这种水平的课程,有市无价!

你也可以自己去求学,先掌握流利的英语,然后考个美国顶尖大学的硕士,经过几年的留学生涯,不但花很多钱,还要付出许多时间、精力和努力,还需要一些天赋和运气,才能学到与王垠课程同等水平的知识。你付出的代价,远远不是只花钱就够的。

那么现在,你还觉得王垠的课程贵吗?

课程的内容

我刚才对王垠课程的描述是 “这种水平的课程”,那到底是什么水平呢?我可以举个具体的例子。

课程的第 1 课讲函数,对吧,所有程序员都知道函数是什么,即使不是程序员,初中上数学课也知道函数。

学习课程以前,函数是什么?函数是编程语言的语法之一,作用是把很多行代码包裹起来,方便以后重复调用。面向对象里面叫 “封装”。函数就是个特别基础的概念。

学习课程以后,函数是什么?函数可以是 “计算” 的基本元素,函数可以作为计算的输入,也可以作为计算的输出,一个计算的输出可以作为另一个计算的输入,输出的函数可以被另外的函数调用……

我这么说你肯定没看明白。

换个角度解释,王垠的导师 Daniel P. Friedman,有一本出版的书《The Little Learner》,Guy L. Steele Jr. 在给这本书的序言中写到,Friedman 在这本书里用高阶函数(higher-order functions)的 4 种不同用途,表达了机器学习(machine learning)的核心原理。

你是不是不相信,函数可以表达深度学习的原理?那就去了解一下 lambda calculus,一种和图灵机同等地位的形式化系统,可以表达的是整个计算机体系,而不只是深度学习。

这才是 “函数”。第 1 课学的函数,是这个函数。

系统学习的重要性

要是单拿第 1 课的内容,或者某一课的内容出来,其实并没有那么神秘,很多地方都可以学到。王垠的课程,通过循序渐进的引导让你把这些知识学会,只是其中一方面,另一个更重要的方面在于,从第 1 课到第 6 课的内容,是非常连贯、层层递进、成体系、系统化的。

我们平时掌握的知识点,就像一个个独立的音符,大多数人都可以轻易地弹奏出某个音,但是只有把这些音符编排成曲,才能形成美妙的音乐。伟大的音乐家之所以伟大,并不是因为他们发明了新的音符,而是因为他们能把已有的音符编排成动人的旋律。

单个音符拿出来,我们很难记住,或者容易遗忘。但是一段完整的旋律,会久久盘旋在你的头脑中。即使你忘记了其中的一两个音,也可以根据整首曲子的旋律推测出来,甚至可以突发奇想,自己对旋律做一些改进。这就是系统学习知识的意义。

课程的定位

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

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

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

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

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

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

抵抗 AI 的冲击

这一小节单独成文:《王垠的课能帮助程序员抵抗 AI 的冲击吗?