#十四、手撕代码题专项

这部分在算法工程、推理工程、平台工程岗位里越来越常见。很多公司不会让你现场写完整训练框架,但会让你实现一个最小核心模块,或者写伪代码、写关键函数。

#1. 手撕代码最常考的 4 大类型

  1. 基础张量计算题
    • 例如 softmax、attention、mask、采样。
  2. 模型模块题
    • 例如实现一个简化版 Multi-Head AttentionRoPELoRA 线性层。
  3. 工程链路题
    • 例如写一个简化版 RAG pipeline、batching、缓存、日志聚合。
  4. 算法/数据结构题
    • 例如 top-k、heap、LRU cache、并发队列、滑动窗口。

#2. 高频手撕代码题清单

#基础难度

  1. 实现 softmax,并说明如何做数值稳定。
  2. 实现 scaled dot-product attention
  3. 实现 causal mask(因果掩码)。
  4. 实现 top-k sampling。
  5. 实现 top-p sampling。
  6. 实现 nucleus sampling 中累计概率截断。
  7. 写一个函数统计 batch 内 token 长度,并按长度分桶。

#中等难度

  1. 手写一个简化版 Multi-Head Attention 前向。
  2. 给定 Q/K,实现 RoPE 的旋转位置编码。
  3. 实现一个带 KV cache 的 decode step。
  4. 实现一个最小版 LoRA Linear
  5. 写一个简单的 BPE merge 过程。
  6. 写一个最小版向量检索 + top-k 返回。
  7. 写一个 reranker 输入构造函数,把 query 与文档拼成模型输入。

#进阶难度

  1. 实现一个支持 padding mask + causal mask 的 attention。
  2. 写一个 continuous batching 的简化调度器。
  3. 写一个 prefix cache 命中逻辑。
  4. 写一个简化版 speculative decoding 框架。
  5. 实现一个最小 RAG 系统:切块、编码、检索、拼接 prompt。
  6. 设计一个 Agent tool executor,支持超时、异常和重试。

#3. 高频伪代码题

有些公司不要求完全可运行,而要求你说清主流程。最常见的是:

  1. 画出 RLHF 三阶段伪代码。
  2. 写出 DPO 的训练主循环。
  3. 写出 RAG 从 query 到 answer 的完整主流程。
  4. 写出在线推理服务的 batch 调度主流程。
  5. 写出 Agent 的 observe-think-act loop(观察-思考-行动循环)。

#4. 手撕代码题到底在考什么

不是考你背 API,而是在考:

  1. 你是否知道张量维度怎么流;
  2. 你是否知道 mask、cache、采样这些细节为什么存在;
  3. 你能不能把一个“概念”落成一个“最小可执行模块”;
  4. 你写代码时是否有边界意识:数值稳定、shape 正确、异常处理、复杂度。

#5. 手撕代码常见追问

  • 你的 softmax 为什么可能 overflow(上溢)?
  • 你的 attention 输出 shape 是什么?
  • 为什么 KV cache 更新时只追加 K/V,不用重算历史?
  • top-p 相比 top-k 为什么更自适应?
  • 你的 RAG 检索结果为什么还要 rerank?

#6. 最值得准备的手撕代码题单

如果只能准备一小套,我建议按下面顺序刷:

  1. softmax(数值稳定)
  2. masked softmax
  3. scaled dot-product attention
  4. multi-head attention forward
  5. causal mask + padding mask
  6. top-k sampling
  7. top-p sampling
  8. RoPE apply
  9. LoRA Linear
  10. KV cache append + decode step
  11. 简化版向量检索 top-k
  12. 最小 RAG pipeline

#7. 面试官通常怎么打分

手撕代码题一般不只是看你“写出来没有”,而是会看这 6 件事:

  1. shape 是否清楚;
  2. 数值稳定性是否想到;
  3. mask / cache 这类细节是否漏掉;
  4. 时间复杂度和空间复杂度是否说得出;
  5. 边界条件是否考虑;
  6. 能否从代码反推回原理。

#8. 常见失分点

  1. softmax 没减最大值,导致上溢;
  2. attention 忘了除 sqrt(d_k)
  3. causal mask 的上三角 / 下三角方向写反;
  4. top-p 先截断再排序,逻辑顺序错;
  5. KV cache 每步重算历史,而不是只追加;
  6. LoRA 没讲清 base weight 冻结、增量矩阵可训练。

#9. 准备建议

如果你要专项准备手撕代码,建议至少把下面这些写熟:

  1. softmax
  2. attention
  3. mask
  4. top-k / top-p
  5. RoPE
  6. LoRA Linear
  7. KV cache decode
  8. 一个最小 RAG pipeline