为什么刷了 300 道 LeetCode,还是过不了 AI Engineer 面试


一句话总结

刷题量与面试通过率之间的相关性,在 AI Engineer 这条赛道上正在快速衰减。不是 LeetCode 不重要,而是它从"充分条件"降级成了"基础门槛",考察重心已经转移到系统设计里的模型选型权衡、生产环境的故障溯源、以及你与 research team 和 platform team 的协作边界感。2019 年进 Google Brain 的人靠两道 hard 就能拿到 strong hire,2024 年同一批面试者里,能清晰说出为什么不用 FlashAttention 3 而继续用 2 的人反而更容易过 bar。市场没有明说,但 debrief 会议上的争论早变了。


适合谁看

这篇文章写给三类人。第一类是刷了 200-400 题、面试 feedback 里出现"coding strong, but..."然后被拒的候选人,你不是不够努力,是努力的方向与当前 bar 错位。第二类是从传统 software engineer 转岗、以为补完 ML 课程就能平移的人,你需要知道平台工程经验和模型服务化经验之间的鸿沟比想象中深。第三类是正在准备 2024-2025 年招聘季的 new grad,你的竞争对手里已经有人带着顶会一作和开源项目 commit history 进来,你需要理解面试官在比较什么。

不适合的人是:只想找"刷题清单"的 shortcut seeker,以及认为"AI Engineer 就是调参的"传统 ML 从业者。这篇文章不会给你 list,只会告诉你为什么 list 本身正在失效。


不是算法变简单了,是"会算法"的定义被重写了

2018 年的 AI Engineer 面试,Coding 轮考的是经典 dynamic programming,ML 轮考的是手写 backpropagation,系统设计轮基本不存在。当时一个从 Stanford 毕业、刷了 300 题的人,确实可以靠硬核 coding 和扎实的数学推导拿到多个 offer。那个时代的面试设计隐含一个假设:算法能力强的人,工程直觉和模型理解会自动跟上。

这个假设在 2024 年已经破产。

现在的面试流程通常 5-7 轮,总时长 4.5-6 小时,分布在 1-2 天内。Coding 轮压缩到 45 分钟,不再是 leetcode hard 的炫技场,而是给一道"用 Python 实现一个简化版 transformer block 的 forward pass",然后追问"batch size 从 32 提到 128,你的内存占用怎么变化"。ML 轮 60 分钟,要求你现场设计一个推荐系统的冷启动策略,不是写 pseudocode,是画数据流图、标出每个阶段的 latency budget、讨论 embedding 存 Redis 还是存 feature store。System Design 轮 60 分钟,典型题目是"设计一个支持 1000 QPS 的 LLM inference service",面试官会在你说出"用 vLLM"之后追问"prefill 和 decode 阶段怎么分离,TTFT 和 TPOT 的 tradeoff 你怎么选"。Behavioral 轮 45 分钟,问的不是"tell me about a time",而是"你上一个项目里,research 团队坚持要加一个你明知道 latency 爆炸的 feature,你怎么处理的"。

这不是难度的线性叠加,是考察维度的质变。刷题培养的是"看到 pattern 就反应出解法"的直觉,但现在的面试要求的是"看到 undefined problem 就定义出约束条件"的能力。不是算法不重要,是"会算法"的标准从"能解 hard"变成了"能在约束下做 engineering tradeoff"。


debrief 室里真正争论的是什么

我参加过一场针对 L4 AI Engineer 候选人的 debrief。Coding 轮反馈是"clean, fast, 提前 10 分钟完成"。ML 轮反馈是"知道 LoRA,但说不明白为什么自己的项目不用"。System Design 轮反馈是"画了很漂亮的图,但把 model serving 和 feature serving 混在一起了"。Behavioral 轮反馈是"故事很完整,但每个故事的主角都是他自己,没有提到任何 cross-functional partner"。

Hiring manager 开口的第一句话是:"我们可以教 LoRA 的细节,但教不了他区分 model 和 feature 的 serving boundary。这个 hire 进来半年内会跟 platform 团队打起来。" 最终结果是 no hire,4-1 的投票。

另一个对比案例:候选人 Coding 轮只完成了 medium 的最优解,没有碰 hard 的 follow-up。但 ML 轮主动说"我之前的项目试过这个方案,但 inference cost 太高,我们最后改成了蒸馏 + 量化的组合,这是当时的 A/B test 结果"。System Design 轮在面试官说"assume we have infinite GPU"时打断说"实际上我们的瓶颈不是 GPU 是 PCIe bandwidth,这个假设会改变架构"。Behavioral 轮讲了一个"我为了验证一个假设,周末写了 200 行脚本爬了内部 log,周一早上发现确实有问题,但我的第一反应是先 sync 给 SRE 而不是自己 fix"的故事。

这个人拿了 strong hire。不是因为他知道得更多,是他的"不知道"展现的方式不同:不是"这个我没做过",而是"这个地方我没碰过,但根据相邻领域的经验,我推测约束条件是..."。


薪资结构告诉你什么是真稀缺

AI Engineer 的薪资在 2024 年已经明显分层,而且分层逻辑和纯 software engineer 不同。以湾区大厂 L4-L6 为例:

L4(new grad / 1-2 年经验):base $130K-$160K,RSU $80K-$150K/年(4 年 vest),bonus 10-15%。总包 $220K-$350K。这个 level 的候选人供应充足,面试 bar 主要筛掉"只会刷题不会落地"的人。

L5(3-5 年经验,能独立负责 model serving pipeline):base $160K-$200K,RSU $150K-$280K/年,bonus 15-20%。总包 $380K-$650K。这是竞争最激烈的 band,因为候选人要么 coding 够强但 ML 工程经验不足,要么反过来。能同时通过两轮硬考察的人,市场上不到 10%。

L6(5-8 年经验,能带 small team,定义技术方向):base $200K-$250K,RSU $300K-$500K/年,bonus 20%+。总包 $600K-$1M+。这个 level 的面试已经不在"做题"层面,是考察"你敢不敢在信息不完整时做技术决策,并承担后果"。

注意 RSU 的占比。不是 base 不重要,而是公司用 equity 投票告诉你:我们赌的不是你现在的技能,是你未来 4 年适应技术变迁的能力。而"适应"的 proxy,正是面试里那些刷题覆盖不到的维度。

一个具体数字:某头部公司 2023 年 AI Engineer 面试的 pass rate,Coding strong + other weak 的组合是 12%;Coding medium + other strong 的组合是 34%。这不是说 coding 不重要,是说 coding 的边际效用递减点来得比想象中早。


面试流程拆解:每一轮都在淘汰什么

Round 1: Coding (45 min)

不是考你能不能写出最优解,是考你在压力下能不能快速澄清约束。典型题目:"实现一个 function,输入是 model predictions 和 ground truth,输出是 top-k accuracy,要求支持 streaming data"。面试官会在你写完基础版本后追加"如果 ground truth 来得比 prediction 晚 5 分钟,你的代码怎么改"。

错误版本:直接开始写,假设所有数据同步到达,花 30 分钟调最优复杂度,最后 5 分钟被追问时手忙脚乱。

正确版本:先问"streaming 的窗口大小是多少,late arrival 怎么处理",花 5 分钟确认约束,写出一个有明确 tradeoff 说明的方案,最后主动说"如果时间够,我会加这个优化,但当前约束下我认为这不是瓶颈"。

Round 2: Machine Learning (60 min)

不是考你知道多少模型,是考你给业务问题匹配技术方案的能力。典型题目:"我们有一个电商搜索场景,用户 query 很短,商品 title 很长,怎么设计相关性模型"。

错误版本:直接说"用 BERT 做双塔",然后被追问"你的正负样本怎么构造"时回答"点击算正样本,没点击算负"。

正确版本:先问"metric 是 CTR 还是 GMV,有没有位置 bias 的考虑",然后给出"短 query 用意图识别做 routing,长 title 做 selective attention,负采样用 hard negative from same category"的完整 pipeline,并主动讨论"这个方案的上限是语义匹配,跨域迁移需要另外处理"。

Round 3: System Design (60 min)

这是区分"ML researcher"和"AI Engineer"的核心轮。典型题目:"设计一个 TikTok 的 for-you page 推荐系统"。

错误版本:花 40 分钟讲模型架构,最后 10 分钟被追问"你的 P99 latency 是多少"时回答"我们可以用 cache"。

正确版本:前 10 分钟确认 scale(DAU、视频库大小、刷新频率),接下来 20 分钟分离线训练和在线 serving 两条线讲,明确标出"这一块的瓶颈是 IO,不是 compute",最后 10 分钟主动说"如果要求 P99 < 200ms,我需要在这里做 model 的量化或者换轻量架构,这是 tradeoff 分析"。

Round 4: Behavioral (45 min)

不是讲故事,是展现你的决策框架。典型问题:"Tell me about a time you had to push back on a PM"。

错误版本:讲了一个"我发现 bug 很严重,PM 不理解,我花了三天说服他"的故事,暗示自己总是对的。

正确版本:讲了一个"PM 要加的功能技术上可行但会引入 3 个月的技术债,我带了 data(类似项目的实际维护 cost)、alternative(MVP 版本实现 80% 效果但 20% 工作量)、以及 rollback plan 去谈,最后我们选了 alternative"的故事,展现的不是"我赢了",是"我能结构化地处理冲突"。

Round 5: Hiring Manager / Culture Fit (45 min)

这一轮没有标准题目,但有一个隐藏考察点:你是不是只会等任务,还是能主动定义问题。HM 可能会说"我们团队最近在纠结要不要从自研模型切换到开源模型,你怎么看"。

错误版本:分析一通利弊,最后说"取决于具体情况"。

正确版本:先问"你们现在的瓶颈是迭代速度还是模型效果,切换的 trigger 是什么",然后给出"如果瓶颈是迭代速度且你们有 3 人以下做 model training,建议切换,但需要专人做 model distillation 来保持效果"的具体建议。


准备清单

  1. 精做 10 道题,代替泛刷 300 道。每道题要求自己写出 3 个版本的解:naive、optimized、production-ready with error handling。不是"能跑通",是"能解释为什么这样 tradeoff"。
  1. 系统性拆解面试结构,PM面试手册里有完整的 AI Engineer 面试实战复盘可以参考,特别是关于如何拆解"开放题"的框架部分。
  1. 自建一个端到端的 toy project:从 data collection 到 model serving,用 Docker 跑起来,在 GitHub 上写清楚 design decision log。不是给面试官看,是逼自己经历一遍真实的 engineering decision。
  1. 找 3 个真实公司的 system design 案例,不是看文章,是自己画架构图,然后找有经验的人 challenge。重点练"被追问时的快速调整",不是"一次性给出完美答案"。
  1. 准备 5 个 behavioral story,每个故事准备两个版本:30 秒电梯版和 3 分钟详细版。要求每个故事都有具体的数字、具体的冲突、具体的你做的 tradeoff。
  1. Mock interview 至少 3 次,每次录屏回看。不是看答案对不对,是看自己的"um"、"actually"、"I think maybe"出现的频率。口语模糊度直接映射到面试官对你技术确定性的判断。
  1. 深入研究 2-3 个你目标团队的技术栈,不是看 public blog,是看他们开源的代码、发的 paper、甚至 team member 的 Twitter。面试时提一句"我看到你们在处理 xxx 时用了 yyy 方案,我好奇为什么不用 zzz"比一百句"我对此很感兴趣"有用。

常见错误

错误一:把"做过"当成"会了"

BAD:简历上写"使用 PyTorch 实现了 Transformer 模型",面试时被问"你的 attention 是 self-implemented 还是用的 nn.MultiheadAttention",回答"用的 built-in,自己写太慢了"。

GOOD:同样经历,但主动说"第一版我自己实现了 scaled dot-product attention 来理解内存访问模式,后来发现 bottleneck 不在 compute 在 memory bandwidth,切换到了 built-in 并加了 torch.compile 优化,latency 从 120ms 降到 45ms"。

区别不是诚实与否,是展现的深度。面试官不是在找"你做过什么",是在找"你遇到问题时的思考路径"。

错误二:用 research depth 替代 engineering breadth

BAD:面试 system design 时,花 30 分钟讲 Transformer 的数学原理,被面试官打断"我们假设模型已经训练好了,现在说 serving"。

GOOD:同样背景,但主动说"模型层面的优化我了解这些,但在 serving 场景下,我认为瓶颈是这些",然后展开讨论 batching strategy、KV cache management、quantization 的部署权衡。

不是 research 不重要,是在 AI Engineer 的语境里,research 是 input,engineering 是 output。面试官要的是你能把 research 变成 production 的能力,不是 research 本身。

错误三:忽视"软技能"的硬考察

BAD:Behavioral 轮讲"我和 PM 意见不合,我找了 data 说服了他",面试官追问"PM 当时的顾虑是什么",回答"他就是不懂技术"。

GOOD:同样场景,但说"PM 的顾虑是上线时间,我的方案会增加 2 周。我回去算了笔账:技术债的利息是每周 x 小时的人工,2 个月的利息就超过 2 周的前期投入。我把这个 analysis 带回去,我们一起改了 timeline"。

不是让你撒谎,是让你展现"我能理解对方的 constraint,并在此基础上寻找 win-win"。这在跨职能团队里是 survival skill,不是 nice-to-have。


FAQ

我已经刷了 200 题,还要不要继续刷?

判断是:要,但方式要变。不是追求数量,是追求"能清晰说出每道题的约束条件和 tradeoff"。

具体做法:把刷过的题分类为"必须能闭眼写对"、"能理解最优解但自己写会错"、"看过答案还是不懂"三类。第一类保持,第二类精做 10 遍直到变成第一类,第三类直接放弃。同时,每周至少花 3 小时在"用代码实现一个 ML 模型组件"上,比如手写一个高效的 top-k 采样、实现一个自定义的 data loader 处理 uneven sequence length。这些题不会出现在 LeetCode 上,但会出现在面试的 follow-up 里。一个真实案例:候选人在 Meta 的面试里被问"实现 beam search",不是考算法,是考你能不能处理 memory constraint 下的 batching。他刷了 300 题但没准备这个,现场写了 40 分钟没跑通。

没有大厂 ML 经验,怎么过 system design 轮?

判断是:经验可以补,但要用对方法。不是去编经历,是用开源项目和 paper reading 构建"准经验"。

具体做法:选 3 个公开的技术方案,比如 vLLM 的 PagedAttention、Triton 的 dynamic batching、或者任何你目标公司发的 blog。不是读一遍,是 clone 代码,跑起来,改参数,看性能变化。然后问自己:如果我是这个团队的工程师,下一步优化方向是什么?把这个思考写成 blog 或 tweet。面试时,你可以说"我没有在 production 里 scale 到这个 level 的经验,但我研究过 xxx 方案,他们当时的 tradeoff 是... 我认为在我们的场景下..." 这不是 excuses,是展现你的 learning curve 和 structured thinking。一个成功案例:new grad 靠深入分析某开源推理框架的 issue discussion,在面试时指出"这个设计在 high concurrency 下的 memory fragmentation 问题,你们团队是怎么处理的",直接拿到了 strong hire。

面试官问了一个我完全没准备过的问题,怎么办?

判断是:这不是事故,是设计。考察的就是你在压力下的 problem decomposition 能力。

具体做法:不要沉默,不要"让我想想"超过 10 秒。用结构化方式争取时间:"这个问题我没直接处理过,但我理解核心约束是... 我倾向于从这几个角度拆解..." 然后选一个你最接近的子问题开始分析。面试官不是要正确答案,是要看你的思维过程。一个反直觉的观察:有时候"我注意到这个假设可能不成立"比"我知道答案"更加分,因为它展现了 critical thinking。真实场景:候选人在 Google 面试时被问"设计一个 distributed training 的 fault tolerance 机制",他没有直接回答,而是说"我先确认一下,你们的 fault 主要是 GPU failure 还是 network partition,因为这两种情况的 recovery strategy 完全不同"。面试官事后在 feedback 里写"demonstrates senior-level problem framing"。他最终拿到了 L5 offer,base $185K,RSU $220K/year,bonus 18%。



想系统准备PM面试?

获取PM面试通关手册 →

想要配套练习工具?PM面试准备系统 包含框架模板、Mock 追踪表和30天备战计划。