别笑 vibecoder 了:一行代码看不懂的人,正在用 YAML 写核心代码
一个新的概念:metacoding。不是一行代码不写,也不是一行代码都看不懂,而是只处理核心代码。 项目地址:github.com/BlendTreeD/...
一、被嘲讽的 vibecoder
社区里 vibecoding 的段子不少:抽卡、复制粘贴、AI 屎山、"跑起来就是胜利"。
嘲讽的人笑的是抽卡,但被嘲讽的人其实也很痛苦------不是不想写好,是根本无从下手。你对 AI 说"帮我写个客服对话流程:先问订单号,格式不对就重新问;然后查物流,签收了就说感谢,没签收就说在路上"。
AI 刷刷写完。你跑起来,漏了"格式不对重问"的分支;补充描述,再跑,"签收/未签收"的顺序又反了。改到第三版,翻出 diff 一看:不止逻辑变了,连函数名、命名风格都换了。每一版都"看起来不错",但你没法在上一版的基础上迭代------因为哪一版你都没真正看懂过。
这就是 vibecoder 的死循环:看不懂代码,所以只能靠描述需求让 AI 重写;而自然语言描述需求,每一轮都在走样。
二、问题从来不是"不懂代码"
先看一个公司里的老场景。
产品对开发说:"帮我做个物流查询,用户输入单号后查状态,没签收就回复在路上,签收了就感谢一下。"开发每个含糊处都得猜:"在路上"要不要带具体地点?"格式不对"具体是什么规则?猜错了返工。
同一个需求,vibecoder 对 AI 又讲一遍。猜的人从开发换成了 AI,噪声一点没少。
问题在哪?"先问......再查......如果......就......"这些是流程结构。结构性的东西用自然语言传递,每传一遍就重新解释一遍。这不是"懂不懂代码"的问题------再懂代码的人,用自然语言描述结构,也会偏。
所以嘲讽 vibecoder 的人可能骂错了对象:他们不是缺编程能力,是缺一门合适的语言。
三、metacoding:只处理核心代码
我管这门语言叫 YAML。给这个模式起了个名字:metacoding(核心编码)。
它的主张只有一句话:不是一行代码不写,也不是一行代码都看不懂,而是只处理核心代码。
分工是这样的:
| 角色 | 负责 | 需要的能力 |
|---|---|---|
| 产品 / 运营 / 新人 | 写 YAML 剧本(流程怎么走) | 10 分钟学会 |
| 开发 | 写 Action(真正的业务 API) | 正常开发能力 |
| LLM | 意图识别、槽位提取、口语表达 | 交给模型 |
所谓"核心代码",就是流程本身------它恰好可以用 YAML 表达,而 YAML 恰好是那种10 分钟学会读、一下午学会写的语言。
更关键的是:YAML 也可以让 AI 生成,人来审核。 AI 生成的 Python 你不敢拍板,AI 生成的 YAML 你扫一眼就知道对不对------因为每一行你都看得懂。审核通过的那一刻,你不只是"提了个需求",你是交付了一段可执行的核心代码。
四、参与感是怎么回来的
vibecoder 最缺的不是技术,是参与感------改需求要重新抽卡,出了 bug 只能把报错贴回给 AI。
metacoding 把参与感还回来了,因为 YAML 是可校验、可 diff、可 review 的:
- 改一句回复话术,就是改 YAML 里的一行
text,效果立竿见影; - 加一个"发票申请"流程,就是加一段 30 行的 YAML,不用找开发排期;
- 条件分支、槽位校验,写错了加载时当场报错,不像自然语言那样"理解偏差";
- 团队 review 时,你能指着 diff 说"这里的分支顺序反了"------这句话产品说得出来,而"这里的状态转移逻辑有竞态"就很难。
看一个真实的流程长什么样:
yaml
flows:
logistics_tracking:
name: 物流查询
steps:
- id: start
type: start
next: ask_order
- id: ask_order
type: collect
slot_name: order_number
response:
mode: static
text: "请提供订单号(至少 5 位字符)。"
validation:
condition: "len(str(slots.get('order_number', ''))) >= 5"
failure_response:
mode: static
text: "订单号格式好像不对,能再说一次吗?"
next: query
- id: query
type: action
action: action_query_logistics
next:
- if: "slots.get('logistics_status') == 'delivered'"
then: reply_delivered
- else: reply_in_transit
- id: reply_delivered
type: action
action: action_response
args:
mode: static
text: "订单{{ slots.order_number }}已签收,感谢使用!"
next: end
- id: end
type: end
next: []
这不是伪代码,这就是能跑的代码:collect 是追问,validation 是校验,next 是跳转,if/else 是分支。看懂它的成本,小于读懂一篇技术文档。
引擎负责保证它被确定性执行;LLM 只负责柔性部分------理解"帮我看看快递到哪了"、从"单号是 SF12345"里提取值、把"已到达北京转运中心"改写得像人话。
五、30 秒上手
零依赖、零 API Key,一条命令看引擎怎么把剧本演出来:
bash
python examples/quickstart_mock.py
输出就是一段可读的执行轨迹:追问 → 校验拦截 → Action 查物流 → 条件分支选回复。接真实 LLM 也只需要环境变量配一个 Key。
仓库里还带了一份给编码 Agent 装的 SKILL:装完之后,AI 会按框架规范帮你生成 YAML------你负责审核,它负责产出。让 AI 写 YAML,比让 AI 写 Python 靠谱得多,因为它写的每一行你都看得懂。
六、给 vibecoder 的一句话
从 vibecoding 到 metacoding,变的不是工具,是位置:
- 以前你描述需求,AI 生成代码,你在循环外面;
- 现在你写剧本(或审核 AI 写的剧本),你写的就是核心代码,你在循环里面。
产品写剧本,开发写 Action,LLM 演即兴。不懂代码的人第一次有了自己的位置------不是被 AI 替代,也不是替代开发,是终于说得清自己要什么,而且说得算数。
项目地址:github.com/BlendTreeD/...
欢迎来聊:你觉得"只处理核心代码"这个定位,能立得住吗?