谁动了我的代码?从 Tab 到 Vibe 再到 Spec:一场 AI 编程的进化实录

167 阅读10分钟

摘要: 当按下 Tab 键不再只是缩进,而是生成整个函数时,潘多拉魔盒就已打开。短短三年,我们经历了从“补全代码”的惊喜,到“一句话生成网站”的狂欢,如今正站在“以文档驱动编程”的理性回归路口。本文将深度复盘 Tab Coding、Vibe Coding 到 Spec Coding 的进化路径,探讨在 AI 时代,我们究竟该如何保卫自己的核心竞争力。


还记得你第一次安装 GitHub Copilot 的那个下午吗?

当你在编辑器里敲下 function editItem(n),屏幕上并没有像往常一样等待你的输入,一行灰色的 Ghost Text 幽灵般浮现,完美补全了递归逻辑。那一刻,你迟疑了一秒,然后按下 Tab 键。

这不仅仅是一个键的确认,它是程序员与机器关系重构的开始。

那时候我们以为这只是一个更好用的“自动补全”工具,谁曾想,短短两三年间,我们已经坐上了过山车。我们从小心翼翼地让 AI 补全一行代码,快进到了对着屏幕喊出“给我个那种感觉(Vibe)的网站”的狂欢时代,而现在,资深的开发者们正试图从狂欢中冷静下来,探索一种更严谨的“规格(Spec)”驱动模式。

这是一场关于 Tab Coding、Vibe Coding 和 Spec Coding 的进化论,也是每一位开发者正在经历的当下。

Tab Coding —— 机械飞升的甜蜜陷阱

在 AI 介入编程的初期,无论是 Copilot 还是早期的 JetBrains AI,它们扮演的角色都是谦卑的“副驾驶”。这个阶段,我称之为 Tab Coding

Tab Coding 的核心交互逻辑是“预测”与“确认”。它像极了一个刚刚入行但记忆力超群的实习生,它时刻盯着你的光标位置,试图猜测你下一行想写什么。

这种体验是线性的、局部的。当你正在写一个正则校验邮箱的函数时,不需要再去切出浏览器搜索 Stack Overflow,只需要写一行注释 // 校验邮箱格式,AI 就会把那一串晦涩难懂的正则推送到你面前。

image.png 这种模式极大地提升了我们的幸福感,因为它消除了编程中最枯燥的“样板代码”环节。但 Tab Coding 有一个致命的局限性:短视

它通常只能看到你当前打开的文件,甚至只关注光标上下的几十行代码(Context Window 有限)。它不知道你项目里其实已经有一个 utils 库封装好了同样的逻辑,它只会在当前文件里帮你重新造一个轮子。

在这个阶段,程序员的心智模型依然是“驾驶员”。我们牢牢把控着方向盘,对每一行生成的代码进行 Review。我们虽然按下了 Tab,但我们依然对代码的逻辑负责。这种安全感,让我们误以为人机关系会永远这样和谐下去。直到大语言模型的能力迎来了质的飞跃。

Vibe Coding —— 感觉流编程的狂欢与宿醉

随着 GPT-4、Claude 3.5 Sonnet 等强力模型的出现,以及 Cursor 这类原生 AI 编辑器的崛起,量变引起了质变。我们进入了 Vibe Coding(氛围/感觉编程)时代。

Andrej Karpathy 曾半开玩笑地提出了这个概念,但在实际开发中,它已经成为了无数独立开发者的常态。在这个阶段,编程不再是关于语法、变量名和内存管理的严谨科学,而变成了一种“自然语言的魔法吟唱”。

在 Cursor 的 Composer 模式(Cmd+I)或者 v0.dev 中,你不再需要一行行写代码,你只需要描述你想要的“感觉”:

“帮我写一个公司主页,要有科技感,深色模式,卡片悬停时要有那种光泽流动的效果,用 Tailwind 实现。”

19b25ab305cfe.png

这种交互模式不仅是效率的提升,更是多巴胺的疯狂分泌。以前写一个带动画的组件可能需要半天,现在只需要几秒钟。只要跑起来效果是对的,只要“Vibe”是对的,我们就心满意足地 Commit。

但危机正是在这种狂欢中悄然埋下的。

Vibe Coding 带来了一个可怕的后果:代码的可读性与掌控力的断崖式下跌。 当原本需要 500 行代码实现的复杂逻辑,被 AI 在几秒钟内生成后,很少有人有耐心去逐行阅读并理解它。我们开始容忍“黑盒”的存在。

我们变成了一个只会下达模糊指令的产品经理,而 AI 成了那个任劳任怨但偶尔会产生幻觉的全栈工程师。当项目初期,一切都很美好。但当项目迭代到中期,需要修改一个深层逻辑,或者出现了一个诡异的 Bug 时,Vibe Coding 的代价显现了:

你面对着那一堆由 AI 生成的、风格迥异的代码,发现自己根本改不动。你试图再次用 Prompt 让 AI 修复,结果它修好了 A 问题,却引发了 B 问题。你陷入了与 AI 的“扯皮”循环中,最后只能无奈地回滚代码。

Vibe Coding 就像是吃快餐,爽快,但营养不良且后患无穷。资深的工程师们开始意识到:靠“感觉”写出来的代码,在大规模工程中是不可维护的。

Spec Coding —— 工程师的理性回归

当狂欢退去,为了解决 AI 代码不可维护的问题,一种更高级、更工程化的模式应运而生:Spec Coding(规格/文档驱动编程), 例如:Spec-kit 和aws团队推出的 KIRO

如果说 Tab Coding 是填空题,Vibe Coding 是命题作文,那么 Spec Coding 就是“建筑蓝图”。

Spec Coding 的核心理念是:AI 的输出质量,严格取决于输入上下文(Context)的精度。 既然 AI 极其擅长写代码,但由于缺乏全局观而容易写出烂代码,那么人类工程师的职责就不再是写代码,而是构建“约束上下文”。

现在的开发流程变成了这样:

我不再直接打开 .ts 文件写代码,而是先新建一个 feature-spec.md(功能规格书)。在这个文档里,我像写给另一个人类高级工程师看一样,详细定义一切:

# 功能:用户积分历史模块

## 1. 上下文 (Context)
- 数据库: 使用 Prisma,模型定义在 `schema.prisma`- 鉴权: 使用 Clerk,需要获取当前 `userId`- UI 组件库: 使用项目现有的 Shadcn/UI 组件。

## 2. 需求 (Requirements)
- 数据库层: 新增 `PointHistory` 模型,包含字段: amount, reason, createdAt。
- API 层: 使用 Next.js Server Actions,而非 API Routes。
- 前端层: 创建一个数据表格,支持分页,日期格式化需复用 `lib/utils.ts` 中的 `formatDate`## 3. 约束 (Constraints)
- 严禁引入新的 CSS 库。
- 错误处理必须遵循项目现有的 `Result<T>` 模式。

写完这个Spec文档后,我会在Windsurf或Cursor中,将这个文档作为唯一的TruthSource投喂给AI(比如使用Ofeature-spec.md),并下达指令:"根据这个Spec实现功能。"

奇迹发生了。

AI不再胡乱发挥,它读取了你的数据库Schema,理解了你的UI规范,严格遵守了你的错误处理要求。它生成了Migration文件,更新了ServerAction,编写了前端组件,甚至连变量命名风格都和你的项目保持了一致。

这就是Spec Coding的威力。它将AI限制在了一个名为"规范"的围栏里。

  1. 确定性:消除了Vibe Coding的随机性。
  2. 可维护性:文档即代码。如果逻辑错了,我们不去修补那堆面条代码,而是修改Spec文档,让AI重新生成。
  3. 工程化思维:程序员重新拿回了控制权。我们的核心能力从"默写语法"进化为了"定义系统边界"和"描述业务逻辑"。

在Spec Coding时代,工具如Cursor的.cursorrules文件变得至关重要。我们在其中定义项目的"宪法":使用什么库、禁止什么写法、代码格偏好等。AI每一次生成代码,都要先通过这部"宪法"的审查。

深度反思:我们失去了什么?又得到了什么?

站在从Tab到Spec的进化终点,我们不得不面对一个哲学问题:这种进化对程序员来说,究竟是福是祸?

我们正在失去"手感"。就像自动挡汽普及后,很少有人会开手动挡一样。Tab Coding剥夺了初学者通过大量重复练习来形成"代码肌肉记忆"的机会。年轻一代的程序员可能在入行第一天就能写出复杂的React应用,但他们可能永远无法理解 useEffect 的依赖数组底层是如何工作的,或者CSS的 z-index 上下文堆叠原理。

这会导致一种"技能空心化"。一旦AI服务宕机,或者遇到AI无法解决的极度底层的Bug,这些缺乏"手感"的开发者将寸步难行。AI可以是你的手,但绝不能替代你的脑。如果你看不懂AI写的代码,你就不是这段代码的主人,你只是它的饲养员

但同时,我们得到了前所未有的"杠杆"。Spec Coding让一个人成为一支军队成为可能。全栈的概念被无限放大。只要我有清晰的Spec能力,我可以是iOS开发者,可以是Go后端,也可以是Rust系统工程师。语言的壁垒被打破了,技术栈的鸿沟被填平了

在这个时代,清晰的思考能力远比熟练的编码能力更值钱。你能否清晰地拆解业务?能否考虑到边缘情况(EdgeCases)?能否设计出优雅的数据结构?这些是AI目前还需要依赖人类的地方。我们正在从"搬砖工"真正进化为"建筑师"。

结语:做Spec时代的幸存者

AI编程的进化路径非常清晰:

  • Tab Coding 帮我们省去了打字的力气,让我们尝到了甜头。
  • Vibe Coding 帮我们验证了创意的可行性,让我们感受到了速度的激情。
  • Spec Coding 帮我们将创意转化为可靠的工程,让我们回归了理性的建设。

未来的编程语言,可能不再是Python或JavaScript,而是Markdown英语

为了不被这个时代抛弃,我们应该做到以下三条建议:

  1. 不要停止阅读代码:即使代码是AI生成的,也要逼自己去读懂每一行。Code Review的能力将比Coding能力更重要。
  2. 死磕系统设计:既然具体的实现细节可以外包给AI,那么宏观架构的设计能力就成了你的护城河。去学习设计模式,去学习领域驱动设计(DDD)。
  3. 练习写文档:学会写清晰、无歧义的Technical Spec。把你脑子里的想法,精准地翻译成AI能听懂的"规格"。

编程没有死,它只是换了一种形式。从今天起,我们不能只做一个Coder,去做一个Commander。 拿好你的Spec文档,那才是你在AI时代的指挥棒。