AI时代,我们会有个疑惑:当所有代码都是 AI 写的,初级程序员的学习路径被剥夺了,资深工程师怎么培养?Jane Street 的 Ron Minsky 与 Aaron Bauer 的一场对话,聊到了Jane Street的一种解法。
Ron Minsky是 Jane Street 的 CTO。而 Aaron 在Jane Street的头衔在其他公司不太常见:工程师培训师(developer educators)。Aaron 在 Jane Street 的职责一半是给公司写代码、一半教人写代码;此前他在 Carleton 学院教计算机。
餐巾纸上的代码
把学生扔到电脑前不是最好的教法。Ron Minsky 用另一种方式教自己的孩子编程。在餐馆等菜的间隙,他拿出一张餐巾纸,写几行用混淆变量名命名的 Scheme 代码,让孩子们猜这段代码在算什么。函数名故意起成 Foo 这种毫无意义的词。
Aaron 学编程也类似。高中科学营用 Python 算小行星轨道,后来想学 AP 计算机但学校没课,在网上找到一位常年坐在北卡罗来纳海滩上、只通过纯文本邮件答疑的退休教师。没有视频,没有在线 IDE。
这引出了对 “翻转课堂”这种教学方式的探讨:把讲课录成视频让学生在宿舍看,课堂时间留给互动。但现场讲课有一种被低估的力量:活人站在面前拆解推理,注意力会被牢牢抓住。人对屏幕的反应和对人的反应不一样。现场听讲的人更可能记笔记,而记笔记这个动作本身就帮助记忆,哪怕笔记再也没看过。
手写比打字好,真正的杀手是屏幕。Aaron 教编程时不让学生开电脑,让他们在纸上写程序、判断代码对不对。初学者在屏幕前会进入乱改模式,直到程序碰巧编译通过了。这个过程中,思考是碎片化的。
平行宇宙里的编辑器
Jane Street 是著名的异类。二十五年里,世界在 Git、VS Code 和 Modern Web 栈里转,他们走了一条自己的路:用 OCaml 构建几乎所有交易系统,自研版本控制系统 Iron,有专门的团队维护编辑器。大多数公司的代码审查流程是这样的:终端提交,推远程,打开浏览器 GitHub,在 Web 表单里点选某一行留评论。在 Jane Street,代码审校只发生在编辑器里。编辑器是工程师的大本营。分支管理、版本比对、修改建议全在编辑器完成。给别人提建议是在代码行直接写格式化注释,也可以直接拉取对方代码帮他改好。
外部工程师第一次见到这种做法往往觉得 “侵入性太强”。但反过来想:在网页里看着静态代码指手画脚,连随手跑个测试、改个变量名都做不到,这才是怪异的。Jane Street的做法是把编辑器变成唯一控制台,把反馈闭环缩短到极致。
这也解释了为什么 Jane Street 要设 “工程师培训师” 且要求教学者承担一半日常工程开发。传统大学里教计算机的教授多年不写工业级代码,大厂里资深工程师忙于救火无暇思考公司级的系统沉淀。面对一个高度自研的复杂系统,脱离前线的老师教不出合格工程师。
Aaron 进公司后接手了一个糟糕的测试培训。Ron 想组织大家学软件测试,各路人马各管一摊,但没人把整件事捏起来。Aaron 上来问了一句:你们的 “学习目标” 到底是什么?
好的学习目标不是 “理解 property-based testing”。“理解” 没法验证。好的学习目标是 “完成培训后,学员能够为一个嵌套 record 类型的输入写出 property-based 测试”。动词主动,范围具体,能不能做到看得见。
所以,一个好的学习目标一定是以某种形式输出且可衡量的,这和定义一个任务的SMART原则有些类似。
一旦诚实地写下目标,练习就该让学员练这个,讲座就该讲做这个需要的背景,无关内容全砍掉。它还给了你一把评估培训本身的尺子。
绝大多数教学从不这么做。大家习惯的是讲完就算教完了,学生到底掌握了什么,没人说得清。
当代码可以被自动生成
大语言模型学会了写代码,能在十秒内写出几乎所有大学作业级别的代码,还能修类型报错。对于老师的第一反应肯定是筑墙:禁止用 AI、断网环境考试。但这就像计算器发明后数学系禁止加减乘除一样可笑。过去,写出可运行的代码是检验理解的唯一手段。“产出代码” 不是目的,“建立心智模型” 才是。计算机科学的核心是构建对状态、控制流、类型系统和系统边界的抽象理解。过去代码是投射这种理解的唯一介质,现在 AI 可以跨过人的思考直接代劳介质的输出。
如果只把 AI 当自动写手,心智模型就会萎缩。你会退化到那个在终端前胡乱碰运气的初学者状态,只是这次不是乱改字符,是不断向 AI 重新输入 Prompt,祈祷下一次吐出的代码刚好能跑。
Jane Street 之前的实习生项目是花四周做一个编程项目,现在 AI 工具好到一个 prompt 就做完,项目的评估意义归零。他们没有禁掉 AI,而是把整个实习课程拆了重建。逻辑是:过去 “能不能产出合理质量的代码” 是最重要的信号,现在代码变成了容易的部分。以下剩下的才是真正该教的东西:
重构学徒制
当生成代码的边际成本趋近于零,软件工程真正稀缺的东西浮出水面。Jane Street 把新教学重心放在三件事上:意图与设计。 最顶尖的工程师是能最清晰地把模糊需求拆解为优雅系统结构的人。决定系统边界在哪里、状态由谁持有、模块间如何解耦,这些架构层决定 AI 无法凭空做出,只能在你给出清晰架构后填补细节。
深度测试。 代码是机器写的,你如何证明它对?测试从写完代码后的补丁变成核心规范。必须比以前更擅长思考边缘情况,用确定性的属性测试界定代码安全范围。测试不再是苦力活,是定义 “真理” 的方式。
代码审校与鉴赏力。 人的角色不再是创作者,是总编辑。必须阅读海量人类或 AI 生成的代码,迅速嗅出坏味道、隐蔽的并发竞争、性能瓶颈。品味只能来自过去亲手拆解过的优秀和糟糕的系统。
新实习项目变得更开放、更模糊、更像真实工程。塞进了更多小组讨论、设计交互活动、模拟与需求提出者之间的对话,这些恰是 LLM 做不了的部分,因为它们本质上是关于人和判断的。
这背后是 Aaron 在 Carleton 学院就实践过的 “认知负荷” 理论:人同时能装进工作记忆的新东西有限。他把 OCaml 新人营拆开:先只学语言本身,用命令行 REPL;编辑器单独一堂课;代码审查再单独一堂课。AI 出现后原则没变,只是要装进脑子的东西清单换了。
底层的意义
每次抽象层提升都有人说不需要学底层了。高级语言出现时说不需要懂汇编,操作系统出现时说不需要懂硬件中断。但真正能驾驭新层级的人,永远是清楚下一层到底发生了什么的人。系统正常时抽象层美好,当时钟倾斜、网络缓冲区溢出、AI 写出的微妙逻辑漏洞导致数百万美元损失时,能救你的只有老派的、扎实的心智模型。Aaron 提到 Claude Code 有一个 learning mode,让模型停下来在代码里留 TODO 让人填。他发现这样不仅更愉快,还真的更理解代码。这很像记笔记:你参与生产,就会理解得更深。现在的工具大多倾向于让模型生成一切然后人选择接受或拒绝。也许应该设计更多让人参与生产的摩擦。
真正的学习目标一直都没变
AI 时代教学的目标是什么?真正的学习目标一直都在,只是被 “写代码” 这个显眼的任务盖住了。当公司用 “能不能四周内写出这个系统” 评估实习生时,真正想测的那些东西 —— 判断力、品味、和不确定性共处的能力 —— 从来没被直接测过,只是搭了 “产出代码” 这趟顺风车。现在车空了,才发现不知道要往哪儿去。
“机器帮不上忙的地方” 这个清单和 “学习目标” 的写法是同一件事:先具体写下一个人在结束时应该 “能做什么”,不是 “理解”,不是 “掌握”,是能做什么。一旦诚实地写下那个动词短语,AI 能不能替他做这件事就一目了然了。凡是一个 prompt 能替代的,都不该是学习目标。
这个原则逼你面对一个问题:你现在教的东西里,有多少是你自己都说不清 “学完之后他能干什么” 的?AI 的价值就是把这部分逼到光天化日之下。
读后思考
读完如上 Jane Street 在AI时代对“如何学习”的重新思考,我的感悟有如下3点:• 新人培训课题:我们公司的新人培训跟 Jane Street 的套路有些类似:“四周时间,用底层框架从零搭一个简版交易系统”。这个课题在AI时代可能用一句prompt就能解决了。所以AI 时代这条路需要重构,需要重新定义动手的学习目的是什么。也许可以改成手动画出交易业务模型的关系图,测的是对业务结构的理解;也许是设计一个在注入故障后仍能稳住的系统,测的是你对韧性的判断;也许是搭一个能自迭代提升吞吐的性能进化平台,测的是你对架构演进方向的把控。这些变体的共同点:“你能不能写出这东西”不再重要,“这东西为什么该长这样”才是。
• 搭建新人友好的学习环境。AI 对新人有一个真实的好处:反馈闭环变短了。以前主要时间花在编写代码,等待反馈上。现在一个 prompt 下去,几秒就知道方向偏没偏。如果能给新人一套高仿真的运行环境,再往里埋一些精心设计的异常场景——就像游戏的新手村,难度可控,反馈即时——学习就变成了打怪升级。浓缩起来两件事:一,搭一套高仿真的环境让系统跑起来;二,用线上的历史事件或一套完备的测试用例集作为输入校验,让每次尝试都有反思收获。
• “无AI日”。常用 agent 编程一段时间之后,能明显感到自己编程能力的退化。可能的一种解法可能是定期搞一个“无 AI 日”,偶尔回到“古法手搓”的状态,重新激活对底层细节的敏感。就像你学会开车之后,就再没骑车上过班。目的地没变,时间省了。但偶尔骑一次,你能感受到一路上的城市环境,自由大胆地去试没走过的路,在慢悠悠中看到一些坐在方向盘后面注意不到的变化。抢个沙发
🙂
🤔