重要说明: 本项目模拟真实的遗留系统修复场景。你将接手一个"能跑但问题很多"的数据处理系统,通过排查、修复、重构来证明你的系统级工程能力。
本挑战要求你使用 AI 工具(Cursor, Claude, ChatGPT 等)辅助完成。
我们不考察"你是否能脱离 AI 手写代码"。我们考察的是你和 AI 组成的 team 如何解决复杂工程问题。
具体来说,我们通过你的 AI 对话记录评估以下三项核心能力:
| 核心能力 | 具体表现 |
|---|---|
| 复杂系统切分 | 你能否将多服务交互拆解为独立的数据流片段,即使面对"魔法般"的 AI 输出,也能找到逻辑线索 |
| 领域语义直觉 | 你能否快速从字段名推断业务含义?看到 confidence: 0.3 和 confidence: 0.85 时,你对"数据可信度"的理解是否立即浮现? |
| AI 协作深度 | 你向 AI 提出的问题质量——是在做"系统认知"还是在做"搜索引擎式复制粘贴"? |
⚠️ 强制要求:请将完整的 AI 对话记录保存为solutions/ai-chat-log.md并随代码一起提交。对话记录是评分的核心依据之一——如果缺失,我们将无法评估你真正的工程思维。
你加入了一个做 influencer marketing 数据分析的创业公司。系统负责接收品牌方的数据分析请求,通过第三方 AI/数据服务对 influencer 受众进行画像分析,并将报告返回给用户。
你的前任工程师已经离职了。以下是你上班第一天的情况。
┌─────────────────┐ Message Queue (SQS) ┌─────────────────┐
│ LegacyApp │ ─────────────────────────────► │ WorkerService │
│ (REST API) │ AnalysisRequested │ (SQS Consumer) │
│ Port: 3000 │ │ │
└────────┬────────┘ └────────┬────────┘
│ │
│ Read / Write │ Read / Write
│ │
▼ ▼
┌───────────────────────────────────────────────────────────────────┐
│ MongoDB │
│ (analysis_jobs collection) │
└───────────────────────────────────────────────────────────────────┘
核心数据模型 AnalysisJob:
{
jobId: string; // 唯一任务标识
userId: string; // 发起分析的用户
dataUrl: string; // 待分析的数据源 URL
status: AnalysisStatus; // 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED'
demographics?: { // 受众画像分析结果
ageRange?: string; // 年龄段
gender?: string; // 性别
location?: string; // 地区
confidence?: number; // 结果置信度 (0~1)
};
createdAt: string;
updatedAt: string;
}- Node.js 20+ - 使用 nvm:
nvm use - Docker - 用于运行 MongoDB
- pnpm - 包管理器
pnpm install# 终端 1: 启动 MongoDB
docker-compose up -d
# 终端 2: 启动 LegacyApp (REST API)
pnpm run start:legacy
# 终端 3: 启动 WorkerService (SQS Consumer - 本地模拟)
pnpm run start:worker# 创建分析任务
curl -X POST http://localhost:3000/api/analysis \
-H 'Content-Type: application/json' \
-d '{
"userId": "user-123",
"dataUrl": "https://example.com/data.json"
}'
# 查询分析结果
curl http://localhost:3000/api/analysis/{jobId}你需要在 3-4 小时 内完成以下任务。
在动手写代码之前,每个任务都需要你先提交一份"系统认知报告"到 solutions/ 目录。报告需要包含:
- 数据流向图:画出问题场景中数据从产生到最终状态的完整流转路径
- 字段语义标注:说明关键字段在业务场景中意味着什么
- 根因假设:基于你的分析,在写任何代码之前提出根因假设
⚡ 这不是走过场。系统认知报告的质量在总评分中权重最高。 一份好的报告应该在你还没写任何代码之前,就已经精确定位到了问题的本质。
团队目前的调试流程非常痛苦:每次修改代码都要部署到云端才能测试,反馈周期 5 分钟+。
你的任务是建立一个 "Payload Capture & Replay" 机制,让开发者可以在本地秒级复现问题。
-
编写 Middleware (
apps/worker-service/src/middleware/capture.middleware.ts)- 当环境变量
CAPTURE_MODE=true时,将每条 SQS 消息的完整 Payload 保存到debug-payloads/目录
- 当环境变量
-
编写 Replay 脚本 (
scripts/replay-event.ts)- 从
debug-payloads/读取指定的 Payload 文件 - 直接调用 Worker 的 Handler 函数(绕过 SQS)
- 支持命令行参数:
pnpm run replay -- --file=job-xxx.json
- 从
# 1. 开启捕获模式
CAPTURE_MODE=true pnpm run start:worker
# 2. debug-payloads/ 下应生成 JSON 文件
# 3. 使用 replay 本地调试
pnpm run replay -- --file=debug-payloads/job-xxx.json
# 应看到 Handler 的完整执行日志,无需启动队列#customer-support 频道:
@channel 用户再次反馈报告数据异常
工单 #4521
用户 ID: user-8827
时间: 2026-04-10 14:32 UTC
现象:
用户在 14:32:01 查看了分析报告(jobId: a3f8e-...),页面显示:
gender: female, location: US, confidence: 0.85
14:32:03 刷新页面后,数据变成了:
gender: male, location: CA, confidence: 0.3
用户非常困惑,质疑我们数据的可信度。
这是本周第三个类似投诉了。
#engineering 频道:
@team 关于数据跳变的问题——这个月已经有 12 个工单了。
每次现象都一样:刚生成的报告过几秒就变回一个低质量版本。
有人能看看吗?日志里只有 "Error happened",完全没法定位。
-
系统认知报告 (
solutions/part2-analysis.md)- 追踪
AnalysisJob从创建到最终状态的完整数据生命周期 - 标注哪些服务、在什么时间点、对同一条记录做了什么操作
- 解释为什么用户先看到
confidence: 0.85后看到confidence: 0.3——精确到代码行和时间窗口
- 追踪
-
TDD 验证 (
apps/legacy-app/test/bug-repro.spec.ts)- 先写测试证明 Bug 存在(Red)
- 再修复代码让测试通过(Green)
-
代码修复
- 修复根因,确保
PENDING → PROCESSING → COMPLETED的状态流转稳固 - 无论并发时序如何乱序,数据都不再跳变
- 修复根因,确保
- 系统认知报告中有精确到毫秒的数据生命周期时序图
- TDD 测试先红后绿
- 修复后数据一致性可证明
事故时间: 2026-04-09 03:14 UTC
影响范围: Worker 批处理服务全部崩溃,排队中的分析任务积压
恢复方式: 手动重启 Worker 后恢复,但相同任务重新触发时再次崩溃
初步排查:
- Worker 日志最后一条: "Error happened"(无其他上下文)
- Crash 似乎与某些第三方 API 响应数据有关
- 已将事发时段捕获到的第三方 API 原始响应保存在 debug-payloads/chaos-data-samples.json
查看 debug-payloads/chaos-data-samples.json——这是从第三方 API 捕获的真实响应。你需要理解每条记录中的每个字段在 influencer marketing 领域的业务含义,才能判断"什么样的数据是脏的"以及"为什么它会导致 Crash"。
-
数据质量分析 (
solutions/part3-observability.md)- 逐条审查
chaos-data-samples.json - 对每条记录标注: 合法 / 不合法,以及判断依据
- 你的判断依据应该体现你对 influencer demographics 数据的业务理解
- 逐条审查
-
Runtime Validation
- 在 Worker 中引入运行时数据校验
- 不合法的数据应被记录并跳过,不应 Crash 整个流程
-
结构化日志
- 替换所有
console.log('Error happened')式的日志 - 每条日志包含:
jobId,traceId, 事件类型, 上下文信息
- 替换所有
-
Dead Letter 逻辑
- 失败记录保存到
failed-records/,包含失败原因和原始数据
- 失败记录保存到
pnpm run process:chaos
# ✅ Processed: X records
# ⚠️ Skipped (validation failed): Y records
# 📁 Failed records saved to: failed-records/batch-xxx.json@engineering 我们在做月度数据质量审计时发现一个问题:
受众画像 (audience demographics) 数据有大约 5% 的缺失率。
具体表现:
- 绝大部分 influencer 的受众数据正常采集
- 但某些特定的 mediaId 总是返回空值
- 我们已经确认第三方 API 对这些 mediaId 返回了 200 OK
- 但我们系统里存的是 null
受影响的 mediaId 样本: 12345, 54321, ...
这个问题已经存在好几个月了,因为只影响少量数据一直没人注意到。
-
复现 Bug
pnpm simulate:audience-bug
-
调用链路追踪 (
solutions/part4-audience-trace.md)- 追踪完整调用链:
run-audience-test.ts→audience.service.ts→facade-audience.service.ts→mock-audience-api.ts - 对比成功请求和失败请求在每一层的数据差异
- 精确标注数据在哪一层、哪一行代码"丢失"的
- 追踪完整调用链:
-
修复与验证
- 修复数据丢失问题
- 验证所有测试 mediaId 都能成功返回 (
Errors: 0)
-
扩展性设计(进阶)
- PM 通知你下周要增加
youtube,twitter,linkedin三个新平台的受众抓取 - 以当前代码结构,如何避免沦为
if/else堆积?请在代码中体现你的设计思路
- PM 通知你下周要增加
- 调用链路文档精确到代码行号和数据结构差异
- 所有测试 mediaId 数据成功返回 (
Errors: 0) - 新平台接入无需修改核心逻辑
场景背景: 你的修复上线后系统稳定了。但销售团队签下了一个 Enterprise 大客户。
新需求: 客户每周一早上 9:00 会上传一个 10GB 的 CSV 文件(约 500 万行记录)到 S3,要求在 2 小时内 完成所有分析并生成报告。
现有限制:
- 目前的 Worker 是单实例轮询,处理速度约为 10 条/秒。
- 团队目前只有 你 1 个后端人力。
- 只有 2 周 时间上线。
CTO 的提议: CTO 听说 Rust 很快,建议你用 Rust 重写 Worker,或者上 Kubernetes 做自动扩缩容。
在
solutions/part5-tradeoffs.md中回答:
- 架构方案:你会如何修改架构来满足 500万条/2小时 的吞吐量?请画出架构图。
- 技术选型:你会接受 CTO 用 Rust 重写的建议吗?为什么?替代方案?
- 妥协与牺牲:2 周 1 个人,你会主动放弃哪些"最佳实践"?
- 调试灾难预案:500 万条中 1% 失败(5万条错误),如何设计监控让研发能排查而不被报警淹没?
| 维度 | 权重 | 评估方式 |
|---|---|---|
| 系统认知 & 数据流向分析 | 40% | 系统认知报告的深度和准确性。数据生命周期图是否精确?字段语义理解是否正确?根因假设是否命中核心? |
| 解决方案质量 | 25% | 修复是否正确解决根因(而非只治症状)?是否健壮? |
| AI 协作质量 | 20% | 从 AI Chat Log 评估:你如何向 AI 拆解问题?如何验证 AI 的输出? |
| 代码质量 | 15% | TypeScript 规范、合理的抽象、清晰的命名 |
| 行为模式 | 评价 |
|---|---|
| 向 AI 分段提问:"先帮我梳理这个服务的数据流向"、"这个字段在业务上意味着什么?" | ✅ 体现了系统切分能力 |
| 让 AI 给出方案后追问:"这样改会不会影响另一个服务的写入?" | ✅ 体现了全局意识 |
| 发现 AI 的方案有隐患后主动修正或引导 AI 调整 | ✅ 体现了深度理解 |
| 把整段代码或整个文件粘贴给 AI 说"帮我找 bug" | |
| AI 说什么改什么,不做验证 | ❌ 缺乏判断力 |
| 只关注让测试通过,不关注根因和系统影响 | ❌ 缺乏工程思维 |
senior-backend-challenge/
├── apps/
│ ├── legacy-app/ # REST API 服务
│ │ ├── src/
│ │ │ ├── analysis/ # 分析模块
│ │ │ └── shared/ # 数据库 & 消息队列
│ │ └── test/
│ │ └── bug-repro.spec.ts # Part 2 TDD 测试
│ └── worker-service/ # 消息处理 Worker
│ └── src/
│ ├── processors/ # 消息处理器
│ ├── middleware/ # 中间件 (Part 1)
│ └── audience-integration/ # 受众数据集成 (Part 4)
├── packages/
│ └── shared-types/ # 共享类型定义
├── scripts/
│ ├── replay-event.ts # Part 1: Replay 脚本
│ └── process-chaos.ts # Part 3: 脏数据处理
├── debug-payloads/ # Payload 捕获目录
│ └── chaos-data-samples.json # 脏数据样本
├── failed-records/ # 失败记录目录
├── solutions/ # ⬅️ 你的交付物
│ ├── ai-chat-log.md # ⚠️ 必需:AI 完整对话记录
│ ├── part2-analysis.md # 数据流向 & 根因分析
│ ├── part3-observability.md # 数据质量分析
│ ├── part4-audience-trace.md # 调用链路追踪
│ └── part5-tradeoffs.md # 系统设计方案
├── docker-compose.yml
└── package.json
Q: 可以使用 AI 工具吗? A: 不只是可以,是要求你必须使用。 这个挑战考的是你和 AI 如何协作解决问题。但请注意——我们更关注你的 问题切分方式、领域理解深度以及对 AI 输出的判断力,而不是代码生成速度。
Q: 时间不够怎么办? A: 优先完成 Part 1 和 Part 2。但无论做到哪一步,每个已完成部分的系统认知报告质量是第一优先级。
Q: 需要真的连接 AWS 吗? A: 不需要。本项目使用本地 MongoDB 和模拟的消息队列,所有测试都可以在本地完成。
祝你好运! 🚀