聊天讨论 面试官说"打开你的 AI 工具"——我才发现,他考的根本不是写代码

193577746(kyriewen) · 2026年08月17日 · 26 次阅读

Starboard 的负责人 James Lowman 面试时爱问一句:"讲讲你最近写的三个 Claude Code skills。" 有个实习生答了俩字——没有。 理由是用不起付费工具。

上周 LeadDev 专门发了篇文章,标题翻译过来就是:你的面试题,默认候选人买得起 Claude Code Max。

我刷到这事的时候愣了一下。不是因为心疼那个实习生,是我突然想明白——这两年我面过、看过、听过的 AI 相关面试题,没几个人真正搞懂面试官在问什么。

面试现场真让你打开 AI 工具写

这不是段子。知乎一篇高赞面经,原话:

"AI 编程标配 Cursor / Claude Code(面试现场允许用 AI 工具解题,观察你怎么用)"

还有个前端跑了五家主打 AI 业务的前端岗,回来写的原话:

"现在面试官根本没兴趣跟你死磕老八股默写……不少面试官开场跳过基础原理,直接上 AI 业务落地、流式交互、模型前端集成、工程质量管控类场景题。"

划重点不是"用没用过 AI",是你怎么用

博客园有位作者这话挺狠——"面试 AI Coding,我只看你是不是驾驶员。"他说他观察到一个现象,很多人聊 AI 跟聊新闻联播似的,DeepSeek、Agent、上下文窗口、推理模型、多模态、MCP,词儿蹦得贼溜,但全是"知道",没一个"做过"。

这种人就是面试官要刷掉的。

你以为考写代码,其实考的是你会不会挑 AI 的刺

我先把最常见的误区摆出来。很多人以为 AI 面试就是:面试官问你用不用 AI,你说用,然后讲讲用 Cursor 写了个组件。这点分现在不够了。

面试官真正盯的,我归纳了下,没有一条是"你能不能用 AI 写出能跑的代码"。

挑个真题说。前面那篇面经里反复出现的题:能不能解决 SSE 流式渲染卡顿。

AI 给你写流式对话,大概率长这样:

// AI生成的第一版——能跑,用户一多就卡
function ChatPanel() {
  const [text, setText] = useState('');

  useEffect(() => {
    const es = new EventSource('/api/chat');
    es.onmessage = (e) => {
      setText(prev => prev + e.data);  // ← 每来一个chunk就整体拼接+重渲染
    };
    return () => es.close();
  }, []);

  return <div className="whitespace-pre-wrap">{text}</div>;
}

"能跑"。但你要是面试官,看着候选人原样照抄、一个字不质疑,心里基本有数了——这人没拿 AI 写过真正上线的流式功能。

因为真到线上,这段代码有几个要命的坑:

  • prev + e.data,每来一个 token 就拼一次字符串,长对话下是 O(n²) 的字符串操作,越聊越卡
  • 每次 setState 整个组件重渲染,token 流得快时一秒重渲染几十次,输入框都跟着卡
  • 没有取消机制,组件卸载时请求还没完,setState 直接打到已经卸载的组件上

面试官想看的,是你会不会自己把这些坑点出来,然后动手填掉:

// 改进版——现场能主动说出这几个问题,就是加分项
function ChatPanel() {
  const [chunks, setChunks] = useState<string[]>([]);
  const [done, setDone] = useState(false);

  useEffect(() => {
    const controller = new AbortController();

    fetch('/api/chat', { signal: controller.signal })
      .then(res => readStream(res.body!, controller))  // 用ReadableStream,绕开EventSource的坑
      .finally(() => setDone(true));

    return () => controller.abort();  // 卸载即取消,避免泄漏
  }, []);

  const deferredChunks = useDeferredValue(chunks);
  const content = useMemo(() => deferredChunks.join(''), [deferredChunks]);

  return (
    <div className="whitespace-pre-wrap">
      {content}
      {!done && <span className="animate-pulse"></span>}
    </div>
  );
}

这里面没一个高深东西。AbortController、useDeferredValue、useMemo,都是 React 基础 API。AI 默认不会主动给你加这些——它默认你要的是"能跑的代码"。

面试官在看的,是 AI 给的是糙活,你能不能看出哪里不够、该补什么。 这就是"驾驶员"的意思——AI 是车,你是握方向盘的。车自己不会变道,是你让它变的。

再说个更隐蔽的——AI 埋的类型坑

知乎那篇面经列的高频真题,几乎全是"找坑"型:

  • AI 接口返回的字段可能因模型版本动态变化,怎么设计类型守卫和类型收缩?
  • 多轮对话、工具调用结果的嵌套数据结构,怎么用泛型做类型推导?
  • 设计一个类型系统描述 Agent 执行的状态流转(思考→执行→观察→完成),还能类型安全地切换。

没有一个问"怎么写"。全在问"怎么约束 AI 输出的不确定性"。

道理也简单——AI 写代码这事已经不稀罕了。 稀罕的是知道 AI 的输出哪儿会出问题、出了问题怎么兜。

举个常见的。AI 生成的工具调用类型,十有八九长这样:

// AI默认——把所有可能性拍平成一个大type
type AgentResponse = {
  thought?: string;
  action?: string;
  result?: string;
  status?: 'thinking' | 'executing' | 'observing' | 'done';
  error?: string;
  // ...一堆可选字段
};

能跑。但类型基本没起作用——你拿到一个AgentResponse,根本不知道这个状态下哪些字段一定有、哪些一定没有。面试官想看的是你把它拆成"状态 - 数据"绑一块的判别联合:

// 判别联合——每个状态只带它该带的字段,编译器帮你查错
type AgentState =
  | { status: 'thinking'; thought: string }
  | { status: 'executing'; action: string; tool: string }
  | { status: 'observing'; action: string; result: string }
  | { status: 'done'; result: string }
  | { status: 'error'; action: string; error: string };

function handle(state: AgentState) {
  if (state.status === 'done') {
    console.log(state.result);       // ✅ 有result
    // console.log(state.thought);    // ❌ 编译报错——done状态不该有thought
  }
}

也不是什么高阶技巧。但 AI 默认不会这么写——它默认你要的是"最快能跑的版本"。面试官在筛的,是你有没有那种"AI 给的是糙活、我能把它捋成工程级"的意识。

回到那个实习生——这事最扎心的地方

"没有,用不起。"

这真不是"他不努力"四个字能盖过去的。

LeadDev 引了一篇论文,提出个"Agentic Inequality"框架,三个维度:

维度 含义
availability(可用性) 某个 agentic 系统对你是否可用
quality(质量) 它有多强
quantity(数量) 你能同时跑多少个 agent

作者有个说法挺戳人:agent 跟以前的技术不一样——它不是工具,是"能替你行动的劳动力"。 工具的不平等,差距是线性的;"劳动力"的不平等,差距会被复利放大。

四道门槛把关:金钱、算力、专业知识、时间。 Sharp 原话是,你问 skills/workflows 这些,测的不只是能力,还有"谁付得起这样练习"。会把暂时的资源差距,变成永久的筛选机制。

成本摆台面上:Claude Code Pro 约 20 刀/月,Max 5x 是 100 刀,Max 20x 是 200 刀。有开发者追了自己 8 个月,烧了约 100 亿 token,按 API 价折算远超订阅价。对一个大三实习生,200 刀/月就是真金白银的门槛。

所以 James Lowman 那道题,残酷的地方不在"你会不会写 skills",在"你有没有那个经济余裕,把一个付费工具磨到熟练"。

不买 Max,也能证明自己是驾驶员

这是我真正想掰扯的。大多数人买不起 Max,也没必要为了面试去买。

LeadDev 那篇的潜台词摆得明白:把面试题建在"候选人买得起特定付费工具"上,不公平。但对个人来说,抱怨不公平没用,得有办法证明自己。

关键是把"会用 AI"拆成能验证的能力,别老想着"我订了哪个套餐"。 几个不花钱也能练、练了面试能讲的角度:

一,用免费的 DeepSeek API + 开源 DSH,自己搭个 coding agent

前两天 DeepSeek 把 Harness 开源了,MIT 协议,npx @deepseek-ai/dsh web一行命令起本地 Web UI。配 DeepSeek 的 API,成本是 Claude 的零头。你能在这个环境里完整跑一遍"模型 + 工具 +Agent Loop"是怎么凑一块的——这比"我订了 Claude Code Max"有信息量多了。

面试能这么讲:"我用 DSH 配 DeepSeek V4 跑过完整前端项目,Harness 里 context 管理、工具调用、容错重试怎么配合的我清楚。" ——比"我用过 Cursor"强。

二,练"否决 AI 代码"——这是面试新维度

CSDN 有个 Node.js 面试指南点出个新趋势:面试官直接问"你用 AI 写过 Node 吗?哪次你否决了 AI 的代码?"

这题答不上来的,基本就是"让 AI 写、自己不审"那类。平时攒着——AI 给的方案,哪些你没用、为啥不用、改成了啥。攒几个真实案例,面试能讲二十分钟。

三,做个集成了 AI 的真实前端项目

不是"用 AI 写项目",是"写一个集成了 AI 的项目"。一个对话界面、一段流式渲染、一个 AI 输出的错误兜底。这种项目面试能被深挖,因为它有真实的边界问题,不是套壳调 API。

现场用 AI 时的绿旗红旗

把上面那些面经和 LeadDev 的讨论揉一块,候选人现场用 AI 解题,你解题的过程本身就是被观察的题:

行为 信号
直接粘 AI 输出,不读不审 🔴 红旗——连"质检员"都算不上,是搬运工
AI 输出后,主动点出哪里不安全、会踩坑 🟢 绿旗——驾驶员意识
会反问 AI"这边界 case 咋办",而不是照单全收 🟢 绿旗
只会用一个工具,问备选方案答不上 🟡 中性——视野窄
能讲清 AI 生成代码背后"为啥这么写"的原理 🟢 绿旗——最难造假
光蹦词儿(MCP/Agent/上下文窗口),没一个动手痕迹 🔴 红旗——新闻联播型

最后一行是面试官最敏感的红线。你能蹦一串词,但没一个真做过、调过、踩过坑的东西兜着,一深挖就露。

说到底在考啥

AI 能写代码之后,"写得出代码"已经不是稀缺能力,"判断这段代码该不该这么写"才是。

James Lowman 问"你写过 skills 吗",问的是"你有没有把一个工具用到能改造它的程度"——这是驾驶员和乘客的差别。那个实习生答"没有",错不在没买 Max,错在没把任何一个免费工具用到那个深度。

工具不平等是真的,LeadDev 把这层窗户纸捅破了,值得敬。但对个体来说,能证明自己的路没被锁死——DSH 开源了,DeepSeek API 白菜价,Cursor 有免费额度。门槛从来不是"买不买得起 Max",是"有没有花时间,把一个工具用到能讲出细节"。

时间这道坎,倒是真不挑人。


你被问过最刁钻的 AI 题是啥?现场让用 AI 工具解题你碰上过吗?评论区聊聊,我攒一篇面经合集。

觉得有用,点个赞👍让更多正在面试的人看到。

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请 注册新账号