For AI agents: the complete documentation index is available at https://blog.glimverge.com/llms.txt, the full documentation bundle is available at https://blog.glimverge.com/llms-full.txt, and this page is available as Markdown at https://blog.glimverge.com/%E4%BA%8C%E5%8D%81%E5%88%86%E9%92%9F%E5%86%99%E5%AE%8C%E7%9A%84%E4%BB%A3%E7%A0%81%E4%BD%A0%E6%95%A2%E6%94%B9%E4%B8%80%E7%89%88%E5%90%97.md.

二十分钟写完的代码,你敢改一版吗

读前一句

让 AI 替你做你已经会做的事,别让它替你做你正要学的事。

封面

先讲个我们都很熟的场景。

同事 A 用 AI 搓一个页面,二十分钟,能跑,样式干净,截图丢进群里,一片叫好。同事 B 手写,跟 CSS 较劲,跟一堆边界条件较劲,中间还撞上一个诡异的异步 bug,查到第二天下午才把它摁住,最后也跑起来了。两张截图放在一起,看不出谁花了多久。

只看做出来的东西,两边一样。

产出凭什么证明过能力

工程师这行靠另一条等式吃饭很久了。面试看你做过什么,晋升看你交付了什么,评审看代码写得怎么样。我们习惯拿产物证明自己行。AI 第一次让这条等式不好用。

省时间当然有用。我每天都在用,不少活从三天压到三小时。

旧等式失灵,是因为中间那段摩擦被抽走了。过去产物能证明能力,多半因为产物不可能白来,后面站着一段时间、一堆报错、一次次返工。证据在那段摩擦里,产物只是它留下的痕迹。

这里还要再往下走一步。摩擦不光是能力的证据,它还是能力长出来的地方。跟一个诡异的异步 bug 耗两天,耗完你身上会多一样东西,下次再碰到类似的坑,你能认出来。这样东西长在过程里,不长在结果里。摩擦没了,痕迹还在,你照样看得见东西做出来了,可你已经没有那两天可以长了。

所以 AI 抽走的不只是时间。它顺手把练手的场地也抽走了。

摩擦被抽走

代价是第二天才到的

功能上线崩了,你打开文件,看着一段不是你写的代码。看得懂就能修,看不懂就只能再去问 AI,然后跟模型猜谜。昨晚的成就感,在你身上留不下什么。

一个人讲不清,还只是个人的麻烦。一个 PR 的作者自己讲不清,评审就容易走过场。

代码评审能成立,有一个没人说出口的前提。作者比评审的人更懂这段代码。评审者看的是方向、边界和副作用,他默认作者知道每一行为什么这么写。整个流程靠这个默认撑着。

AI 生成的代码把这个默认抽掉了。作者自己也只看过一遍输出,他没有比评审者多懂多少。这时候评审在审什么,谁也说不清。

还有一件更实际的事。AI 生成的 PR 往往偏大。八百行 diff 摆在你面前,你不可能逐行看完,只能挑几处扫一眼。人写的八百行,作者自己知道哪三十行是要紧的。AI 写的八百行,没人知道哪三十行要紧。

更难的地方在于,没人愿意在评审里说我看不懂。这句话等于承认这段代码不该由自己提交,也等于当着同事认一件不太体面的事。最常见的动作就变成了看一遍,结构清楚,命名规整,边界看着也像那么回事,点通过。AI 写的代码通常长得很好看,这一关过得格外容易。

时间一长,系统里积起一批没人真懂的代码。它们能跑,测试也过了,看板上一片绿,绿得很稳。直到某天它不能跑了,团队里没有一个人能站出来说,我知道它为什么这么写。

认知债和技术债不是同一种债

技术债我们都熟。还有一种债很少有人记账,叫认知债。代码不是你的,理解也不是你的,等它出问题那天,连本带利一起还。

两种债的利息长得不一样。技术债的利息是改起来慢。你每次碰到那段代码都要多花一点时间,痛是持续的,总有一天会被排进迭代。

认知债的利息不在平时。平时它完全不痛,代码跑得好好的,没人会去问它是怎么跑起来的。它只在出事的那个晚上一次性结清,方式是没人能响应。

这决定了它几乎不会被主动偿还。技术债天天痛,有人会去还。认知债不痛,出事才痛,而出事又常常能被解释成偶发的、外部的、上游的。一次线上故障过去,值班的人熬到凌晨,复盘会开完,改进项挂到下个季度,代码照原样躺着,债一分没少。

两种债

判断力寄生在底子上

我不是来劝大家别用 AI 的。用,是对的。AI 让你长出来的本事,是判断、描述和验收。这是真本事,跟旧标签"我会写代码"不是一回事。最容易犯的错,是拿新本事去填旧标签。

判断力涨了一点,工程底子未必一起涨。下次接到更硬的需求,手底下该懂的还是空的。

麻烦还在于,判断力是靠底子喂的。你能看出 AI 给的这段并发处理有问题,靠的是你自己踩过坑。底子停在那里,判断力早晚跟着停。它涨到某个位置就上不去了,而你还以为自己一直在进步。

这里面很阴的一点在于,玩和练从里面看常常是同一个感觉。vibecoding 一晚上很爽,手写两天也很爽,都看到东西跑起来了。当下很难分辨这一晚是在玩,还是在长能力。于是就会拿做出来的即时快感,去结变强了的长期账。

判断力寄生在底子上

讲得清楚,可能只是转述

我自己在这上面栽过。一段 AI 生成的逻辑,我读完觉得懂了,还能给同事讲一遍。讲到一半同事问,这里要是并发呢。我答不上来。我复述的是它的结论,我没想过它为什么成立。

AI 生成的代码特别容易制造这种错觉。它命名规整,结构清楚,读起来一路顺。读得顺和想得通是两回事,你很容易把前者当成后者。

讲得清楚和真的懂,中间隔着一道很窄但很硬的坎。就看你能不能回答一个问题,把它改成另一种写法会怎么样。

答得上来,说明你脑子里有它的模型。答不上来,你手里只有一段转述,讲得再流利也只是读得比较熟。

读得很顺,影子里是空的

怎么给自己量一下

我想了很久,有没有一把能用的尺子。很土,对我管用。

做完之后,不看结果,能不能说清楚它为什么成立。

落到日常是三个问题。

  1. 这段代码明天出线上事故,我敢不敢在没有 AI 的情况下自己定位、自己修?
  2. 能不能把它讲给一个完全不了解背景的同事,讲到对方能接着改?
  3. 如果现在把 AI 关了,我还知道从哪下手吗?

三个都答能,那这次就是在长本事。有一个卡住,它多半只是一次很爽的消费。

想再狠一点,就把它改一版,看跑出来的结果是不是你预想的那样。这一下最准。

线划在哪里

有些页面、有些脚本,你就是要个产物,用完就扔,怎么方便怎么来。我不会因此觉得谁虚。工具没毛病,出问题的是目的和手段没对上。想练能力的人在买产物,想要产物的人却在自我感动地练能力。

我自己只划一条线。让 AI 替你做你已经会做的事,别让它替你做你正要学的事。

前半句是放开的。你已经会的活交给它,只是省时间,底子在你身上,丢不掉。后半句是底线。你还不会的那块,正是摩擦该发生的地方,你把它交出去,就什么都没留下。

AI 把写代码的时间还给你了。那段时间你拿去干什么,现在没人替你安排,也没人替你检查。

那条线