氛围编程是指通过向大语言模型(LLM)发出提示,告诉它要构建什么,然后进行测试,再提示它进行修改——但全程不看LLM生成的任何代码。这种技术可以让没有任何编程知识的人使用。然而,由此产生的软件往往在可维护性、正确性和安全性方面存在问题——因此最适合用于为有限受众编写的、一次性的软件。

该术语由经验丰富的程序员安德烈·卡帕西(Andrej Karpathy)于2025年2月在X平台上的一篇帖子中首创:

有一种我称之为“氛围编程”的新型编程方式,你完全沉浸在氛围中,拥抱指数级增长,甚至忘记代码的存在。之所以能做到这一点,是因为LLM(例如Cursor Composer搭配Sonnet)变得过于出色。而且我只是用SuperWhisper与Composer对话,几乎都不碰键盘。我会问一些最愚蠢的问题,比如“把侧边栏的内边距减少一半”,因为我懒得去找到它。我总是“全部接受”,不再查看差异。当我收到错误消息时,我只是直接复制粘贴进去,不加任何评论,通常这样就能解决问题。代码增长到超出我通常的理解范围,我必须花时间仔细阅读。有时LLM无法修复某个错误,我就绕过它,或者要求随机修改直到问题消失。对于一次性周末项目来说,这还不错,但仍然相当有趣。我正在构建一个项目或网络应用,但这并不是真正的编程——我只是看到东西、说出东西、运行东西、复制粘贴东西,而且大部分都能正常工作。

—— 安德烈·卡帕西

氛围编程的关键点在于**“忘记代码的存在”**。这正是它既实用又有限制的原因。

十一月转折点以来,许多程序员让LLM编写他们所有的代码,并评论说他们可能再也不会直接编写一行代码了。然而,他们确实关心这些代码,会进行审查,关注其内部结构。在这种情况下,他们并没有忘记代码的存在,所以这实际上是另一回事,我称之为代理编程。遗憾的是,“氛围编程”这个术语确实流行起来了,所以很多人用它来指代代理编程。然而,尽管存在这种快速的语义扩散,我仍然认为值得尝试将氛围编程和代理编程的概念区分开来,因为它们在用法和后果上都截然不同。

由于氛围编程者不看代码,他们不需要编程技能,因此对于没有编程知识的人来说,这是为自己构建应用程序的完美方式。经验丰富的程序员也可能发现它在快速开发一次性软件或原型时很方便。

氛围编程仍处于新兴阶段,因此我们正在探索其局限性,而这些局限性会随着模型及其工具链的成熟度变化而改变。这些局限性确实带来了相当大的风险,尤其是当氛围编程开发的软件被广泛使用或能够访问敏感信息时。

最严重的风险或许在于安全性。大语言模型天生存在漏洞,因为它们为攻击者提供了庞大的攻击面。氛围编程开发的应用程序常常会泄露敏感信息,甚至暴露凭证,使攻击者能够深入渗透组织的系统。即使是非程序员也需要了解致命三重奏

由于对代码关注不足,氛围编程开发的软件可能迅速产生大量低质量代码。这种代码即使对LLM而言,未来也难以修改和增强。虽然LLM能力的提升或许能让它处理最混乱的“意大利面条式”代码,但迄今为止,结构良好的软件显然也能让LLM的工作更轻松。

LLM以习惯性产生错误事实并自信地呈现而闻名。这种习惯也会导致它们创建行为不正确的软件——而这些错误可能不会对用户显现。此外,LLM的非确定性意味着,要求LLM增强某些软件时,很容易导致它引入错误,甚至可能出现在不应因新需求而变更的代码部分。因此,我们应该对LLM生成的软件持怀疑态度,它仍然有用,但我们需要意识到其中的风险。

总体而言,氛围编程软件最适合用于一次性软件,仅供其作者或了解并接受相关风险的紧密合作团队使用。对于更复杂、使用范围更广、风险后果更严重的代码,则不应掉以轻心。