Vibe Coding 不是终点:AI 编程教育真正该补的是打开黑盒的能力
AI 编程不是教育终点,关键是让生成代码可读、可测、可修。
软件行业这两年争论 Vibe Coding,常常吵成两边。
一边说,AI 让不会编程的人也能写工具,这是解放。另一边说,不懂代码却生成代码,只会制造更多不可维护的垃圾。两边都有道理,也都说得太满。
更好的问题不是“要不要让 AI 写代码”,而是:自动生成的代码能不能被看懂、被拆开、被修好。
编程能力来自可读性
早期学习计算机的人,常常能摸到系统的内部。
CARDiac 是一个纸板计算机。它用卡片和槽位模拟内存、累加器和指令执行。速度慢得可笑,但它让“计算”变成了能被眼睛和手指感知的动作。后来在 Apple ][+ 上敲 BASIC 程序,照着杂志输入代码、修 typo、自己琢磨调试器,也有类似效果。浏览器时代的 View Source,又给网页开发留下了一条缝:看见效果后,可以直接翻到下面的 HTML 和 JavaScript。
这些入口的共同点,不是效率高,而是可读。
图:可打开的系统能让人从使用者逐步走向改造者。
一个系统只要能被打开,人就有机会从使用者变成改造者。反过来,如果系统永远只给一个光滑界面,失败时只返回一句含糊报错,学习就很难发生。
抽象层不是敌人
很多批评AI 编程的人,会把“不了解底层”当作原罪。这不公平。
现代软件本来就是一层层抽象堆起来的。没人会每次写 Web 服务都从晶体管想起,也没人要求前端工程师先手写 TCP 栈。抽象层的价值,就是让人不用每一步都面对底层复杂性。
真正的问题是,抽象层能不能在需要时被打开。
图:好的抽象不是把底层永久藏起来,而是在失败时留下可追踪的入口。
| 抽象工具 | 好处 | 风险 | 合格条件 |
|---|---|---|---|
| 宏录制器 | 让非程序员自动化重复工作 | 生成脚本难维护 | 能查看和编辑脚本 |
| View Source | 让网页结构可学习 | 只能看到前端一部分 | 代码和效果能互相映射 |
| Stack Overflow 复制代码 | 快速解决局部问题 | 不理解边界条件 | 能追问、调试、改动 |
| LLM 生成代码 | 降低入口门槛 | 可能制造黑盒依赖 | 能解释、测试、定位失败 |
所以,Vibe Coding 的问题不在“AI 帮你写了代码”。问题在于,AI 生成的东西是否把你困在更高的黑盒里。
个人软件和生产软件不是一回事
一个人用 AI 写个脚本整理照片、生成报销表、同步自己的笔记,即使代码粗糙,也未必是什么灾难。它解决的是个人问题,维护边界也很小。坏了,大不了重写。
生产软件完全不同。
上线给别人用的系统,要考虑可维护性、安全性、可观测性、权限、兼容性和长期演进。这里的代码不是“能跑就行”,而是要被团队接手,被故障现场考验,被用户的奇怪输入折磨。
| 场景 | 可以接受什么 | 不能忽略什么 |
|---|---|---|
| 个人脚本 | 粗糙实现、少量重复、临时方案 | 数据安全和基本可恢复 |
| 内部小工具 | 有限用户、快速迭代 | 权限、日志、部署方式 |
| 面向客户的产品 | 清晰架构、测试、监控 | 责任边界、长期维护、故障处理 |
把这三类混在一起讨论,Vibe Coding 就会变成口号战。个人软件里,AI 生成代码可能是巨大的创造力入口;生产系统里,它必须接受工程纪律。
AI 工具应该设计学习坡道
如果 AI 编程工具只追求“你不用懂,交给我”,那它确实会削弱人的能力。用户会越来越依赖提示词,越来越不会判断生成结果哪里坏了。
但另一种设计方向更有意思:让 AI 生成结果之后,顺手给出可打开的结构。
图:AI 编程工具如果能展示调用链、失败位置和测试边界,就更容易把使用带向理解。
比如:
| 工具能力 | 对学习的帮助 |
|---|---|
| 标出关键文件和调用链 | 让用户知道代码从哪里开始运行 |
| 解释失败堆栈和相关行 | 把报错变成可定位的问题 |
| 生成最小测试用例 | 让行为边界可验证 |
| 展示替代实现方案 | 让抽象选择变得可讨论 |
| 保留修改记录和原因 | 帮用户复盘判断过程 |
这类设计不会让每个用户都变成专业程序员。大多数人只会停留在“解决自己的问题”这一层。没关系。漏斗顶部越大,愿意继续往下钻的人也会越多。
入口变宽之后,教育方式要变
过去的编程教育常从语法开始。变量、循环、函数、数据结构,一层层往上。AI 编程普及后,很多人的第一步会反过来:先得到一个能跑的东西,再追问它为什么能跑。
这不是坏事。它更像早期网页时代的 View Source:先看到页面,再复制,再改,再理解。
区别是,LLM 生成的代码可能比当年的 HTML 复杂得多,也更容易把错误藏起来。教育者和工具设计者要补的不是更多语法讲解,而是更多“打开黑盒”的方法。
怎么读生成的代码,怎么确认依赖,怎么写测试,怎么判断一个 bug 是需求问题、数据问题还是状态问题。这些能力会变得更重要。
Vibe Coding 不是编程教育的终点。它只是把入口换了个方向。
如果入口后面是一堵墙,那它会制造依赖。如果入口后面是一条能继续往下走的坡道,它就可能把更多人带进真正的软件理解里。
