从一句咒语开始
动念写这篇文章,是因为最近看到了一些具有神秘色彩的言论,比如说第一性原理咒语:一些人声称,如果在 Vibe Coding 的时候,让模型基于第一性原理思考,会获得更好的效果。听起来,“第一性原理”好像变成了一个魔法咒语,具有了点石成金的魔力。那么我今天也试着用第一性原理,从香农信息论的视角,去拆解所谓的 Vibe Coding 。
信息论视角下的软件
根据信息论的基本观点,信息被用于消除系统中的不确定性,可以把软件建模为“有效信息”的集合。这里的有效信息,并不是一个严格的信息论术语,而是一种便于讨论的定义:它指的是构成该软件核心语义、并使其区别于其他软件的那部分信息。
举例而言,对于一个 SaaS 产品,其架构与技术选型往往属于有效信息;而对于一个面向大众的消费级产品,用户更关心的是其交互体验与视觉设计,这些才构成其有效信息。换言之,“什么是有效信息”取决于使用者的视角。

克劳德·香农(Claude Shannon)。“Claude Code” 实际上就是致敬 Claude 香农。
Vibe Coding 的信息结构
如果回看编程语言的发展路径,会发现它一直在做同一件事:汇编语言对底层二进制进行抽象,高级语言又在汇编之上进一步屏蔽实现细节。按这个演进方向,AI 原本也应该继续抬高软件生产的抽象层级,帮助开发者屏蔽代码本身。
但实际情况并不是这样。AI 的介入是跨层的:它不仅替代部分底层实现,还参与、甚至替代部分高层决策。从这个角度来看,所谓的“有效信息”,其实就是使用者角度所关心的那一层信息;而 Code Agent 会侵入不同层级进行修改。
正因为 Code Agent 的这种特性,我们才可以进一步讨论:在这种协作方式里,究竟哪些信息该由人提供,哪些信息由 Agent 补全。
我们可以把 Vibe Coding 生产的软件拆解为两部分:一部分信息由人类通过 prompt 提供,另一部分由 Code Agent 补全。当人类提供的信息不足时,Code Agent 会选择概率最高的实现方式-这种概率偏好在模型训练结束后就固化了- 这会使软件更容易在架构、交互和实现细节上落入高频范式,进而导致软件的同质化。相反,如果人类提供的信息充足,那么 Code Agent 在很大程度上会退化为一个“翻译器”或“执行器”:它负责将已有的信息,从一种表达形式转换为另一种表达形式。
这就意味着,如果人类通过 prompt 提供的信息足够充足的话,它本质上也已经非常接近实现代码——只是它用自然语言表述。在这里可以引入 Edsger W. Dijkstra 在《EWD667》中的一个经典批评。他指出,“自然语言编程”之所以愚蠢,是因为它试图用歧义的、不确定的自然语言,去替代简洁的、确定的形式化语言。如果我们真能用自然语言描述一个软件,其篇幅往往会远远超过等价的形式化代码。今天的 Code Agent 当然有别于他所批评的传统“自然语言编程”想象,但他的提醒仍然成立:自然语言天然是歧义的,而歧义总要在后续环节中被消解。
因此,一个自然的问题是:基于上面的建模,Vibe Coding 的意义究竟何在?
五类场景
我认为,它的价值主要体现在以下几个场景中。
第一类场景是“有效信息的等价转换”
在这类场景下,有效信息的源头与终点在语义上是等价的,差别仅在表达形式。例如,将一个 TypeScript 编写的项目用 Rust 重写。至于 Rust 的忠实信众,他们的长期事业之一,似乎就是将一切软件都用 Rust 重写一遍。两者在功能与逻辑上可以保持完全一致,Code Agent 只是加速这一转换过程,而不引入新的有效信息。
第二类场景是“降低系统中的信息熵”
在长期演化的软件系统中,往往会积累大量冗余代码、兼容性代码以及被标记为 deprecated 的遗留逻辑。这些代码虽然存在于代码库中,但已不再对产品提供有价值的有效信息。在这种场景下,可以借助 Code Agent 对系统进行重构与清理。它能够在不改变核心语义的前提下,压缩系统的冗余结构,降低整体复杂度。这里的操作同样不引入新有效信息,而是移除无效信息。
第三类场景是 “新人上手”
新人在上手一个大型代码项目时往往对项目缺乏整体认知。此时,人类可以利用 Code Agent 对代码库进行结构化解读。值得注意的是,这本质上是对已有信息的再组织,而非信息的创造。Code Agent 提供的是“二次加工的信息”,其价值在于降低理解成本,而非新增有效信息。
第四类场景是“快速构建”
这类场景是 Vibe Coding 最有魔力也最令人着迷的部分,但有一个关键前提:Vibe Coder 的大脑中对目标产品有足够清晰的想象和规划。例如,一个没有编程能力的吉他初学者希望将五线谱转换为六线谱,在过去,这种细分需求很难被软件化;但借助 Code Agent,他可以直接通过语言来构建产品。
在这个过程中,这个吉他初学者并不需要关心产品的底层架构或技术选型,因为这些对产品而言并不是有效信息,所以即便实现方式趋于同质化,也不会产生什么影响。在这一场景中,Code Agent 依然扮演的是“翻译器”的角色——不引入新的有效信息。
第五类场景是“在交互中发现新的有效信息”
这类场景中,Code Agent 的价值在于它通过与人的交互暴露出人原本未曾清晰意识到的结构、需求与约束。Code Agent 本身并没有创造有效信息,但它能够作为一种外部刺激,促使人重新理解问题。这类似于苏格拉底的启发式教学:答案并不是由提问者直接给出,而是在不断追问中被对方自己识别出来。
总结
总结来看,Vibe Coding 并没有打破“软件是有效信息的集合”这一事实,它改变的,只是有效信息转变为产品的路径——从“程序员用形式化语言表达”,转变为“任何人用自身经验描述”。
在过去,软件的“有效信息”大多由程序员间接决定。即便产品面向普通用户,其设计与实现仍受限于程序员的经验边界。而程序员的经验大多集中在构建软件本身——软件系统、工程抽象,以及为程序员服务的工具,而不是日常生活中的场景。这使得大量领域中的细微需求——例如吉他初学者在五线谱与六线谱之间的转换——被忽略,而程序员主导的软件生产,也容易围绕程序员熟悉的问题空间展开,从而在某些层面上呈现出趋同。
Vibe Coding 的意义,在于让原本无法参与软件生产的人将自身的经验和审美转化为代码,而不在于让程序员更快的写出产品。
最后,这篇文章由我借由 Typeless 口述完成。同样的, AI 在这里,只是充当了我大脑的翻译器。