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给你写流式对话,大概率长这样:
ts
// 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直接打到已经卸载的组件上
面试官想看的,是你会不会自己把这些坑点出来,然后动手填掉:
ts
// 改进版------现场能主动说出这几个问题,就是加分项
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生成的工具调用类型,十有八九长这样:
typescript
// AI默认------把所有可能性拍平成一个大type
type AgentResponse = {
thought?: string;
action?: string;
result?: string;
status?: 'thinking' | 'executing' | 'observing' | 'done';
error?: string;
// ...一堆可选字段
};
能跑。但类型基本没起作用------你拿到一个AgentResponse,根本不知道这个状态下哪些字段一定有、哪些一定没有。面试官想看的是你把它拆成"状态-数据"绑一块的判别联合:
typescript
// 判别联合------每个状态只带它该带的字段,编译器帮你查错
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工具解题你碰上过吗?评论区聊聊,我攒一篇面经合集。
觉得有用,点个赞👍让更多正在面试的人看到。