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

admin 2026-07-13 03:08 新闻动态 122

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

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

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

先说个面试场景。

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

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

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

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

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

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

你的前端产出,怎么跟公司的设计规范对得上?

你怎么保证产出能跟后端顺利交接,不用反复返工?

你给AI的plan.md(或者任何形式的需求文档),里面到底写什么?

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,其他工具看自己的约定。文件里大概写这些东西:

本项目使用AntDesign5.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

入参:

usernamestring必填6-20字符

passwordstring必填8-20字符

出参:

tokenstring

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

错误码:

1001用户名不存在

1002密码错误

1003账号已锁定

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

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

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

constUserList==>{

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

useEffect(=>{

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

},[]);

return

;

};

我们要求拆成三层:

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

exportconstgetUsers==>

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

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

exportconstuseUsers==>{

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

constfetchUsers=async=>setUsers(awaitgetUsers);

return{users,fetchUsers};

};

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

exportconstUserList==>{

const{users,fetchUsers}=useUsers;

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

};

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

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

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

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

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

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

我一般这么提问:

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

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

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

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

##日期处理

–不要用newDate.toLocaleString,不同浏览器输出不一样

–统一用dayjs,格式YYYY-MM-DDHH: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一次写对,说明你自己已经想透了;写不清楚,多半是你自己也没想明白。

上一篇:只招博士,字节跳动启动前沿技术领域人才校招
下一篇:没有了

热点资讯

江南足球外围