本文翻译自 Engineering, 747s, and Coding Agents,原载于 Hacker News。
一次改变视角的飞行
几年前,我从德国出差回来,幸运地升到了商务舱。邻座是一位比利时籍的 747 飞行员,大概五六十岁的样子。我们聊了很多关于各自职业生涯的话题。
那时候我刚离开海军,开始专业编程还不到一年。而他大学毕业后不久就当了飞行员,飞 747 已经快二十年了。他在学校学的是机械工程,给我详细讲解了现代飞机上可变几何形状的喷气式涡轮发动机——这种发动机能在很广的海拔范围内保持高效。
我表达了对他工作的羡慕。很明显,他对飞机有着极客般的热爱。虽然现在大多数航空公司已经不再飞 747 了,但这确实是一台不可思议的机器。他同意能飞这架飞机是一种特权,但他有些感慨地说:
在这份工作中,过了一段时间之后,就没有进步了。你今天不会比昨天更好。
他说到现在为止,他对 747 的了解已经到了飞行员能做到的极限。事实上,他有时希望自己当初成为飞机的工程师或设计师,这样学习新东西就会成为工作的核心部分。然后他说:
你很幸运,你的工作是这样的。
编程工作的变化
那次飞行之后,我的工作发生了很大变化。AI 编程代理(Coding Agents)可以完成我之前认为是我工作的大部分内容。
我大概是最后一批应该对此感到沮丧的人——我在一家 AI 实验室工作,如果 AI 能兑现其经济承诺,我会获益良多。尽管如此,这确实改变了我解决问题的的方式,有时候我感觉自己更像一个飞行员,而不是工程师。
过去的工作方式
在过去,当我修复一个 bug 或实现一个功能时,我必须花一定的时间去理解情况。比如,要给这个网站添加分页功能,我会:
- 阅读 Jekyll 文档
- 找到合适的插件来安装
- 阅读示例配置
- 进行修改
如果不行,我就去 Google 搜索,读更多资料,尝试更多方法,重新测试,等等。在这个过程中,很难不学到东西。解决完问题后,我对系统的运作方式会有更好的理解。如果我需要再次实现这个功能,我会做得更快、更轻松。
LLM 时代的转变
当 LLM 开始擅长编程后,我偶尔会在过程开始时向它们寻求帮助,主要是用来替代搜索引擎。如果遇到错误,我会把错误信息复制粘贴到聊天机器人里,看看它怎么说,而不是先努力理解(经常是还没读错误信息就去问)。
但这并没有取代批判性思维,因为我仍然需要学习和规划来实现修改。
AI 编程代理时代
但最近几个月的 AI 编程代理改变了这一切。通常,代理可以端到端地实现整个功能,完全不需要我参与。
现在当我需要修改代码库时,我不再从理解开始。相反,我先看看我的编程代理能否”一击即中”地解决问题,只有在它似乎要失败时才介入。这种情况越来越少,而且我放心交给代理的功能也越来越大。
产出更多,但成长更少
我相信编程主要是达到目的的手段。编程代理让我比以前做得更多,所以大部分情况下我很高兴!但我得承认,把功能完全交给 AI 也有些让人不安。
我不再像以前那样快速地积累技能或知识。 如果我用编程代理构建一个功能,然后必须再做一次,我第二次并不会更快。可以想象,用 AI 写代码写二十年,最后也不会变得更熟练。没有进步。
如果我确实需要介入并拯救 LLM,我也经常变得迷失。突然之间,我在阅读别人的代码。我不是逐渐理解问题的解决方案,而是被直接呈现了解决方案——只是有点不对劲。随着 LLM 为我处理越来越大的任务,这种情况会变得更糟。我唯一的慰藉是我需要这样做的次数会越来越少。
“提示工程”是答案吗?
你可能会说,新的真正技能是提示代理(prompting agents)。但我不相信这一点。提示很容易,而且只会变得更简单。
关于编程和问题的硬核知识才是帮助你做出良好设计决策的关键,所以这些知识是决定你的编程代理是否成功的最重要因素。而获取这些知识正在变得可有可无。
有些人可能会(带着傲慢地)说,我应该阅读我的代理生成的代码,而不是盲目依赖它们。我确实会读代码,但审查代码与编写代码非常不同,能学到的肯定更少。如果你不相信这一点,我怀疑你不是做软件的。
如何应对?
编程代理已经来了,不用它们是愚蠢的。但是,我认为如果你理解你正在工作的领域,你会更成功地使用它们。
这曾经是编程的必要副产品,但现在不再是了。为此,也许这样做是个好主意:
- 作为教育任务而非生产任务,手写最低限量的代码
- 先尝试自己写出问题的解决方案,只有在确信你的答案正确后,再与 LLM 的答案比较
要点总结
- AI 编程代理确实提高了效率,但代价是减少了对底层技术的深度理解
- 被动阅读代码 vs 主动编写代码——两者的学习效果截然不同
- 领域知识仍然是关键——它决定了你能否有效地指导和审查 AI 的工作
- 刻意练习很重要——即使有 AI 辅助,也要保持一定的手动编码来维持和提升技能
这篇文章让我想起了一个问题:当工具越来越强大,我们是成为更好的工匠,还是只是成为更好的工具操作员?这可能是每个程序员都需要思考的问题。