Anthropic FDE 面试:把岗位描述当成每一轮的复习大纲
把岗位描述当作教学大纲来读。每一条要求都说明了该练哪项技能,也暗示了哪一轮最可能考到它。
要点速览
- Anthropic 的 FDE 岗位要求有生产环境 LLM 经验、扎实的 Python,以及在情况不明时自己找到方向的能力。先准备这几项。
- 一份面试准备指南描述的流程包括:招聘方电话、围绕 Claude 和 MCP 的技术面、每一步追加一个需求的编码题,以及结合行为面试问题的设计轮。
- 准备阶段可以用 Claude,但现场面试和带回家完成的作业中不能用,除非面试官允许。
打开 Anthropic 在伦敦招聘前线部署工程师(FDE)的岗位描述,有一行很容易一眼扫过:25%–50% 的时间要出差到客户那里,与客户一起直接构建。乍看这只是出差安排,其实它说明这个岗位要的是能当着客户的面把东西做出来的人,而不只是擅长算法题的人。
所以,最有效的准备方法是把岗位描述本身当作教学大纲,把每条要求对应到最可能考它的那一轮。
岗位描述是教学大纲,不是广告
根据岗位描述,这个岗位隶属 Applied AI 团队。FDE 在客户自己的系统里用 Claude 构建生产级应用,交付物很具体:MCP 服务器、子智能体(sub-agent)和智能体技能(agent skill)。这是一份你必须能亲手做出来的清单,而不只是叫得出名字。
任职要求同样直白。候选人需要 4 年以上面向客户的技术岗位经验,例如 FDE。
还需要 LLM 的生产环境经验,包括高级提示工程和智能体开发;需要扎实的 Python;岗位描述还希望候选人高度自驱,能在规模大、层级多、情况模糊的组织里找到方向。
每条要求都能对应到最可能涉及它的那一轮。所以第一件事不是打开刷题网站,而是先把这张对应表做出来。
四轮面试,每轮考一项能力
Exponent/Aced 的一份面试准备指南列出了这个岗位的一个示例流程。第一轮是 30 分钟的招聘方电话,聊你的背景、动机、推荐人以及适合你的职级。
接下来是技术面,围绕一个真实场景展开:用 MCP 工具部署 Claude,并在上下文变得很长时保持系统稳定。
据同一份指南,编码轮是在类似 CodeSignal 的平台上完成的分步实操题,每一步追加一个新需求。
终面包含两部分:方案设计,即为客户设计 Claude 系统的架构;以及关于行为和公司价值观的问题。
这只是示例流程,并非固定安排,具体轮次顺序请向你的招聘方确认。
| 岗位描述中的要求 | 最可能考察的轮次 | 准备方法 |
|---|---|---|
| 交付 MCP 服务器、子智能体、智能体技能 | 技术面 | 搭一个把 Claude 接入真实数据源的小型 MCP 服务器 |
| 高级提示工程、智能体开发 | 技术面、设计轮 | 准备一组测试用例,用来对比两个版本的提示词 |
| 扎实的 Python | 增量编码轮 | 练习写小而易扩展的函数,每一步都配测试 |
| 在情况不明时找到方向 | 设计轮、行为面试 | 练习在画架构之前先提澄清问题 |
| 4 年以上与客户合作的经验 | 招聘方电话、行为面试 | 准备三个故事,每个都包含客户、冲突和结果 |
示例:每一步追加一个需求的编码题
设想下面这道题。这是练习题,不是真实面试题。第一步:输入一组 JSON 格式的支持工单,按客户分组。第二步:去掉内容重复的工单。第三步:发送给模型之前做裁剪,让每个客户的总长度不超过某个阈值。
陷阱在于把第一步写成一个长函数。到了第三步,你只能在计时中把它拆开重写。更稳妥的做法是让每个需求都是一个纯函数,这样新需求只需在链条上多加一环:
from dataclasses import dataclass
from collections import defaultdict
@dataclass(frozen=True)
class Ticket:
id: str
customer: str
created_at: str # ISO 8601,例如 "2026-03-01T09:30:00Z"
text: str
def load(rows: list[dict]) -> list[Ticket]:
return [Ticket(r["id"], r["customer"], r["created_at"], r["text"].strip())
for r in rows]
def dedupe(tickets: list[Ticket]) -> list[Ticket]: # 第 2 步
seen, out = set(), []
for t in tickets:
key = (t.customer, t.text.lower())
if key not in seen:
seen.add(key)
out.append(t)
return out
def group(tickets: list[Ticket]) -> dict[str, list[Ticket]]: # 第 1 步
groups = defaultdict(list)
for t in tickets:
groups[t.customer].append(t)
return dict(groups)
def budget(groups, max_chars: int): # 第 3 步
trimmed = {}
for customer, items in groups.items():
total, kept = 0, []
# 最新的优先:同一时区的 ISO 8601 字符串按字典序排序即为时间顺序
for t in sorted(items, key=lambda t: t.created_at, reverse=True):
if total + len(t.text) > max_chars:
break
kept.append(t)
total += len(t.text)
trimmed[customer] = kept
return trimmed
def pipeline(rows, max_chars=4000):
return budget(group(dedupe(load(rows))), max_chars)
第三步按工单创建时间排序,而不是按 id,因为 id 大不一定代表工单更新。如果数据里没有时间戳字段,先把你的假设说清楚,再退而使用 id。
真正得分的是你边写边说的内容,而不是代码本身。把取舍讲明白:你保留最新的工单,是因为假设它们更相关;如果这个假设不成立,你会去跟客户确认。
这个上下文预算问题,也很接近技术面核心的长上下文稳定性问题。
设计轮:先提问,后画图
岗位描述强调在情况不明时找到方向的能力,因此设计题很可能故意省略大量细节。要养成先问再画的习惯。
假设面试官说:“一家保险公司希望员工能向 Claude 询问保单条款。”不要马上画一张带向量数据库的架构图,可以先问几个问题。
可以从这三个问题开始:“谁会使用它,是呼叫中心员工还是理赔部门?保单存在哪个系统里,有没有访问控制?如果 Claude 答错了,后果是来电者不满,还是赔付出错?”
问完这三个问题之后,再提出架构:一个遵循现有访问控制的 MCP 服务器,一个专门负责引用保单条款的子智能体,以及一组基于员工真实提问构建的测试用例。
行为面和深挖轮:真实的故事胜过漂亮的故事
Educative 关于 Anthropic 工程岗位招聘流程的一份通用指南指出,技术深挖环节青睐真正理解自己所建系统的人。在行为面试中,面试官往往更看重诚实、自我认知和反思,而不是包装精美的成功故事。
具体来说,至少准备一个自己的部署失败的故事:讲清技术原因、你当时的决定,以及之后做了哪些改变。如果被追问两层之后你仍然讲得清楚,这一个故事比十个只停留在表面的项目更有分量。
这也是修改简历的好时机。不要写含糊的“有 LLM 相关经验”,而要写清你搭建了一个 MCP 服务器,把模型接入了哪个系统,为谁运行,以及如何衡量它的质量。
这类具体的描述并不能替代岗位要求的 4 年以上经验,只是让读简历的人一眼看出你这几年做了什么。
Claude 使用规则:提前了解
Anthropic 发布了关于候选人使用 AI 的官方指引。你可以用 Claude 润色申请材料,但初稿必须自己写。你可以用 Claude 研究公司、练习回答、准备向面试官提的问题。
界线划在评估本身。现场面试“全靠你自己”,除非面试官另有说明,否则不能借助 AI。带回家完成的作业同样不能用 Claude,除非得到许可。
对于一个整天和 Claude 打交道的岗位,这听起来有些矛盾,但合理的理解是:他们想看到你在没有助手时的真实底子。
让优秀候选人落选的错误
第一个常见错误是备错了考试类型:花几周刷算法,而按示例流程,技术面其实是一个用 MCP 部署 Claude 的场景题。其次是把代码写成一整块,导致每来一个新需求都得重写。
还有一个是设计题还很开放时就直接进入架构,恰好跳过了岗位描述中明确写出的在模糊中找方向的能力。
剩下两个错误与人有关。一是讲的故事太完美,听的人找不到你真正学到东西的地方。
二是在不允许的场合使用 Claude,比如未经许可在带回家的作业中使用。这会让你失去信任,而在一个依赖客户信任的岗位上,失去信任就等于失去一切。
本周练习:请一位同事扮演面试官,只给你一个故意含糊的设计题,比如“一家医院想在前台使用 Claude”。
设一个 30 分钟的计时器。前 10 分钟只能提问,不能画任何东西。结束后问同事,你的哪个问题最能把问题弄清楚。
这篇文章对你有帮助吗?
感谢你的反馈!