真正在退化的那项能力
这周有三篇不同的文章在担心 LLM 让程序员变差。它们担心的多半是错的那项能力 —— 写代码从来不是瓶颈,而取代它的那件事更难,不是更容易。

真正在退化的那项能力 🧠
一周之内,三个不同社区出了三篇文章:LLM 时代怎么学编程、如何在 AI 时代保住对写代码的热爱、现代工程师安静的认知萎缩。这个门类现在大到已经有固定套路了。
担忧通常被表述成:如果模型把代码写了,你就永远学不会写代码。这个表述很整齐,但我认为它瞄错了对象,因为产出语法从来不是这份工作里贵的那部分。
什么没有退化,因为它本来就没承重
记得 Python 切片是左闭右开、strcpy 不做边界检查、那个参数叫 -exec 且以 \; 结尾 —— 这是查阅。在它成为模型操作之前,它是手册操作;从一个搬到另一个,变的是延迟,不是认知。
敲出一个循环。知道列表推导式长什么样。记得标准库某个调用的参数顺序。这些感觉像编程,因为从外面看编程就长这样,而它们也正是模型最明显顶替掉的部分。它们同时也是这份工作里最不重要的部分。
如果你对"专业能力"的心智模型是"记得住咒语",那么是的,它正在被侵蚀,而且它本来就没你以为的那么重要。
真正在被侵蚀的东西
一件更具体、也更难察觉的事:动手之前先建立因果模型的习惯。
看一个难 bug 被处理的方式差别就清楚了。无辅助的路径慢而有结构 —— 对"什么能产生这个现象"提出假设,找出能区分这些假设的最便宜的实验,跑它,更新。你通过做这件事变强,而且正因为它不舒服才变强。
有辅助的路径有一条感觉像进展的捷径:描述症状、拿到一个貌似合理的原因、套用建议的修法、看症状消没消。有效时,你得到一个修好的 bug 和零个模型。无效时,你描述新症状,再来一遍。这个循环收敛得出奇地频繁,而这正是它腐蚀性的来源 —— 反馈信号在奖励这个循环。
代价在你撞上"貌似合理的原因是错的"那个 bug 之前都是隐形的。到那时你会发现,你一直靠别人画的地图在走,而你分不清地图上哪些部分是猜的。
我可以给一个这个月我们自己的例子。一个 macOS 应用公证通过、codesign --verify 通过、Gatekeeper 通过,然后在启动的瞬间被内核杀掉。每一个貌似合理的原因 —— 签名损坏、证书有问题、隔离属性 —— 都是错的。真正的原因是一个受限 entitlement 没有描述文件授权,而通往这个答案的唯一路径是:停止猜测、读内核日志、然后造一个只隔离一个变量的探针 —— 用那一个权限签一个极简二进制,看它跑不跑得起来。
最后那一步才是能力。不是知道答案,而是构造出能区分答案的实验。
另一个在退化的:阅读
第二个伤亡讨论得更少,量级可能更大。随着你没写的代码占比上升,你评审的代码占比同步上升。读懂陌生代码是一项独立能力,而我们多数人从没被正式教过,因为我们多数人过去写的大多是自己的代码。
它同时也是压力最大的那项能力,因为评审慢、接受快,而两者的即时回报差距巨大。一个看起来对、测试也过的 diff,在当下是很难反驳的。
具体的失败模式不是"模型写了个 bug",而是"模型写的东西在我想到的那个场景下是对的" —— 而你没想到的那个场景,恰恰是你需要第二个脑子的地方。
一个看起来管用的做法
不是戒断。戒断的论证会输,因为效率差距是真实的,人们不会为了一个原则放弃它。
对我们管用的是更窄的一条:维持一个关于「能否解释」的标准,而不是关于「是否亲手写」的标准。
在你没写的代码进仓库之前,你应该能够 —— 出声地、对另一个人 —— 说出它做什么、为什么用这个方案而不是某个显然的替代方案、以及什么条件成立时它会是错的。不是 diff 的摘要,是一个因果说明。
如果你给不出这个说明,你就没有评审过这段代码,你只是目击了它。补救办法不是自己重写一遍,而是继续追问到能解释为止 —— 这恰好是模型很擅长的对话,而多数人会跳过,因为代码已经能跑了。
这个做法有个好性质:它随风险自动缩放。对一个一次性脚本,标准轻松达到,不花成本。对那个会碰生产数据的东西,达到这个标准就是大部分工作量 —— 而这正是努力该有的分布,也正是"唯快"会把它颠倒过来的那个分布。
确实变好的那部分
这值得明说,因为这个门类往往不说。
门槛降下来了。一个有清晰想法、没有科班训练的人,现在能做出能用的东西;而这个行业历史上相当大一部分把关,把的是咒语而不是思考。这道关口失守是好事。
对有经验的人,乏味的中段 —— 样板代码、第五个 CRUD 接口、一年用两次的语法写的配置文件 —— 确实被压缩了。那里的压缩不是认知衰退,是把从来没教会你任何东西的活儿去掉。
需要守住的东西比"写代码"窄得多:在依赖某个东西之前先知道它为什么能用。这一直都是这份工作。现在它是全部的工作 —— 这是一次伪装成威胁的升职。