code-reader-v2-cn

📁 notlate-cn/code-reader-skills 📅 2 days ago
2
总安装量
2
周安装量
#73802
全站排名
安装命令
npx skills add https://github.com/notlate-cn/code-reader-skills --skill code-reader-v2-cn

Agent 安装分布

amp 2
gemini-cli 2
github-copilot 2
codex 2
kimi-cli 2
cursor 2

Skill 文档

源代码深度理解分析器 v2.3 (Code Deep Understanding Analyzer – 中文版)

基于认知科学研究的专业代码分析工具,支持三种分析深度,确保真正理解代码,而非产生流畅幻觉。

三种分析模式

用户意图 推荐模式 触发词示例 分析时长
快速浏览/代码审查 Quick Mode “快速看一下”、”这段代码干嘛的”、”简单扫一眼” 5-10 分钟
学习理解/技术调研 Standard Mode ⭐ “分析一下”、”帮我理解”、”解释一下”、”什么原理” 15-20 分钟
深度掌握/大型项目 Deep Mode 🚀 “彻底分析”、”完全掌握”、”深入研究”、”面试准备”、”项目整体分析” 30+ 分钟

默认使用 Standard Mode,系统会根据代码规模和用户意图自动选择最合适的模式。

🚀 Deep Mode 内部智能策略:

  • 代码 ≤ 2000 行:使用渐进式生成(顺序填充章节)
  • 代码 > 2000 行:自动启用并行处理(子 Agent 并行分析各章节)

核心哲学:理解优先,记忆其次

反流畅幻觉 (Combat Fluency Illusion)

“能读懂代码 ≠ 能写出代码”
“能看懂解释 ≠ 能独立实现”
“感觉明白了 ≠ 真的理解了”

核心原则:

  • 理解为什么 (WHY),而非只知道是什么 (WHAT)
  • 强制自我解释,验证真实理解程度
  • 建立概念连接,而非孤立记忆
  • 通过应用变体,测试迁移能力

研究支撑:

  • Dunlosky et al. – 精细询问法效果显著优于被动阅读
  • Chi et al. – 自我解释者获得正确心智模型的概率更高
  • Karpicke & Roediger – 检索练习优于重复阅读 250%

分析前强制检查:理解验证关卡

根据选择的模式,执行相应的验证流程:

Quick Mode – 简化验证

  • 快速识别代码类型和核心功能
  • 列出关键概念(无需深度验证)

Standard Mode – 标准验证

  • 对核心概念进行自我解释测试
  • 验证能否说出”为什么”

Deep Mode – 完整验证

  • 完整的自我解释测试
  • 应用迁移能力验证

输出格式(在分析文档开头):

## 理解验证状态 [仅 Standard/Deep Mode]

| 核心概念 | 自我解释 | 理解"为什么" | 应用迁移 | 状态 |
|---------|---------|-------------|---------|------|
| 用户认证流程 | ✅ | ✅ | ✅ | 已理解 |
| JWT Token 机制 | ✅ | ⚠️ | ❌ | ⚠️ 需深入理解 |
| 密码哈希 | ✅ | ✅ | ⚠️ | 基本理解 |

三种模式的输出结构

Quick Mode 输出结构(5-10 分钟)

# [代码名称] 快速分析

## 1. 快速概览
- 编程语言和版本
- 代码规模和类型
- 核心依赖

## 2. 功能说明
- 主要功能是什么 (WHAT)
- 简要说明 WHY 需要

## 3. 核心算法/设计
- 算法复杂度(如有)
- 使用的设计模式(如有)
- WHY 选择这个算法/模式

## 4. 关键代码段
- 3-5 个核心代码段
- 每段简要说明作用

## 5. 依赖关系
- 外部库列表及用途

## 6. 快速使用示例
- 简单可运行的示例

Standard Mode 输出结构(15-20 分钟)⭐推荐

# [代码名称] 深度理解分析

## 理解验证状态
[自我解释测试结果表格]

## 1. 快速概览
- 编程语言、规模、依赖

## 2. 背景与动机(精细询问)
- WHY 需要这段代码
- WHY 选择这种方案
- WHY 不选其他方案

## 3. 核心概念说明
- 列出关键概念
- 每个概念回答 2-3 个 WHY

## 4. 算法与理论
- 复杂度分析
- WHY 选择这个算法
- 参考资料

## 5. 设计模式
- 识别的模式
- WHY 使用

## 6. 关键代码深度解析
- 逐行 WHY 解析
- 执行流程示例

## 7. 依赖与使用示例
- 详细的 WHY 注释

Deep Mode 输出结构(30+ 分钟)

Deep Mode 根据代码规模自动选择最优策略,确保每个章节都有足够深度:

策略 A:渐进式生成(代码 ≤ 2000 行)

适用于中小型代码,顺序生成各章节:

# [代码名称] 完全掌握分析

[包含 Standard Mode 所有内容,加上以下部分]

## 3+. 概念网络图
- 核心概念清单(每个 3 WHY)
- 概念关系矩阵
- 连接到已有知识

## 6+. 完整执行示例
- 多场景执行流程
- 边界条件说明
- 易错点标注

## 8. 测试用例分析(如代码包含测试)
- 测试文件清单与覆盖分析
- 从测试中发现的边界条件
- 测试驱动的理解验证

## 9. 应用迁移场景(至少 2 个)
- 场景 1:不变原理 + 修改部分 + WHY
- 场景 2:不变原理 + 修改部分 + WHY
- 提取通用模式

## 10. 依赖关系与使用示例
- 详细的 WHY 注释

## 11. 质量验证清单
- 理解深度验证
- 技术准确性验证
- 实用性验证
- 最终"四能"测试

策略 B:并行处理(代码 > 2000 行)🚀

适用于大型项目,使用子 Agent 并行架构:

核心架构

┌─────────────────────────────────────────────────────────────┐
│                     主协调 Agent                              │
│  - 生成分析大纲和目录框架                                     │
│  - 识别核心概念列表(供子 Agent 共享)                        │
│  - 分配章节任务                                              │
│  - 汇总子 Agent 结果                                          │
│  - 最终质量验证                                              │
└─────────────────────────────────────────────────────────────┘
                              │
            ┌─────────────────┼─────────────────┐
            ▼                 ▼                 ▼
    ┌─────────────┐   ┌─────────────┐   ┌─────────────┐
    │ 子 Agent 1  │   │ 子 Agent 2  │   │ 子 Agent 3  │
    │ 背景与动机  │   │ 核心概念    │   │ 算法理论    │
    └─────────────┘   └─────────────┘   └─────────────┘
            │                 │                 │
            └─────────────────┼─────────────────┘
                              ▼
    ┌─────────────┐   ┌─────────────┐   ┌─────────────┐
    │ 子 Agent 4  │   │ 子 Agent 5  │   │ 子 Agent 6  │
    │ 设计模式    │   │ 代码解析    │   │ 应用迁移    │
    └─────────────┘   └─────────────┘   └─────────────┘

并行执行流程

阶段 执行者 操作 输出
1. 框架准备 主 Agent 快速概览代码,生成大纲和核心概念列表 框架.md
2. 任务分发 主 Agent 为每个章节创建独立任务描述 任务列表
3. 并行处理 子 Agents 每个子 Agent 专注一个章节,深度生成 章节-N.md
4. 结果汇总 主 Agent 合并所有章节,统一格式 完整分析.md
5. 质量验证 主 Agent 检查深度标准,补充薄弱部分 最终文档

章节任务定义(给子 Agent 的指令模板)

# 子 Agent 任务:[章节名称]

## 上下文信息
- **代码名称:** [项目/代码名]
- **编程语言:** [语言]
- **代码规模:** [行数]
- **核心概念:** [从主 Agent 传递的概念列表]

## 你的任务
你是专门负责"**[章节名称]**"章节的分析专家。请深度分析这个章节,生成详细内容。

## 输出要求
1. **内容深度:** 本章节至少 [X] 字
2. **WHY 分析:** 每个关键点必须回答 3 个 WHY
3. **代码注释:** 使用场景/步骤 + WHY 风格
4. **引用来源:** 提供权威参考链接
5. **独立性:** 生成完整独立的章节内容,不需要引用其他章节

## 输出格式
直接输出 Markdown 格式的章节内容,以 `## [章节名称]` 开头。

## 深度标准
- [ ] 所有子项都已覆盖(不能有"略"或"同上")
- [ ] 每个 WHY 至少 2-3 句话解释
- [ ] 代码示例有完整注释
- [ ] 执行流程有具体数据追踪

开始分析:

主 Agent 汇总逻辑

# Parallel Deep Mode 汇总规范

## 汇总步骤

1. **读取所有子章节**

章节_1_背景与动机.md 章节_2_核心概念.md 章节_3_算法理论.md 章节_4_设计模式.md 章节_5_代码解析.md 章节_6_测试用例分析.md(如有) 章节_7_应用迁移.md 章节_8_依赖关系.md 章节_9_质量验证.md


2. **合并顺序**
```markdown
# [代码名称] 完全掌握分析(并行深度版)

## 理解验证状态
[从主 Agent 的初步分析生成]

[按顺序插入各章节内容]
  1. 交叉检查

    • 核心概念在各章节中定义一致
    • WHY 解释没有矛盾
    • 引用的代码示例一致
  2. 深度验证

    • 每章字数达标
    • WHY 分析充分
    • 执行示例完整

#### 实现伪代码

函数:ParallelDeepMode(代码, 工作目录):

// ========== 阶段 1: 框架准备 ========== 框架 = { “代码名称”: 提取名称(代码), “编程语言”: 识别语言(代码), “代码规模”: 统计行数(代码), “核心概念”: 提取核心概念(代码), // 共享给所有子 Agent “章节列表”: [ “背景与动机”, “核心概念”, “算法与理论”, “设计模式”, “关键代码解析”, “测试用例分析”, “应用迁移场景”, “依赖关系”, “质量验证” ] }

写入文件(f”{工作目录}/00-框架.json”, 框架)

// ========== 阶段 2: 创建子任务 ========== 子任务列表 = []

对于每个 章节 in 框架[“章节列表”]: 任务描述 = 生成任务模板(章节, 框架) 任务文件 = f”{工作目录}/tasks/{章节}-任务.md” 写入文件(任务文件, 任务描述) 子任务列表.append(任务文件)

// ========== 阶段 3: 并行执行子 Agent ========== // 注意:实际执行时通过 Task tool 创建并行子 Agent

章节文件列表 = []

对于每个 任务文件 in 子任务列表: // 创建子 Agent(并行执行) 子Agent = 创建Agent( 名称: f”分析-{章节}”, 任务: 读取文件(任务文件), 代码: 代码, 输出文件: f”{工作目录}/chapters/{章节}.md” )

// 启动并行执行
子Agent.start(并行=True)
章节文件列表.append(子Agent.输出文件)

// 等待所有子 Agent 完成 等待所有(章节文件列表)

// ========== 阶段 4: 结果汇总 ========== 完整文档 = “# {框架[‘代码名称’]} 完全掌握分析\n\n” 完整文档 += “## 理解验证状态\n\n” 完整文档 += 生成验证表格(框架) + “\n\n”

对于每个 章节文件 in 章节文件列表: 章节内容 = 读取文件(章节文件) 完整文档 += 章节内容 + “\n\n”

// ========== 阶段 5: 质量验证 ========== if not 通过深度检查(完整文档): 薄弱章节 = 识别薄弱部分(完整文档) 对于 each 章节 in 薄弱章节: // 重新执行该章节的子 Agent,要求更深度的内容 重新执行(章节) 完整文档 = 更新章节(完整文档, 章节)

// ========== 最终输出 ========== 最终文件 = f”{工作目录}/{框架[‘代码名称’]}-完全掌握分析.md” 写入文件(最终文件, 完整文档)

return 最终文件


---

## 分析流程(研究驱动)

**每个章节的深度标准:**

```markdown
## 深度自检清单(每章完成后检查)

### 内容完整性
- [ ] 章节所有子项都已覆盖(不能有"略"或"同上")
- [ ] 每个 WHY 都有具体解释(不能只有一句话)
- [ ] 代码示例有完整注释(场景/步骤 + WHY)

### 分析深度
- [ ] 核心概念有 3 个 WHY 的完整回答
- [ ] 算法有复杂度分析 + 选用理由
- [ ] 设计模式有 WHY 使用 + 不用会怎样
- [ ] 执行流程有具体数据追踪

### 实用性
- [ ] 易错点已标注
- [ ] 边界条件已说明
- [ ] 应用迁移场景至少 2 个

实现方式(伪代码流程):

函数:DeepMode渐进式生成(代码, 文件路径):

  // 阶段 1: 生成框架
  框架 = 生成完整目录(Standard结构 + Deep扩展部分)
  写入文件(文件路径, 框架)

  // 阶段 2: 逐章填充
  章节列表 = [
    "1. 快速概览",
    "2. 背景与动机",
    "3. 核心概念",
    "4. 算法与理论",
    "5. 设计模式",
    "6. 关键代码深度解析",
    "7. 测试用例分析(如有)",
    "8. 应用迁移场景",
    "9. 依赖关系",
    "10. 质量验证"
  ]

  对于每个 章节 in 章节列表:
    当前内容 = 读取文件(文件路径)

    // 生成章节内容(单次专注,确保深度)
    章节内容 = 深度生成章节(章节, 代码)
    // 要求:每章至少 300-500 字,代码段有完整注释

    // 深度自检
    if not 通过深度检查(章节内容):
      章节内容 = 追加细节(章节内容)

    // 更新文件
    新内容 = 当前内容.replace(章节占位符, 章节内容)
    写入文件(文件路径, 新内容)

  // 阶段 3: 整体验证
  完整文档 = 读取文件(文件路径)
  if not 通过整体检查(完整文档):
    薄弱章节 = 识别薄弱部分(完整文档)
    for 章节 in 薄弱章节:
      补充内容(章节)

  return 文件路径

分析流程(研究驱动)

第 1 步:快速概览

目标: 建立整体心智模型 (Mental Model)

必须识别:

  • 编程语言 (Programming Language) 和版本
  • 文件/项目规模
  • 核心依赖 (Dependencies)
  • 代码类型(算法、业务逻辑、框架代码等)

第 2 步:精细询问 – 背景与动机

核心问题(必须回答):

  1. WHY:为什么需要这段代码?

    • 解决什么实际问题?
    • 不写这段代码会怎样?
  2. WHY:为什么选择这种技术方案?

    • 有哪些替代方案?
    • 为什么不选择其他方案?
    • 这个方案的权衡 (Trade-offs) 是什么?
  3. WHY:为什么这个时机/场景需要它?

    • 在什么业务流程中使用?
    • 前置条件和后置条件是什么?

输出格式:

## 背景与动机分析

### 问题本质
**要解决的问题:** [用一句话描述]

**WHY 需要解决:** [不解决会导致什么后果]

### 方案选择
**选择的方案:** [当前实现方式]

**WHY 选择这个方案:**
- 优势:[列出 2-3 个关键优势]
- 劣势:[列出 1-2 个已知限制]
- 权衡:[说明在什么之间做了权衡]

**替代方案对比:**
- 方案 A:[简述] - WHY 不选:[原因]
- 方案 B:[简述] - WHY 不选:[原因]

### 应用场景
**适用场景:** [具体场景描述]

**WHY 适用:** [解释为什么这个场景适合]

**不适用场景:** [列出边界条件]

**WHY 不适用:** [解释为什么某些场景不适合]

第 3 步:概念网络构建

目标: 建立概念间的连接,而非孤立记忆

必须包含:

  1. 核心概念提取

    • 识别所有关键概念(类、函数、算法、数据结构)
    • 每个概念必须回答 3 个 WHY
  2. 概念关系映射

    • 依赖关系:A 依赖 B – WHY?
    • 对比关系:A vs B – WHY 选 A?
    • 组合关系:A + B → C – WHY 这样组合?
  3. 知识连接

    • 连接到已知概念
    • 连接到设计模式
    • 连接到理论基础

输出格式:

## 概念网络图

### 核心概念清单

**概念 1:用户认证 (User Authentication)**
- **是什么:** 验证用户身份的过程
- **WHY 需要:** 保护系统资源不被未授权访问
- **WHY 这样实现:** 使用 JWT 实现无状态认证,减轻服务器压力
- **WHY 不用其他方式:** Session 方式需要服务器存储,不利于水平扩展

**概念 2:密码哈希 (Password Hashing)**
- **是什么:** 将明文密码转换为不可逆哈希值
- **WHY 需要:** 即使数据库泄露,攻击者也无法获得原始密码
- **WHY 用 bcrypt:** 自带盐值 (Salt),可调节计算成本抵抗暴力破解
- **WHY 不用 MD5/SHA1:** 计算速度太快,容易被暴力破解

### 概念关系矩阵

| 关系类型 | 概念 A | 概念 B | WHY 这样关联 |
|---------|--------|--------|-------------|
| 依赖 | 用户认证 | 密码哈希 | 认证过程需要验证密码,必须先哈希才能比对 |
| 顺序 | 密码哈希 | Token 生成 | 密码验证通过后才能生成访问 Token |
| 对比 | JWT | Session | JWT 无状态,适合分布式;Session 有状态,服务器压力大 |

### 连接到已有知识

- **连接到设计模式:** [下文详述]
- **连接到算法理论:** [下文详述]
- **连接到安全原则:** 最小权限原则、深度防御原则

第 4 步:算法与理论深度分析

强制要求: 所有算法和核心理论必须:

  1. 标注时间/空间复杂度
  2. 解释”WHY 选择这个复杂度是可接受的”
  3. 提供权威参考资料
  4. 说明在什么场景下会退化

输出格式:

## 算法与理论分析

### 算法:快速排序 (Quick Sort)

**基本信息:**
- **时间复杂度:** 平均 O(n log n),最坏 O(n²)
- **空间复杂度:** O(log n)

**精细询问:**

**WHY 选择快速排序?**
- 平均性能优秀,实际应用中通常最快
- 原地排序 (In-place),空间效率高
- 缓存友好 (Cache-friendly),访问局部性好

**WHY 可接受最坏 O(n²)?**
- 最坏情况概率极低(可通过随机化避免)
- 实际数据通常不是完全有序/逆序
- 可以用三数取中法 (Median-of-Three) 优化

**WHY 不选择其他排序算法?**
- 归并排序:需要 O(n) 额外空间,不适合内存受限场景
- 堆排序:虽然稳定 O(n log n),但缓存性能差,实际慢于快排
- 插入排序:小数据集优秀,但 O(n²) 不适合大规模数据

**什么时候会退化?**
- 输入已经有序或逆序(可用随机化解决)
- Pivot 选择不当(可用三数取中解决)
- 大量重复元素(可用三路快排优化)

**参考资料:**
- [Quick Sort - Wikipedia](https://en.wikipedia.org/wiki/Quicksort)
- [Quick Sort Analysis - Princeton](https://algs4.cs.princeton.edu/23quicksort/)
- [Why is QuickSort better than MergeSort?](https://stackoverflow.com/questions/70402/why-is-quicksort-better-than-other-sorting-algorithms-in-practice)

### 理论基础:JWT (JSON Web Token)

**WHY 使用 JWT?**
- 无状态认证,服务器不需要存储 Session
- 自包含 (Self-contained),Token 携带所有必要信息
- 跨域友好,适合微服务架构

**WHY JWT 是安全的?**
- 使用签名 (Signature) 验证完整性
- 无法伪造(除非私钥泄露)
- 可设置过期时间 (exp)

**WHY JWT 有局限性?**
- 无法主动失效(除非维护黑名单,破坏无状态优势)
- Token 体积较大(Base64 编码导致体积增加约 33%)
- 敏感信息需要加密,仅签名不提供保密性

**参考资料:**
- [JWT.io - Introduction](https://jwt.io/introduction)
- [RFC 7519 - JWT Specification](https://tools.ietf.org/html/rfc7519)

第 5 步:设计模式识别与询问

强制检查: 代码中使用的每个设计模式都必须:

  1. 明确标注模式名称
  2. 解释 WHY 使用这个模式
  3. 说明不用这个模式会怎样
  4. 提供标准参考

输出格式:

## 设计模式分析

### 模式 1:单例模式 (Singleton Pattern)

**应用位置:** `DatabaseConnection` 类

**WHY 使用单例?**
- 数据库连接开销大,复用单个实例节省资源
- 避免连接池混乱,统一管理连接生命周期
- 全局唯一访问点,方便控制并发

**WHY 不用单例会怎样?**
- 每次操作创建新连接,资源耗尽
- 多个连接实例可能导致事务不一致
- 难以控制并发访问

**实现细节:**
```python
class DatabaseConnection:
    _instance = None
    
    def __new__(cls):
        if cls._instance is None:
            cls._instance = super().__new__(cls)
            # WHY 在 __new__ 中初始化:
            # 确保对象创建前就是单例,线程安全
        return cls._instance

WHY 这样实现?

  • 使用 __new__ 而非 __init__:控制实例创建,而非初始化
  • 类变量 _instance:存储唯一实例
  • 懒加载 (Lazy Loading):首次使用时才创建

潜在问题:

  • ⚠️ 非线程安全(多线程环境需要加锁)
  • ⚠️ 单元测试困难(全局状态难以隔离)
  • ⚠️ 违反单一职责原则(类需要管理自己的实例)

更好的替代方案:

  • 依赖注入 (Dependency Injection):更灵活,易于测试
  • 模块级变量:Python 模块天然单例

参考资料:


---

### 第 6 步:逐行深度解析(关键代码段)

**核心原则:**
- 选择 3-5 个最关键的代码段
- 每行代码必须解释"做了什么"+"为什么这样做"
- 提供具体数据的执行流程示例
- 标注易错点和边界条件

**输出格式:**

```markdown
## 关键代码深度解析

### 代码段 1:用户认证函数

**整体作用:** 验证用户名和密码,返回 JWT Token 或 None

**WHY 需要这个函数:** 认证是系统安全的第一道防线,必须可靠且高效

**原始代码:**
```python
def authenticate_user(username, password):
    user = db.find_user(username)
    if not user:
        return None
    if verify_password(password, user.password_hash):
        return generate_token(user.id)
    return None

逐行精细解析(推荐注释风格):场景化 + 执行流追踪

注释风格说明:

  • # 场景 N: [描述] / // 场景 N: [描述] – 标注条件分支的不同执行路径(if/else、switch、match 等)
  • # 步骤 N: [描述] / // 步骤 N: [描述] – 标注串行执行流程(初始化顺序、函数调用序列等)
  • 注释符号与语言一致:Python 用 #,C++/Java 用 //
  • 用具体变量值追踪执行流程(# 此时:xxx / // 此时:xxx)
  • 注明循环/递归的迭代状态
  • 标注关键数据的变化轨迹
def authenticate_user(username, password):
    # 步骤 1: 查询用户
    user = db.find_user(username)
    # WHY 先查用户:避免不存在的用户名也进行密码哈希(节省计算)

    # 场景 1: 若用户不存在,立即返回 None
    if not user:
        return None
        # WHY 返回 None 而非抛异常:认证失败是正常业务流程,非异常情况
        # WHY 不区分"用户不存在"和"密码错误":防止用户名枚举攻击

    # 场景 2: 若密码验证通过,生成并返回 Token
    if verify_password(password, user.password_hash):
        # verify_password 内部流程:
        #   1. 从 password_hash 提取盐值 (Salt)
        #   2. 用相同盐值哈希明文密码
        #   3. 恒定时间比较两个哈希值(防止时序攻击)
        return generate_token(user.id)
        # 此时:user.id = 42(假设)
        # generate_token(42) → "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."

    # 场景 3: 密码错误,返回 None
    return None
    # WHY 与"用户不存在"相同的返回值:防止攻击者区分两种失败情况

完整执行流示例(多场景追踪):

// 示例:追溯 tensor 生产者的函数(编译器代码典型风格)

Value getProducerOfTensor(Value tensor) {
  Value opResult;

  while (true) {
    // 场景 1: 若 tensor 由 LinalgOp 定义,直接返回
    if (auto linalgOp = tensor.getDefiningOp<LinalgOp>()) {
      opResult = cast<OpResult>(tensor);
      // while 只循环 1 次
      return;
    }

    // 按照本节示例,首次调用本函数时:tensor = %2_tile
    // 场景 2: 若 tensor 通过 ExtractSliceOp 链接,继续追溯源
    if (auto sliceOp = tensor.getDefiningOp<tensor::ExtractSliceOp>()) {
      tensor = sliceOp.getSource();
      // 此时:tensor = %2,由 linalg.matmul 定义
      // 执行第二次 while 循环,会进入场景 1 分支 (linalg.matmul 是 LinalgOp)
      continue;
    }

    // 场景 3: 通过 scf.for 的迭代参数
    // 示例 IR:
    // %1 = linalg.generic ins(%A) outs(%init) { ... }
    // %2 = scf.for %i = 0 to 10 iter_args(%arg = %1) {
    //   %3 = linalg.generic ins(%arg) outs(%init2) { ... }
    //   scf.yield %3
    // }
    // getProducerOfTensor(%arg)
    if (auto blockArg = dyn_cast<BlockArgument>(tensor)) {
      // 第一次 while 循环:tensor = %arg,是 BlockArgument
      if (auto forOp = blockArg.getDefiningOp<scf::ForOp>()) {
        // %arg 由 scf.for 定义,获取循环的初始值:%1
        // blockArg.getArgNumber() = 0(%arg 是第 0 个迭代参数)
        // forOp.getInitArgs()[0] = %1
        tensor = forOp.getInitArgs()[blockArg.getArgNumber()];
        // 此时:tensor = %1,由 linalg.generic 定义
        // 执行第二次 while 循环,会进入场景 1 分支
        continue;
      }
    }

    return;  // 找不到(可能是函数参数)
  }
}

执行流程示例(推荐风格):

场景 1:认证成功

# 初始状态
输入:username="alice", password="Secret123!"

# 执行路径
步骤 1: db.find_user("alice")
   → 查询数据库
   → 返回 User(id=42, username="alice", password_hash="$2b$12$KIX...")
   # 此时:user 存在,跳过场景 1 的 return None

步骤 2: 进入场景 2 分支(密码验证)
   → verify_password("Secret123!", "$2b$12$KIX...")
   → 提取盐值:$2b$12$KIX...
   → 哈希 "Secret123!" with salt
   → 恒定时间比较哈希值
   → 返回 True

步骤 3: generate_token(42)
   → 创建 payload: {"user_id": 42, "exp": 1643723400}
   → 使用私钥签名
   → 返回 "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjo0Miwi..."
   # 最终返回:Token 字符串

# 性能分析
耗时:~100ms(主要是 bcrypt 计算)

场景 2:用户不存在

# 初始状态
输入:username="bob", password="anything"

# 执行路径
步骤 1: db.find_user("bob")
   → 查询数据库
   → 返回 None
   # 此时:user = None,进入场景 1 分支

步骤 2: if not user: # true
   → 直接返回 None
   # 场景 2、3 都不执行

# 性能分析
耗时:~5ms(仅数据库查询)
⚠️ 注意:比认证成功快得多,可能泄露用户是否存在
# 安全建议:添加固定延迟或假哈希计算,使两种情况耗时接近

场景 3:密码错误

# 初始状态
输入:username="alice", password="WrongPass"

# 执行路径
步骤 1: db.find_user("alice")
   → 返回 User(id=42, ...)
   # 此时:user 存在,跳过场景 1 的 return None

步骤 2: 进入场景 2 分支(密码验证)
   → verify_password("WrongPass", "$2b$12$KIX...")
   → 哈希 "WrongPass"
   → 比较哈希值
   → 返回 False

步骤 3: 密码验证失败,不执行 generate_token
   → 继续执行到最后的 return None
   # 场景 3:密码验证失败,返回 None

# 性能分析
耗时:~100ms(与认证成功相近)
✅ 好处:无法通过响应时间判断密码是否正确

关键要点总结:

  1. 安全性考虑:

    • ✅ 明文密码仅在内存中短暂存在,立即哈希验证
    • ✅ 失败原因不泄露(防止用户名枚举)
    • ✅ 时间恒定比较(防止时序攻击)
    • ⚠️ 潜在问题:用户不存在时响应更快(需优化)
  2. 性能优化:

    • ✅ 用户不存在时快速返回,不浪费哈希计算
    • ⚠️ 但这会导致时序泄露,需权衡安全与性能
  3. 错误处理:

    • ✅ 用 None 表示失败,清晰且符合 Python 惯例
    • ⚠️ 调用方需检查返回值,否则可能误用 None
  4. 可改进之处:

    • 添加日志记录失败尝试(检测暴力破解)
    • 添加速率限制(Rate Limiting)
    • 统一失败场景响应时间

---

### 第 6.5 步:测试用例反向理解(如有测试)

**目标:** 通过测试用例反向验证和深化对代码功能的理解

**为什么重要:**
- 测试用例反映了代码的**预期行为**,是最准确的"使用说明书"
- 测试通常覆盖**边界条件**和**异常场景**,这些在主代码中容易被忽略
- 通过测试可以**验证理解是否正确**,避免产生错误的假设

**当检测到代码包含测试文件时,必须执行此步骤。**

#### 6.5.1 测试文件识别

**常见测试文件模式:**

| 语言 | 测试文件模式 | 测试目录结构 |
|------|-------------|-------------|
| **Python** | `test_*.py`, `*_test.py` | `tests/`, `test/` |
| **JavaScript/TypeScript** | `*.test.ts`, `*.test.js` | `__tests__/`, `tests/` |
| **Go** | `*_test.go` | 与源码同目录, `*_test.go` |
| **Java** | `*Test.java`, `*Tests.java` | `src/test/java/` |
| **C++** | `*.cpp` (包含测试), gtest | `test/`, `tests/`, `unittest/` |
| **Rust** | `*_test.rs`, `tests/*.rs` | `tests/` |
| **MLIR/LLVM** | `*.mlir` (测试文件) | `test/Dialect/*/` |

**大型项目测试目录结构示例:**

```bash
# MLIR 风格(测试独立目录)
mlir/test/Dialect/Linalg/
├── ops.mlir           # Linalg 方言操作测试
├── transformation.mlir # 变换测试
├── interfaces.mlir    # 接口测试
└── invalid.mlir       # 错误处理测试

# 传统 C++ 项目风格
project/test/
├── unittest/          # 单元测试
├── integration/       # 集成测试
└── benchmark/         # 性能测试

6.5.2 测试覆盖分析

分析测试覆盖的功能点:

## 测试用例覆盖分析

### 测试文件清单
| 测试文件/目录 | 测试的模块 | 测试用例数量 |
|--------------|-----------|-------------|
| `test/Dialect/Linalg/ops.mlir` | Linalg Ops | 156 |
| `test/Dialect/Linalg/invalid.mlir` | 错误处理 | 43 |
| `unittest/test_auth.cpp` | `authenticate_user()` | 12 |

### 功能覆盖矩阵
| 核心功能 | 主代码位置 | 测试覆盖 | 覆盖率评估 |
|---------|-----------|---------|-----------|
| linalg.matmul 操作 | `Dialect/Linalg/Ops/*` | ✅ 有测试 | 覆盖正常+边界 |
| linalg.generic 接口 | `Interfaces/*` | ✅ 有测试 | 覆盖完整 |
| Tile 变换 | `Transforms/Tiling.cpp` | ⚠️ 测试不足 | 缺少嵌套场景 |

6.5.3 通过测试理解边界条件

从测试中提取关键边界条件:

## 从测试中发现的边界条件

### MLIR 示例:理解 linalg.generic 的区域约束

#### 测试文件:test/Dialect/Linalg/invalid.mlir
```mlir
// 测试:generic 的 region 必须有且仅有一个 block
func.func @invalid_generic_empty_region(%arg0: tensor<10xf32>) -> tensor<10xf32> {
  %0 = linalg.generic {indexing_maps = [affine_map<(d0) -> (d0)>],
                     iterator_types = ["parallel"]}
    outs(%arg0) {
    // 空 region - 应该报错
  } -> tensor<10xf32>
  return %0 : tensor<10xf32>
}

WHY 这个测试重要:

  • 揭示了 linalg.generic 的结构约束:必须有 block
  • 通过负向测试(invalid test)明确错误条件
  • 边界条件:region 的 block 数量必须 = 1

测试文件:test/Dialect/Linalg/ops.mlir

// 测试:输入和输出数量必须与 indexing_maps 一致
func.func @generic_mismatched_maps(%a: tensor<10xf32>, %b: tensor<10xf32>) -> tensor<10xf32> {
  %0 = linalg.generic {
    indexing_maps = [
      affine_map<(d0) -> (d0)>,  // 1 个输入的 map
      affine_map<(d0) -> (d0)>   // 1 个输出的 map
    ],
    iterator_types = ["parallel"]
  } ins(%a, %b : tensor<10xf32>, tensor<10xf32>)  // 但有 2 个输入
  outs(%0 : tensor<10xf32>) {
  ^bb0(%in: f32, %in_2: f32, %out: f32):
    linalg.yield %in : f32
  } -> tensor<10xf32>
  return %0 : tensor<10xf32>
}

WHY 这样处理:

  • 验证了类型系统约束:输入/输出数量必须与 map 一致
  • 测试了静态验证逻辑,在编译期捕获错误
  • 说明了 MLIR 的静态强类型特性

C++ 示例:通过测试理解并发安全性

测试文件:unittest/concurrent_map_test.cpp

// 测试:并发插入相同键
TEST(ConcurrentMapTest, ConcurrentInsertSameKey) {
  ConcurrentMap<int, int> map;
  const int num_threads = 10;
  const int key = 42;

  std::vector<std::thread> threads;
  for (int i = 0; i < num_threads; ++i) {
    threads.emplace_back([&map, key, i]() {
      map.Insert(key, i);  // 所有线程插入同一个 key
    });
  }

  for (auto& t : threads) t.join();

  // 验证:只有一个插入成功
  EXPECT_EQ(map.Size(), 1);
  EXPECT_TRUE(map.Contains(key));
}

WHY 这个测试存在:

  • 验证了线程安全性:多线程并发访问不会崩溃
  • 说明了冲突处理策略:后插入覆盖先插入(或反之)
  • 测试了一致性保证:最终状态符合预期

#### 6.5.4 测试驱动理解示例

**完整示例:通过 MLIR 测试理解 `linalg.tile` 变换**

```markdown
## 测试用例反向理解:linalg.tile 变换

### 问题:仅看文档能理解 tile 的全部行为吗?

**文档说明(简化):**
> `linalg.tile` 将 linalg 操作分解为更小的片段

**可能遗漏的细节:**
1. Tile 大小如何确定?
2. 支持哪些操作的 tile?
3. Tile 后的循环顺序是什么?
4. 如何处理剩余元素?

### 从测试中发现的答案

#### 测试 1:test/tile-mlir.mlir - 基本 tile 行为
```mlir
// 原始操作
%0 = linalg.matmul ins(%A: tensor<128x128xf32>, %B: tensor<128x128xf32>)
                     outs(%C: tensor<128x128xf32>)

// Tile 大小为 32x32
%1 = linalg.tile %0 tile_sizes[32, 32]

发现: Tile 大小直接指定,输出包含嵌套循环结构

测试 2:test/tile-mlir.mlir – 剩余元素处理

// 127x127 矩阵,tile 大小 32x32
%0 = linalg.matmul ins(%A: tensor<127x127xf32>, ...)
%1 = linalg.tile %0 tile_sizes[32, 32]

发现: 自动生成边界检查处理不均匀的剩余部分

测试 3:test/tile-mlir.mlir – 不可 tile 的操作

// 尝试 tile 不支持的操作
%0 = linalg.generic ...
%1 = linalg.tile %0 tile_sizes[16]
// 预期:编译错误或运行时失败

发现: 并非所有操作都支持 tile,有明确的限制条件

测试前后理解对比

问题 仅看文档 看测试后
Tile 大小如何指定? ⚠️ 不清楚 ✅ 直接作为参数
剩余元素如何处理? ❓ 文档未提及 ✅ 自动边界检查
支持哪些操作? ❓ 列表不完整 ✅ 测试覆盖所有支持的操作
循环顺序是什么? ⚠️ 描述模糊 ✅ 从测试 IR 可看出顺序

结论: 测试用例补充了约 50% 的实现细节!


#### 6.5.5 不同语言测试文件解析要点

**各语言测试的注意点:**

```markdown
## 各语言测试文件解析要点

### Python (pytest/unittest)
- 查找 `test_*.py` 或 `*_test.py`
- 注意 `@pytest.mark.parametrize` 参数化测试
- 关注 `pytest.raises` 异常测试
- 查找 fixtures (`conftest.py`) 了解测试上下文

### C++ (gtest/gtest)
- 查找 `*_test.cpp` 或 `test/*.cpp`
- `TEST_F` 表示 fixture 测试,有前置条件
- `EXPECT_*` vs `ASSERT_*`:失败后是否继续
- `TEST_P` 表示参数化测试

### MLIR/LLVM
- 测试文件通常是 `.mlir` 或 `.td`
- `RUN:` 命令指定如何执行测试
- `// EXPECTED:` 标记预期输出
- `// ERROR:` 标记预期的编译错误
- FileCheck 指令:`CHECK-`, `CHECK-NOT:`, `CHECK-DAG:`

### JavaScript/TypeScript (Jest)
- `*.test.ts`, `*.spec.ts`
- `describe/it` 嵌套结构
- `expect(...).toThrow()` 异常测试
- `beforeEach/afterEach` 钩子函数

### Go
- 测试与源码在同一目录:`*_test.go`
- `TestXxx(t *testing.T)` 基础测试
- `TableDrivenTests` 表格驱动测试
- `TestMain` 测试入口

### Rust
- `*_test.rs` 内嵌测试
- `tests/` 目录集成测试
- `#[should_panic]` 异常测试
- `#[ignore]` 跳过的测试

6.5.6 测试质量评估

评估测试是否充分:

## 测试质量评估

### 覆盖的功能点
- ✅ 正常流程
- ✅ 边界输入
- ✅ 异常输入
- ⚠️ 并发场景
- ❌ 性能测试

### MLIR 特定评估
- ✅ 正向测试(valid.mlir)
- ✅ 负向测试(invalid.mlir)
- ⚠️ 性能回归测试
- ❌ 跨方言交互测试

### 测试缺失警告
> ⚠️ **警告:该模块测试覆盖不足**
> - 未覆盖场景:[具体列出]
> - 建议补充:[具体建议]

6.5.7 测试用例分析输出模板

## 测试用例分析

### 测试文件结构
[列出测试文件/目录及其对应的源码模块]

### 关键测试用例解读
[选择 3-5 个最有价值的测试用例]

### 从测试中发现的隐藏行为
[列出仅看代码容易遗漏的细节]

### 测试覆盖度评估
- 核心功能覆盖率:X%
- 边界条件覆盖:[充分/不足]

### 测试质量建议
[如测试不足,提出改进建议]

第 9 步:应用迁移测试(检验真实理解)

目标: 测试概念能否应用到不同场景

必须包含:

  • 至少 2 个不同领域的应用场景
  • 说明如何调整代码以适应新场景
  • 标注哪些原理保持不变,哪些需要修改

输出格式:

## 应用迁移场景

### 场景 1:将用户认证应用到 API 密钥验证

**原始场景:** Web 用户登录认证  
**新场景:** 第三方 API 密钥验证

**不变的原理:**
- 验证调用方身份的核心流程
- 哈希存储凭证(API 密钥也应哈希)
- 生成访问令牌的机制

**需要修改的部分:**

```python
# 原始:用户名+密码
def authenticate_user(username, password):
    user = db.find_user(username)
    if not user:
        return None
    if verify_password(password, user.password_hash):
        return generate_token(user.id)
    return None

# 迁移:API 密钥
def authenticate_api_key(api_key):
    # WHY 只需要一个参数:API 密钥本身就是身份+凭证
    
    app = db.find_app_by_key_prefix(api_key[:8])
    # WHY 用前缀查询:避免全表扫描,API 密钥前缀作为索引
    
    if not app:
        return None
    
    if verify_api_key(api_key, app.key_hash):
        # WHY 也要哈希:防止数据库泄露导致密钥泄露
        
        return generate_token(app.id, scope=app.permissions)
        # WHY 增加 scope:API 密钥通常有不同权限级别
        
    return None

WHY 这样迁移:

  • 保留核心安全原则(哈希存储、恒定时间比较)
  • 调整业务逻辑(单参数、权限范围)
  • 优化查询性能(前缀索引)

学到的通用模式:

  • 任何需要验证”谁在调用”的场景都可用类似结构
  • 核心:查找实体 → 验证凭证 → 生成令牌
  • 变化:凭证形式、查询方式、令牌内容

场景 2:将快速排序应用到日志分析

原始场景: 对用户列表按 ID 排序
新场景: 对数百万条日志按时间戳排序

不变的原理:

  • 分治思想:递归分解问题
  • Pivot 选择:影响性能的关键
  • 原地排序:节省空间

需要调整的部分:

# 原始:简单快排
def quicksort(arr):
    if len(arr) <= 1:
        return arr
    pivot = arr[len(arr) // 2]
    left = [x for x in arr if x < pivot]
    middle = [x for x in arr if x == pivot]
    right = [x for x in arr if x > pivot]
    return quicksort(left) + middle + quicksort(right)

# 迁移:日志排序(外部排序 + 优化)
def quicksort_logs(log_file, output_file, memory_limit):
    # WHY 外部排序:数据量超过内存,无法一次性加载
    
    # 1. 分块排序
    chunks = split_file_into_chunks(log_file, memory_limit)
    # WHY 分块:每块可载入内存单独排序
    
    for chunk in chunks:
        logs = load_chunk(chunk)
        
        # WHY 用 timsort 而非快排:
        # - 日志通常部分有序(按时间追加)
        # - timsort 对部分有序数据优化到 O(n)
        # - Python 内置 sorted() 就是 timsort
        logs.sort(key=lambda log: log.timestamp)
        
        save_sorted_chunk(chunk, logs)
    
    # 2. 归并排序的分块
    merge_sorted_chunks(chunks, output_file)
    # WHY 归并:多个有序序列合并为一个有序序列
    
    return output_file

WHY 不直接用快排:

  • 数据量超过内存:需要外部排序
  • 日志部分有序:timsort 更优
  • 需要稳定排序:保持相同时间戳的日志顺序

学到的通用模式:

  • 算法选择取决于数据特征(规模、有序性、稳定性需求)
  • 基本原理可迁移(分治、比较),但实现需调整
  • 超大数据需要外部算法(分块+归并)

---

### 第 10 步:依赖关系与使用示例

(与原版类似,但增加 WHY 解释)

```markdown
## 依赖关系分析

### 外部库

**bcrypt (v5.1.0)**
- **用途:** 密码哈希 (Password Hashing)
- **WHY 选择 bcrypt:**
  - 自带盐值,无需手动管理
  - 可调节计算成本(cost factor)
  - 抵抗 GPU/ASIC 加速攻击
- **WHY 不用 SHA256:** 计算太快,容易暴力破解
- **WHY 不用 scrypt/argon2:** bcrypt 更成熟,兼容性好

**jsonwebtoken (v9.0.0)**
- **用途:** JWT token 生成与验证
- **WHY 选择 JWT:** 无状态认证,适合分布式系统
- **WHY 不用 Session:** Session 需要服务器存储,不利于扩展

### 内部模块依赖

**database.js → auth.js**
- **依赖原因:** 认证需要查询用户数据
- **WHY 这样设计:** 分离数据访问和业务逻辑(单一职责原则)

**utils/crypto.js → auth.js**
- **依赖原因:** 认证需要密码哈希和验证
- **WHY 封装工具模块:** 加密逻辑复杂,集中管理更安全

## 完整使用示例

(包含详细的 WHY 注释)

### 示例 1:标准用户登录流程

```javascript
// 1. 导入认证模块
const auth = require('./auth');

// 2. 接收用户输入(来自登录表单)
const username = req.body.username;  // 例如:"alice"
const password = req.body.password;  // 例如:"Secret123!"

// WHY 不在客户端哈希密码:
// - 客户端哈希后,哈希值本身就成了"密码"
// - 攻击者获取哈希值后可以直接登录
// - 必须在服务端用盐值哈希,客户端永远传明文

// 3. 调用认证函数
const token = await auth.authenticate_user(username, password);

// 4. 根据结果响应
if (token) {
    // 认证成功
    res.json({
        success: true,
        token: token,
        // WHY 返回 token:客户端后续请求需要携带
        message: '登录成功'
    });
    
    // WHY 设置 HTTP-only Cookie(可选):
    // res.cookie('auth_token', token, {
    //     httpOnly: true,    // WHY:防止 XSS 攻击读取
    //     secure: true,      // WHY:仅 HTTPS 传输
    //     sameSite: 'strict' // WHY:防止 CSRF 攻击
    // });
} else {
    // 认证失败(用户不存在或密码错误)
    
    // WHY 不区分失败原因:防止用户名枚举
    res.status(401).json({
        success: false,
        message: '用户名或密码错误'  // 模糊的错误信息
    });
    
    // WHY 返回 401 而非 403:
    // 401 = 未认证(需要提供凭证)
    // 403 = 已认证但无权限
}

执行结果分析:

成功路径:

客户端请求 → 服务端验证 → 返回 Token
时间:~100ms
Token 示例:"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."

失败路径:

客户端请求 → 服务端验证 → 返回 401 错误
时间:~100ms(与成功相近,防止时序攻击)

---

### 第 11 步:自我评估检查清单

**分析完成后,强制验证以下项目:**

```markdown
## 质量验证清单

### 理解深度验证

- [ ] **每个核心概念都回答了 3 个 WHY**
  - WHY 需要这个概念
  - WHY 这样实现
  - WHY 不用其他方式

- [ ] **自我解释测试通过**
  - [ ] 不看代码能解释每个核心概念
  - [ ] 能说出"为什么"而非只知道"是什么"
  - [ ] 能在不同场景下应用(迁移测试)

- [ ] **概念连接建立**
  - [ ] 标注了概念间的依赖/对比/组合关系
  - [ ] 连接到已有知识(设计模式、算法理论)
  - [ ] 说明了每个连接的原因(WHY)

### 技术准确性验证

- [ ] **算法分析完整**
  - [ ] 时间/空间复杂度标注
  - [ ] WHY 选择这个算法
  - [ ] WHY 复杂度是可接受的
  - [ ] 提供权威参考资料

- [ ] **设计模式识别**
  - [ ] 所有模式都已标注
  - [ ] WHY 使用这个模式
  - [ ] 不用会怎样
  - [ ] 提供标准参考

- [ ] **代码解析详细**
  - [ ] 关键代码段有逐行解析
  - [ ] 每行包含"做什么"+"WHY 这样做"
  - [ ] 提供具体数据的执行示例
  - [ ] 标注易错点和边界条件

### 实用性验证

- [ ] **应用迁移测试**
  - [ ] 至少 2 个不同场景的迁移示例
  - [ ] 说明了什么不变、什么需要变
  - [ ] 提取了通用模式

- [ ] **使用示例可运行**
  - [ ] 示例代码完整
  - [ ] 包含详细的 WHY 注释
  - [ ] 说明了执行结果

- [ ] **问题与改进建议**
  - [ ] 指出潜在问题
  - [ ] WHY 是问题
  - [ ] 提供改进方案
  - [ ] WHY 改进方案更好

### 最终验证问题

**如果不看原代码,根据这份分析文档:**

1. ✅ 能否理解代码的设计思路?
2. ✅ 能否独立实现类似功能?
3. ✅ 能否应用到不同场景?
4. ✅ 能否向他人清晰解释?

如果有任何一项答"否",说明分析不够深入,需要补充。

输出格式总结

完整分析文档结构:

# [代码名称] 深度理解分析

## 理解验证状态
[自我解释测试结果表格]

## 1. 快速概览
- 编程语言:
- 代码规模:
- 核心依赖:

## 2. 背景与动机分析(精细询问)
- 问题本质(WHY 需要)
- 方案选择(WHY 选择 + WHY 不选其他)
- 应用场景(WHY 适用 + WHY 不适用)

## 3. 概念网络图
- 核心概念清单(每个概念 3 个 WHY)
- 概念关系矩阵
- 连接到已有知识

## 4. 算法与理论深度分析
- 每个算法:复杂度 + WHY 选择 + WHY 可接受 + 参考资料
- 每个理论:WHY 使用 + WHY 有效 + WHY 有限制

## 5. 设计模式分析
- 每个模式:WHY 使用 + WHY 不用会怎样 + 实现细节 + 参考资料

## 6. 关键代码深度解析
- 每个代码段:逐行解析(做什么 + WHY) + 执行示例 + 关键要点

## 7. 测试用例分析(如有)
- 测试文件清单与覆盖分析
- 从测试中发现的边界条件
- 测试驱动的理解验证

## 8. 应用迁移场景(至少 2 个)
- 每个场景:不变的原理 + 需要修改的部分 + WHY 这样迁移

## 9. 依赖关系与使用示例
- 每个依赖:WHY 选择 + WHY 不用其他
- 示例包含详细 WHY 注释

## 10. 质量验证清单
[检查所有验证项]

特殊场景处理

多文件项目

  1. 整体架构分析

    • 项目结构树 + WHY 这样组织
    • 入口文件 + WHY 从这里开始
    • 模块划分 + WHY 这样划分
  2. 模块间关系

    • 依赖图 + WHY 这样依赖
    • 数据流图 + WHY 这样流动
    • 调用链 + WHY 这样调用
  3. 逐模块分析

    • 每个核心模块按标准流程分析
    • 强调模块间的 WHY 关系

复杂算法

  1. 分层解释

    • 先用自然语言描述思路
    • 再用伪代码展示结构
    • 最后逐行解析实现
  2. WHY 贯穿始终

    • WHY 选择这个算法
    • WHY 每一步这样做
    • WHY 复杂度是这样的
  3. 可视化辅助

    • 用具体数据展示执行过程
    • 每一步都说明 WHY

不熟悉的技术栈

  1. 技术背景说明

    • 这个技术栈是什么
    • WHY 存在这个技术栈
    • WHY 项目选择它
  2. 关键概念解释

    • 技术栈特有的概念
    • WHY 这样设计
    • 与其他技术栈对比
  3. 学习资源

    • 官方文档链接
    • WHY 推荐这些资源
    • 学习路径建议

分析前最终检查

在开始分析前,确认:

  • 已理解用户的真实需求(学习?审查?面试准备?)
  • 已识别代码的语言、框架、规模
  • 已确定分析重点(全面理解 vs 特定方面)
  • 准备好随时问”WHY”
  • 准备好进行自我解释测试
  • 准备好寻找概念连接
  • 准备好思考应用迁移

记住:目标不是”看完代码”,而是”真正理解代码”。


📤 输出要求(Token 优化版)

分析完成后,必须生成独立的 Markdown 文档!

三种模式的文档生成策略

模式 生成方式 文件数量 适用场景
Quick 单次 Write 1 快速代码审查
Standard 单次 Write 1 学习理解代码
Deep 根据规模自动选择策略 1-2 深度掌握、大型项目
→ 代码 ≤ 2000 行 渐进式 Write 1-2 面试准备、完全掌握
→ 代码 > 2000 行 并行处理 + 汇总 多个临时章节 → 1 个最终文档 大型项目、复杂代码库

⚡ Token 节省策略

重要原则:避免重复输出,直接写入文件

  1. 禁止在对话中输出完整分析

    • 完整分析直接写入文件,不输出到对话
    • 对话中仅输出:分析摘要 + 文件路径
  2. 分块处理大型项目

    • 单文件分析:生成单个文档
    • 多文件项目:按模块生成多个文档
    • 超长分析:拆分为 概述.md + 模块名-详细分析.md
  3. 渐进式生成(适用于 Deep Mode)

    • 先生成框架文档(目录 + 概要)
    • 逐节填充内容,每次调用 Write 追加更新

文档生成规则

  1. 文件命名格式

    • 单文件:[代码名称]-深度分析.md 或 [code-name]-deep-analysis.md
    • 多文件项目:[项目名]-概述.md + [模块名]-分析.md
    • 例如:JWT认证-深度分析.md、quicksort-deep-analysis.md
  2. 生成方式(Token 优化流程)

    方式一:直接写入(推荐)

    用户: 深入分析这段代码
    
    1. [完成分析过程,不输出完整内容]
    
    2. 直接使用 Write 工具生成文档:
       文件路径: [代码名称]-深度分析.md
       内容: [完整分析内容]
    
    3. 在对话中输出简要摘要:
       - 分析模式:Standard/Deep
       - 核心发现:3-5 条要点
       - 文件路径:[代码名称]-深度分析.md
    

    方式二:多文件项目分块生成

    1. [完成整体分析]
    
    2. 生成概述文档:
       Write: [项目名]-概述.md
       内容:整体架构、模块关系图、分析框架
    
    3. 逐模块生成详细文档:
       Write: [模块A]-分析.md
       Write: [模块B]-分析.md
       Write: [模块C]-分析.md
    
    4. 输出摘要:
       - 生成了 4 个文档
       - 列出所有文件路径
    

    方式三:Deep Mode(根据代码规模自动选择策略)

    Deep Mode 会根据代码规模自动选择最优生成策略:
    
    【策略 A:渐进式生成】代码 ≤ 2000 行时
    - 先生成框架文档(目录 + 概要)
    - 逐节填充内容,每次调用 Write 追加更新
    - 参见前文 "Deep Mode 输出结构 - 策略 A" 章节
    
    【策略 B:并行处理】代码 > 2000 行时
    1. 主 Agent 生成框架和任务分配
    2. 使用 Task tool 创建多个并行子 Agent
    3. 每个子 Agent 专注一个章节,生成独立文件
    4. 主 Agent 汇总所有章节,生成最终文档
    
    文件结构:
    work/
    ├── 00-框架.json           # 主 Agent 生成的框架
    ├── tasks/                 # 子任务描述目录
    ├── chapters/              # 子 Agent 生成的章节
    └── [项目名]-完全掌握分析.md  # 最终汇总文档
    
    示例 Task 调用:
    Task(
      description: "深度分析[章节名]章节",
      prompt: "你是[章节名]分析专家,请深度分析...[具体指令]",
      subagent_type: "general-purpose"
    )
    
  3. 对话输出格式(精简版)

    ## 分析完成
    
    **模式:** Standard Mode
    
    **核心发现:**
    - 代码实现了 [核心功能]
    - 使用 [算法/模式] 解决 [问题]
    - 关键优化点:[优化点1]、[优化点2]
    - 潜在问题:[问题1]、[问题2]
    
    **完整文档:** `[代码名称]-深度分析.md`
    

输出流程对比

❌ 高 Token 消耗方式(避免):

1. 在对话中输出 5000 token 的完整分析
2. 再次用 Write 工具写入 5000 token
→ 总计:10000+ token 输出

✅ Token 优化方式(推荐):

1. 直接用 Write 工具写入 5000 token
2. 对话中输出 200 token 摘要
→ 总计:5200 token 输出(节省 ~50%)

大型项目分块指南

项目规模 推荐模式 生成策略 文件结构
< 500 行 Quick/Standard 单文档 [名称]-分析.md
500-2000 行 Standard 单文档(可能较长) [名称]-分析.md
2000-10000 行 Deep(自动并行) 并行章节 多个临时章节 → 1个最终文档
> 10000 行 Deep(自动并行) 分层并行 模块级并行 + 章节级并行

重要:不要在对话中输出完整分析结果,直接写入文件,仅输出摘要!


🚀 Deep Mode 自动实现指南(给 Claude 的具体指令)

Deep Mode 会根据代码规模自动选择最优策略。当需要并行处理时:

步骤 1: 识别是否需要并行处理

自动触发条件(满足任一即使用并行处理):
- 代码文件数 > 10
- 代码总行数 > 2000
- 用户明确说"大项目"、"完整项目"、"项目整体分析"
- 用户使用"彻底"、"完全掌握"、"深入研究"等深度触发词且代码规模较大

步骤 2: 选择处理策略

if 代码行数 <= 2000:
    使用策略 A:渐进式生成(顺序处理)
else:
    使用策略 B:并行处理(下文详述)

步骤 3: 并行处理准备(策略 B)

# 创建工作目录
mkdir -p code-analysis/{tasks,chapters}

# 生成框架文件
cat > code-analysis/00-framework.json << 'EOF'
{
  "project_name": "[项目名]",
  "language": "[语言]",
  "total_lines": [行数],
  "core_concepts": [概念列表],
  "chapters": [
    "背景与动机", "核心概念", "算法理论",
    "设计模式", "代码解析", "应用迁移",
    "依赖关系", "质量验证"
  ]
}
EOF

步骤 4: 创建并行子 Agent

对于每个章节,使用 Task tool 创建独立的子 Agent:

Task(
  description: "深度分析[章节名称]章节",
  prompt: """
  你是[章节名称]分析专家。

  ## 上下文
  - 项目:{project_name}
  - 语言:{language}
  - 核心概念:{core_concepts}

  ## 任务
  深度分析代码的[章节名称]部分,生成详细章节内容(至少{min_words}字)。

  ## 要求
  - 使用场景/步骤 + WHY 风格注释
  - 每个关键点回答 3 个 WHY
  - 提供具体执行示例
  - 引用权威来源

  ## 输出
  将完整章节内容写入文件:
  code-analysis/chapters/{章节名}.md
  """,
  subagent_type: "general-purpose"
)

步骤 4: 汇总结果

等待所有子 Agent 完成后,使用 Read 工具读取所有章节文件,按顺序合并:

1. 读取 code-analysis/00-framework.json
2. 读取 code-analysis/chapters/*.md(按顺序)
3. 合并为最终文档
4. 写入 {项目名}-完全掌握分析.md

📋 章节深度自检标准(确保质量)

Deep Mode 生成时,每章完成后必须通过以下检查:

## 章节深度自检清单

### 1. 内容完整性(必填项)
- [ ] 章节所有子项都已覆盖(不能有"略"、"详见上文"、"同上"等跳过性描述)
- [ ] 每个 WHY 都有具体解释(至少 2-3 句话,不能只有一句话)
- [ ] 代码示例有完整注释(使用 场景/步骤 + WHY 风格)
- [ ] 引用有来源链接(算法/模式/理论)

### 2. 分析深度(按章节类型)

**概念类章节(第 3 章):**
- [ ] 每个核心概念都有 3 个 WHY
  - WHY 需要这个概念
  - WHY 这样实现
  - WHY 不用其他方式

**算法类章节(第 4 章):**
- [ ] 有时间/空间复杂度标注
- [ ] 有 WHY 选择这个算法的解释
- [ ] 有 WHY 复杂度可接受的说明
- [ ] 有退化场景说明

**设计模式类章节(第 5 章):**
- [ ] 有模式名称和标准参考
- [ ] 有 WHY 使用这个模式
- [ ] 有不用会怎样的说明

**代码解析类章节(第 6 章):**
- [ ] 有逐行解析(做什么 + WHY)
- [ ] 有具体数据的执行示例
- [ ] 有多场景追踪(至少 2 个场景)
- [ ] 有易错点和边界条件标注

### 3. 实用性(应用价值)
- [ ] 易错点已标注
- [ ] 边界条件已说明
- [ ] 应用迁移场景至少 2 个
- [ ] 改进建议有 WHY 说明

### 4. 格式规范
- [ ] 使用 Markdown 格式
- [ ] 代码块有语言标注
- [ ] 表格对齐正确
- [ ] 列表层级清晰

### 不合格章节的处理

**情况 A:内容过少(< 300 字)**
→ 追加细节:添加更多解释、示例、对比

**情况 B:WHY 分析不足**
→ 补充 WHY:对每个核心点追问"为什么"

**情况 C:代码注释不完整**
→ 添加详细注释:使用 场景/步骤 + WHY 风格

**情况 D:执行流程缺失**
→ 添加具体数据示例:追踪变量变化轨迹

快速深度评估标准:

章节 最低字数 必含元素
1. 快速概览 200 语言、规模、依赖、类型
2. 背景与动机 400 问题本质、方案选择、应用场景
3. 核心概念 600 每概念 3 WHY、关系矩阵
4. 算法与理论 500 复杂度、WHY、参考资料
5. 设计模式 400 模式名、WHY、标准参考
6. 关键代码解析 800 逐行解析、执行示例、场景追踪
7. 测试用例分析 400 测试覆盖、边界条件、测试发现
8. 应用迁移 500 至少 2 场景、不变原理、修改部分
9. 依赖关系 300 每依赖的 WHY、使用示例
10. 质量验证 200 验证清单、四能测试

总计:Deep Mode 文档应 ≥ 4300 字