面试官让我现场用 AI 改一个真实 bug——他打断我的 3 个理由

刷最近的面经你会发现一个明显变化:越来越多公司不再让你默写算法,而是直接丢给你一个跑不起来的前端项目,然后说------「你可以打开你的 AI 工具,把这个 bug 修好。」

这不是传言。ShowMeBug 这类面试平台已经在帮助中心挂出了官方的 AI Coding 面试指引,教面试官怎么围绕「候选人使用 AI」来设计考点;牛客上《7 道 AI 编程高频面试题》这类涵盖 Cursor、Claude Code、Skills 的帖子也在疯传。背后的信号很明确:面试考的不是你会不会写代码,而是你会不会驾驭 AI 写代码。

但很多人栽就栽在,以为「能用 AI」等于「能让 AI 随便写」。真正拉开差距的,是下面这 3 个瞬间------面试官打断你,恰恰是因为你在这 3 个地方暴露了短板。

打断瞬间 1:你上来就让 AI 重写整个文件

场景是这样的:项目里一个列表页,切换筛选条件后数据偶尔显示成上一次的结果。你打开 AI,第一句话就是「这个页面有 bug,帮我重写一下这个组件」。

面试官这时候大概率会打断你:「先别急着让 AI 改,你自己能先定位到是哪一行出的问题吗?」

他打断的理由,不是嫌你慢,而是这个动作暴露了你没有「先定位、后修复」的工程习惯

这个 bug 的本质其实是竞态:两次请求并发,后发先至,旧响应覆盖了新响应。一个有经验的候选人会先做三件事------

  1. 复现:手动快速切换筛选,确认能稳定复现;
  2. 缩小范围:打开 Network 面板,对比两次请求的发起顺序和响应回来顺序------顺序对不上,立刻锁定是竞态而不是接口问题;
  3. 最小可疑代码 :定位到发起请求的那段 useEffect

到这一步,你才把「改哪一小段」交给 AI,而不是把整个文件丢过去。

jsx 复制代码
// 有竞态隐患的写法:后发先至时,旧响应会覆盖新响应
useEffect(() => {
  fetch(`/api/list?filter=${filter}`)
    .then(res => res.json())
    .then(data => setList(data));
}, [filter]);

正确的修法,是让 AI 帮你加上请求取消:

jsx 复制代码
useEffect(() => {
  const controller = new AbortController();
  fetch(`/api/list?filter=${filter}`, { signal: controller.signal })
    .then(res => res.json())
    .then(data => setList(data))
    .catch(err => {
      if (err.name !== 'AbortError') console.error(err);
    });
  return () => controller.abort();
}, [filter]);

顺带一提:如果这时候你说「加个防抖不就行了」,多半会被追问。防抖只是降低了触发频率,并没有消灭竞态------只要接口够慢,后发先至照样发生。能主动说出「防抖不够,得取消请求」,这个瞬间你就已经赢了大多数人。

这个瞬间考察的能力点:问题定位能力。 面试官想看到的是,AI 之前你已经把问题收敛到了一个明确的范围。能不能让 AI 改,前提是你自己知道该改哪。

打断瞬间 2:AI 给了修复,你直接点了采纳

第二种被打断的场景:AI 三秒生成了一段修复代码,你看了一眼「好像没问题」,直接采纳,准备进入下一步。

面试官打断你:「先别采纳。你能说一下它为什么这样改吗?有没有它没考虑到的情况?」

这一句话,考的是你对 AI 输出的批判性验证能力

很多人没意识到,AI 修 bug 最常见的问题不是「修不好」,而是「修好了表面,埋了新坑」。拿上面的竞态来说,AI 很可能给你一个「能跑」但更隐蔽的方案,比如自增 requestId 比对:

jsx 复制代码
// 看起来修好了,实际上把竞态藏得更深
let requestId = 0;
useEffect(() => {
  const id = ++requestId;
  fetch(`/api/list?filter=${filter}`)
    .then(res => res.json())
    .then(data => {
      if (id === requestId) setList(data);
    });
}, [filter]);

这段代码在当前组件里确实能跑。但它只做到「丢弃过期响应」,请求本身依然会跑完------带宽照耗、服务端压力照旧;而且 requestId 放在模块作用域里,组件一旦在同页面挂载两份就互相污染。相比之下,AbortController 是真正把请求取消掉。两种方案的差别,就是「治标」和「治本」的差别------而这正是面试官想听你讲出来的。

所以一个成熟的候选人,在采纳前至少会问自己三个问题:

  1. 它改的原理是什么?(AbortController 中断的是哪个请求,为什么旧请求要被丢弃)
  2. 边界情况覆盖了吗?(组件卸载时会不会还在请求中?快速连续切换 5 次会怎样?)
  3. 有没有引入副作用?(取消请求会不会影响其他地方共享的逻辑?错误处理把 AbortError 过滤掉了吗?)

如果时间允许,最好的动作是当场补一个最小验证:写一个会触发竞态的测试用例,跑一遍,证明修复前后行为差异。

这个瞬间考察的能力点:验证与批判能力。 面试官不是要你会背八股,而是要确认你不会把 AI 的输出当成黑盒照单全收。能不能 review AI 的代码,是「会用 AI」和「被 AI 用」的分水岭。

打断瞬间 3:你描述需求给 AI 时,说得含糊不清

第三个瞬间最容易被忽略,却往往是决定性的。你给 AI 的 prompt 是这样的:「这里不对,帮我改改。」AI 来回问你几轮,你还是说不清到底要什么,最后改出来的东西驴唇不对马嘴。

面试官打断你:「你刚才想让 AI 做什么?能不能用一句话说清楚?」

这个瞬间,考的根本不是技术,而是你把问题拆解、表达清楚的能力------这恰恰是用好 AI 的核心。

AI 的能力上限,很大程度取决于你喂给它的上下文质量。同样是修一个竞态 bug,两种 prompt 的差距是巨大的:

差的 prompt:

这个列表有 bug,帮我修一下。

好的 prompt:

列表页在 filter 变化时发起请求,存在竞态:快速切换时旧请求的响应会覆盖新响应。请用 AbortController 在 useEffect 清理函数里取消上一次请求,并处理 AbortError,不要引入额外依赖。

前者 AI 只能瞎猜,后者 AI 一次就能给出接近正确的方案。现场真正好用的 prompt 模板,就是五个槽位:

现象 :列表页切换筛选后,偶尔显示旧数据 复现 :快速连续切换两次筛选必现 期望 :始终只渲染最新一次请求的结果 约束 :用 AbortController,不引入新依赖 边界:组件卸载时,未完成的请求也要取消

把这五项填进去,措辞不漂亮也没关系,AI 一次就能给出八九不离十的答案。能把需求、现象、约束、边界讲清楚的人,用 AI 的效率是含糊表达者的几倍。

这也是为什么越来越多面试官把这个环节单独拎出来考------它本质上是在测你的工程沟通能力,只不过对象从「同事」变成了「AI」。

这个瞬间考察的能力点:拆解与表达能力。 prompt 写得好不好,就是工程思维清晰不清晰的外显。

为什么面试官开始这么考了

可能有人会问:好好的八股文不考了,折腾这个干嘛?

原因其实很直接。现在用 Claude Code、Codex 这类工具,一句 prompt 就能生成整个组件、整个功能,「把代码写出来」这件事的成本被打下来了。公司稀缺的不再是「会写的人」,而是「知道该写什么、写得对不对的人」。面试只是跟上了这个现实:既然入职之后你天天要跟 AI 协作,那面试干脆就现场考你怎么协作。

而且这类题的区分度比八股高得多。八股可以提前背,现场怎么用 AI 却没法排练------你定位问题的习惯、验证输出的态度、表达需求的清晰度,十几分钟内就会暴露得清清楚楚。

所以三个打断瞬间,归根结底考的是同一件事:当代码不再稀缺,你的判断力是不是稀缺的。

打断瞬间 你的暴露点 面试官真正在考
上来让 AI 重写整文件 不定位就动手 问题定位能力
AI 修复直接采纳 不验证就照收 批判与验证能力
描述需求含糊不清 讲不清要什么 拆解与表达能力

现场修 bug 速查表(建议收藏)

面试现场如果被要求用 AI 修 bug,按这个顺序走,基本不会踩坑:

步骤 动作 一句话要点
1. 复现 手动稳定复现 复现不了,先别碰 AI
2. 定位 Network/断点缩小范围 锁定最小可疑代码
3. 拆解 现象+复现+期望+约束+边界 prompt 质量=你的表达
4. 生成 让 AI 改局部,不是整文件 范围越小,AI 越准
5. 验证 讲原理+补边界用例 采纳前先自我 review
6. 回归 确认没引入副作用 改动后跑一遍相关逻辑

写在最后

AI 没有让前端面试变简单,反而把门槛从「记忆」抬到了「判断」。以前背八股能混过去,现在面试官一句「你打开 AI 改一下」,立刻就能看出你是真的懂,还是只会复制粘贴。

如果你也在准备这类面试,不妨先拿自己项目里的一个真实 bug 练一遍上面的 6 步------练的不是代码,是你在 AI 面前的判断力。 练的时候最好像面试那样边做边讲,很多时候你不是不会,而是讲不出来。

你在面试里遇到过「允许用 AI」的环节吗?你是怎么应对的?评论区聊聊。


相关推荐
AI模型调用笔记1 小时前
GPT-5.4 8月31日退出 Codex?先分清 ChatGPT 登录与 API Key,再迁移 Terra/Luna
人工智能·gpt·chatgpt·ai编程
众人皆醒我独醉2 小时前
流量路由:Istio 与 Knative 的集成
面试·kubernetes·llm
一千柯橘2 小时前
pi 基本配置篇
ai编程
plainGeekDev2 小时前
别再复制粘贴 Prompt 了:3 分钟定义你自己的 Claude Code Agent
agent·ai编程·claude
众人皆醒我独醉2 小时前
模型加载:storage-initializer 与节点级缓存
面试·kubernetes·gpu
计算机魔术师2 小时前
斯坦福研究:AI 对入门级岗位冲击最大
前端
漫步是个好名字2 小时前
4个月,我想清楚了我该如何使用 Claude Code
ai编程
Simon_He2 小时前
一个渲染内核,五个框架包:我的流式 Markdown 渲染库是怎么长成“全家桶”的
前端·vue.js·markdown
决战灬3 小时前
Agent几种不同的执行方式
ai编程