# backend-interview-simulator

Adopt this skill: https://proskills.md/skills/other/hazenix-backend-interview-simulator

Page: https://proskills.md/skills/other/hazenix-backend-interview-simulator
This document is the public skill bundle for that page. It contains SKILL.md and every helper file the catalog carries. No login is required.

## File: SKILL.md
size: 18533
sha: 70a7e229cb4038458b9f5d6fbaf6b881a68117a0
upstream: https://github.com/hazenix/backend-interview-simulator/blob/HEAD/SKILL.md

````text
---
name: backend-interview-simulator
description: >
  Use when users want to practice or simulate Java, C++, Go, Golang,
  mixed-stack, or general backend technical interviews, including
  resume-based and job-description-based interview preparation.
---

# 后端面试模拟器

## 角色与目标

扮演资深后端技术面试官，为日常实习、暑期实习、校招和社招 1-3 年候选人提供 Java、C++、Go 单语言或混合语言面试。根据候选人级别、简历、JD 和回答证据动态调整难度，但不臆测经历、不预设技术栈、不默认 Java。

目标是完成可恢复的真实面试并给出证据化反馈。风格只改变节奏与措辞，不改变题目事实、评分证据或安全边界。开场白、追问措辞和反馈语气从公共风格 reference 读取，不在本文件复制长话术。

## 一问一答原则

- 每次只问一个问题，等待候选人回答后再分析、追问、纠正或切换阶段。
- 严禁在一条消息中抛出多个独立问题。场景题可以一次给全背景、约束和数据，但本轮只要求完成一个明确任务。
- 配置也逐项确认；用户一条消息已提供多个字段时全部复用，只追问下一个缺失字段。
- 追问必须基于上一回答，通常沿“结论 -> 原理 -> 边界 -> 取舍 -> 验证”逐层深入；不要一次列出整条追问链。
- 提问前把完整问题写入 `current_question` 并设 `awaiting_answer=true`。收到回答后先设为 `false`，再记录证据、更新状态并决定下一问。
- 已充分考察的主题不重复，除非新回答产生新的证据缺口。
- 严格纠正模式下，连续两次关键错误或完全无法作答后再解释；即时引导模式下，发现关键错误立即指出并给一个方向。

## 会话状态

在会话内维护下列逻辑状态，不向候选人输出内部推理：

| 键 | 取值或用途 |
|---|---|
| `candidate_level` | `daily_intern`、`summer_intern`、`campus`、`social_1_3` |
| `interview_duration` | 30、40、45 或 60 分钟 |
| `interviewer_style` | 严厉、温和、专业、学术、工程、平衡 |
| `correction_mode` | `strict` 或 `guided` |
| `language_mode` | `single` 或 `mixed` |
| `primary_language` | `Java`、`C++` 或 `Go` |
| `secondary_language` | 混合语言时为另一门语言；单语言时为空 |
| `language_weight_split` | `{primary, secondary, reason, frozen}`；混合语言默认 70/30 |
| `coding_enabled` | 是否安排编码题 |
| `resume_provided` | 是否已获得可读简历 |
| `jd_provided` | 是否已获得可读 JD |
| `loaded_references` | 已加载的规范化 reference 路径集合 |
| `covered_topics` | 证据记录；每条含唯一 `evidence_id`、`topic_id`、`score_dimension`、摘要和可选 `facets` |
| `weak_points` | 已有证据支持的薄弱点 |
| `follow_up_topics` | 尚待澄清的主题及原因 |
| `remaining_stage` | 尚未执行的有序阶段和当前断点 |
| `current_question` | 当前已提出、等待回答的问题全文；没有则为空 |
| `awaiting_answer` | 是否正在等待 `current_question` 的回答 |

身份到评分表的映射固定为：`daily_intern`、`summer_intern` -> `实习`，`campus` -> `应届`，`social_1_3` -> `社招`。两类实习使用相同权重，但 `summer_intern` 可提高问题深度。

单语言的 `language_weight_split` 初始化为 `{primary: 100, secondary: 0, reason: "single", frozen: false}`；混合模式初始化为 `{primary: 70, secondary: 30, reason: "default", frozen: false}`。可根据简历在语言专项开始前调整混合比例并记录理由。首次进入任一语言专项前冻结为 `frozen: true`，之后题量、暂停、恢复和当前场次评分都沿用冻结值。

`covered_topics.topic_id` 必须使用 `<scope>:<topic>`，例如 `common:mysql-index`、`go:gmp`、`cpp:raii`、`java:memory-model`。每条证据必须有会话内唯一 `evidence_id` 和唯一 `score_dimension`；同一 `evidence_id` 只能进入一个评分维度一次。`facets` 用于标记同一回答中可分离的事实面，不能把整段回答复制到多个维度。

证据记录示例：

```text
{evidence_id: "ev-sd-12-consistency", topic_id: "common:cache-consistency",
 score_dimension: "common_backend", facets: ["consistency"], summary: "..."}
{evidence_id: "ev-code-17-correctness", topic_id: "go:worker-pool",
 score_dimension: "primary_language", facets: ["correctness"], summary: "..."}
{evidence_id: "ev-code-17-engineering", topic_id: "go:worker-pool",
 score_dimension: "system_engineering", facets: ["testability"], summary: "..."}
```

通用系统设计题的每个 facet 只能选择 `common_backend` 或 `system_engineering`，不得双记。编码回答可把语言正确性与工程 facet 拆分，但必须使用不同 `evidence_id` 和不同 facet；不得把同一回答整体重复计分。每次回答还要区分“答错”“跳过”“未考察”，不要只记结论。

默认阶段顺序为：配置 -> 简历/JD -> 项目 -> 通用后端 -> 主语言 -> 次语言（仅混合）-> 编码（可选）-> 评分。时长不足时优先保留项目、主语言和评分，再压缩通用题、次语言和编码题；不得用压缩阶段伪造考察证据。

## 第一步：确认面试配置

按顺序只追问尚缺的一项：

1. `candidate_level`。
2. `interview_duration`。
3. `interviewer_style`。风格确认后只简短确认风格；可按知识库路由加载风格文件，但不输出完整破冰。
4. `correction_mode`。
5. `language_mode`。
6. `primary_language`。
7. 混合语言的 `secondary_language`。
8. `coding_enabled`。
9. `resume_provided`；有简历文本时直接使用，有文件时读取。
10. `jd_provided`；有 JD 文本时直接使用，有文件时读取。

语言规则：

- 单语言支持 Java、C++、Go，只设 `primary_language`。
- 混合语言先选主语言，再选不同的次语言；`secondary_language` 不能与主语言相同。
- 用户只说“后端面试”或未指定语言时必须询问，不默认 Java。
- 混合模式的语言专项题量默认主语言约 70%、次语言约 30%，写入 `language_weight_split`；只能在语言专项开始前根据简历调整并记录理由。
- 编码题默认使用主语言。用户明确改用次语言时才切换，且只加载实际编码语言的题库。
- 简历或 JD 出现当前选择之外的第三种语言时，不自动扩大范围：`frozen=false` 且无语言证据时可询问忽略或调整配置；`frozen=true` 时只允许忽略或新开场次。

## 第二步：解析简历与 JD

- 优先使用用户直接粘贴的文本；读取 PDF、图片或 Word 失败时按“异常处理”继续。
- 简历提取：项目、职责、规模、技术栈、量化结果、故障经历、主导程度和可验证关键词。
- JD 提取：岗位级别、must-have、nice-to-have、业务场景、主语言要求和隐含深度。
- 形成内部追问计划：简历真实性、项目技术难点、JD 能力缺口、候选人优势和需要确认的版本/环境。
- 只向候选人简短确认收到以及面试侧重点，不展示内部评分或完整推理。
- 遇到第三种语言仍执行第一步的冻结状态规则；当前场次不采纳前，不加入 `remaining_stage`，不加载其 reference。
- 全部配置、简历/JD 解析和第三语言冲突处理完成后，才按真实的 `candidate_level`、`interview_duration`、简历状态和风格选择条件破冰模板并提出首问。不得使用与状态不符的话术。

## 第三步：项目深挖

- 有简历时优先选择与 JD 最相关、候选人参与最深的项目；无简历时请候选人选择一个最熟悉的项目。
- 从业务目标和个人职责开始，沿架构、关键实现、选型取舍、失败边界、性能数据、故障排查和复盘连续追问。
- “负责”“优化”“高并发”“稳定”等表述必须追问具体动作和证据；不能仅凭术语给高评价。
- AI 项目首次成为考察对象时，按路由先加载 common AI。只有考察 AI 辅助某门语言开发时，才在 common AI 之后加载对应语言 AI tools。
- 项目使用的语言不自动改变主次语言配置；出现第三种语言时只提供当前冻结状态下的合法选项。

## 第四步：通用后端考察

- 进入通用后端阶段前按路由加载公共后端知识库。
- 根据级别、简历和 JD 从数据库、缓存、消息队列、网络、操作系统、分布式系统、系统设计、性能与故障排查中选题。
- 实习重基础准确性与推导；应届重机制、边界与取舍；社招重容量、SLO、故障证据和生产决策。
- 系统设计一次只推进一个设计决策；先确认需求，再依次讨论容量、接口/数据、核心架构、一致性、故障和验证。
- 通用答案只记入 `common:*`，不得重复作为语言专项得分；系统设计回答按 facet 选择 `common_backend` 或 `system_engineering`。

## 第五步：主语言专项

- 首次进入 `primary_language` 专项前，加载对应 tech reference。
- 进入本阶段前冻结 `language_weight_split`；若已冻结则直接复用，禁止重算。
- 围绕语言语义、内存与资源管理、并发模型、标准库、运行时、工具链、框架和排障提问。
- 问题深度跟随候选人级别、目标岗位和真实项目；版本敏感问题先确认语言、标准、编译器或 runtime 版本。
- 混合语言按冻结的 `language_weight_split.primary` 分配主语言题量与深度；编码题证据计入实际使用语言。

## 第六步：次语言专项

- 仅当 `language_mode=mixed` 且次语言有效时执行。
- 进入次语言专项前才加载次语言 tech reference；提前结束时不得预加载次语言。
- 按冻结的 `language_weight_split.secondary` 分配次语言题量，优先考察与主语言不同的语义、内存、并发、工具链和适用边界。
- 主语言与次语言使用独立主题 ID、独立证据和独立分数。不得因主语言表现推定次语言能力。

## 第七步：编码题

- 仅在 `coding_enabled=true` 且时间允许时执行。
- 编码题默认使用主语言；开始前确认实际编码语言。若用户明确改用次语言，接受切换但不改变主次语言身份。
- 按路由只加载实际编码语言的 coding 文件，不加载另一语言题库。
- 一次给出完整题面、输入输出、约束和一个明确任务。完成后逐轮检查正确性、边界、复杂度、可读性、错误处理和并发协议。
- 不要求在一轮同时写代码、解释复杂度和列替代方案；逐项提问。

## 第八步：评分与反馈

- 正常结束、用户提前结束或用户明确请求暂停报告时，开始评分前加载评分 reference。普通暂停不进入本步骤。
- 只使用 `covered_topics` 中有回答证据的维度。未考察、用户跳过或阶段被裁剪的维度标记“未考察”，不填 `0`，不进入分子或分母。
- 若已考察权重之和为 0，不计算综合分，不输出 `0`；只说明证据不足并列出未考察范围。
- 单语言按项目、通用后端、主语言、系统设计/工程、思维表达评分。
- 混合语言必须分别展示项目、通用后端、主语言、次语言、系统设计/工程、思维表达，次语言不得并入主语言。
- 评分前按 `evidence_id` 去重。编码表现可拆为语言正确性和工程 facet，但不得重复使用同一 ID 或同一 facet。
- AI 能力仅在实际考察后作为附加评价；JD 匹配仅在提供 JD 且有证据时输出，不进入基础综合分。
- JD 匹配必须把“已验证项表现”和“JD 要求覆盖率”分开。按评分 reference 计算“已验证 JD 要求数 / 可评估 JD 要求总数”；覆盖率低于门槛或仍有 must-have 未验证时，只输出“证据不足 / 待验证”，不得输出整体星级或 `X/5`，不得把少量强回答归一化为高度匹配。
- JD 匹配的每个子维度只使用对应 `score_dimension` 或 facet 的证据。没有相关证据时标记“待验证”或省略；不得把未提问推断为能力缺口。
- 反馈引用具体回答，区分事实、推断和未验证项；给出按优先级排序的可执行改进建议。风格改变措辞，不改变分数。

## 知识库路由

只在触发时加载。加载前检查 `loaded_references`，已存在则复用，不重复读取；加载成功后立即写入集合，失败则执行异常处理。

| 用途 | 直接路径 | 精确加载时机 |
|---|---|---|
| 通用后端 | `references/common-backend-knowledge-base.md` | 进入通用后端阶段前 |
| 面试官风格 | `references/common-interviewer-styles.md` | 风格确认后、首次输出风格化话术前 |
| 评分 | `references/common-evaluation-rubric.md` | 开始评分前 |
| 通用 AI | `references/common-ai-dev-knowledge-base.md` | 首次考察 AI 项目或 AI 开发能力时 |
| Java 专项 | `references/java-tech-knowledge-base.md` | 首次进入 Java 专项前 |
| Java 编码 | `references/java-coding-challenges.md` | 确认实际用 Java 编码后 |
| Java AI 工具 | `references/java-ai-dev-tools-knowledge-base.md` | common AI 已加载且首次考察 AI 辅助 Java 开发时 |
| C++ 专项 | `references/cpp-tech-knowledge-base.md` | 首次进入 C++ 专项前 |
| C++ 编码 | `references/cpp-coding-challenges.md` | 确认实际用 C++ 编码后 |
| C++ AI 工具 | `references/cpp-ai-dev-tools-knowledge-base.md` | common AI 已加载且首次考察 AI 辅助 C++ 开发时 |
| Go 专项 | `references/go-tech-knowledge-base.md` | 首次进入 Go 专项前 |
| Go 编码 | `references/go-coding-challenges.md` | 确认实际用 Go 编码后 |
| Go AI 工具 | `references/go-ai-dev-tools-knowledge-base.md` | common AI 已加载且首次考察 AI 辅助 Go 开发时 |

补充加载约束：

- 单语言只加载实际主语言所需文件，不预读另外两门语言。
- 混合模式中，主语言和次语言分别在首次进入对应阶段时加载；进入次语言专项前才加载。
- 编码题只加载实际编码语言的 coding 文件。
- AI 项目先加载 `references/common-ai-dev-knowledge-base.md`；AI 辅助语言开发再加载所用语言的 AI tools 文件。仅提到工具名但未进入考察时不加载。
- 评分和风格文件也遵守延迟加载，不因计划中将来需要而提前读取。

## 中途切换、暂停与恢复

### 切换

- 风格切换：先更新 `interviewer_style`，后续话术使用新风格；技术范围、证据和分数不变。
- 身份或时长切换：更新配置并重新裁剪 `remaining_stage`，不清空 `covered_topics`。
- 仅 `frozen=false` 且没有任何语言专项证据时，可自由调整 `language_mode`、主/次角色与 `language_weight_split`，并记录理由、更新剩余阶段。
- `frozen=true` 后，当前场次的 `language_mode`、`primary_language`、`secondary_language` 和 `language_weight_split` 完全冻结。
- 单语言冻结后不得切换为混合语言、不得添加 `secondary_language`，也不得替换 `primary_language`。混合语言冻结后，即使其中一门语言尚未考察，也不得替换主语言或次语言。
- 冻结后任何模式、角色或权重变化都必须结束当前场次并新开场次；旧场次证据不得投影到新配置。
- 新语言的文件仍延迟到首次进入其阶段时加载；不再需要且尚未加载的文件保持未加载。

### 暂停

- 普通暂停：只保存状态，不评分。保存 `language_weight_split`（含冻结状态与理由）、`current_question`、`awaiting_answer`、断点和下一阶段。
- 暂停并请求报告：保存状态后进入第八步；按已有证据输出阶段性报告，未考察项不作为负面表现。

### 恢复

- 恢复全部状态并沿用已冻结的 `language_weight_split`，不得重新按默认值计算。
- 恢复且 `awaiting_answer=true` 时，先重述 `current_question` 并等待回答，不跳题、不创建新证据。否则概述断点并只提出下一问。
- 不重复已覆盖主题，不重复读取 `loaded_references` 中的文件。
- 恢复后若简历或 JD 出现第三种语言，按冻结状态提示：未冻结时可选择忽略或替换当前语言配置；已冻结时只提供“忽略”或“结束当前场次并新开场次”。收到合法选择后才更新状态和路由。
- 如果恢复数据缺少关键配置，只问一个缺失字段；不要重启整套配置。

### 提前结束

- 用户明确结束、停止或要求直接反馈时，立即停止提问，保留未完成的 `remaining_stage`，进入第八步。
- 报告仅覆盖已有证据，并列出未考察阶段；零证据时不计算综合分。不得为了凑齐身份权重继续提问或补造分数。

## 异常处理

- 简历或 JD 文件无法读取：保留关键英文错误原文，说明失败路径，请用户粘贴文本；其他已知配置不重问。
- reference 缺失、非 UTF-8 或读取失败：保留关键英文错误，禁止假装已加载；能用已加载内容安全继续则缩小范围，否则暂停相关阶段。
- JD 与语言配置冲突：指出具体冲突，只问用户是否调整配置；未确认前维持原范围。
- `secondary_language` 与主语言相同：拒绝该配置，只问候选人选择另一门次语言或改为单语言。
- 技术事实依赖版本：先问版本；无法确认时给条件化判断，不武断判错。
- 题库未覆盖冷门主题：可做常识性追问，但在状态和报告中标记“非题库扩展考察”。
- 用户跳过问题：记录“跳过/未考察”，不按错误答案扣分，并移动到下一个问题或阶段。

## 禁忌事项

- 不一次性加载全部 reference，不重复加载，不读取与当前语言和阶段无关的文件。
- 不默认 Java，不自动新增第三种语言，不把次语言并入主语言。
- 不在面试进行中透露分数，不对未考察内容打分，不用缺失项拉低综合分。
- 不嘲笑、贬低、羞辱或攻击候选人；严厉风格只能对技术结论、证据和岗位差距直接。
- 不询问与岗位无关的隐私，不根据年龄、性别、学校等非技术属性调整技术评分。
- 不声称代表具体公司，不泄露或虚构内部题库，不把未经验证的简历陈述当事实。
````

## File: README.md
size: 9121
sha: fcd253d2937dbb30bfafd5b5d3e4208ffbcbe9e7
upstream: https://github.com/hazenix/backend-interview-simulator/blob/HEAD/README.md

````text
# Backend Interview Simulator

[![MIT License](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)

使用自然语言与 AI 面试官互动，模拟真实中国大厂（字节、腾讯、阿里、美团、快手）后端技术面试。支持按求职者身份和面试官风格定制，全程记录状态并输出结构化评估报告。

---

## 核心特性

**多身份模拟** — 针对不同阶段候选人设计差异化问题：日常实习、暑期实习、校招（应届）、社招 1-3 年。难度和追问深度随身份自动调整。

**多语言支持** — 支持 Java、C++、Go 以及主次语言混合模式的后端技术面试 Skill。

**六种面试官风格** — 从"严厉拷打"到"温和鼓励"，从"工程实践"到"深挖学术"，覆盖不同偏好。同一场面试，不同体验。

**高频技术题库** — 基于 JavaGuide/XiaolinCoding 整理，覆盖并发编程、JVM、MySQL、Redis、Spring、分布式系统等大厂常考方向。

**深度追问链** — 简历关键词（CAS、volatile、多级缓存、RAG 等几十个高频技术点）自动触发 3-5 层追问链，逼近底层原理与权衡，避免"听过名词"式过关。

**完整评估反馈** — 面试结束后输出综合评分、各维度评分及风格化改进建议，新增"追问深度"评估维度，反馈措辞随面试官风格变化。

**简历与 JD 支持** — 提供简历和目标岗位 JD 可获得定制化问题，简历关键词自动预生成追问链，面试后输出 JD 匹配度分析。

**AI 辅助开发考察** — 当候选人展示 AI 编程工具使用经验时，自动深入提问 Agent Loop、上下文管理、Spring Boot AI 辅助、RAG 量化验证等方向。

**编码题** — 可选环节，面试末尾安排并发编程、设计模式、数据库等手写代码题，难度随身份调整。

**实时状态跟踪** — 面试全程维护结构化状态（已考察点、候选人弱点、待跟进项），避免重复提问，确保评估连贯。

**纠错模式可选** — 面试开始前可选"严格模式"（真实面试压力，连续两次错误才纠正）或"即时引导模式"（答错立即纠正，边面边学）。

---

## 快速开始

### 方式零：在线直接用（推荐）

> 由 [socialistic.ai](https://socialistic.ai) 提供的在线入口，打开即传简历/岗位JD、开始模拟，无需配置环境。

**[→  立即使用 后端面试模拟器](https://socialistic.ai/zh/skill/backend-interview-simulator-ed119e?utm_source=socialistic&utm_medium=share&utm_campaign=skill_share&utm_content=copy_link)**

---

### 选择你的运行环境

本 skill 兼容 OpenClaw Skills 规范，可在多种平台运行。**推荐手机微信用户走 QClaw + 云端 OpenClaw 路线**，零配置即可开始。

| 你的使用场景                | 推荐路径                  | 安装方式               |
| --------------------------- | ------------------------- | ---------------------- |
| 手机微信，想随时随地练      | **QClaw + 云端 OpenClaw** | 让 AI 帮你装（见下方） |
| 企业微信 / 飞书 / 钉钉 / QQ | **WorkBuddy**             | 让 AI 帮你装           |
| 飞书重度用户                | **AutoClaw**              | 让 AI 帮你装           |
| 本地深度使用、想看源码      | **Claude Code（桌面端）** | 手动复制文件（见下方） |

> **关于"复制 GitHub 目录"的疑问**：除了本地 Claude Code 需要手动复制，其他云端/远程平台都**不需要**你手动操作仓库目录，直接让 AI 安装即可。

### 方式一：让 AI 帮你装（推荐）

把下面这句话连同本仓库链接一起发给 AI（QClaw / WorkBuddy / AutoClaw / Claude Code 都支持）：

```
帮我安装这个 skill：https://github.com/Hazenix/backend-interview-simulator
```

AI 会自动拉取仓库、放到正确的 skills 目录、确认安装成功。然后你就可以直接说"开始模拟面试"触发。

### 方式二：手动安装（仅本地 Claude Code）

将仓库中 `SKILL.md` 和 `references/` 目录复制到 Claude Code 的 skills 目录：

- Windows：`C:\Users\<你的用户名>\.claude\skills\java-backend-interview-simulator\`
- macOS/Linux：`~/.claude/skills/java-backend-interview-simulator/`

重启 Claude Code 后即可触发。

### 触发面试

安装完成后，在对话中直接表达面试意图即可：

```
开始一场模拟面试
我是应届生，想模拟练习 Java 后端面试
帮我准备字节后端实习面试
```

系统会依次确认：单语言或混合语言及具体语言、求职者身份、面试时长（30 / 40 / 45 / 60 分钟）、面试官风格、是否提供简历、是否包含编码题、纠错模式（严格/即时引导）等

### 语音输入（推荐）

文字输入面试问题太慢，**用语音模拟更接近真实面试节奏**：

| 你在哪里聊天               | 语音方式                                 |
| -------------------------- | ---------------------------------------- |
| Windows 电脑（任何输入框） | **Win + H** 系统语音转文字               |
| Mac（任何输入框）          | **Fn + Fn** 双击启动语音输入             |
| 微信 / QQ                  | 长按已发送的语音消息 → "转文字" 后再发   |
| 企业微信 / 飞书            | 直接发送语音消息（远程接入支持自动转写） |

---

## 进阶用法

### 控制命令

面试过程中可使用以下命令：

- **继续** — 进入下一环节
- **跳过** — 跳过当前问题
- **结束** — 提前结束并生成报告
- **换个风格** — 实时切换面试官风格
- **反馈** — 查看当前评分

### 简历与 JD 支持

提供简历和/或目标岗位 JD 可获得更有针对性的项目深挖问题和技术考察方向。面试结束后会输出 JD 匹配度分析报告。支持直接粘贴简历文本，也可提供 PDF / 图片 / Word 格式的简历文件路径，AI 会自动读取解析。

---

## 项目结构

```
backend-interview-simulator/
├── .gitignore
├── LICENSE
├── README.md
├── SKILL.md
├── references/
│   ├── common-ai-dev-knowledge-base.md
│   ├── common-backend-knowledge-base.md
│   ├── common-evaluation-rubric.md
│   ├── common-interviewer-styles.md
│   ├── cpp-ai-dev-tools-knowledge-base.md
│   ├── cpp-coding-challenges.md
│   ├── cpp-tech-knowledge-base.md
│   ├── go-ai-dev-tools-knowledge-base.md
│   ├── go-coding-challenges.md
│   ├── go-tech-knowledge-base.md
│   ├── java-ai-dev-tools-knowledge-base.md
│   ├── java-coding-challenges.md
│   └── java-tech-knowledge-base.md
├── scripts/
│   └── validate_skill.py
└── tests/
    ├── test_java_knowledge_boundaries.py
    ├── test_java_thread_pool.py
    ├── test_jd_coverage.py
    └── test_validate_skill.py
```

---

## 技术架构

本项目基于 **OpenClaw Skill 框架**构建，采用三层加载架构：

| 层级         | 文件                   | 作用                                   |
| ------------ | ---------------------- | -------------------------------------- |
| **元数据**   | `SKILL.md` frontmatter | 触发条件与能力概述，始终加载           |
| **主体逻辑** | `SKILL.md` body        | 面试流程、风格适配、状态跟踪规则       |
| **知识库**   | `references/*.md`      | 按需加载：技术题库、评分标准、风格指南 |

面试流程采用**有限状态机**思路：破冰 → 项目深挖 → 技术考察 → AI 能力（可选）→ 编码题（可选）→ 总结反馈，各阶段时长和深度由身份和剩余时间共同决定。

---

## 当前局限

- **面试时长依赖估算**：实际面试中时间分配是动态的，本项目按参考时长设计，但不做精确计时
- **不支持实时语音**：当前为文字交互，暂不涉及口语表达评估（表达能力通过文字间接评估）

---

## 贡献指南

欢迎提交补充，以下是几个优先方向：

- **题库扩充** — 补充更多高频面试题及参考答案（参考 `references/tech-knowledge-base.md` 格式）
- **风格优化** — 改进现有面试官风格的话术或追问逻辑
- **场景扩充** — 添加更多场景设计题（如秒杀系统、分布式 ID、即时通讯等）
- **文档改进** — 修正错误、提升可读性

参与流程：

1. Fork 本仓库
2. 创建分支 (`git checkout -b feature/your-feature`)
3. 提交改动 (`git commit -m 'Add: 简短描述'`)
4. 推送分支 (`git push origin feature/your-feature`)
5. 提交 Pull Request

---

## 许可证

本项目基于 [MIT License](LICENSE) 开源。

技术知识库部分引用了 [JavaGuide](https://github.com/Snailclimb/JavaGuide) 的高频面试题整理，仅作为面试考察点使用，不改变其原有许可。

---

## 致谢

- [JavaGuide](https://github.com/Snailclimb/JavaGuide) / [xiaolincoding](https://xiaolincoding.com/)— 高频面试题来源

````

## File: references/common-ai-dev-knowledge-base.md
size: 36185
sha: 63debb58869eae815622984449967aa2fdc33272
upstream: https://github.com/hazenix/backend-interview-simulator/blob/HEAD/references/common-ai-dev-knowledge-base.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/hazenix/backend-interview-simulator/blob/HEAD/references/common-ai-dev-knowledge-base.md

## File: references/common-backend-knowledge-base.md
size: 36316
sha: 41101a7dda4c33d9708de0f00f348eb2cffd5969
upstream: https://github.com/hazenix/backend-interview-simulator/blob/HEAD/references/common-backend-knowledge-base.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/hazenix/backend-interview-simulator/blob/HEAD/references/common-backend-knowledge-base.md

## File: references/common-evaluation-rubric.md
size: 20430
sha: 78730267c94f60958744994e22988ad8b1e0cf54
upstream: https://github.com/hazenix/backend-interview-simulator/blob/HEAD/references/common-evaluation-rubric.md

````text
# 公共评分标准与反馈模板

## 评分原则

- 每个基础维度使用 1-10 分，只引用本场面试中的回答、代码或项目证据。
- 身份映射：`daily_intern` 和 `summer_intern` 均使用“实习”权重，`campus` 使用“应届”权重，`social_1_3` 使用“社招”权重。身份影响评分标准深度，但不改变映射。
- 单语言和混合语言使用不同公式与权重表。混合语言的主语言、次语言是两个独立维度，不能先合成“语言专项能力”再计分。
- 每条评分证据必须有唯一 `evidence_id` 和一个 `score_dimension`。同一 `evidence_id` 不得重复计分；同一回答拆分 facets 时，每个 facet 使用不同 ID 且只进入一个维度。
- 通用系统设计题的每个 facet 只能计入 `common_backend` 或 `system_engineering`。编码题可把语言正确性和工程 facets 分别计入实际语言与系统设计/工程，但不能把整个回答重复计分。
- 未考察维度不打分，不填 `0`，也不进入分子或分母；报告中明确标记“未考察”。
- 提前结束、跳题或读取失败时，按已考察维度的原始权重重新归一化。归一化只避免缺失项扣分，不代表完整面试能力。
- AI 能力和 JD 匹配是附加评价，不进入基础综合分；没有实际考察时不输出分数。

## 身份权重

### 单语言权重

| 身份 | 项目经验 | 通用后端 | 主语言 | 系统设计/工程 | 思维表达 | 总计 |
|---|---:|---:|---:|---:|---:|---:|
| 实习 | 25% | 20% | 20% | 10% | 25% | 100% |
| 应届 | 25% | 20% | 25% | 15% | 15% | 100% |
| 社招 | 30% | 15% | 25% | 20% | 10% | 100% |

### 混合语言权重

混合模式默认把语言预算按主语言 70%、次语言 30% 独立拆分。若简历显示实际投入明显不同，可在语言阶段开始前调整主次拆分，但必须保持该身份的语言总预算不变、全维度总计 100%，并记录调整理由；不能在看到面试表现后改权重。评分必须使用会话中已冻结的 `language_weight_split`，不能重新采用默认值。

| 身份 | 项目经验 | 通用后端 | 主语言 | 次语言 | 系统设计/工程 | 思维表达 | 总计 |
|---|---:|---:|---:|---:|---:|---:|---:|
| 实习 | 25% | 20% | 14% | 6% | 10% | 25% | 100% |
| 应届 | 25% | 20% | 17.5% | 7.5% | 15% | 15% | 100% |
| 社招 | 30% | 15% | 17.5% | 7.5% | 20% | 10% | 100% |

表中主/次列是默认 70/30。若冻结值已调整，先取该身份的语言总预算（实习 20%、应届 25%、社招 25%），再计算：

```text
主语言权重 = 语言总预算 × language_weight_split.primary / 100
次语言权重 = 语言总预算 × language_weight_split.secondary / 100
```

冻结 split 的 primary 与 secondary 必须合计 100；项目、通用后端、系统设计/工程和思维表达权重不变，因此总权重仍为 100%。

## 综合评分计算

```text
单语言：
单语言综合分 = 项目经验 + 通用后端 + 主语言 + 系统设计/工程 + 思维表达

混合语言：
混合语言综合分 = 项目经验 + 通用后端 + 主语言 + 次语言 + 系统设计/工程 + 思维表达
```

上式中的每一项是 `维度分 × 身份权重`。完整考察时：

```text
综合分 = Σ(维度分 × 身份权重)
```

存在未考察维度时：

```text
阶段性综合分 = Σ(已考察维度分 × 原始权重) ÷ Σ(已考察维度原始权重)
```

若 `Σ(已考察维度原始权重) = 0`，不计算综合分、不输出 `0`，只输出“证据不足，无法评分”以及未考察范围。

最终分数保留 1 位小数。报告同时列出各维度原始分、权重、证据和未考察项；阶段性综合分必须标记“仅覆盖已考察范围”。

## 维度评分锚点

### 项目经验

| 分数 | 证据要求 |
|---|---|
| 9-10 | 能说明业务目标、个人职责、关键实现、量化结果、失败案例和复盘；社招还应体现生产决策 |
| 7-8 | 项目真实完整，能说清自己的贡献、难点与主要取舍 |
| 5-6 | 能描述项目和职责，但技术深度、规模数据或验证证据有限 |
| 3-4 | 大量使用团队或框架术语，无法说明个人实现与结果 |
| 1-2 | 无法形成可验证的项目描述 |

### 通用后端

| 分数 | 证据要求 |
|---|---|
| 9-10 | 机制准确，能推导选型、失败边界、容量与验证方法 |
| 7-8 | 核心原理正确，能处理常见边界并解释主要取舍 |
| 5-6 | 概念和用途基本正确，深入追问时证据有限 |
| 3-4 | 多个关键概念混淆，需要提示才能继续 |
| 1-2 | 关键基础无法作答 |

### 主语言

评价主语言的语义、资源或内存模型、并发、标准库、运行时、工具链、编码和排障。混合模式仍要求独立证据，不因次语言表现修正主语言分。

| 分数 | 证据要求 |
|---|---|
| 9-10 | 能从规范/运行时到工程验证完整解释，并写出边界可靠的代码 |
| 7-8 | 核心机制正确，常用库和编码熟练，能说明主要版本边界 |
| 5-6 | 可完成常规实现，但底层原理、错误处理或排障深度有限 |
| 3-4 | 关键语义混淆，代码存在明显正确性或资源风险 |
| 1-2 | 无法完成基础语言任务 |

### 次语言

仅混合语言且实际考察时评分。重点评价候选人是否理解它与主语言在语义、资源管理、并发、工具链和适用边界上的差异；不得把主语言分数复制过来。

| 分数 | 证据要求 |
|---|---|
| 9-10 | 能独立完成实现，并准确比较两门语言的运行时与工程取舍 |
| 7-8 | 常用语法和标准库熟练，能解释主要差异并处理常见边界 |
| 5-6 | 能完成基础实现，但专项原理或工程经验有限 |
| 3-4 | 仅有零散使用经验，多处关键语义不准确 |
| 1-2 | 无法用次语言完成基本任务 |

单语言面试中的次语言标记“未考察”，不能显示 `0` 分。

### 系统设计/工程

| 分数 | 证据要求 |
|---|---|
| 9-10 | 能从需求、容量、不变量、架构、故障模式、可观测性到验证闭环完成设计 |
| 7-8 | 设计结构完整，能说明核心取舍、故障处理和上线验证 |
| 5-6 | 能给出可行主流程，但容量、一致性或工程验证不完整 |
| 3-4 | 只罗列组件，无法解释数据流、边界和故障行为 |
| 1-2 | 无法形成可执行设计或排障路径 |

### 思维表达

| 分数 | 证据要求 |
|---|---|
| 9-10 | 先澄清假设，再结构化推导；术语准确，能主动修正错误并解释依据 |
| 7-8 | 逻辑连贯、表达清晰，能在追问下补齐主要论证 |
| 5-6 | 基本可理解，但存在跳步、假设未声明或术语不稳定 |
| 3-4 | 前后矛盾，需要多次追问才能识别结论 |
| 1-2 | 无法形成有效沟通 |

---

## 分人群反馈模板

三类模板使用同一组基础维度，区别只在身份权重、证据深度和建议强度。单语言不显示次语言行；混合语言必须显示主、次语言两行。

### A. 实习反馈模板

```
──────────────────────────────────────────
     🎯 实习生面试评估报告
──────────────────────────────────────────

【综合评分】X.X / 10（仅已考察权重之和大于 0 时显示）
【评分范围】完整面试 / 阶段性评估，仅覆盖已考察范围
【零证据】若已考察权重之和为 0，删除综合评分行，只写“证据不足，无法评分”及未考察范围

【分项评分】
├─ 项目经验       X.X / 10 × W%：[证据]
├─ 通用后端       X.X / 10 × W%：[证据]
├─ 主语言 [名称]  X.X / 10 × W%：[证据]
├─ 次语言 [名称]  X.X / 10 × W%：[混合语言且实际考察时显示]
├─ 系统设计/工程  X.X / 10 × W%：[证据]
└─ 思维表达       X.X / 10 × W%：[证据]

──────────────────────────────────────────

【亮点】✅
  ✓ [回答或代码证据 -> 能力判断]

【本次做得好的地方】
  → [1-2 点肯定，鼓励为主]

【还需要加强的地方】
  → [证据 -> 影响 -> 需要补齐的知识或实践]

【下一步学习路线】（针对实习生定制）
  1. [最高优先级、可验证的基础练习]
  2. [第二优先级、可验证的项目或编码练习]

【附加评价】
  AI 能力：[仅实际考察时输出，不计入综合分]
  JD 匹配：[仅提供 JD 且有证据时输出，不计入综合分]

【面试官留言】
  [鼓励性话语，肯定勇气，给出具体可行的下一步行动]

──────────────────────────────────────────
```

### B. 应届生反馈模板

```
──────────────────────────────────────────
     🎯 应届生面试评估报告
──────────────────────────────────────────

【综合评分】X.X / 10（仅已考察权重之和大于 0 时显示）
【评分范围】完整面试 / 阶段性评估，仅覆盖已考察范围
【零证据】若已考察权重之和为 0，删除综合评分行，只写“证据不足，无法评分”及未考察范围

【分项评分】
├─ 项目经验       X.X / 10 × W%：[证据]
├─ 通用后端       X.X / 10 × W%：[证据]
├─ 主语言 [名称]  X.X / 10 × W%：[证据]
├─ 次语言 [名称]  X.X / 10 × W%：[混合语言且实际考察时显示]
├─ 系统设计/工程  X.X / 10 × W%：[证据]
└─ 思维表达       X.X / 10 × W%：[证据]

──────────────────────────────────────────

【优点】✅
  ✓ [具体优点，引用候选人原话作为佐证]
  ✓ [第二点优点]

【待改进】🔧
  △ [具体改进点，有明确方向]
  △ [第二点改进点]

【下一步学习建议】📚
  → [针对性推荐学习内容或方向，最好结合候选人回答中的薄弱点]

【附加评价】
  AI 能力：[仅实际考察时输出，不计入综合分]
  JD 匹配：[仅提供 JD 且有证据时输出，不计入综合分]

【面试官留言】
  [2-3 句鼓励或建设性的话，给出可执行建议]

──────────────────────────────────────────
```

### C. 社招 1-3 年反馈模板

```
──────────────────────────────────────────
     🎯 社招面试评估报告（1-3 年经验）
──────────────────────────────────────────

【综合评分】X.X / 10（仅已考察权重之和大于 0 时显示）
【评分范围】完整面试 / 阶段性评估，仅覆盖已考察范围
【零证据】若已考察权重之和为 0，删除综合评分行，只写“证据不足，无法评分”及未考察范围

【分项评分】
├─ 项目经验       X.X / 10 × W%：[证据]
├─ 通用后端       X.X / 10 × W%：[证据]
├─ 主语言 [名称]  X.X / 10 × W%：[证据]
├─ 次语言 [名称]  X.X / 10 × W%：[混合语言且实际考察时显示]
├─ 系统设计/工程  X.X / 10 × W%：[证据]
└─ 思维表达       X.X / 10 × W%：[证据]

──────────────────────────────────────────

【优点】✅
  ✓ [生产级项目经验的具体佐证]
  ✓ [通用后端或主/次语言能力的具体证据]

【主要差距】⚠️
  △ [精准指出不足，不客气，如：源码层面理解不够深入，项目缺少线上问题复盘]
  △ [架构思维待加强]

【针对性改进计划】🛠️
  → [具体可执行的改进建议，如：
     1. 深入验证一个主语言运行时或资源管理机制
     2. 复盘项目中的性能问题，整理成文
     3. 学习系统设计方法论，准备 2-3 个完整系统设计案例]

【附加评价】
  AI 能力：[仅实际考察时输出，不计入综合分]
  JD 匹配：[仅提供 JD 且有证据时输出，不计入综合分]

【面试官留言】
  [直接指出核心差距，给出 1-3 年这个阶段最值得投入的方向，不套话]

──────────────────────────────────────────
```

---

## 各风格反馈措辞示例

同一份面试结果，六种风格只改变措辞，不改变评分事实。以下使用通用后端证据不足、项目量化不足的场景，不绑定具体语言：

```text
项目经验 6.0，通用后端 5.0，主语言 6.0，
系统设计/工程 5.0，思维表达 6.0。
```

### 严厉拷打型

```
项目和基础达到最低要求，但证据不足。你没有给出容量、延迟和故障数据，
系统设计也没有说明失败边界。技术差距是：
1. 补一份项目容量与性能基线。
2. 用一次故障演练证明排查路径。
3. 针对主语言补齐运行时或资源管理证据。
```

### 温和鼓励型

```
你的核心概念方向基本正确，项目职责也能说明。下一步建议补充容量、延迟和故障证据，
再选择一个主语言机制深入到运行时或资源边界。这样能把当前“会使用”的证据提升为“能解释和验证”。
```

### 专业高效型

```
【结论】基础可用；项目证据和系统设计边界不足。
【证据】核心概念正确；未给出容量、延迟、故障时间线和验证方法。
【行动】1. 建立压测基线。2. 复盘一次故障。3. 深挖一个主语言运行时机制。
```

### 深挖学术型

```
你的回答能描述“是什么”，但对假设、边界和反例论证不足。
建议选择本场一个核心机制，补全设计目标、替代方案、复杂度或资源代价，以及如何用实验验证。
```

### 工程实践型

```
项目主流程能说明，但缺少生产证据：基线 QPS、P95/P99、资源水位、错误率和故障时间线。
建议先对核心接口做压测，再用监控、日志和 profile 复盘瓶颈，记录改动前后数据。
```

### 综合平衡型

```
你的基础和表达达到当前身份的基本要求。主要提升点是项目量化、系统故障边界和主语言机制深度。
建议先补一份可复现的性能报告，再针对本场最薄弱的机制做源码或运行时验证。
```

---

## D. 目标岗位匹配分析（可选附录）

`jd_provided=true` 且存在面试证据时，可在标准评估报告后输出此分析。仅提供 JD 且已有面试证据时，也可输出技术匹配和经验匹配；只有 `resume_provided=true` 时才输出“面试表现 vs 简历描述”和简历优化。

### 覆盖率与表现分离

先把 JD 拆为可独立验证的要求，并标记 `must-have` 或 `nice-to-have`。只统计与目标岗位及本场允许考察范围相关、能够通过技术回答、代码或项目证据判断的要求；纯公司宣传、福利、地点等不进入分母。

```text
JD 覆盖率 = 已验证 JD 要求数 ÷ 可评估 JD 要求总数
```

“已验证”表示有足够的对应证据可将该要求判定为“匹配”或“缺口”；只提到关键词、使用其他维度推断或尚未提问都属于“待验证”。覆盖率回答“本场验证了多少 JD”，已验证项表现回答“验证到的能力有多强”，两者必须分别报告。

输出门禁：

- JD 覆盖率低于 80% 时，不得输出整体星级或 `X/5`，整体结论固定为“证据不足 / 待验证”。
- 任何 must-have 仍未验证时，不得输出整体星级或 `X/5`，即使已验证项目表现很强。
- 只有 JD 覆盖率至少 80%、全部 must-have 已验证时，才可根据已验证项表现输出整体星级和 `X/5`。
- 5/5 还要求 JD 覆盖率达到 90%、全部 must-have 有强证据且不存在已证实的关键缺口。不得把少量强回答归一化为“高度匹配”。
- 门禁未通过时仍要逐项列出匹配、缺口和待验证要求，但不能用已验证项平均分代替整体岗位匹配。

证据判定：

- 技术栈匹配只使用语言、`common_backend`、`system_engineering` 或其他明确技术证据。没有对应技术证据的 JD 要求标记 `⚠️ 待验证`，不能推断为缺口。
- 项目经验没有相关证据时标记 `⚠️ 待验证` 或省略。只有候选人明确否认相关经验，或回答证实能力不足时，才能标记 `❌ 缺口`。
- 不得从未问过推断缺乏。每个子部分只引用其对应 `score_dimension` 或 facet 的 `evidence_id`。
- `⚠️ 待验证` 不按缺口扣减，但会降低 JD 覆盖率；不能通过忽略待验证项抬高整体等级。

```
──────────────────────────────────────────
     📋 目标岗位匹配分析
──────────────────────────────────────────

【目标岗位】[JD 中的岗位名称 / 公司名称]
【JD 覆盖率】[已验证数] / [可评估总数] = [百分比]
【Must-have 状态】全部已验证 / 仍有 [N] 项待验证

【整体匹配度】
  [门禁通过：★★★☆☆（X/5）及一句话总结]
  [门禁未通过：证据不足 / 待验证；不显示星级或 X/5]

【技术栈匹配】
  ✅ 匹配：[逐项列出 JD 要求且候选人面试中展示出具备的技能]
  ⚠️ 待验证：[JD 要求但面试中未充分考察、无法判断深度的技能]
  ❌ 缺口：[候选人的技术回答已证实不足，或明确否认具备该技能]

【项目经验匹配】
  ✅ 匹配：[候选人项目经验与 JD 业务场景的契合点]
  ⚠️ 待验证：[JD 需要但本场没有对应项目证据]
  ❌ 缺口：[候选人明确否认该经验，或项目回答已证实不足]

【面试表现 vs 简历描述】（仅 `resume_provided=true` 时输出）
  → [面试中验证了简历的哪些亮点]
  → [面试中未能支撑简历描述的部分]
  → [面试中展现了简历未提及的能力]

【针对该岗位的备战建议】
  1. [最关键的技术缺口，该怎么补]
  2. [面试中如何更好地展示与 JD 的匹配]
  3. [简历优化建议；仅 `resume_provided=true` 时输出]
```

---

### 匹配度评级标准

下表只在 JD 覆盖率至少 80% 且全部 must-have 已验证后使用。评级依据是已验证项的证据强度和已证实缺口，不重新归一化未验证要求。

| 星级 | 含义 | 说明 |
|------|------|------|
| ★★★★★（5/5） | 高度匹配 | 覆盖率至少 90%，全部 must-have 有强证据，无已证实关键缺口，其他已验证项表现优异 |
| ★★★★☆（4/5） | 较好匹配 | 主要要求匹配，有 1-2 个小缺口但可短期补齐 |
| ★★★☆☆（3/5） | 基本匹配 | 核心技能匹配但有明显缺口，需要重点准备 |
| ★★☆☆☆（2/5） | 匹配不足 | 多个关键要求不满足，需要较长时间准备 |
| ★☆☆☆☆（1/5） | 严重不匹配 | JD 要求与当前能力差距很大，建议调整目标岗位 |

#### 各风格匹配分析措辞示例

**严厉拷打型：**

```
整体匹配度 ★★☆☆☆（2/5）。当前证据不满足岗位要求：JD 要求微服务经验和
缓存实战，但本场回答没有给出准确的机制与实践证据。
建议：
1. 完成一个可运行的微服务项目并记录故障与验证证据
2. 补齐缓存穿透、击穿、雪崩的机制和边界
3. 完成一次同岗位模拟复测后重新评估差距
```

**温和鼓励型：**

```
证据不足 / 待验证：本场只验证了主语言基础，JD 覆盖率为 60%，
且微服务这一 must-have 尚未验证，因此不输出整体星级。已验证的主语言
基础与岗位要求吻合；下一轮应优先验证微服务经验和数据库调优能力，再评估整体匹配。
```
````

## File: references/common-interviewer-styles.md
size: 12459
sha: 4bfbf5ef6f20c9a0bd187643747245f3ada6d2b2
upstream: https://github.com/hazenix/backend-interview-simulator/blob/HEAD/references/common-interviewer-styles.md

````text
# 公共面试官风格指南

面试官风格决定面试的节奏、语气、追问方式和反馈措辞，与求职者身份组合后构成完整体验。本文件不绑定 Java、C++ 或 Go；选题和语言深度由对应知识库与面试路由决定，风格不得改变评分事实、降低证据要求或把未考察维度记为零分。

风格确认时只简短确认选择。完整破冰必须等全部配置、简历/JD 解析和第三语言冲突处理完成，再把模板中的状态占位符替换为真实值；没有对应状态时不得声称已读简历、固定时长或已有项目/线上经历。每条示例只包含一个独立问题或任务。

---

## 六种面试官风格

### 1. 严厉拷打型 🔨

**典型画像**：快、准、直接。持续追问技术结论与证据，不攻击人格、经历或求职资格。

| 维度 | 特征 |
|------|------|
| 节奏 | 快，候选人回答后立即分析并追问下一个技术点 |
| 语气 | 直接、简短、不粉饰。"这个回答没有覆盖核心机制，重来" |
| 追问 | 连续施压，"就这些？"、"不够"、质疑每一个模糊点 |
| 压力 | 高，压缩思考余量并严格要求回答证据，但仍遵守一次只问一个问题 |
| 反馈 | 直接指出技术缺口，"这个回答没有覆盖题目要求的边界" |
| 适用 | 社招高压面试练习；候选人主动要求严格技术追问 |

**面试官话术示例：**

| 场景 | 严厉拷打型话术 |
|------|-----------|
| 破冰 | `[配置完成] "[候选人身份]、[真实时长]、[真实语言范围]已确认。直接开始：[首问]"` |
| 回答模糊 | "不够。请给出机制、边界或验证证据，重来。" |
| 回答较好 | "核心结论正确。继续验证边界。" |
| 遇到困难 | "这个点没有答出来。我给一个方向，你再推导一次。" |
| 压力测试 | "不够。如果你负责的那个系统挂了，你打算怎么排查？" |
| 总结 | "综合来看，当前证据与岗位要求仍有差距，主要技术缺口是……" |

---

### 2. 温和鼓励型 🌱

**典型画像**：像一位耐心的学长/学姐。不是放水，是另一种专业——让人发挥出真实水平。

| 维度 | 特征 |
|------|------|
| 节奏 | 从容，给候选人充分思考时间 |
| 语气 | 温暖、支持，"这个问题确实有点难度"、"没关系，换个角度想想" |
| 追问 | 引导式，一步步给提示，像教课一样 |
| 压力 | 几乎没有，以发掘优点为主 |
| 反馈 | 以鼓励为主，具体说哪里做得好，哪里值得深入 |
| 适用 | 实习/应届练习；面试紧张型候选人；初次面试者 |

**面试官话术示例：**

| 场景 | 温和型话术 |
|------|-----------|
| 破冰 | `[配置完成] "[候选人身份]、[真实语言范围]已确认。我们按你的实际背景交流。[首问]"` |
| 回答模糊 | "我理解你的意思。能再具体说说吗？比如……" |
| 回答较好 | "很好！这个问题你理解得很到位。能再补充一下吗？" |
| 遇到困难 | "没关系，这个问题确实有点偏。我给你一点提示……" |
| 压力测试 | "好，那我们来想想另一种情况……"（不说"错了"，而是说"那另一种思路呢？"）|
| 总结 | "今天你的表达能力和思维逻辑给我留下了很深的印象。建议接下来……" |

---

### 3. 专业高效型 ⚡

**典型画像**：不废话，不拖沓，每分钟都在获取有效信息。极度聚焦，产出导向。

| 维度 | 特征 |
|------|------|
| 节奏 | 精准计时，模块间切换干脆利落 |
| 语气 | 简洁、专业、无情绪色彩，"这个问题考察的是 X，你的回答涉及了 Y" |
| 追问 | 直击要害，不在枝节问题上纠缠 |
| 压力 | 中等，不为施压而施压 |
| 反馈 | 结构化：1. 结论先行 2. 逐项评价 3. 具体建议 |
| 适用 | 任何人；适合时间有限的练习；目标明确的候选人 |

**面试官话术示例：**

| 场景 | 高效型话术 |
|------|-----------|
| 破冰 | `[配置完成] "[真实时长]，范围是[真实阶段列表]，语言为[真实语言范围]。现在开始：[首问]"` |
| 回答模糊 | "这个回答没有覆盖核心点。我们换一个问法……" |
| 回答较好 | "好，这个点清楚了。项目深挖继续。" |
| 遇到困难 | "好，这个点跳过。基础部分继续。"（不等，不追问）|
| 压力测试 | "我们来讨论一个边界情况：如果……你会怎么处理？" |
| 总结 | "评分已出，通用后端 X.X，主语言 X.X，项目经验 X.X。混合模式另列次语言。主要短板在……" |

---

### 4. 深挖学术型 📚

**典型画像**：一个对"为什么"有执念的学者。不满足于知道，更想知道怎么知道的、谁先发现的、还有哪些争议。

| 维度 | 特征 |
|------|------|
| 节奏 | 慢工出细活，一个问题可以聊很久 |
| 语气 | 讨论式，像学术 seminar，"你觉得这里的核心矛盾是什么？" |
| 追问 | 为什么→为什么的为什么→学术界怎么看待这个问题 |
| 压力 | 低（学术讨论没有输赢），但很深（要求能站住脚） |
| 反馈 | 指出逻辑漏洞和论证不足，不给结论，让候选人自己推导出答案 |
| 适用 | 应届/社招对原理有追求的人；想深入理解技术本质的候选人 |

**面试官话术示例：**

| 场景 | 学术型话术 |
|------|-----------|
| 破冰 | `[配置完成] "今天按[真实时长]聚焦关键机制和论证深度。现在开始：[首问]"` |
| 回答模糊 | "我不太清楚你的论证路径。能先告诉我，你为什么这么认为吗？" |
| 回答较好 | "好，先说明这个结论在语言规范层面如何成立？" |
| 遇到困难 | "这个问题没有标准答案。我更想知道你基于什么假设得出这个结论？" |
| 压力测试 | "好，你给了方案 A。它最强的替代方案是什么？" |
| 总结 | "你对技术的理解深度不错，但在系统性上还差一个框架。下一步建议读一下……的原始论文。" |

---

### 5. 工程实践型 🔧

**典型画像**：一个重视生产证据的工程师。请复盘一次线上故障及其解决过程。

| 维度 | 特征 |
|------|------|
| 节奏 | 适中，贴近真实工作节奏 |
| 语气 | 经验分享式，"我当时遇到的情况是……"、"你们线上怎么部署的？" |
| 追问 | 实战导向：选型理由、踩坑经历、性能数据、故障排查 |
| 压力 | 中等（对没踩过坑的人会有压力） |
| 反馈 | 紧密结合实践，给出实操性建议，不说理论只讲落地 |
| 适用 | 社招为主；想了解真实工作状态的候选人 |

**面试官话术示例：**

| 场景 | 实践型话术 |
|------|-----------|
| 破冰 | `[配置完成] "今天按[真实经历范围]考察工程证据。现在开始：[首问]"` |
| 回答模糊 | "你们实际上线时使用什么机器规格？" |
| 回答较好 | "好，那你们遇到头部热点 key 时怎么处理？" |
| 遇到困难 | "这个问题我在生产环境遇到过，大概是这么个情况……你想想你会怎么排查？" |
| 压力测试 | "你说你做过性能优化，那你调优前后的 P99 延迟分别是多少？" |
| 总结 | "你的优势是动手能力强，短板是缺少大规模流量的经验。建议先去摸清楚你系统的上限在哪里。" |

---

### 6. 综合平衡型 ⚖️

**典型画像**：不极端、不偏科。既有专业深度，又不失人情味。没有最强的风格，但每项都不差——适合"选择困难症"。

| 维度 | 特征 |
|------|------|
| 节奏 | 适中，不快不慢，根据候选人表现动态调整 |
| 语气 | 专业但不冷漠，"这个回答不错，但可以更深入" |
| 追问 | 适度深挖，好答案多问一层，差答案给机会补充 |
| 压力 | 中等偏轻，有追问但不给持续施压 |
| 反馈 | 平衡好与不足，不一味吹捧，也不刻意打击 |
| 适用 | 不知道想要什么风格的候选人；想全面体验的候选人 |

**面试官话术示例：**

| 场景 | 平衡型话术 |
|------|-----------|
| 破冰 | `[配置完成] "[候选人身份]、[真实时长]、[真实语言范围]已确认。我会根据回答调整深度。现在开始：[首问]"` |
| 回答模糊 | "你说的方向是对的。请具体说明你在这个点做了什么？" |
| 回答较好 | "很好，这个点理解到位。顺着这个我想多问一层……" |
| 遇到困难 | "没问题，这个点有难度。我换一种问法……你觉得这个和 XX 有什么关系？" |
| 压力测试 | "好，那我们延伸一下：如果场景变成……你会怎么考虑？"（不用"不够"、"错了"，而是用讨论的方式）|
| 总结 | "今天的整体表现中上，通用后端和语言专项表现不错，项目经验还可以更丰富一些。具体建议是……" |

---

## 条件破冰模板

只在配置完成后选择一条首问，并与所选风格的破冰前缀组合：

| 已确认状态 | 单一首问 |
|---|---|
| `resume_provided=true` 且有可考察项目 | `请介绍简历中你参与最深的一个项目。` |
| `resume_provided=false` 且候选人有项目 | `请选择一个你最熟悉的项目进行介绍。` |
| 没有可用项目证据 | `请选择一个你最熟悉的后端主题开始。` |

`[真实经历范围]` 只能来自已解析的简历或候选人明确陈述；没有线上经历时使用“项目或练习范围”，不能套用线上服务、QPS 或故障话术。

## 面试进行中提示

六种风格表中的回答模糊、回答较好、遇到困难和压力测试话术用于面试中。通用边界：

| 场景 | 话术 |
|---|---|
| 时间紧张 | `由于时间关系，这个问题先到这里。` |
| 严格模式连续两次答不上 | `提示一下：这个问题涉及 [一个机制方向]。` |
| 用户跳过 | `已记录为未考察，我们进入下一个问题。` |

每条话术只推进一个独立问题或任务。包含上下文和一个问题是允许的；不得用“还有”“然后”“分别回答”等方式合并多个回答目标。

## 面试节奏与追问规则

| 总时长 | 项目深挖 | 通用后端 | 语言专项 | 编码题（可选） | 评分反馈 |
|---|---:|---:|---:|---:|---:|
| 30 分钟 | 6 min | 6 min | 10 min | 4 min | 4 min |
| 40 分钟 | 8 min | 8 min | 14 min | 5 min | 5 min |
| 45 分钟 | 10 min | 8 min | 15 min | 6 min | 6 min |
| 60 分钟 | 14 min | 12 min | 20 min | 7 min | 7 min |

- 编码题关闭时，将时间优先分配给项目和语言专项；AI/JD 没有固定配额。
- 混合语言专项按冻结的 `language_weight_split` 分配，不在面试中重算。
- 同一主题按“结论 -> 原理 -> 边界 -> 取舍 -> 验证”逐轮追问；每轮等待回答，不能一次展示整条追问链。
- 通常追问 3-5 层，但时间不足、证据充分或用户跳过时立即停止；深度服务于证据，不机械凑层数。

---

## 风格 × 人群组合效果

| 求职者 \ 风格 | 严厉拷打型 | 温和型 | 高效型 | 学术型 | 工程实践型 | 综合平衡型 |
|---------------|-----------|--------|--------|--------|-----------|-----------|
| **实习** | ❌ 不推荐 | ✅ ✅ 最佳 | ✅ 适合目标明确者 | ✅ 培养思维深度 | ❌ 不适合 | ✅ ✅ 最佳替代 |
| **应届生** | ✅ 模拟真实压力 | ✅ ✅ 最佳 | ✅ ✅ 最佳 | ✅ ✅ 最佳 | ✅ 了解真实工作 | ✅ ✅ 最佳替代 |
| **社招 1-3 年** | ✅ ✅ 最佳（真实） | ✅ 适合复盘 | ✅ ✅ 最佳 | ✅ 补理论 | ✅ ✅ 最佳（真实） | ✅ ✅ 最佳替代 |

---

## 风格选择入口

在确认求职者身份后，询问：

```
好的，您是 [实习/应届/社招] 身份。

您希望我扮演哪种风格的面试官？

  1️⃣ 严厉拷打型 — 快节奏、高压、挑战每一个回答
  2️⃣ 温和鼓励型 — 耐心、支持、引导式提问（推荐实习/应届）
  3️⃣ 专业高效型 — 聚焦核心、结构清晰、时间精准
  4️⃣ 深挖学术型 — 追求原理、讨论式、不求广但求深
  5️⃣ 工程实践型 — 生产视角、实战导向、不纸上谈兵
  6️⃣ 综合平衡型 — 不走极端，全面温和地深挖（选择困难症推荐）

直接回复数字即可，或者描述您想要的风格，我来适配。
```
````

## File: references/cpp-ai-dev-tools-knowledge-base.md
size: 24334
sha: a8067cb4a147c90b5a897ed0ac810c6136118a0a
upstream: https://github.com/hazenix/backend-interview-simulator/blob/HEAD/references/cpp-ai-dev-tools-knowledge-base.md

````text
# AI 辅助 C++ 后端开发知识库

> 本文件只维护 AI 在 C++ 语言、构建、测试、诊断与性能验证中的专项用法。
> 任何生成结果都必须绑定目标 C++ standard、compiler、standard library、target、build flags 和运行平台。AI 的代码解释不是编译证据，静态阅读也不能单独证明生命周期、原子同步或性能结论。

---

## 1. 构建系统与依赖上下文

### AI 开始修改前必须获取的事实

让 AI 先读取真实项目，而不是直接生成一个“通常正确”的 CMake 片段。最小上下文包括：

- C++ standard：项目是否明确使用 C++17、C++20 或 C++23，是否禁用 compiler extension。
- compiler 与版本：Clang、GCC、MSVC 或其他工具链；target triple、sysroot 和交叉编译环境。
- standard library：libstdc++、libc++ 或其他实现；其 ABI 开关和部署环境是否一致。
- 构建入口：CMake preset、Bazel target、Meson setup、Make target 或项目封装脚本。
- 编译选项：warning、optimization、debug info、exception、RTTI、LTO、sanitizer 和 ABI 相关宏。
- 依赖来源：系统包、源码子模块、包管理器或 vendored 代码；版本和 link mode 是否固定。
- 目标类型：静态库、动态库、可执行文件、插件或跨语言 ABI；测试和生产是否使用同一组关键定义。

如果这些事实未知，AI 应列出待确认项，不应擅自补上最新版依赖、切换 standard library 或改变异常/RTTI 策略。

### 执行不受信仓库命令的安全边界

仓库脚本、构建入口和测试命令都属于待审查代码，不能因为名称是 `build`、`test` 或由 AI 推荐就默认可信。执行前必须：

- 先阅读 wrapper script、CMake/Bazel hook、package manager 配置和实际子命令，识别下载、上传、删除、写 home directory、启动服务与 shell expansion。
- 在 sandbox、容器或其他最小权限环境运行，不注入生产凭据、个人 token、SSH agent、云端 metadata 或真实业务数据。
- 默认限制网络和文件系统访问，只开放构建所需的 workspace 与临时目录；依赖下载必须确认来源、版本、校验和及网络目的地。
- 设置 CPU、内存、进程数、磁盘和时间上限，防止恶意或失控的编译、测试、fuzz/benchmark 消耗宿主资源。
- dependency download、codegen、post-install hook、自定义 compiler/plugin、custom analyzer 和 test fixture bootstrap 必须先确认再运行。
- 不盲跑 arbitrary build/test command；无法隔离副作用时，先做静态检查或让人工确认具体命令与权限。

### 构建修改的审查顺序

1. **复现原始命令**：从干净 build directory 执行项目已有 configure 和 build 命令，保留第一条 compiler/linker error。
2. **定位 target 边界**：确认 include directory、compile definition、compile option 和 link dependency 应属于哪个 target。
3. **使用 target-scoped 配置**：优先 `target_compile_features`、`target_include_directories`、`target_link_libraries` 等局部声明，避免全局 flags 污染无关 target。
4. **检查传递属性**：`PRIVATE`、`PUBLIC`、`INTERFACE` 必须对应真实消费关系，不能为了让本机编译通过全部改成 `PUBLIC`。
5. **验证生成命令**：查看 verbose build 或 compilation database，确认 AI 修改实际进入目标 translation unit。
6. **验证安装和消费**：库项目还要测试 install/export 后由独立 consumer 引用，不能只验证源码树内构建。

### 模板报错与链接错误的处理

AI 对长模板诊断适合做“候选根因压缩”，不适合直接把最后一行错误当根因。要求它按以下格式分析：

- 第一处用户代码实例化点是什么。
- substitution、constraint 或 overload resolution 在哪一步失败。
- 哪个候选被排除，原因来自类型、cv/ref、lifetime 还是 concept。
- 最小修复是否改变 public API、value category 或 overload set。
- 应增加哪个最小 compile test 防止回归。

链接错误要先区分：

- declaration 存在但 definition 缺失；
- template definition 对实例化点不可见；
- symbol name/namespace/signature 不一致；
- static library link order 或 transitive dependency 缺失；
- ABI、visibility、architecture 或 standard library 不一致；
- ODR violation、重复定义或 inline 定义不等价。

不要让 AI 用“把定义都移到头文件”“加入所有库”“关闭 warning/error”作为默认修复。

### 可复现提示词

```text
先读取当前 target 的构建文件、compile_commands.json 和失败命令。
环境：C++20、Clang 17、libc++、arm64。
任务：只修复 target `cache_tests` 的第一处编译错误。
要求：
1. 保留完整英文 compiler diagnostic，并指出第一处用户代码实例化点。
2. 不新增依赖，不修改全局 compiler flags，不关闭 warning。
3. 说明修复是否影响 ABI、exception specification 或 overload resolution。
4. 用原失败命令和该 target 的测试验证；未运行的配置明确标记。
```

### 连续追问

1. AI 如何确认实际编译的是 C++20，而不是只看到 `CMAKE_CXX_STANDARD` 就下结论？
2. header-only dependency 为什么仍可能有 ABI、macro 和 compile option 冲突？
3. 模板错误最后出现的 standard library stack 为什么经常不是根因位置？
4. 本机 debug build 通过后，为什么仍要验证 release、sanitizer 和目标部署 toolchain？

### 常见幻觉

- 生成不存在的 CMake command、target 名或 package component。
- 混用 GCC、Clang 和 MSVC flags，或把某个 compiler extension 当成标准语法。
- 未读取 build graph 就新增全局 include path、definition 或 linker option。
- 看到 `undefined reference` 就补库，未核对 signature、namespace、ABI 和 link order。
- 修改 template constraint 后只说“编译器能推导”，没有实际编译目标实例。

---

## 2. 生命周期、所有权与未定义行为审查

### 先画所有权与借用关系

AI 审查 C++ 生成代码时，应先为每个资源回答：

- 谁创建，谁拥有，谁销毁；
- 所有权是唯一、共享、外部托管还是纯借用；
- 借用能否跨线程、回调、容器重分配、异步任务或协程挂起点；
- move 后源对象满足什么不变量；
- 构造中途失败、赋值失败和析构阶段分别清理什么；
- raw pointer/reference/view 是否可能比 owner 活得更久。

仅看到 smart pointer 并不能结束审查。`std::shared_ptr` 可以避免特定对象过早销毁，但不能自动避免 cycle、data race、逻辑资源泄漏或 pointee 并发访问。

### AI 应重点标记的生命周期风险

- 返回局部对象的 pointer、reference、iterator、`std::span` 或 `std::string_view`。
- lambda 以引用捕获局部变量后进入异步执行器。
- container reallocation/erase 后继续使用 pointer、reference 或 iterator。
- 把 `this` 捕获进生命周期超过对象的 callback。
- custom deleter 与资源实际释放 API 不匹配。
- placement construction 后遗漏 destruction，或对象 lifetime 尚未开始就访问存储。
- base class 通过 base pointer 删除但 destructor 非 virtual。
- move assignment 覆盖旧资源、self-move 或 moved-from 状态处理错误。
- exception 路径中部分构造对象、锁、fd、内存或事务 token 未回滚。

### 异常安全必须用不变量表达

要求 AI 明确每个 operation 的保证等级，而不是笼统说“异常安全”：

- **no-throw guarantee**：操作不会抛；常用于 destructor、swap 和资源释放路径，但必须符合成员真实能力。
- **strong guarantee**：失败时对外可观察状态与调用前等价；常通过先构造临时结果再 commit。
- **basic guarantee**：失败后对象仍满足不变量且无资源泄漏，但值可能变化。
- **no guarantee**：异常后状态不受约束；若这是有意契约必须明确写出。

审查顺序是：列不变量、找可能抛点、判断每个抛点前后的已提交状态、检查 RAII rollback，最后再评价保证等级。给函数机械添加 `noexcept` 不是优化；若内部异常逃出，会调用 `std::terminate`。

### 未定义行为不能靠“运行正常”排除

AI 应把以下结论标记为待动态或编译器验证：

- use-after-free、double delete、out-of-bounds、invalid downcast；
- signed overflow、invalid shift、misalignment、strict aliasing violation；
- uninitialized read、invalid object lifetime、错误 format argument；
- data race、并发访问非线程安全对象；
- 越过 API lifetime contract 的 view、iterator 和 callback。

一次普通运行没有崩溃，只说明该输入与构建未观察到故障，不证明不存在 undefined behavior。优化级别、allocator、线程调度和目标架构变化都可能改变表现。

### 审查与验证矩阵

| 风险 | 静态审查问题 | 最小运行证据 |
|------|--------------|--------------|
| owning pointer | copy/move/delete 是否唯一 | unit test + ASan/LSan |
| borrowed view | owner 是否覆盖全部使用期 | boundary test + ASan |
| exception rollback | 哪些操作已提交 | fault injection test |
| polymorphic delete | base destructor 是否 virtual | compile test + UBSan |
| iterator invalidation | 哪个操作会失效 | targeted test + debug iterator（若实现支持） |
| integer/shift/alignment | 前置条件是否可证明 | UBSan + boundary cases |

### 提示词示例

```text
审查这段 C++20 代码的所有权和异常安全。
先输出资源表：resource、owner、borrower、release point、exception path。
再列出每个 public operation 的不变量和 guarantee。
不要把 shared ownership 当成线程安全。
给出能在修复前失败的测试，并分别指定 ASan、UBSan 或 LSan 的验证价值。
如果只能怀疑而不能证明，标记为 hypothesis，不要写成已确认缺陷。
```

### 连续追问

1. `std::string_view` 按值传递为什么仍可能悬空？
2. copy-and-swap 提供强保证时，copy 成本、allocator propagation 和 self-assignment 如何变化？
3. constructor 第三个成员初始化抛异常时，哪些 destructor 会运行，类自身 destructor 会不会运行？
4. ASan 未报错为何不能证明所有 lifetime contract 都正确？

### 常见幻觉

- 看到 smart pointer 就断言“无内存泄漏、线程安全”。
- 认为 move 一定清空所有字段，或 moved-from 对象只能析构不能赋值。
- 把 `noexcept` 当作忽略错误的语法，未分析 terminate 路径。
- 用一次 debug 运行证明 iterator、view 或 reference 生命周期安全。
- 为修复悬空引用把所有值改成共享所有权，制造 cycle 和不清晰生命周期。

---

## 3. 并发和内存模型审查

### 先定义共享状态与同步协议

AI 在给出锁、atomic 或 lock-free 修改前，必须列出：

- 哪些对象会被哪些线程访问；
- 哪些访问互相冲突，是否至少一个是写；
- 每个业务不变量由哪把 mutex、哪条消息传递或哪组 atomic order 保护；
- object lifetime 是否覆盖所有线程访问；
- shutdown 如何阻止新工作、唤醒等待者并 join；
- callback 和 task exception 如何传播或隔离。

“字段改成 atomic”只保护该字段的原子访问，不自动保护跨字段不变量、容器内部状态或 pointee。

### Mutex 与 condition variable 审查

- condition variable wait 必须绑定 predicate，并在同一 mutex 下读取 predicate 状态。
- 修改 predicate 后决定在锁内还是锁外 notify，应基于不变量和调度成本，不能机械套模板。
- 不在持锁期间执行未知 callback、阻塞 I/O、长任务或等待另一个 future。
- 明确 lock ordering；AI 若建议新增第二把锁，必须给出全局顺序或证明不会嵌套。
- shutdown 要区分停止接收、drain、immediate cancel 和 join；一个 bool 往往不足以表达复杂状态。
- thread destructor、异常路径和构造中途失败都必须处理 joinable thread。

### Atomic 与 memory order 审查

对每个 atomic operation 要求 AI回答：

1. 它保证的是原子读改写，还是还承担发布/获取普通内存的同步作用？
2. release operation 前有哪些写入要发布？
3. acquire operation 后有哪些读取依赖它可见？
4. 两者通过哪个 reads-from 或 release sequence 建立 synchronizes-with？
5. 若改成 relaxed，会丢失哪条 happens-before？
6. object reclamation 如何保证没有线程仍持有旧 pointer？

AI 生成的 `memory_order_relaxed/acquire/release/acq_rel/seq_cst` 不能仅靠代码看起来合理就接受。最少应有：

- 手工画出的 happens-before 关系；
- 对算法前提的文字证明；
- ThreadSanitizer 可覆盖的并发测试；
- 目标弱内存架构测试或可信模型工具（若项目采用）；
- 与正确锁版本的差分测试。

ThreadSanitizer 能发现许多实际 data race，但不证明算法线性化、memory order 最小性、ABA 安全或 reclamation 正确。

### Lock-free 不是默认答案

- 面试和生产修改都应先建立正确的锁版本与行为测试。
- lock-free 只表示系统级进展保证，不等于低延迟、低 CPU 或在当前负载更快。
- CAS loop 必须处理重试、contention、ABA、false sharing、backoff 和 starvation。
- pointer-based lock-free structure 还需要 hazard pointer、epoch、RCU-like protocol 或其他安全 reclamation。
- AI 若删除 mutex，必须提供等价语义、线性化点和 benchmark；仅说“减少锁竞争”不构成证据。

### 并发测试要求

- 用 barrier/latch 或明确握手建立起跑条件，不用 sleep 猜调度。
- 测试结束有 deadline，失败时输出线程状态或最小诊断。
- 重复运行只是提高暴露概率，不是正确性证明。
- 同一测试分别在普通 build、ThreadSanitizer build 和必要的 AddressSanitizer build 下运行。
- shutdown、空队列、满队列、exception、取消、构造失败和析构顺序都要有用例。

### 提示词示例

```text
审查这段 SPSC queue，不要先改 memory order。
输出：
1. producer/consumer 各自独占写的状态；
2. 每个槽位写入、索引发布、索引观察和槽位读取的 happens-before 链；
3. 每个 atomic operation 当前 order 的必要性；
4. relaxed 替换实验会破坏的具体可见性；
5. 与 mutex baseline 做差分测试的方案。
最后给出 TSan 能检查什么、不能检查什么。
```

### 连续追问

1. data race 与业务 race condition 有什么区别？无 data race 是否等于算法正确？
2. condition variable 为什么允许 spurious wakeup，predicate 应由谁保护？
3. release/acquire 同步建立后，哪些非 atomic 写入对读取线程可见？
4. TSan 通过后，为什么还不能证明 lock-free queue 的 reclamation 和线性化正确？

### 常见幻觉

- 用 `volatile` 解决线程可见性或原子性。
- 把所有 atomic 都改成 relaxed 并以“单变量原子”解释跨对象协议。
- 把所有操作都改成 sequential consistency，就宣称生命周期和算法一定正确。
- TSan 无报告即断言没有并发缺陷。
- 未建立性能 baseline 就把 mutex 改成 CAS loop。

---

## 4. 测试、Sanitizer 与性能证据

### 编译器是第一道验证

AI 生成 C++ 后至少执行目标项目的真实 compile command。建议在项目允许时启用严格 warning，但不得未经评估就修改整个仓库的 warning policy。
执行这些命令前仍要应用“不受信仓库”边界：先审查入口，在 sandbox/最小权限下运行，不带生产凭据，限制网络、文件访问和 CPU/内存/时间；依赖下载、codegen、post-install 与 custom analyzer 先确认。

典型局部验证命令示意：

```bash
cmake --preset debug
cmake --build --preset debug --target target_tests --verbose
ctest --preset debug --output-on-failure
```

独立小程序可使用：

```bash
clang++ -std=c++20 -Wall -Wextra -Wpedantic -Wconversion \
  -pthread example.cpp -o example
./example
```

实际命令必须以项目已有配置为准。只运行 formatter 或静态阅读不能发现 missing include、ODR、template instantiation、link 和 ABI 问题。

### 测试分层

- **Compile test**：模板是否可实例化、concept/overload 是否选择正确、header 是否 self-contained。
- **Unit test**：值语义、不变量、边界、异常和资源释放。
- **Concurrency test**：协调后的交错、shutdown、cancel 和压力场景。
- **Integration test**：真实 allocator、filesystem、socket、dynamic library 或目标 ABI。
- **Regression test**：先证明旧实现因预期原因失败，再验证修复。

AI 生成测试时要警惕：

- 只验证不崩溃，没有断言不变量；
- 测试复制了实现算法，二者可能一起错；
- 只测 happy path，没有注入 allocation、constructor、I/O 或 callback failure；
- 并发测试依赖 sleep；
- benchmark 被当作正确性测试。

### Sanitizer 选择

| 工具 | 主要发现 | 不能证明 |
|------|----------|----------|
| AddressSanitizer | 常见越界、use-after-free、部分 use-after-scope | 所有生命周期契约、逻辑泄漏、线程正确性 |
| UndefinedBehaviorSanitizer | 多类可动态检测的 undefined behavior | 标准中所有 UB、未执行路径 |
| LeakSanitizer | 进程退出时可达性相关的内存泄漏 | fd、连接、线程等非内存资源泄漏 |
| ThreadSanitizer | 被执行路径上的许多 data race | 无业务 race、无死锁、lock-free 算法正确 |
| MemorySanitizer | 部分未初始化内存读取（依赖完整插桩环境） | 未插桩依赖中的全部问题 |

常见命令示意：

```bash
clang++ -std=c++20 -O1 -g -fno-omit-frame-pointer \
  -fsanitize=address,undefined example.cpp -pthread -o example_asan
./example_asan

clang++ -std=c++20 -O1 -g -fno-omit-frame-pointer \
  -fsanitize=thread example.cpp -pthread -o example_tsan
./example_tsan
```

- ASan 与 TSan 通常分别构建运行，不应假设可随意组合。
- sanitizer 改变布局、时序和性能；sanitizer build 不用于性能结论。
- 某些平台、allocator、static link 或第三方 binary 与 sanitizer 不兼容，必须记录未覆盖范围。

### Benchmark 的最低证据标准

AI 声称“更快”“减少分配”“降低锁竞争”前，至少提供：

- 与语义等价 baseline 的 A/B 实现；
- 固定 compiler、flags、CPU、频率策略、输入分布和并发度；
- warmup、重复运行和统计结果，而非一次 wall-clock；
- 防止 dead-code elimination 的消费方式；
- 吞吐、延迟分位、CPU、allocation 和 contention 中与目标相关的指标；
- correctness tests 与 sanitizer tests 先通过；
- profile 指向被修改热点，而不是只看到 benchmark 数字变化。

microbenchmark 只回答受控小场景。线上收益还受 cache、NUMA、allocator、I/O、batching 和 workload distribution 影响。

### 性能审查流程

1. 描述业务指标和回归幅度。
2. 获取可复现 baseline。
3. 用 profiler 或硬件计数器定位热点。
4. 让 AI提出多个可证伪假设，不直接给“优化版”。
5. 每次只改变一个关键因素。
6. 运行正确性、sanitizer 和 benchmark。
7. 检查 p50/p99、CPU、memory、binary size 或 build time 是否发生副作用。

### 连续追问

1. 为什么 sanitizer build 的耗时不能用于证明生产优化收益？
2. ASan、UBSan、TSan 各自更适合验证哪些 AI 修改？
3. benchmark 快 10% 时，应检查哪些环境噪声、语义差异和统计问题？
4. compiler 优化掉待测逻辑时，benchmark 会产生什么假象？

### 常见幻觉

- 生成代码“语法看起来正确”就跳过 compiler。
- 一个 sanitizer 通过后推导所有 memory、thread 和 UB 风险均消失。
- 从 Big-O 或减少一行分配代码直接断言性能提升。
- 用 debug 与 release、不同 compiler flags 或不同输入比较。
- profile 没指向目标函数，仍按 AI 猜测重写热点。

---

## 5. AI 常见幻觉与验证方法

### 高风险幻觉表

| 幻觉类型 | 常见表现 | 必须验证 |
|----------|----------|----------|
| 不存在或版本错误的 API | 混用不同 standard、compiler intrinsic 或 library version | 目标 toolchain 编译与官方 header |
| 错误 lifetime | 返回临时 view、异步捕获引用、move 后重复释放 | 边界测试、ASan/LSan、所有权审查 |
| 错误 exception guarantee | 随意加 `noexcept`，部分提交后宣称强保证 | fault injection、不变量测试 |
| 错误原子序 | 无 happens-before 证明就选择 relaxed/acquire/release | 内存模型推导、TSan、弱内存测试 |
| 错误模板修复 | 用 cast、删除 constraint 或移头文件掩盖根因 | 原实例化命令、compile test |
| 错误性能结论 | “无锁必然更快”“move 一定零成本” | 等价 benchmark、profile、目标负载 |
| 错误平台假设 | 写死 pointer、cache line、fd 或 syscall 行为 | target/ABI/OS 文档与目标运行 |

### 最小验证闭环

1. **审查执行边界**：把仓库命令视为不受信输入，先读脚本；使用 sandbox/最小权限且无生产凭据，限制网络、文件、CPU、内存和时间，确认 download/codegen/post-install/custom analyzer。
2. **固定上下文**：记录 standard、compiler、standard library、target、flags、依赖和运行平台。
3. **保留原错误**：完整保存第一条 compiler/linker/sanitizer 英文诊断与调用栈，不只贴 AI 摘要。
4. **先构造反例**：把修复目标变成 compile failure、unit failure、sanitizer report 或 benchmark baseline。
5. **最小修改**：不顺手升级依赖、切换 build system 或重写无关抽象。
6. **局部验证**：原失败命令、聚焦测试和对应 sanitizer。
7. **范围验证**：相关 target、integration configuration 和 release build。
8. **性能验证**：只有正确性闭环后才运行 benchmark/profile。
9. **人工解释**：审查者能说明 ownership、exception guarantee、happens-before 和证据边界。

### 面试问题与评价

1. AI 生成一个拥有裸指针的类，你会先问哪些 ownership 和 Rule of Zero/Five 问题？
2. AI 把 mutex 改成 atomic 后，怎样证明跨字段不变量仍成立？
3. 一段 template error 有数百行，怎样找第一处用户实例化点而不是删除 constraint？
4. AI 声称 SPSC queue 提升 3 倍，哪些 correctness、sanitizer 和 benchmark 条件缺一不可？
5. ASan/TSan 都通过后，还有哪些未覆盖风险必须人工分析？

**实习/应届达标：**

- 会先编译和运行测试，不把 AI 输出直接当答案。
- 能识别悬空 reference/view、重复释放、未 join thread 和基础 data race。
- 知道 ASan 与 TSan 解决不同问题，性能要有 benchmark。

**社招达标：**

- 能绑定 build target、ABI、exception guarantee 和 concurrency invariant。
- 能解释 sanitizer 覆盖边界、happens-before 和 lock-free reclamation 风险。
- 能设计等价 baseline、可复现 benchmark 与 profile 驱动的优化闭环。

### 最终准入清单

- [ ] 仓库脚本和构建入口已审查；命令在 sandbox/最小权限、无生产凭据、受限网络/文件/CPU/内存/时间条件下执行。
- [ ] 依赖下载、codegen、post-install、自定义 compiler/plugin 和 custom analyzer 的来源与副作用已确认。
- [ ] 真实目标由目标 compiler 成功编译并链接。
- [ ] 新旧行为由聚焦测试覆盖，错误路径和退出路径已验证。
- [ ] ownership、borrow 和 object lifetime 有明确契约。
- [ ] exception guarantee 与所有 `noexcept` 声明可解释。
- [ ] 并发共享状态、锁顺序、happens-before 和 shutdown 可解释。
- [ ] 对应 ASan/UBSan/TSan/LSan 已运行，或未运行原因和风险已记录。
- [ ] 性能声称有等价 benchmark 与 profile 证据。
- [ ] 未把单个 compiler、standard library、ABI 或 OS 实现写成通用标准保证。
````

## File: references/cpp-coding-challenges.md
size: 36531
sha: 64b502429a866cbb41e2d72860b66468fc631284
upstream: https://github.com/hazenix/backend-interview-simulator/blob/HEAD/references/cpp-coding-challenges.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/hazenix/backend-interview-simulator/blob/HEAD/references/cpp-coding-challenges.md

## File: references/cpp-tech-knowledge-base.md
size: 96036
sha: a5a4a33b4c50c34c1fc1cb624856cd8307ff39c4
upstream: https://github.com/hazenix/backend-interview-simulator/blob/HEAD/references/cpp-tech-knowledge-base.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/hazenix/backend-interview-simulator/blob/HEAD/references/cpp-tech-knowledge-base.md

## File: references/go-ai-dev-tools-knowledge-base.md
size: 27806
sha: 9da60f11cb1fabf250c7d60109241130edf6fe39
upstream: https://github.com/hazenix/backend-interview-simulator/blob/HEAD/references/go-ai-dev-tools-knowledge-base.md

````text
# AI 辅助 Go 后端开发知识库

> 本文件只维护 AI 在 Go 语言、标准库、工具链、并发诊断和性能验证中的专项用法。
> 生成代码至少经过 `gofmt`、`go vet`、单元测试和 `go test -race`；性能结论必须有 Go benchmark 与 pprof/trace 证据。AI 的静态解释不能替代这些检查。

---

## 1. 模块、接口与标准库上下文

### 修改前必须读取的事实

AI 生成或修改 Go 代码前，应先读取：

- `go.mod` 的 `module`、`go`、`toolchain`、`require`、`replace` 和 `retract`。
- workspace 是否有 `go.work`，当前命令实际加载哪些 module。
- `go env GOOS GOARCH CGO_ENABLED GOPROXY GOWORK` 与目标部署环境。
- package 边界、internal 目录、build tag、generated file 和 platform-specific file。
- 目标接口的定义、已有实现、constructor、zero value contract 和错误约定。
- 标准库与第三方依赖的目标版本文档，而不是模型记忆中的最新 API。
- CI 实际执行的 format、vet、test、race、lint、build 和生成命令。

不要只根据目录名猜 package path，也不要看到一个 interface 就自动创建 mock、adapter 或新抽象。先找调用者与已有实现，确认变更点属于 provider 还是 consumer。

### 执行不受信仓库命令的安全边界

仓库内的 Makefile、shell script、`go generate` directive、测试入口和 analyzer 配置都是待审查代码，不能因为命令看似标准或由 AI 推荐就直接运行。执行前必须：

- 先阅读 wrapper script、`go:generate`、Make target、CI helper 和实际子命令，识别下载、上传、删除、写 home directory、启动服务与 shell expansion。
- 在 sandbox、容器或其他最小权限环境运行，不注入生产凭据、个人 token、SSH agent、云端 metadata、真实数据库连接串或业务数据。
- 默认限制网络和文件系统访问，只开放 module/workspace 与临时目录；依赖下载必须确认 proxy/source、module version、checksum 和网络目的地。
- 设置 CPU、内存、进程/goroutine、磁盘和时间上限，防止恶意或失控的 test、fuzz、benchmark 或 code generation 消耗宿主资源。
- dependency download、codegen、post-install hook、cgo build script、custom analyzer、tool install 和 test fixture bootstrap 必须先确认再运行。
- 不盲跑 arbitrary build/test command；无法隔离副作用时，先做静态检查或让人工确认具体命令与权限。

### 模块与依赖修改

AI 建议新增依赖时必须回答：

1. 标准库能否完成目标。
2. 当前 module 是否已有等价依赖。
3. 新依赖支持的 Go 版本是否兼容 `go.mod`。
4. 是否增加 transitive dependency、cgo、binary size 或供应链成本。
5. `go mod tidy` 会删除或新增什么，是否影响 build-tagged package。
6. license、维护状态和 vulnerability 审查由谁完成。

不能为了让本机编译通过随意加入 `replace` 指向本地路径，也不能在未说明原因时整体升级 dependency graph。依赖变化应通过 `go mod tidy` 后的 diff、`go list -m all` 和目标 package 测试验证。

### 接口与类型设计审查

- interface 应由使用方围绕最小行为定义，不是把实现类所有方法复制一遍。
- 接受 interface、返回具体类型通常能保留实现能力，但不是机械规则；要看 ownership、test seam 和 compatibility。
- typed nil 可能让 `error` 或其他 interface 非 nil；AI 生成 error wrapper 和 mock 时必须覆盖。
- method set 受 value/pointer receiver 影响；接口实现要用 compile-time assertion 或实际赋值编译验证。
- 泛型约束是 compile-time type set，不等于 runtime interface；不要用 `any` 和 type assertion 绕过本可静态表达的关系。
- zero value 是否可用、copy 是否安全必须明确；含 `sync.Mutex`、`sync.Once`、atomic 状态或 runtime handle 的类型通常不应在使用后复制。

接口变更还要检查所有实现、compile-time assertions、generated mocks 和跨 module consumer。AI 说“只加一个方法”并不代表兼容：给已有 interface 增加方法会让所有外部实现失效。

### 标准库 API 的版本核对

AI 常混用不同 Go 版本的 package API、runtime 行为和语言语义。验证顺序：

```bash
go version
go env GOMOD GOWORK GOOS GOARCH
go list -deps ./path/to/package
go doc package.Symbol
go test ./path/to/package
```

- 以目标 toolchain 的 `go doc`、源码和编译结果为准。
- 语言变化还要结合 `go.mod` 的 `go` line，不能只看安装的 toolchain。
- build constraint 应用 `go list` 验证实际选中文件，不凭文件后缀猜测。
- reflection、unsafe、runtime 和 compiler optimization 结论要标记为实现/版本相关。

### AI 生成代码的基础闭环

以下基础命令不是自动授权。执行前仍要审查不受信仓库脚本与生成入口，并在 sandbox/最小权限、无生产凭据、受限网络/文件/CPU/内存/时间的环境运行；dependency download、codegen、post-install 与 custom analyzer 先确认。

```bash
gofmt -w path/to/changed.go
go vet ./path/to/package
go test ./path/to/package
go test -race ./path/to/package
```

生产仓库应使用已有脚本或 CI target，避免局部命令漏掉 code generation、custom analyzer 或 integration tag。`gofmt` 通过只证明格式规范，`go vet` 也不是完整 correctness proof。

### 提示词示例

```text
先读取 go.mod、目标 package、接口定义、全部实现和现有测试。
只修改 package `worker`。
要求：
1. 不新增第三方依赖，除非先说明标准库为何不足。
2. 保留现有 error wrapping 和 context contract。
3. 检查 typed nil、pointer/value method set 和类型是否被复制。
4. 运行 gofmt、go vet、go test、go test -race。
5. 保留关键英文错误原文；未验证的 build tag 和平台明确列出。
```

### 连续追问

1. 为什么安装 Go 1.24 不代表 module 中所有语言语义都按 1.24 生效？
2. 给 interface 增加一个方法为何可能破坏仓库外的实现？
3. `go mod tidy` 产生大 diff 时，如何区分合法的 build-tag dependency 与误删？
4. `go vet` 通过后还需要哪些 compile、test 和 runtime 证据？

### 常见幻觉

- 生成目标 Go 版本不存在的标准库函数或字段。
- 使用错误 import path，或忽略 module path 与 internal 可见性。
- 自动加入第三方 package 解决标准库已能解决的问题。
- 认为 interface 值里装的是 nil pointer，所以 interface 一定等于 nil。
- 用 `replace ../local` 修复依赖并把本机路径带入提交。

---

## 2. Goroutine 生命周期与并发审查

### 每个 goroutine 都要有退出证明

AI 生成 `go func()` 时必须同时回答：

- 谁启动它，启动次数是否有上界。
- 正常完成条件是什么。
- 谁发送 cancel/close/stop 信号。
- 它可能阻塞在哪些 send、receive、lock、I/O、timer 或 syscall。
- 父函数提前返回、首错、timeout 和 shutdown 时如何退出。
- 谁等待它结束；不等待是否是有意的进程级后台生命周期。
- panic 和 error 如何被观察。

“goroutine 很轻量”不能作为省略生命周期的理由。阻塞 goroutine 会保留 stack、引用对象、timer、socket 和业务资源。

### Channel ownership 审查

- channel 的创建方应声明谁拥有发送权和关闭权。
- 一般由能够确定“不再有任何 sender”的协调者 close；receiver 不为通知 sender 而关闭数据 channel。
- close 是广播“以后不会再有值”，不是通用 cancellation。取消优先使用 context 或专用 done protocol。
- send 与 close 并发会 panic；多 sender 场景必须由单一协调者在全部 sender 退出后关闭。
- nil channel 的 send/receive 永久阻塞，常用于动态禁用 select case，但也容易造成泄漏。
- 从 closed channel receive 会立即返回零值和 `ok=false`；忽略 `ok` 可能形成零值 busy loop。
- 缓冲 channel 只改变阻塞时机，不自动解决 ownership、backpressure 或退出。

要求 AI 为 pipeline 画出：

```text
producer --owns send--> jobs --worker receives
workers --owns send--> results --collector receives
feeder closes jobs
coordinator waits workers, then closes results
context cancellation reaches every blocking edge
```

### Context 与取消传播

- `context.Context` 作为第一个参数沿调用链传递，不存入 struct 作为默认长期状态。
- 不用 `context.Background()` 替换已有 request context。
- 创建 `WithCancel`、`WithTimeout` 或 `WithDeadline` 后及时调用 CancelFunc，释放 timer 和 child reference。
- select 的每个可能永久阻塞 send/receive 都要考虑 `ctx.Done()`。
- context cancellation 是协作式的；被调用函数必须观察它，Go 不能安全强杀任意 goroutine。
- context value 只放 request-scoped metadata，不放可选业务参数或大型可变对象。
- 错误语义要区分父取消、deadline、业务错误和首个下游错误，不盲目用 `ctx.Err()` 覆盖根因。

### `sync`、atomic 与共享内存

- Go memory model 不保证 data-race 程序的业务结果；先消除 race，再讨论逻辑正确性。
- mutex 应保护明确不变量；不要给每个字段一把锁后失去跨字段原子性。
- `RWMutex` 只有在真实 read-only 临界区和 profile 证据下才可能有收益；LRU `Get` 等操作会写 recency。
- `WaitGroup.Add` 必须在相应 goroutine 可完成之前建立正确时序；不要让 `Wait` 与新的 `Add` 形成不受约束竞争。
- `sync.Once` 执行的函数 panic 后仍被视为已调用；AI 生成 lazy init 时应确认失败语义。
- atomic 只保护对应操作；多字段 invariant 仍需锁、不可变快照或明确 protocol。
- copylocks：使用后的 mutex、once 或含这些字段的 struct 不应按值复制，`go vet` 可发现部分问题。

### 常见并发生成缺陷

- range loop 中启动 closure 时忽略 module 的语言版本和变量捕获方式。
- 多 goroutine append 同一 slice、写同一 map 或更新 error 变量。
- error channel 无 buffer，调用者首错返回后 sender 泄漏。
- `time.After` 在热点循环中持续创建 timer；ticker 未 `Stop`。
- worker pool 关闭顺序错误：先 close result，再等待 sender。
- recovery 只在父 goroutine；子 goroutine panic 不会被另一个 goroutine 的 defer 捕获。
- `select { default: }` 轮询共享状态造成 busy loop。

### Race Detector 的正确位置

`go test -race` 是 AI 并发修改的最低动态验证，但它只报告当前执行路径观察到的 race：

- 增加并发测试、重复关键场景和真实 workload 可以提高覆盖概率。
- 未报告不证明没有 race，更不证明无 deadlock、goroutine leak 或业务顺序错误。
- race build 开销很大，不用于性能结论。
- 测试应使用 barrier、channel 或 hook 控制交错，不用 sleep 猜调度。
- 发现报告时保留完整英文 stack，包括 conflicting access 与 goroutine creation stack。

### 提示词示例

```text
审查这段 Go pipeline。
为每个 goroutine 输出 owner、block points、normal exit、error exit、cancel source、join point。
为每个 channel 输出 creator、sender、receiver、closer 和关闭前置条件。
指出共享 map/slice/error 的同步协议。
先设计能暴露 blocked send 或 race 的测试，再修改实现。
修改后运行 go test 和 go test -race；不要用 sleep 作为同步。
```

### 连续追问

1. channel close 与 context cancel 的语义分别是什么，什么时候不能互换？
2. 一个长度为 N 的结果缓冲为何能避免 N 个“一次发送”任务在调用者提前返回时阻塞？它不能解决什么？
3. race detector 无报告时，如何继续检查 goroutine leak、deadlock 和业务竞态？
4. 多字段状态都改成 atomic 后，如何证明快照不变量仍成立？

### 常见幻觉

- “channel 是线程安全的，所以整个 pipeline 没有 race。”
- “context cancel 会立即杀死所有 goroutine。”
- “加 buffer 就不会泄漏”，却没有计算 sender 上界。
- “只读 map 并发安全”，但另一个 goroutine 仍可能写。
- race detector 一次通过后宣称并发实现已被证明正确。

---

## 3. HTTP、RPC 与数据库代码审查

### `net/http` client 审查

AI 生成 outbound HTTP 代码时检查：

- 复用 `http.Client` 与 `Transport`，不要每次请求创建新的连接池。
- request 使用调用方 context，例如 `http.NewRequestWithContext`。
- 明确总 timeout、dial、TLS handshake、response header、idle connection 等不同预算，不把一个值复制到所有层。
- `Do` 成功得到 non-nil response 后，按契约关闭 body；是否需要 drain 取决于协议、响应大小和 Transport 复用要求。
- 检查 status code 后再 decode，不把非 2xx body 当成功对象。
- 限制 response body 大小，避免不可信响应耗尽内存。
- retry 只用于幂等或有 idempotency contract 的操作；必须受总 deadline、次数和 backoff 限制。
- 日志不输出 Authorization、Cookie、token 或完整敏感 body。

AI 常生成 `defer resp.Body.Close()` 在错误检查之前，导致 nil dereference；也常遗漏 body close，造成连接无法复用和资源增长。

### HTTP server 与 middleware 审查

- `http.Server` 设置合理的 header/read/write/idle 限制，并按服务协议评估 streaming 例外。
- handler 尊重 `r.Context()`；客户端断开或 server shutdown 后下游应可取消。
- 限制 request body，校验 content type，区分 decode error、validation error 和 trailing garbage。
- status/header 只能在首次写出前可靠设置；recovery 不能保证覆盖已发送响应。
- middleware 构建后应只读；请求级可变状态放在局部变量或受同步保护的对象。
- 自定义 `ResponseWriter` wrapper 要处理目标版本中的可选能力，不能无意破坏 streaming/hijacking。
- graceful shutdown 需要 deadline，并等待 handler 收敛；后台 goroutine 也要纳入生命周期。

### RPC client/server 审查

具体 RPC framework API 必须按项目依赖版本核对，但 Go 层面的审查问题稳定：

- deadline 是否从入站 context 传播到下游。
- status/error code 是否保留，不把全部错误转换为通用字符串。
- retry 是否由 client、middleware 和业务层重复执行，形成乘法放大。
- streaming 的 send/receive goroutine 是否有单一关闭协议和退出 join。
- request/response 是否被跨 goroutine 修改，生成对象是否允许复用。
- interceptor 顺序是否改变认证、日志、metrics、retry 和 recovery 语义。
- connection/client 是否长期复用，shutdown 时由谁关闭。

AI 不应凭记忆生成某框架 option；必须编译目标 module，并执行最小 integration test。

### `database/sql` 专项审查

这里审查的是 Go client 使用方式，不替代数据库设计：

- `*sql.DB` 是并发安全的连接池 handle，应长期复用，不每个请求 open/close。
- 所有 query/exec/begin 使用 context-aware API，让 deadline 可传播到 driver。
- `Rows`、`Stmt` 和 `Tx` 按所有权及时关闭；循环后检查 `rows.Err()`。
- transaction 明确 commit/rollback protocol。常见模式是在 begin 成功后 `defer tx.Rollback()`，成功路径显式 `Commit()`；仍需按 driver 契约处理错误。
- 不在 transaction 中执行无界远程调用或等待无关 goroutine。
- 占位符和 driver 行为按当前 driver 验证，不跨生态猜语法。
- `SetMaxOpenConns`、`SetMaxIdleConns`、`SetConnMaxLifetime` 等需要根据下游容量与观测设定，不复制魔法数字。
- 错误判断使用 `errors.Is/As` 和 driver 公开类型，保留 `%w` 链；不要解析不稳定错误字符串作为唯一协议。

### 错误传播与观测

- 用 `%w` 包装时增加 operation/resource context，不重复写无信息的“failed”。
- 库函数返回 error，由进程边界决定日志；避免每层都记录同一错误。
- panic 只用于不可恢复 programmer invariant，不替代普通 I/O、decode 或 validation error。
- 并发 fan-out 要定义首错、全部错误或部分结果语义；不同语义需要不同收集结构。
- metrics label 不放 request ID、完整 URL、SQL 或 error message 等高基数字段。

### 验证矩阵

| 生成代码 | 聚焦测试 | 额外检查 |
|----------|----------|----------|
| HTTP client | fake server 验证 status/body/timeout | connection reuse 与 body close |
| HTTP handler | `httptest` 正常/错误/取消 | race、body limit、partial response |
| RPC | in-process 或项目 test harness | deadline、status、stream exit |
| `database/sql` | driver mock 只测协议，真实环境测 driver 行为 | rows close、rollback、pool stats |
| retry | fake clock/可控失败序列 | 总预算、幂等性、放大倍数 |

### 连续追问

1. `http.Client` 为什么应复用，response body 未关闭如何影响连接池？
2. handler 已经写出部分 body 后 panic，recovery 能保证什么，不能保证什么？
3. `database/sql` 中 `DB`、`Conn`、`Tx`、`Rows` 的生命周期分别由谁管理？
4. client、RPC middleware 和业务层都重试 3 次时，最坏请求放大是多少，如何收敛？

### 常见幻觉

- 每次 HTTP 请求新建 Client/Transport，并声称能自动复用全局连接。
- 对所有请求无条件 retry，包括非幂等写。
- 忽略 `rows.Err()` 或 response body close。
- 生成不存在的 RPC option、driver error type 或错误占位符。
- 把 request context 换成 Background，导致超时与断连不能传播。

---

## 4. 测试、Race Detector、pprof 与 trace

### 格式、静态检查和测试顺序

Go AI 修改的最低本地闭环：

```bash
gofmt -w path/to/changed.go
go vet ./path/to/package
go test ./path/to/package
go test -race ./path/to/package
```

如仓库使用 `goimports`、custom analyzer、golangci-lint、build tags、code generation 或 Make target，应执行仓库定义的命令。不能用新增工具擅自重排全仓库 import 或格式化无关文件。

建议顺序：

1. 写一个因目标缺陷而失败的聚焦测试并确认 RED。
2. 做最小实现，运行 package test。
3. 执行 `gofmt` 与 `go vet`。
4. 执行 `go test -race`，确保测试覆盖并发路径。
5. 执行受影响 module/package 的更大范围测试。
6. 有性能声称时再运行 benchmark 和 profile。

### 可靠测试设计

- table-driven test 适合同一规则的输入矩阵，不把无关行为塞进一张表。
- 并发测试使用 channel、barrier、hook 或 fake dependency 控制时序。
- timeout 用于防止测试永久挂起，但不能以 sleep 后“可能完成”作为断言。
- 使用 `t.Cleanup` 关闭 server、cancel context、停止 goroutine 并检查临时资源。
- 测试 error chain 时使用 `errors.Is/As`，不要只比较完整字符串。
- 测试 context 时覆盖调用方取消、deadline、下游错误和正常完成。
- goroutine leak 测试优先验证协议 join；必要时比较稳定状态并分析 goroutine profile，不把瞬时总数当唯一断言。
- integration test 区分 mock 能证明的调用协议和真实 driver/network 才能证明的行为。

### Race Detector

常用命令：

```bash
go test -race ./path/to/package
go test -race -count=10 ./path/to/package
```

- `-count` 可提高执行覆盖概率，但不提供形式证明。
- 保留完整 `WARNING: DATA RACE`、Read/Write stack 和 goroutine creation stack。
- 修复共享访问协议，不用删除测试、降低并发或添加 sleep 掩盖报告。
- race build 有显著开销和不同 timing；不能拿它做性能 benchmark。
- 未执行到的路径、逻辑 deadlock、goroutine leak 和 channel ownership 错误可能没有 race report。

### Benchmark

使用标准 testing benchmark，并报告 allocation：

```bash
go test -run='^$' -bench='BenchmarkName$' -benchmem -count=10 ./path/to/package
```

最低要求：

- A/B benchmark 使用相同输入、setup 边界和 correctness contract。
- 不把一次结果或不同机器结果直接比较。
- 区分 `ns/op`、`B/op`、`allocs/op` 与服务级 latency/throughput。
- setup 是否计入要明确，必要时使用 benchmark timer 控制。
- 避免结果未消费而被 compiler 优化，也避免 benchmark 同时测随机生成或日志。
- 并发 benchmark 明确并发度、共享状态和目标 workload，不用 `RunParallel` 就自动代表线上。
- 统计比较应保存原始多次结果，可使用项目已有比较工具。

### pprof

pprof 用于回答“资源花在哪里”，不是自动给根因：

- CPU profile：采样 CPU stack，检查热点是否覆盖故障窗口。
- heap profile：区分 in-use 与 allocated 视角，结合 GC 时点解释。
- allocs profile：定位累计分配来源。
- goroutine profile：观察阻塞 stack 与数量，但要区分正常长期 goroutine。
- mutex/block profile：需要相应采样配置，数据有开销且表示等待样本，不等于完整因果。
- threadcreate 等 profile 只提供特定资源线索。

示意命令：

```bash
go test -run='^$' -bench='BenchmarkName$' -cpuprofile cpu.out ./path/to/package
go tool pprof -top cpu.out
```

服务环境要控制 profile 暴露权限、采样时长和生产开销，不把 debug endpoint 无保护暴露。

### Execution Trace

trace 适合观察 goroutine 调度、网络阻塞、syscall、GC、processor utilization 和 task/region 时间关系：

```bash
go test -run TestScenario -trace trace.out ./path/to/package
go tool trace trace.out
```

- trace 文件可能很大，应选择代表性短窗口。
- trace 能显示调度和阻塞现象，但业务根因仍需结合日志、profile 和代码协议。
- AI 对 trace 截图的解释必须指向具体时间区间、goroutine 和事件，不接受泛化的“调度器有问题”。
- profile 与 trace 有不同观察成本和问题类型，不能互相替代。

### 性能证据闭环

1. 定义问题指标：CPU、allocation、p99、goroutine、mutex wait 或 scheduler latency。
2. 固定 Go/toolchain、GOOS/GOARCH、CPU、环境变量、输入和并发度。
3. 建立 benchmark 或可重复 workload baseline。
4. 用 pprof/trace 定位证据，形成可证伪假设。
5. 做单一关键修改。
6. 重新运行 format、vet、test、race。
7. 重跑 benchmark/profile，比较收益与副作用。

### 连续追问

1. `go test -race` 为什么不能与普通 benchmark 数字直接比较？
2. heap profile 的 in-use 与 allocs 视角分别回答什么问题？
3. CPU profile 没有指向目标函数时，为什么不应按 AI 建议直接重写它？
4. trace 看到大量 runnable goroutine 时，还需要哪些业务、阻塞和 CPU 证据才能归因？

### 常见幻觉

- `gofmt`、`go vet` 通过就宣称程序正确。
- race detector 没报告就宣称没有 deadlock、leak 或业务竞态。
- benchmark 单次变快就断言优化有效。
- 只看 pprof top 一行，不检查采样窗口、调用图和 workload。
- 看到 trace 调度事件就归因 runtime，而不检查无界 goroutine 和阻塞协议。

---

## 5. AI 常见幻觉与验证方法

### 高风险幻觉表

| 幻觉类型 | 常见表现 | 必须验证 |
|----------|----------|----------|
| API/版本幻觉 | 使用目标 Go/依赖版本不存在的函数或 option | `go doc`、compile、目标版本测试 |
| 模块幻觉 | import path、internal 边界、replace 或 build tag 错误 | `go list`、`go mod tidy` diff |
| 并发幻觉 | channel 安全被扩展成整个状态安全 | ownership 表、`go test -race`、退出测试 |
| 取消幻觉 | 认为 cancel 会强杀 goroutine | 每个阻塞点与下游 context contract |
| 错误幻觉 | typed nil、错误链丢失、首错被 ctx error 覆盖 | `errors.Is/As`、失败路径测试 |
| HTTP/RPC 幻觉 | 错误 timeout/retry/stream close API | compile、fake/integration server |
| 数据访问幻觉 | DB 每请求创建、Rows 未关闭、Tx 状态错误 | protocol test、真实 driver 验证 |
| 性能幻觉 | goroutine 越多越快、少一次分配必然降低 p99 | benchmark、pprof、trace |

### 最小验证闭环

1. **审查执行边界**：把仓库命令视为不受信输入，先读脚本；使用 sandbox/最小权限且无生产凭据，限制网络、文件、CPU、内存和时间，确认 download/codegen/post-install/custom analyzer。
2. **固定上下文**：记录 `go version`、`go.mod` 语言版本、module graph、GOOS/GOARCH、build tags。
3. **保留原证据**：完整保存 compile error、panic stack、race report、test failure 或 profile 时间窗口。
4. **先构造 RED**：用单元测试、并发测试或可复现 benchmark 捕获目标问题。
5. **最小修改**：不顺手升级依赖、改公共 interface 或重构无关 package。
6. **基础检查**：执行 `gofmt`、`go vet` 和聚焦 `go test`。
7. **并发检查**：执行 `go test -race`，验证 cancel、close、error 和 join。
8. **范围检查**：执行受影响 module、build tag 和 integration test。
9. **性能检查**：有性能声称才运行 benchmark，并用 pprof/trace 解释。
10. **人工解释**：审查者能说清 goroutine/channel owner、错误语义和证据边界。

### 面试问题与评价

1. AI 生成一个 fan-out/fan-in pipeline，你如何列出每个 channel 的 creator、sender、closer 和退出前置条件？
2. `go test -race` 报告两个 stack 时，怎样定位共享对象和缺失的 synchronization？
3. AI 为 HTTP client 加三层 retry，你如何检查总 deadline、幂等性和请求放大？
4. benchmark 显示 allocs/op 下降但 ns/op 上升，应该如何解释和决策？
5. pprof 与 trace 分别适合回答哪些问题，哪些结论不能只靠其中一个得到？

**实习/应届达标：**

- 会运行 `gofmt`、`go vet`、`go test` 和 `go test -race`。
- 能说明 channel 关闭责任、context 取消和 error 返回路径。
- 能识别共享 map/slice、blocked send、timer/ticker 和 response body 泄漏。

**社招达标：**

- 能设计完整 goroutine lifecycle、deadline budget、首错/全错/部分结果语义。
- 能区分 mock protocol test 与真实 HTTP/RPC/driver 行为。
- 能用 benchmark、pprof 与 trace 建立性能证据链，并说明 race/profile 覆盖边界。

### 最终准入清单

- [ ] 仓库脚本、`go generate` 与测试入口已审查；命令在 sandbox/最小权限、无生产凭据、受限网络/文件/CPU/内存/时间条件下执行。
- [ ] 依赖下载、codegen、post-install、cgo build script、tool install 和 custom analyzer 的来源与副作用已确认。
- [ ] 目标 Go/toolchain、module graph、GOOS/GOARCH 与 build tags 已确认。
- [ ] `gofmt` 无差异，`go vet` 通过。
- [ ] 单元/集成测试覆盖正常、边界、错误和取消路径。
- [ ] `go test -race` 已运行，或未运行原因和风险已记录。
- [ ] 每个新增 goroutine 有 owner、退出条件、cancel source 和 join/进程生命周期说明。
- [ ] 每个 channel 的 sender、receiver、closer 和关闭前置条件明确。
- [ ] error 保留 cause，不存在 typed nil 或被无关 context error 覆盖。
- [ ] HTTP/RPC/database resource 有明确 close/reuse/timeout contract。
- [ ] 性能声称有可复现 benchmark，并由 pprof 或 trace 支撑。
- [ ] 未把 runtime 当前实现、单次测试或 AI 推断包装成规范保证。
````

## File: references/go-coding-challenges.md
size: 33498
sha: ce6f8003fa7036ec1082f94363e1c5ca37cfe9fd
upstream: https://github.com/hazenix/backend-interview-simulator/blob/HEAD/references/go-coding-challenges.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/hazenix/backend-interview-simulator/blob/HEAD/references/go-coding-challenges.md

## File: references/go-tech-knowledge-base.md
size: 81973
sha: eaff28b007136d176ff2c482c3e419a393d84018
upstream: https://github.com/hazenix/backend-interview-simulator/blob/HEAD/references/go-tech-knowledge-base.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/hazenix/backend-interview-simulator/blob/HEAD/references/go-tech-knowledge-base.md

## File: references/java-ai-dev-tools-knowledge-base.md
size: 11148
sha: 13e1dc6b661e2666145567ce963c2698c586bcc5
upstream: https://github.com/hazenix/backend-interview-simulator/blob/HEAD/references/java-ai-dev-tools-knowledge-base.md

````text
# AI 辅助 Java 后端开发知识库

> 本文件只维护 AI 在 Java、JVM 与 Spring 生态中的专项用法。
> 跨语言的任务选择、代码审查、数据库与 API 验证见 `common-ai-dev-knowledge-base.md`；缓存和后端工程原则见 `common-backend-knowledge-base.md`。

---

## 1. Spring Boot 代码生成与审查

### 适合生成的内容

- **边界明确的样板代码** — Controller、DTO、参数校验、异常映射和配置属性类可由 AI 起草，但必须给出当前 Spring Boot、Java 和构建工具版本
- **分层结构草稿** — 让 AI 按 Controller、Application Service、Domain、Repository 的现有项目边界生成，不允许为了套模板擅自增加层级
- **配置迁移辅助** — 在明确目标版本和官方迁移说明后，辅助转换 `application.yml`、自动配置和依赖声明；生成结果必须通过启动测试验证
- **局部重构** — 构造器注入、消除循环依赖、拆分大类和收敛事务边界，应由现有测试证明行为等价

### 审查重点

- `@Transactional` 是否通过 Spring 代理调用，传播行为、只读属性和回滚异常是否符合业务语义
- Bean 生命周期、条件装配和配置绑定是否在当前 Spring Boot 版本有效
- Controller 是否把实体直接暴露，校验错误、业务错误和未知异常是否有稳定映射
- 阻塞调用是否进入错误的执行器，线程池、连接池和超时是否形成一致预算
- 日志、Actuator、metrics 和 trace 是否泄露敏感字段或制造高基数标签

### 提示词示例

```text
基于项目现有的 Spring Boot 版本和同目录代码风格，为 UserService 增加 createUser。
约束：
1. 使用构造器注入，不新增框架或 Lombok 依赖。
2. 事务只覆盖数据库状态变更，不在事务中执行远程调用。
3. 列出修改文件、失败路径和需要补充的测试。
4. 生成后运行现有构建与测试；无法验证的 API 明确标记，不得猜测。
```

### 连续追问与误区

1. AI 如何确认项目使用 Spring Boot 2 还是 3，`javax.*` 与 `jakarta.*` 差异如何验证？
2. 生成的事务注解在 self-invocation 下是否生效，测试如何证明？
3. 自动配置条件为什么未命中，用 `ConditionEvaluationReport` 能获得什么证据？
4. 只通过 `ApplicationContext` 启动是否足以证明真实 HTTP、数据库和序列化边界正确？

**常见误区：**

- 为减少代码量默认加入 Lombok、MapStruct 或新 starter，忽略依赖治理
- 把 `@Transactional` 加在任意方法上就认为事务生效
- 使用模型记忆中的配置键，不检查当前版本 metadata 和启动日志
- 只生成正常路径，没有验证校验失败、事务回滚和下游超时

---

## 2. Java 并发代码审查

### AI 可以辅助发现的问题

- 检查共享可变状态是否受同一同步协议保护，是否存在 check-then-act、迭代期间修改和不安全发布
- 标记 `CompletableFuture`、线程池和并行流中的阻塞调用、异常丢失、错误执行器与缺少超时
- 检查 `ThreadLocal` 清理、锁释放、`InterruptedException` 处理和任务取消传播
- 画出锁获取顺序、线程等待和回调关系，作为死锁或线程饥饿分析的假设输入

### 必须由运行证据验证的问题

- **线程安全不能只靠静态阅读证明** — 需要最小并发回归、重复压力测试、线程 dump、JFR 或 profiler；测试未复现也不等于形式证明
- **原子类不等于复合操作原子** — 多个 `Atomic*` 更新、读后写和跨对象不变量仍可能竞态
- **容器线程安全不等于业务线程安全** — `ConcurrentHashMap` 的单操作安全不能覆盖多个调用组成的业务事务
- **虚拟线程不是无成本线程** — 需验证 pinning、载体线程、连接池和下游并发限制，不能仅凭改用 virtual thread 宣称吞吐提升

### 连续追问与误区

1. 这段代码的共享状态、不变量和 happens-before 边分别是什么？
2. AI 指出的竞态能否写成先失败的并发测试，失败是否来自竞态而非测试本身不稳定？
3. 线程数、队列容量和拒绝策略如何由服务能力与下游预算推导？
4. 修复后如何用 JFR、线程 dump 和压力测试证明锁等待或任务堆积下降？

**常见误区：**

- AI 建议把字段加 `volatile`，但操作实际需要复合原子性
- 为规避同步全部改成 `ConcurrentHashMap`，不定义跨 key 不变量
- 吞掉 `InterruptedException` 或只打印日志，破坏取消协议
- 使用无界队列掩盖背压，直到内存耗尽或尾延迟失控

---

## 3. JVM 与性能排查辅助

### 上下文与证据要求

- 提供 JDK 版本、GC、容器 CPU/内存限制、启动参数、流量变化和问题时间窗口
- 保留关键英文错误原文，例如 `java.lang.OutOfMemoryError: Java heap space`、`GC overhead limit exceeded` 或 `unable to create native thread`
- 让 AI 对 GC 日志、线程 dump、JFR、heap dump 或 async-profiler 结果生成候选解释，但每个结论必须指向原始指标或调用栈
- 将 Java 堆、Metaspace、Code Cache、直接内存、线程栈、文件映射和容器 RSS 分开，不能把所有内存归到 heap

### 典型辅助流程

1. **CPU 飙高** — 先关联流量和容器配额，再定位高 CPU 线程，将系统线程 ID 与 Java 线程栈对齐，最后用 JFR 或采样 profiler 验证热点。
2. **内存增长** — 比较 Full GC 后存活集和分配速率，必要时分析 heap dump 的 dominator tree 与 GC Roots；同时检查 native memory 和线程数量。
3. **延迟抖动** — 对齐请求 p99、GC pause、safepoint、锁等待、线程池队列和下游 trace，避免只凭一条 GC 日志归因。
4. **类加载问题** — 核对类来源、ClassLoader 层级和依赖树，再分析 `ClassNotFoundException`、`NoClassDefFoundError`、`NoSuchMethodError` 的不同含义。

### 连续追问与误区

1. 这个结论能解释故障时间窗口内的哪些指标，反例是什么？
2. dump、JFR 或 profiler 对生产进程的 CPU、磁盘和停顿风险如何控制？
3. 增大 `-Xmx` 是修复、缓解还是延后故障，怎样区分？
4. 参数调整后吞吐、p99、GC 开销和容器成本如何与 baseline 对比？

**常见误区：**

- AI 看到 OOM 就建议增大堆，不区分 heap、Metaspace、direct memory 和 native thread
- 复制其他服务的 GC 参数，不验证对象生命周期、堆规模和 SLO
- 只提供截图或二手摘要，不保留可搜索的原始日志和时间戳
- 把一次 profiler 火焰图当作稳定结论，不检查采样窗口是否覆盖故障

---

## 4. JUnit、Mockito 与集成测试

### 测试生成原则

- 先把需求转成可观察行为和失败用例，再让 AI 生成最小实现；若测试一开始就通过，应检查是否覆盖了目标缺口
- JUnit 测试名表达业务行为，覆盖正常、边界和错误路径；参数化测试用于同一规则的输入矩阵，不把多个无关行为塞进一个用例
- Mockito 只隔离不可控协作者，优先断言返回值、状态和外部可见行为；`verify` 用于确有意义的交互契约，而不是复述实现步骤
- Spring 测试按范围选择：纯 Java 测试、slice test、`@SpringBootTest`、Testcontainers 或真实依赖环境，避免所有测试都启动完整上下文

### AI 生成测试的审查点

- 是否错误地 mock 被测对象、静态全局状态或简单值对象
- 是否因宽泛的 `any()`、默认返回值和过度 stub 让错误实现也能通过
- 是否断言真实异常类型、错误信息或业务状态，而不是只写 `assertNotNull`
- 是否处理时间、随机数、并发、Locale 和时区等不稳定来源
- 集成测试是否实际验证事务、序列化、数据库约束和容器启动，而不是仍由 mock 替代

### 提示词示例

```text
为 UserService.createUser 写 JUnit 5 测试。
先列出业务不变量和失败场景，再逐个写测试；使用真实 User 对象，只 mock 外部 Repository。
至少包含重复 email、密码编码失败和保存异常。
每个测试说明如果实现缺失时预期如何失败，不要修改生产协议来让测试通过。
```

### 连续追问与误区

1. 这个测试是否在修复前因预期原因失败，还是测试配置本身报错？
2. Mockito stub 删除后测试仍通过吗，它是否真正影响被测行为？
3. 数据库唯一约束、事务回滚和序列化需要哪一层集成测试？
4. 并发测试如何控制起跑时序、重复次数和超时，同时减少 flaky？

**常见误区：**

- AI 生成大量 mock 和 interaction verification，看似覆盖率高但没有行为保护
- 只测当前实现分支，不从需求和历史故障设计反例
- 为通过测试暴露生产代码内部方法，或改变业务协议
- 用 H2 内存数据库替代真实数据库后，宣称 SQL 与事务行为已验证

---

## 5. 常见幻觉与验证方法

| 幻觉类型 | 常见表现 | 验证方法 |
|----------|----------|----------|
| 不存在的 API | 生成当前 JDK、Spring 或测试库中没有的方法、注解或参数 | 核对当前依赖版本的官方 API，执行编译和最小运行示例 |
| 版本混用 | 混用 Spring Boot 2/3、`javax`/`jakarta`、旧版安全配置或废弃 JVM 参数 | 输出依赖树与运行时版本，查看迁移说明、编译错误和启动日志 |
| 错误并发保证 | 声称 `volatile`、并发容器或虚拟线程自动解决全部线程安全问题 | 写失败并发测试，检查 happens-before、不变量、JFR 和线程 dump |
| 错误 JVM 归因 | 仅凭 OOM、GC 或 CPU 现象直接给出参数方案 | 对齐时间线，分析 GC 日志、heap/native memory、profile 和容器指标 |
| 脆弱测试 | 测试只验证 mock、立即通过或依赖时间和线程调度 | 先观察 RED，进行 mutation 思考、重复运行和真实边界集成测试 |
| 虚构配置 | 生成不存在或已改名的 Spring 配置键 | 查看 configuration metadata、官方参考和 `ConditionEvaluationReport` |

### 验证闭环

1. **固定环境事实** — 记录 JDK、框架、插件和依赖版本，不允许 AI 自行假设。
2. **保留原始证据** — 保存完整编译错误、异常链、日志、dump 和测试命令，不只提供概括。
3. **构造可证伪检查** — 编译、静态分析、先失败的测试、最小复现或性能 baseline 至少选择一种。
4. **验证受影响范围** — 局部检查通过后运行模块测试、集成测试和构建，确认未破坏兼容性。
5. **人工承担结论** — 审查者能解释生成代码的线程、事务、内存和失败边界，再允许合并或发布。

### 各身份难度参考

| 题目 | 实习 | 应届 | 社招 1-3 年 |
|------|:----:|:----:|:----------:|
| Spring Boot 生成代码验证 | 基础 | 中等 | 深入 |
| Java 并发幻觉识别 | 基础 | 中等 | 深入 |
| JVM 证据链分析 | 了解 | 基础 | 深入 |
| JUnit 与 Mockito 边界 | 基础 | 中等 | 深入 |
````

## File: references/java-coding-challenges.md
size: 59875
sha: 5e2102ef326b520576a2d9d954c0532cf7e4b69b
upstream: https://github.com/hazenix/backend-interview-simulator/blob/HEAD/references/java-coding-challenges.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/hazenix/backend-interview-simulator/blob/HEAD/references/java-coding-challenges.md

## File: references/java-tech-knowledge-base.md
size: 23169
sha: 9e0d7ab7a4911f4ad75e3a80243283ae5b052875
upstream: https://github.com/hazenix/backend-interview-simulator/blob/HEAD/references/java-tech-knowledge-base.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/hazenix/backend-interview-simulator/blob/HEAD/references/java-tech-knowledge-base.md

## File: .gitignore
size: 205
sha: 402581282786c54ca1c994a1d6915cc8e35d6c06
upstream: https://github.com/hazenix/backend-interview-simulator/blob/HEAD/.gitignore

```text
# Local runtime settings
.claude/settings.local.json

# OS metadata
.DS_Store

# Local design and execution notes
/docs/superpowers/

# Local interview inputs and source material
/JavaGuide/
/resume/
/JD/
```

## File: LICENSE
size: 1064
sha: 6bb20ffd8a99c957e36ad2e48ca7a4bee637888c
upstream: https://github.com/hazenix/backend-interview-simulator/blob/HEAD/LICENSE

```text
MIT License

Copyright (c) 2026 Hazenix

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
```
