Vibe Coding 里的两剂解药:第一性原理与对抗式审查

1775 字
9 分钟
Vibe Coding 里的两剂解药:第一性原理与对抗式审查

第一性原理在开工前校准方向,对抗式审查在完工后检查实现
第一性原理在开工前校准方向,对抗式审查在完工后检查实现

最近越来越习惯把大量代码交给 AI 来写。

需求分析、查文档、搭骨架、补接口、写测试、改 UI……很多过去需要自己一点点敲出来的东西,现在一句:

帮我把这个功能做了。

Agent 就开始吭哧吭哧干活。

不得不说,很爽。

但 Vibe Coding 用久以后,我也慢慢发现一个问题:

AI 最大的问题,有时候并不是它不够聪明,而是它太听话了。

你提出一个方案,它很容易默认这个方案是合理的,然后开始帮你完善;

你觉得 Bug 出在 A,它可能陪你研究半天 A,却没有先问一句:

有没有可能,A 从一开始就不是问题所在?

然后两个人——哦不,一个人和一只 Agent——沿着错误方向一路狂奔。

最后代码写了一千行,问题还在那里。

所以现在做稍微复杂一点的功能时,我经常会额外丢给 AI 两个词:

第一性原理

以及:

对抗式审查

一个负责开工前拆台。

一个负责完工后找茬。


第一性原理:先别急着写#

以前我经常直接告诉 Agent:

给这里加个缓存。

再做一个定时任务同步数据。

这个状态是不是应该上 Redux?

AI 一般不会拒绝。

甚至还会非常积极:

好的,我们可以这样设计……

然后:

新增模块。

新增配置。

新增接口。

新增状态。

眼睁睁看着一个可能 50 行就能解决的问题,逐渐长成一个庞然大物。

可可萝及时拉下刹车,阻止简单需求膨胀成复杂系统
可可萝及时拉下刹车,阻止简单需求膨胀成复杂系统

这时候”第一性原理”就很好用。

它做的事情其实非常简单:

先别讨论”这个方案怎么实现”,先问”我们真正要解决的问题是什么”。

比如需求只是”页面切换后保留筛选条件”,我的第一反应可能是加 Redux。

如果直接让 Agent 开工,它大概真会把 Store、Reducer 和 Provider 全套端上来。但把问题重新拆开,可能会发现:只有一个页面需要保留几个筛选项,用 URL Query 或父级状态就够了。

啪。

一个依赖没了,几个文件没了,未来的维护成本也跟着没了。

所以我现在通常会先告诉 Agent:

先别写代码。从第一性原理出发,重新分析真正需求、客观约束和当前假设,再找出最简单的可行方案。

“先别写代码”尤其重要。

毕竟现在的 Coding Agent 实在太勤快了。

你还在说:

“我在考虑要不要……”

它:

已修改 17 个文件。

我:

???


对抗式审查:现在请开始攻击自己#

如果说第一性原理是在开工之前踩刹车,

那”对抗式审查”就是做完之后,请一个反方辩手进场。

普通的:

帮我 Review 一下。

经常会得到:

整体设计合理,模块职责清晰,建议进一步完善异常处理……

不能说错。

但总感觉像年终总结里的:

工作认真负责,希望再接再厉。

真正有价值的问题往往不是变量名还能不能更优雅,而是:

整个方案是不是建立在错误假设上?

有没有漏掉边界情况?

状态会不会在某些情况下不同步?

网络断了会怎样?

用户连续点十次呢?

这个抽象是不是压根没必要?

所以我现在很喜欢在功能完成之后,让 Agent 做一次”对抗式审查”。

简单来说,就是:

别再替刚才的方案辩护了,现在想办法把它打倒。

把自己当成一个特别挑剔的 Reviewer,主动寻找错误假设、边界条件、异常路径、过度设计和维护风险。

当然,也得补一句:

别为了挑刺而挑刺。

不然 AI 一旦进入战斗状态,也挺吓人的。

最后可能给你来一句:

理论上宇宙射线可能导致内存发生 Bit Flip……

差不多得了。

我写的是 Todo List,不是火星探测器飞控。


一个问”为什么”,一个问”凭什么”#

第一性原理与对抗式审查守在开发流程的一前一后
第一性原理与对抗式审查守在开发流程的一前一后

这两个东西搭在一起,我觉得特别适合 Vibe Coding。

整个流程大概就变成了:

我的想法
第一性原理
确认真正的问题和方案
Agent 实现
对抗式审查
修掉真正值得修的问题

简单来说:

第一性原理负责防止”正确地解决错误的问题”。

而:

对抗式审查负责防止”错误地实现正确的问题”。

一个攻击需求和方案。

一个攻击实现和结果。

刚好一前一后。


我现在越来越少直接告诉 AI”该怎么做”#

这可能也是这两个词给我最大的改变。

以前我的 Prompt 经常是:

使用 XXX 技术实现 XXX。

现在更习惯写成:

我要达到 XXX 效果。

我目前想到的方案是 XXX,但它只是一个候选方案。

先看看有没有更合理的做法。

看起来只是换了一种说法,本质上却从:

执行我的方案。

变成了:

和我一起判断方案。

可可萝与 Agent 一起比较候选路线,而不是直接执行既定方案
可可萝与 Agent 一起比较候选路线,而不是直接执行既定方案

AI 把”执行”的成本压得越来越低以后,我反而越来越觉得:

判断本身正在变得越来越值钱。

什么值得写?

为什么这么写?

AI 给出的方案到底靠不靠谱?

有没有更简单的方法?

这些东西如果全部也交给 Agent,然后自己只负责一直点 Accept……

那就真的很容易进入一种:

AI 写得很努力。 我看得很感动。 项目最后跑不起来。

的奇妙状态。


最后#

如果一定要把这两个词压成两句话:

第一性原理:先证明我们正在解决正确的问题。

对抗式审查:再证明我们的解决方案经得起攻击。

它们当然不是什么让模型突然提高几十点智商的神奇咒语。

具体怎么写 Prompt,也完全可以按照自己的项目、模型和习惯去调整。

我更愿意把它们理解成两种思考模式:

一个问:

为什么?

另一个问:

凭什么?

而在 Vibe Coding 里,比”怎么让 AI 更努力地写代码”更重要的事情,也许就是:

偶尔让 AI 停下来,怀疑一下我们两个是不是都在犯蠢。

能因此少写几百行最后准备 git reset --hard 的代码,

就已经很值了。

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
Vibe Coding 里的两剂解药:第一性原理与对抗式审查
https://kokkoro.me/posts/vibe-coding-two-antidotes/
作者
Kokkoro
发布于
2026-08-14
许可协议
CC BY-NC-SA 4.0
相关文章智能推荐
1
从 Claude Code Auto 到 OpenCode:如何开启无审批执行模式
AI日常对比 Claude Code Auto 与 OpenCode 的免审批机制,讲清静态权限 allow 与运行时 --auto 的区别,并给出无审批但保留危险操作确认的多种配置方案。
2
如果不管模型会不会胡说八道,大模型理论上能拥有无限上下文吗?
AI日常显存、算力、框架、API 全部不设限,大模型能不能一直往下吃 Token?本文从 O(N²) Attention、KV Cache、Prefill / Decode、FlashAttention 与 PagedAttention 讲到 RoPE 长度外推,最后给出一个更值得追问的方向:长期 AI 需要的也许不是更大的桌子,而是书架和记忆系统。
3
为什么 128K 模型塞不进第 128001 个 Token?真正拦住它的可能根本不是模型
AI日常标称 128K 的模型到了第 128001 个 Token 常常不是「开始胡说」,而是直接拒绝。本文区分 Effective Context Limit 与 Hard Context Limit,从位置编码、RoPE、模型配置、vLLM 的 max_model_len 一路看到 KV Cache 与 GPU Kernel——拦住那个 Token 的通常是整套推理系统。
4
上下文越长越好吗?为什么大模型“看得见”,却不一定“用得好”
AI日常资料明明全塞进了上下文,模型还是会漏信息、把废弃方案当成现行方案。本文拆开 Attention 的 Query / Key / Value,讲清楚 Distractor Interference、Needle in a Haystack、Lost in the Middle 与信噪比:找得到、分得清、连得起来、推得出来,是四种不同的长上下文能力。
5
128K 上下文到底是什么意思?大模型的“记忆容量”可能和你想的不一样
AI日常32K、128K、1M 这些数字常被直觉地当成大模型的「脑容量」,但 Context Window 描述的其实是另一件事。本文从 Context、Token 一路拆到 Context Window 与 Effective Context:它决定的是有多少资料能摆到模型面前,而不是模型有多聪明、或者永久能记住多少东西。
随机文章随机推荐
Kokkoro
就让身为引导者的我,全力支持主人吧(OxO)
公告
欢迎来到我的博客!希望这里的内容能够帮助到你~
分类
标签
最新动态
站点统计
文章
44
分类
5
标签
110
总字数
121,250
运行时长
0
最后活动
0 天前
站点信息
构建平台
ESA Pages
博客版本
Firefly v6.15.6
文章许可
CC BY-NC-SA 4.0