CockpitCockpit
← 返回博客

Vibe coding 需要一点品味

发布于 2026年5月12日 · 阅读约 6 分钟

现在的 Cockpit 仓库就两堆代码:`packages/feature/` 是业务,`packages/shared/` 是公共底子,箭头只有一个方向。从这张图能讲清楚为什么 vibe coding 时代反而更需要品味——把东西放对、划清边界、敢删没用的东西,三件老掉牙的事在 agent 改代码的当下比以前更值钱。

agent 跑完一轮,diff 一百多行,看着没毛病,你点了通过。

两周以后某个角落坏了。回去看,每个函数都说得过去,没有哪个名字烂到必须改,但你就是不太愿意再打开这个仓库。

vibe coding 真正难的不是怎么让 agent 跑得更快。是跑了一千次以后,仓库还像个仓库。

现在的架构

src/                       Next.js 入口,没有业务
 │
 ▼
packages/feature/          agent  console  explorer
                           workspace  review  comments  skills
 │                         (彼此可以互相依赖,必须无环)
 ▼
packages/shared/           ui  utils  i18n
                           (叶子,不允许反过来 import feature)

整个仓库就这三块:

  • src/ 是 Next.js 框架自己需要的入口——页面文件、API route 的转发 shim——没有业务代码。
  • packages/feature/ 是业务,七个包,每个包是一个独立的 npm package。
  • packages/shared/ 是公共底子,三个包:UI 组件、工具函数、翻译字典。

箭头只有一个方向:上面的可以依赖下面的,下面的不允许反过来 import 上面。这一条规则由 ESLint 盯着,写反了过不了 lint。

后面要说的事情,全都落在这张图上的某个具体位置。

老掉牙的几件事

一个东西该放哪儿。 聊天功能的 API、UI、状态、定时任务、slash 命令,全在 packages/feature/agent 一个目录里。要改聊天的任何东西都不用满仓库找。这不是为了"看着整齐",是让人——和 agent——能用一个文件夹的注意力做完一件事。

边界。 shared/ 不允许反向 import feature/。这条规则不是写在 README 里靠人记,是写在 ESLint 里靠工具卡。"对下一个读代码的人客气" 不是口号,是 lint 报错。

该删要狠。 删掉过的那十几个开发依赖,它们的问题不是"老",是它们归不进图里任何一个位置——既不是某个 feature 的事,也不是 shared 的公共底子。归不进图的东西,就说明它不该留。

不造词。 图里只有两个名词:feature 和 shared。我没用 domain,没用 module,没用 app 和 infra。npm package 是一个所有人都懂的契约,feature 和 shared 是大白话。仓库里你能查到的所有名词,要么是 npm 自己的术语,要么是中学生都看得懂的英文单词。

这次重构里的三张画面

src/ 被搬空了。 之前那里堆着组件、hook、context,一锅端。现在它只是图最上面那一小格——Next.js 的入口。业务全在中间那一格。打开仓库的人一眼就知道往哪儿看,因为框架噪音和业务被物理分开了。

横向只有两堆。 加第三堆很容易:feature、shared,再来一个 "infra"?再来一个 "core"?每一个新名字都要解释,解释就会引来"那这个东西该放哪一堆"的问题。我坚持两堆。装过 npm 包的人打开仓库不需要任何额外培训——package.json 怎么读、exports 怎么写、dependencies 怎么追,他都本能地知道。我没让他多学任何东西。

删 devDep 那一刻。 一个一年没跑过的测试框架、一个没人打开过的组件 demo 工具、一个废弃实验留下的浏览器自动化。一个 commit 全删。删之前犹豫过两秒,删之后没人想起它们。承认当初加错了,是我这两年做得越来越快的一件事。

agent 在这张图里改代码

人读代码靠直觉。agent 读代码靠塞进上下文的那部分。这张图本身就在两个地方帮 agent。

爆炸半径有上限。 agent 要改聊天,它打开 packages/feature/agent 这一个目录就够。它看不到、也不需要看到 console 或 explorer。物理隔离让"agent 顺手把一个无关功能改坏"这件事在结构上变得难以发生。

箭头方向能教 agent 怎么写。 agent 在 shared/ 里写代码时,看不到任何 feature——它根本没法 import 某个 feature 的内部细节。这强迫它写出真正"通用"的东西。反过来在 feature/ 里写时,它知道改不到 shared 以外的世界,下手就更放。

代码库有什么习惯,agent 会学得飞快。你半年前留下的临时方案,它会当成"这个项目的写法"沿用下去。库里没品味,agent 就跟着没品味,速度比人快得多。反过来,库里用的都是 agent 见过几百万遍的那些词——package.jsonexportsdependencies——它直接上手。它没读过你自创的模块体系。

最后

品味不是慢工细活的代名词。它是让"快"能撑过第二个月的那个东西。

把边界划清,词汇压到最小,没在用的东西早点拔掉,剩下的让 agent 去跑就行——它跑得动。一年以后回来,你还愿意打开这个仓库。这件事不会写进 changelog,但它决定了你做这个项目快不快乐。


npm i -g @surething/cockpit · GitHub · 在线体验