面试被”灵魂四问”问懵?聊聊我从抽卡式 Vibe Coding 到规划化的过程

0 评论 86 浏览 0 收藏 17 分钟

当AI编程工具让你误以为'说话就能当全栈'时,职场现实会给你当头一棒。本文揭露Vibe Coding热潮背后的工程化陷阱,从前后端对接崩坏、设计规范失控到AI死循环等真实案例,提炼出可落地的四大解决方案:规范文件化、接口契约先行、模型切换策略与教训文档体系。这些从血泪教训中总结的实战经验,将帮你跨越从'AI聊天'到'工程交付'的关键鸿沟。

最近技术圈被”Vibe Coding”刷屏,搞得不少人产生了一种错觉——以为”只要会说话,就能当全栈”。

但真到职场里,这种错觉是要还债的。

先说个面试场景。

你坐在面试官对面,自信满满地讲自己用 AI 把编程效率翻了几倍。对面笑了笑,问你:”那企业级协作里,你怎么保证 AI 写的前端能跟后端接口顺利对接,不反复返工?”

你大脑空白,憋了半天挤出一句:”呃……我就在对话框里一直跟它提要求,不行就多试几次……”

基本上面到这里就结束了,理由通常写作”缺乏工程化思维”。说真的,这种回答我听到第三次的时候,就懒得再往下问了。

工作里这种事更多。我自己就干过——用 AI 十分钟搓出一个挺炫的页面,自我感觉良好,结果后端把 API 甩过来一看,字段全对不上;更要命的是,AI 把网络请求死死焊在了 UI 组件里,后端稍微调一下数据结构,整个页面直接崩。后端一脸黑线看着我,我盯着屏幕沉默了几秒,认命,推翻重写。

经历几次之后我琢磨明白一件事:很多人把 Vibe Coding 当成黑魔法,却忘了软件开发本身那些没变过的规则。

后来帮朋友公司面前端,我习惯用四个问题来判断对方是真用 AI 编程,还是单纯在抽卡:

  1. 你的前端产出,怎么跟公司的设计规范对得上?
  2. 你怎么保证产出能跟后端顺利交接,不用反复返工?
  3. 你给 AI 的 plan.md(或者任何形式的需求文档),里面到底写什么?
  4. AI 改着改着陷进死循环了,你怎么解决,下次怎么规避?

能把这四个都答利索的,十个里不到两个。

今天想聊的就是这个事——怎么从”只会跟 AI 聊天”,慢慢摸索出一套团队里真的能跑的工程化做法,让你以后面试不被问懵,联调也不被后端追着骂。

下面这些不是什么方法论,就是我和团队踩坑攒下来的一些土办法。挑你能用的看就行,全照搬一定水土不服。

一、先聊聊我自己最早犯的几个错

第一个错:把”生成快”当成”开发快”

去年我们做一个内部的运营后台,我兴致冲冲用 AI 两周搞出来一个能跑的版本,当时挺得意。结果接下来一个月都在重构。

为什么?因为 AI 生成的那一版,每个页面组件里都直接写了 fetch 请求,业务逻辑、UI 渲染、数据请求全揉在一起。后来产品改了一下订单状态的字段命名,我光是找哪些地方要改,就翻了十几个文件。最后干脆推翻重写。

这件事之后我才想明白,AI 帮你省的只是”敲键盘”的时间,但架构怎么分层、需求怎么拆、代码谁来审——这些活一个都跑不掉。你前面偷的懒,后面都要还。

第二个错:一个模型用到死

我有段时间是 Claude 重度用户,什么都用它写。后来发现写复杂算法的时候,它经常陷在某个错误思路里出不来,反复改五六次还是不对。

换 GPT 试了一下,几分钟就给出了能用的方案。

这事让我意识到,不同模型确实有自己擅长的事。当然我说的”擅长”是个人体感,不是什么 benchmark 数据。大概的感觉是:

  • Claude 写 UI 组件、做长文本理解、按现有代码风格续写,我用得最顺手
  • GPT 处理复杂逻辑、调试某些反直觉的 bug,思路更清晰
  • Gemini 偶尔用来做大段代码 review,因为它上下文窗口大

但这都是我个人的使用习惯,不一定适合所有人。你自己多用用就有感觉了。

第三个错:每次都从零开始写提示词

这个坑可能很多人也有。我电脑里翻一下,光是”生成一个表单组件”的提示词,前前后后我写过不下二十次,每次都重新描述项目用的什么框架、什么规范、什么风格。

直到有一天我才想明白——我为什么不把这些攒下来?

二、后来我是怎么做的

我现在用 AI 写代码,主要围绕四件事在做:把规范变成 AI 能读的文件、提前定好接口、不同任务找不同模型、把踩过的坑记下来

1. 把设计规范喂给 AI,而不是每次嘴说

最早我跟 AI 描述设计规范,是这样的:”按钮圆角要小一点,颜色用我们公司的蓝色”。结果它生成出来的按钮,圆角是 4px(我们公司是 8px),蓝色是 #1976d2(我们的是 #1890ff)。

后来我学聪明了,在项目根目录建了一个规范文件。Cursor 用户可以放在 .cursorrules,Cline 用户放 .clinerules,其他工具看自己的约定。文件里大概写这些东西:

本项目使用 Ant Design 5.x,禁止引入其他 UI 库

主色 #1890ff,成功 #52c41a,警告 #faad14,错误 #f5222d

按钮圆角 8px,输入框圆角 6px

字体 Inter,正文 14px,标题 16/20/24px 三档

所有新组件必须参考 src/components 下已有组件的结构

禁止在组件内部直接写 fetch / axios 请求

然后每次新开对话,第一句话就是:”先读 .cursorrules,按里面的规则来。”

这个改动看起来很小,但它把规范从”我说一遍 AI 听一遍”变成了”AI 每次都自己读”。UI 还原度肉眼可见地变高了,至少设计师来找我喝茶的次数少了很多。

还有一个小技巧:让 AI 直接参考已有组件。比如要新写一个 PrimaryButton,我会说”参考 src/components/Button/index.tsx 的写法和风格”,这样它生成出来的代码风格基本一致,不会突然冒出一个跟项目格格不入的写法。

2. 接口先定下来,前后端都按合同办事

前后端扯皮这件事,AI 解决不了,但契约先行这个老办法能解决大半。

我们现在的流程是:需求评审之后,先让 AI 根据需求生成一份接口文档。前端、后端、产品三方过一遍,确认没问题之后,这份文档就是”合同”。

接口文档我一般让它输出成这个样子:

接口: 用户登录

路径: POST /api/auth/login

入参:

username string 必填 6-20 字符

password string 必填 8-20 字符

出参:

token string

userInfo { id: number, name: string, role: string }

错误码:

1001 用户名不存在

1002 密码错误

1003 账号已锁定

后端按这个开发,前端基于这个做 Mock,两边并行。等后端开发完,跑一遍接口测试看是不是符合契约,符合就直接联调,不符合谁违约谁改。

另外有个硬性约定:不允许在 UI 组件里直接发请求。这一条我们写进了 .cursorrules。

错误示范,AI 默认很喜欢这么写:

const UserList = () => {

const [users, setUsers] = useState([]);

useEffect(() => {

fetch(‘/api/users’).then(res => res.json()).then(setUsers);

}, []);

return <div>{users.map(user => <div>{user.name}</div>)}</div>;

};

我们要求拆成三层:

// api/users.ts —— 只管发请求

export const getUsers = () =>

fetch(‘/api/users’).then(res => res.json());

// hooks/useUsers.ts —— 管状态

export const useUsers = () => {

const [users, setUsers] = useState([]);

const fetchUsers = async () => setUsers(await getUsers());

return { users, fetchUsers };

};

// components/UserList.tsx —— 只管渲染

export const UserList = () => {

const { users, fetchUsers } = useUsers();

useEffect(() => { fetchUsers(); }, []);

return <div>{users.map(u => <div key={u.id}>{u.name}</div>)}</div>;

};

这套拆分不复杂,但好处是接口字段改了只改 api 层,状态逻辑改了只改 hook,UI 改了只改组件。AI 改起来也省事,不会一改全崩。

3. AI 卡住的时候,换个模型换个问法

这个是我个人最有用的经验,分享一下。

当 AI 在某段代码上反复改不对(一般改三次还不对就是死循环了),不要继续在原对话里磨。我的做法是:

第一步,把那段有问题的代码单独复制出来,丢掉前面所有上下文。 第二步,开一个新对话,最好换一个模型。 第三步,不要说”帮我改”,而是说”帮我 review”

这一步很关键。前面对话里 AI 已经形成了某种错误的”思维定式”,你让它改,它还在原来的框框里转。但如果你用 review 的语气,相当于让它以旁观者视角重新看这段代码,思路会完全不一样。

我一般这么提问:

帮我看一下这段代码,我怀疑有几个问题:1) 表单校验的时机不对;2) 异步请求没处理 race condition;3) useEffect 的依赖项可能有问题。你帮我确认一下,并给出修改建议。

这种问法的好处是,你已经把怀疑点列出来了,AI 会顺着你的思路深入分析,而不是泛泛地”优化”一通。

4. 把踩过的坑记下来,下次让 AI 自己避开

这个习惯我养成得比较晚,去年才开始。具体做法是在项目里建一个 lessons_learned.md,把 AI 犯过的典型错误记下来。比如:

## 日期处理

– 不要用 new Date().toLocaleString(),不同浏览器输出不一样

– 统一用 dayjs,格式 YYYY-MM-DD HH:mm:ss

– 时区一律按 UTC+8 处理,不要依赖浏览器时区

## 数字精度

– 金额计算不要用原生 + – * /,浮点精度坑过我们两次

– 统一用 decimal.js,金额字段统一存分(整数)

## 接口请求

– 列表请求要带防抖,AI 默认不会加

– 切换 tab 的时候要 abort 上一个请求

新项目开始的时候,让 AI 把这个文件读一遍,能避开七八成的重复坑。

这个文件不用一开始就写得很全,每次项目复盘的时候补一两条就行。慢慢就成了团队的资产。

三、我现在大致的工作流

把上面四件事串起来,我现在做一个新需求大概是这个节奏(仅供参考,不是什么标准流程):

第一步:让 AI 读规范 新开对话先让它读 .cursorrules 和 lessons_learned.md,告诉它”接下来我们要做 XX 模块”。

第二步:拆需求 + 出接口 让 AI 把需求拆成几个独立的子任务,同时输出接口契约。这一步我会自己过一遍,因为 AI 拆需求经常拆得太粗或者漏掉边界情况,需要手动补。

第三步:契约确认 把接口契约发给后端 review,敲定之后再开始写。这一步不能省,省了后面联调一定哭。

第四步:分模块生成 按模块一段一段生成,不要一次性让它写一整个页面。生成完每段都让它自己 review 一遍:”对照规范,看看哪里不符合?”

第五步:人工抽查 + 跑测试 核心业务逻辑(钱、权限、状态机这些)必须自己看一遍,不能完全信 AI。跑一下单测和接口测试,没问题再合并。

第六步:记录 这一步最容易忘。这次项目里 AI 哪些地方犯傻了、哪些 prompt 特别好用,花十分钟记下来,更新到 lessons_learned.md 和 .cursorrules。

这套流程我自己没完全做到,特别是第六步,经常项目一忙完就忘了写。但每次坚持做了,下一次都会明显感觉省事。

四、说点可能不太对的想法

写到最后,说点我个人的观察,不一定对。

第一,AI 不会让程序员失业,但会让”只会写代码的程序员”很难受。因为写代码这件事的门槛被拉低了,但判断代码好不好、架构合不合理、需求拆得对不对这些事的价值变高了。

第二,别迷信什么”AI 编程方法论”,包括我上面写的这些。每个团队的技术栈、协作方式、业务复杂度都不一样,照搬一定水土不服。我说的这些你看完,挑两三条觉得能用的试一下就够了。

第三,AI 用得久了我有个体会:它最大的价值不是帮你写代码,而是逼你把模糊的需求想清楚。你能把需求讲清楚到让 AI 一次写对,说明你自己已经想透了;写不清楚,多半是你自己也没想明白。

本文由 @阿K的AI 碎记 原创发布于人人都是产品经理。未经作者许可,禁止转载

题图来自作者提供

更多精彩内容,请关注人人都是产品经理微信公众号或下载App
评论
评论请登录
  1. 目前还没评论,等你发挥!