2026-10-20
推荐系统业务岗:12 周准备路线 v2(从学习清单到投递闭环)
2026-10-21 修订:v1 把"学什么"写清楚了,但漏了"什么时候拿 offer"。这一版重排了时间线(4 周 MVP + 8 周迭代)、给每个项目补了完成定义和验收口径、把"实验与评测"从三条 bullet 扩成一章,并修正了"主打系统工程岗"这个不太现实的定位。
先把三句话钉在墙上(v1 这三条是对的,是全文地基):
- 业务岗考的不是论文,是你改了什么、指标动了多少、代价是什么、怎么证明不是噪声。
- 离线涨不等于线上涨。样本偏差、位置偏差、特征穿越,任何一个都能把 AUC 的 +2% 变成负收益。
- 模型不是唯一杠杆。重排打散、多样性配额、生态扶持,经常比换模型收益更大。
0. v1 缺什么(这次改了哪八处)
- 终点错了。 v1 的终点是"第 12 周学完",简历整理在第 11 周、投递在第 12 周之后。求职计划的终点是 offer;正确做法是第 4 周末就有一份能投的简历。
- 没有岗位画像。 四类岗位只是分类,没落到"目标公司 JD 出现频率 → 我拿什么证据回应"。
- 没有时间锚点。 10 月 20 日往后排 12 周就是 1 月中。秋招补招、春招实习、在职转岗,三种情形策略完全不同,v1 默认了"我在全职学习"。
- 项目没有完成定义。 只写了做什么,没写"做到什么算过":口径冻结没有、泄漏检查没有、能不能复现、追问接不接得住。
- 数据集偏旧偏小。 只有 Amazon Beauty / MovieLens。缺带曝光反馈的数据(bandit 和 AB 必须有),也缺 CTR/CVR 多目标数据(精排和多任务必须有)。
- 评测只有口号。 "全库评估、GAUC"写了,但没写显著性、多种子、口径对比——而这三个恰恰是业务岗面你的原因。
- 系统项目偏 demo。 压测没有口径,降级没有超时预算,没有灰度、没有热更新,离"上过生产"还差一截。
- 面试准备不能排练。 缺三档讲述、追问清单、mock、复盘表。
所以 v2 的结构是:定靶 → 4 周做出可投版本 → 8 周边投边补。
1. 先定靶:你要投什么、什么时候投
三种情形,三种倒排。先对号入座,再往下看:
| 情形 | 身份 | 投递窗口 | 12 周怎么用 | 关键动作 |
|---|---|---|---|---|
| A 春招实习 | 研一 / 大三 | 次年 3–4 月 | 完整跑 12 周,W4 起投小厂练手 | 实习转正是最稳入口 |
| B 秋招补招 | 应届,10 月已错过主战场 | 立刻,11 月前 | 砍成 6 周(见第 11 节) | 先投"稳"档,边面边补 |
| C 在职转岗 | 有工作经验 | 随时,1–2 个月 | 12 周,但项目替代学习 | 强调可迁移能力,别裸辞 |
定不下来就先按 A 走,但W4 之前必须开始投递——不管投不投得中,面试反馈是最好的需求文档。
2. 岗位画像:从 20 份 JD 反推证据
方法:拉 20 份目标 JD,把要求拆成"能力 → 我有没有证据 → 证据在哪"。这张表是你 12 周的验收清单,不是读书清单。
| JD 要求 | 频率 | 我需要的证据 | 放在哪 |
|---|---|---|---|
| 召回 / 粗排 / 精排 / 重排链路 | 几乎 100% | 项目 A 全链路 + 链路图 | 简历第 1 条 |
| LR / GBDT / FM / DeepFM / DIN / MMoE / PLE | 高 | 项目 A 消融 + 八股 | 简历 + 面试 |
| 特征工程 / 样本构造 / 实时特征 | 高 | 项目 C 特征一致性 | 简历第 3 条 |
| Python + PyTorch(部分大厂仍用 TF) | 高 | 仓库可读性 | GitHub 置顶 |
| Spark / Hive / SQL | 中高 | 至少一次大数据量处理 | 项目 B |
| AB 实验设计与分析 | 高 | 项目 B 的 AB notebook | 简历第 2 条 |
| 业务指标与归因 | 中高 | 业务 case 三件套 | 面试 |
| 论文 / 竞赛 / 开源 | 加分 | 一篇论文精读笔记 | 博客 |
这张表里的"频率"是我看 JD 归纳的,你需要用自己的 20 份替换。不同公司差很多:字节重规模和 AB,美团重场景和供给,小红书重内容和多样性,快手重长序列。
3. 总路线:4 周 MVP + 8 周迭代,双轨并行
| 阶段 | 周 | 项目线 | 面试线 | 对外产出 |
|---|---|---|---|---|
| 定靶 | W0 | 环境、基线、口径冻结 | 拉 JD、建题库 | 实验台账 |
| MVP | W1–W2 | 项目 A:双塔召回 + Faiss + 全库评估 | 手撕 A 级 | — |
| 可投版 | W3 | 项目 A:DIN 精排 + 消融 | 系统设计模板 | 简历 v1 + 开始投递 |
| 差异化 | W4–W5 | 项目 B:曝光反馈 + bandit + AB | 业务 case 模板 | 简历 v2 + 第二篇博客 |
| 深化 | W6–W7 | 项目 A 深化 + 项目 C | 八股分组 | 项目 README 定稿 |
| 系统化 | W8 | 项目 C:压测 / 降级 / 灰度 | 系统设计 mock | 降级录屏 |
| 冲刺 | W9–W12 | 项目 D(可选) | 手撕 + mock + 复盘 | offer |
原则只有一条:项目线永远领先面试线两周,因为面试问的是项目,不是知识点。
4. 项目设计(每个都补了完成定义)
项目 A:端到端两阶段推荐(脊柱,4–5 周)
- 数据:KuaiRec(带曝光反馈)或 Amazon Beauty;别只用 MovieLens-1M
- 链路:多路召回(双塔 + i2i + 热门兜底)→ 精排(DIN)→ 重排(DPP / MMR)
- 完成定义(DoD):
- 评估口径冻结(第 5 节模板),README 第一屏能看见
- 三种召回对比、精排增益、重排对多样性的影响,各一张表
- 每个数字有 3 个种子 + 95% bootstrap CI
- 至少一次完整的负结果记录:哪个改动没涨、为什么
- P99 延迟有真实数字(写清硬件和并发)
- 必须能接住的 5 个追问:
- 为什么用双塔而不是交叉特征?代价是什么?
- 全库评估和负采样评估差多少?为什么差?
- 负采样比例怎么定的?对它敏感吗?
- 你的增益是噪声吗?怎么证明?
- 如果线上延迟砍一半,你砍哪里?
项目 B:曝光反馈、探索与 AB(差异化,2 周)
- 数据:KuaiRec(快手短视频)。它同时记录"曝光了什么"和"没曝光什么"(full exposure matrix),是少数能做 bandit 和曝光偏差实验的公开数据
- 做什么:bandit 模拟器(用户响应模型 + 噪声 + 曝光反馈),对比 ε-greedy / UCB / Thompson;再做一个 AB 分析 notebook
- AB notebook 必须包含:SRM 检查、样本量估算、CUPED 方差缩减、多重比较校正、护栏指标、新奇效应讨论
- 产出:一页结论——"什么条件下该多探索、代价多少、换回多少"
项目 C:在线服务(2 周)
- 栈:FastAPI + Faiss + Redis + Docker
- 必须做:P99 压测(wrk / locust,写清并发、QPS、错误率口径)、超时预算拆解、限流、缓存击穿、依赖超时降级、特征一致性脚本、模型版本与灰度
- DoD:一条录屏——杀掉向量库 → 自动回落热门 → P99 恢复 → 告警触发
项目 D:差异化(可选,2 周)
三选一:推荐鲁棒性评测(注入 / 投毒)、LLM4Rec 小实验(语义 ID 检索)、生态指标(多样性 / 流量集中度)。选和投递岗位最接近的那个,不要贪多。
5. 评测与实验:这才是业务岗的护城河
5.1 冻结评估口径(直接抄这个模板)
- 数据版本 + 划分方式:按时间切,留最后 N 天做测试
- 候选集:全库 or 采样 K(K 值写死)
- 是否过滤已交互
- 指标实现与版本
- 随机种子:至少 3 个
- 报告格式:mean ± std + 95% bootstrap CI
口径不冻结,数字就没有意义。面试官第一句通常就是"你这个 0.xx 是怎么算出来的"。
5.2 显著性
- 论文里的 +2% 很可能是噪声。用 paired bootstrap 或置换检验,别只看均值
- 多种子跑、报方差;单次结果不要写进简历
- 差值不显著时,诚实写"不显著",这比硬编一个提升更值钱
5.3 离线涨、线上不涨的六个来源
- 样本选择偏差:只统计有曝光的样本
- 位置偏差:越靠前越容易被点
- 特征穿越 / 泄漏
- 目标错位:离线 logloss 对齐不了线上的时长 / GMV
- 反馈循环:模型改变了未来的数据分布
- 口径差异:离线全库 vs 线上候选集
5.4 AB 的六个检查项
- SRM:分流比例对不对(卡方检验)
- 样本量:n ≈ 16σ²/δ²(80% 功效,α = 0.05)
- 方差缩减:CUPED(用实验前指标做协变量)
- 多重比较:Bonferroni / BH
- 新奇效应:看 7 日曲线,别看首日
- 护栏:延迟、错误率、负反馈率、多样性
6. 知识地图(四层 + 每层验收问题)
四层保留 v1 的骨架,补上漏的,并给每层加了验收问题——答不出来就是没过。
第 1 层 模型:要能白板上推出来
- 协同过滤 → 矩阵分解 → FM / FFM → 双塔(DSSM)
- GBDT + LR;要能解释它为什么被深度模型取代
- 精排:DeepFM、DCN、DIN、DIEN、SIM、ETA、TWIN、MMoE、PLE、ESMM、AITM
- 序列:SASRec、BERT4Rec、BST;对比学习(S3-Rec)
- 召回:i2i / u2i、Faiss / HNSW、语义 ID(TIGER)
- 重排:PRM、DPP / MMR
- 图:LightGCN(知道为什么比 GCN 好用就行)
- 前沿:HSTU、OneRec(加分,不是主线)
验收:能不能画结构图并说清"它解决了上一个方法的什么缺陷"?能不能手推 FM 的 O(nk) 化简?
第 2 层 系统:要能画链路图
- 全链路:日志 → 样本拼接 → 特征 → 训练 → 服务 → 多路召回 → 粗排 → 精排 → 重排 → 返回
- 特征平台:离线 / 近线 / 在线三份特征怎么保证一致(工程岗最高频追问)
- 训练:大规模 embedding(PS / worker)、稀疏梯度、增量训练
- 推理:延迟预算(看 P99)、批处理、量化 / 蒸馏、降级、缓存
- 向量检索:索引选型、召回率与延迟的权衡、增量更新
- 补:日志到样本的时间对齐、训练-服务 skew、模型热更新与灰度
验收:能不能画出一个请求的完整超时预算,并说清哪一层超时该丢弃、哪一层该降级?
第 3 层 业务与实验:要能算账
- 指标:AUC / GAUC、NDCG@k、HR@k、覆盖率、多样性、时长、GMV、留存
- 补:延迟转化与归因窗口、曝光未点击、pointwise / pairwise / listwise、校准
- AB:分流、样本量、CUPED、多重比较、新奇效应与长期效应
- 冷启动、探索利用、供给约束、生态配额
- 偏差:位置偏差与去偏(PAL、特权特征蒸馏)、样本选择偏差(ESMM)
验收:给你一个"离线 AUC 涨 0.5% 但 AB 不显著"的场景,能不能在 5 分钟内说出三种排查方向?
第 4 层 前沿:加分,不是必需
读工业论文的 20 分钟法:标题摘要 → 架构图 → 实验设置(数据规模、基线、延迟)→ 结论和适用边界 → 只记三句话。判断值不值得读只问一句:它解决了什么约束(规模 / 延迟 / 冷启动 / 多目标)?
7. 12 周执行表(周粒度,含验收)
| 周 | 目标 | 产出物 | 验收(做到算过) | 时间 |
|---|---|---|---|---|
| W0 | 定靶 + 基线 | JD 表、口径模板、实验台账、BPR 基线 | 能跑出 HR@10 基线,口径写进 README | 8h |
| W1 | 项目 A 召回 | 双塔 + Faiss + 全库评估 | 三种召回的 Recall@50/200 带 CI | 12h |
| W2 | 项目 A 精排 | DIN + 消融 | 精排增益 + 一次负结果记录 | 12h |
| W3 | 简历 + 投递 | 简历 v1、项目 A README、系统设计模板 | 能脱稿讲 10 分钟;投出 10 份 | 12h |
| W4 | 项目 B 模拟器 | bandit 三算法对比 | 探索率-收益曲线 | 12h |
| W5 | 项目 B AB | AB notebook | SRM / 样本量 / CUPED / 多重比较齐全 | 12h |
| W6 | 项目 A 深化 | 多目标 PLE、序列特征、显著性汇总 | 消融表 3 行以上,全带 CI | 12h |
| W7 | 项目 C 服务 | 召回 + 排序串起来,压测 | P99 数字 + 压测口径 | 12h |
| W8 | 项目 C 生产化 | 降级 / 限流 / 灰度 / 一致性 | 降级录屏 + 一致性报告 | 12h |
| W9 | 项目 D 或补深 | 二选一 | 一个能讲透的差异化点 | 10h |
| W10 | 手撕 + 系统设计 | 白板稿、2 次 mock | A 级手撕无提示通过 | 12h |
| W11 | 业务 case + 八股 | 3 个 case 稿、48 问自测 | 每个 case 5 分钟内讲完 | 12h |
| W12 | 冲刺 + 复盘 | 面试复盘表、offer 比较 | 至少 3 场面试复盘 | 10h |
总计约 148 小时,平均每周 12 小时。允许掉一周链子,优先砍 W9。
8. 面试准备(可排练版)
8.1 手撕分级
- A 级(必须无提示写出来):LR 梯度推导、AUC(含并列)、TopK 堆、Attention / Self-Attention、FM 交叉项化简、负采样、in-batch negative loss
- B 级(常考):DIN attention、交叉熵梯度、KMeans、FTRL、快排 / 归并 / 二分、链表树遍历、DP
- C 级(加分):Transformer block、Beam Search、分布式 AUC(分桶)
8.2 系统设计七步
- 澄清约束:场景、DAU / QPS、延迟预算、可用性、冷启动、合规
- 指标:北极星 + 护栏
- 数据与日志:埋点、样本拼接、时间对齐
- 离线链路:样本 → 特征 → 训练 → 评估 → 发布
- 在线链路:多路召回 → 粗排 → 精排 → 重排 → 混排
- 特征平台与一致性
- 降级 / 容量 / 实验
画图 + 讲取舍,不要背结构。 面试官打断你的时候,往往是在问"为什么不是另一种"。
8.3 业务 case 五步
定义指标 → 分层拆解(人群 / 场景 / 端 / 供给)→ 假设树 → 验证方案(数据 + AB + 样本量)→ 风险与长期效应 + 决策建议
三个必练:新用户次日留存跌 3%、多样性下降但时长涨了、AB 不显著。
8.4 八股四十八问
- 样本与标签:曝光未点击算负样本吗;延迟转化与归因窗口怎么定;正负比例与采样对哪些指标有偏;样本权重的用法;位置偏差与 PAL;特征穿越的典型例子;训练 / 验证为什么不能随机切;冷启动样本怎么造
- 特征与训练:类别特征编码与哈希冲突;embedding 维度怎么定;实时与离线特征一致性;特征重要性与 SHAP 的局限;归一化 / 分桶为什么很多模型不做;多值和序列特征怎么进模型;不收敛 / 过拟合怎么排查;增量训练 vs 全量重训
- 模型结构:FM 为什么能从 O(n²) 降到 O(nk);DeepFM 的 FM 与 DNN 怎么互补;DIN attention 和普通 attention 的区别;上万长序列怎么建模(SIM / ETA / TWIN 取舍);多任务跷跷板与 MMoE / PLE 的区别;ESMM 解决了什么、假设了什么;重排为什么不能只看精排分(DPP / MMR);生成式推荐改变了什么、没改变什么
- 评估指标:AUC 的物理含义与为什么不均衡不敏感;GAUC 怎么算、线上为什么看它;AUC 涨线上差的原因;NDCG / Recall@K / HR@K 的偏置;全库评估与负采样评估的差距;排序指标怎么和业务指标对齐;校准为什么在广告 / 出价场景必须要;离线涨但 AB 不显著先查什么
- 实验与因果:分流哈希与一致性;SRM 出现说明什么;样本量与功效不足的后果;CUPED 的前提;多重比较校正;新奇效应与长期效应怎么测;反向实验 / holdout 什么时候用;观察性数据什么条件下能说因果
- 系统与在线:一个请求的延迟预算怎么拆;超时预算怎么传播、下游超时怎么办;缓存击穿 / 雪崩怎么防;限流放哪层、限流后返回什么;模型热更新与灰度怎么做;向量检索的召回率-延迟权衡与增量更新;训练-服务 skew 怎么系统性发现;依赖挂了怎么定降级顺序
8.5 三档讲述
同一个项目准备三个版本:30 秒(电梯)、3 分钟(一面)、10 分钟(深挖)。30 秒只讲"业务问题 + 我的动作 + 结果数字";10 分钟要能讲清每一次取舍和失败。
录一遍自己的 3 分钟版本,回放时数"嗯、然后、就是"——这是最便宜的提升。
9. 投递策略与复盘
| 档 | 公司(示例) | 投递时间 | 目的 |
|---|---|---|---|
| 冲 | 字节、快手、小红书、美团、阿里、腾讯、拼多多 | W6–W8 | 拿面试 |
| 稳 | B 站、滴滴、网易、携程、京东、得物、SHEIN、Shopee | W4–W6 | 练手 + 保底 |
| 保 | 中厂、垂直行业、初创 | W3–W4 | 先拿一个 offer 定心 |
- 渠道优先级:内推 > 官网 > 招聘平台
- 记录表字段:公司 / 岗位 / 渠道 / 投递日 / 状态 / 轮次 / 被问到的题 / 复盘链接
- 纪律:每场面试 24 小时内写复盘;连续三场挂在同一类题,停下来补,不要继续投
10. 简历与差异化
同一件事的两种写法:
差:基于 DIN 实现了推荐排序模型,提升了效果。
好:在 KuaiRec 上搭多路召回 + DIN 精排,全库评估 HR@10 从 0.041 到 0.052(3 seed,95% CI 不重叠);推理 P99 从 42ms 降到 27ms(批处理 + 量化);上线前做特征一致性校验,定位并修复 3 处离线 / 在线偏差。
差别不在技术,在于有没有数字、有没有规模、有没有代价、有没有验证。
关于差异化,v1 写"主打系统工程 + 生态治理、算法作为第二腿",这个定位有风险:系统工程岗通常要求生产级后端经历(C++/Go/Java、高并发),2 周 FastAPI 撑不起来;生态治理岗 HC 少且偏策略。更现实的打法:
- 主线:推荐算法(业务向)——项目 A + B 直接对口
- 第一标签:评测与实验能力——这是业务岗最缺、也最容易补出差异的能力
- 第二标签:能压延迟——把模型压进延迟预算是硬通货,但别把它当主卖点
11. 砍单规则:只剩 6 周 / 2 周 / 3 天
只剩 6 周:W1–2 项目 A 最小版(双塔 + 全库评估 + 一个精排 baseline);W3–4 项目 B 的 AB notebook;W5 简历 + 投递;W6 手撕 + 系统设计。砍掉 C 和 D。
只剩 2 周:项目 A 只做双塔 + 全库评估 + 热门兜底对比;简历压到一页;手撕 A 级;系统设计白板走一遍。
面试前 3 天:只复习自己的项目 + A 级手撕 + 三个业务 case。不要读新论文。
12. 几个坑(v2 版)
- 学到第 12 周才开始投:这是最大的坑,v1 就踩了
- 只做模型不做系统:一面问特征一致性就露馅
- 只报离线指标:没有代价、没有显著性
- 数字不可复现:口径没冻结,面试官一问实现细节就崩
- 项目没有失败记录:讲不出坑,说明没真跑过
- 追新模型不看约束:HSTU、OneRec 是加分项,不是主线
- 简历写"熟悉"不写数字
- 面试不复盘:同样的题挂三次
13. 本周就动手(三件事,6 小时)
- 拉 20 份目标 JD,填完第 2 节那张表(2h)
- 冻结评估口径 + 建实验台账(1h)
- 用 RecBole 跑通 BPR 基线,记下 HR@10 与 NDCG@10(3h)
附:资源清单
论文(按优先级读,每篇只回答一个问题)
| 论文 | 优先级 | 读完要能回答 |
|---|---|---|
| YouTubeDNN (2016) | P0 | 工业两阶段召回+排序的骨架长什么样 |
| DIN (2018) | P0 | 为什么要对用户历史做 attention |
| ESMM (2018) | P0 | CVR 训练样本缺失怎么用全空间建模 |
| SASRec (2018) | P0 | 序列推荐为什么能用 Transformer |
| MMoE (2018) | P1 | 多目标为什么互相拉扯、门控怎么分 |
| PLE (2020) | P1 | MMoE 的跷跷板怎么缓解 |
| SIM (2020) | P1 | 上万条长序列怎么塞进延迟预算 |
| TIGER (2023) | P1 | 语义 ID 怎么把召回变成生成 |
| DIEN (2019) | P2 | 兴趣漂移怎么建模 |
| HSTU (2024) | P2 | 把推荐当序列生成,和传统范式差在哪 |
| OneRec (2025) | P2 | 统一召回和排序的代价是什么 |
| PRM (2019) | P2 | 重排为什么要看上下文 |
数据集
| 数据 | 用途 | 备注 |
|---|---|---|
| KuaiRec | bandit、曝光偏差、AB | 有 full exposure matrix,项目 B 首选 |
| Tenrec | 多场景、短视频 | 曝光 + 点击 + 时长齐全 |
| Ali-CCP | CTR / CVR 多目标 | 练 ESMM / MMoE / PLE |
| Criteo | 大规模 CTR | 练特征工程与稀疏模型 |
| Amazon 2018 / 2023 | 序列推荐 | 注意 2018 版的 dense subset 争议 |
| MovieLens-1M | 快速验证 | 太小,容易过拟合,只当 baseline |
工具:RecBole、Faiss、Redis、FastAPI、Docker、MLflow 或 W&B(实验追踪,从 W0 就要有)、wrk / locust、scipy / statsmodels。
书两本:王喆《深度学习推荐系统》(业务视角最好的一本)、项亮《推荐系统实践》(老,但当历史读)。
计划是给人用的,不是给人看的。12 周里允许掉一周链子,但项目 A 必须完整跑完一遍——它是所有面试话题的载体。