用 AI Agent 逆向 5000 个代码文件:从遗留系统到需求规格说明书的全过程

逆向工程实践 · AI Agent · 2026-08

一套运行多年的企业级软件,文档散落、人员更迭、业务逻辑锁在代码里。能不能让 AI 直接读代码,逆推出一份完整的需求文档?我们用一个真实项目验证了这件事。

5000+ 源文件 250+ Controller 900+ 数据实体 15 业务领域

接手一个没有文档的老系统是很多技术团队的噩梦。业务逻辑全在代码里,新人上手靠口口相传,重构和迁移更是无从下手。这次我们尝试让 AI Agent 直接扫描代码目录,自动完成从代码结构分析到需求文档撰写的全过程。本文记录完整的方法论、踩过的坑和最终效果。

目录

  1. 问题:当业务逻辑只存在于代码中
  2. 思路:AI 逆向需求的三层映射模型
  3. 实战:五步完成代码到文档
  4. 关键技术决策与踩坑记录
  5. 产出物与效果评估
  6. 方法论总结与适用边界

1. 问题:当业务逻辑只存在于代码中

企业软件有一个普遍困境:系统上线运行多年,经历了多轮迭代和人员变动,最初的需求文档早已过时甚至丢失。真正的"需求"散落在三个地方——

  • 代码里:Controller 名称暗示功能点,Service 层藏着业务规则,Entity 字段定义了数据模型;
  • 数据库里:表结构、字段约束、外键关系是数据模型的最终真相;
  • 人脑里:老员工知道为什么这么设计、哪些字段已经废弃、哪些流程有历史包袱。

传统做法是组织人力逐模块阅读代码、访谈关键人员、手工整理文档。一个中等规模的系统,这个过程通常需要数周甚至数月,而且整理出来的文档在完成的那一刻就开始过时。

我们面对的是一套典型的行业管理软件——C# ASP.NET MVC 架构,17 个项目,5000 多个源文件,涵盖十几个业务领域。它有三个客户变体版本,代码中通过命名前缀和独立模块区分。目标很明确:在不依赖原开发团队的情况下,仅从代码出发,逆推出一份按领域分类的完整需求规格说明书

核心挑战

不是"读不懂代码",而是代码量太大、模块太多。人工逐个文件阅读效率极低,且容易遗漏跨模块的业务关联。需要一种结构化的方法,让 AI 能够系统性地扫描、归类和提炼,而不是泛泛地"看一眼代码就开始写"。


2. 思路:AI 逆向需求的三层映射模型

在动手之前,我们先建立了一个核心认知:MVC 架构本身就是一座从代码通往需求的桥梁。在典型的 ASP.NET MVC 项目中,代码结构与业务需求之间存在三层可机械提取的映射关系:

代码层 映射到需求 提取方式
Areas/ 目录 业务领域——每个 Area 对应一个业务模块 列出顶层目录名称
*Controller.cs 功能点——每个 Action 方法对应一个用户操作 递归扫描 Controller 文件名
Entity/*.cs 数据模型——实体类和字段映射数据库表结构 读取实体类属性和 EF Mapping

这三层不是孤立的。Controller 名称引用 Entity,Entity 之间通过导航属性关联,Areas 把相关 Controller 组织在一起。三者交叉验证,就能还原出"谁在什么模块里对什么数据做了什么操作"——这正是需求规格说明书的核心内容。

逆向分析流水线

基于这个模型,我们设计了一条清晰的处理流水线:

📁 目录扫描 → 📊 结构提取 → 🔍 领域归类 → 🤖 深度阅读 → 📝 文档生成
递归列出源文件  Areas/Controller/Entity  按业务语义分组  关键实体与流程  按领域撰写SRS

3. 实战:五步完成代码到文档

第一步:直接访问本地文件系统

最初的顾虑是文件上传限制——如果一个个文件上传,5000 个文件根本不现实。但 Coze Agent 的桌面端能力可以直接访问本地文件系统,通过授权后就能用命令行递归扫描目录,无需上传任何文件。

申请目录权限后,Agent 获得了"始终允许"的授权,后续所有读取操作都无需重复确认。

⚠️ 环境适配:Windows vs Linux 命令

用户本地电脑是 Windows 环境,第一次尝试用 findls -Rhead 等 Linux 命令全部失败——要么被安全策略拦截,要么 PowerShell 不识别。最终统一改用 PowerShell 原生命令 Get-ChildItem,问题解决。

关键扫描命令(已过滤掉 bin/obj/packages 等编译产物目录):

# 递归列出所有 C# 源文件
Get-ChildItem -Path 'D:\Project\CodeRoot' -Recurse -File `
  -Include *.cs,*.cshtml,*.csproj,*.sln |
  Where-Object { $_.FullName -notmatch '\\(bin|obj|packages)\\' } |
  ForEach-Object { $_.FullName } | Sort-Object

第二步:提取三层结构

三条命令分别提取目录结构、Controller 清单和 Entity 清单:

  1. 列出所有项目和 Areas 目录——先看解决方案文件(.sln)了解项目组成,再列出各项目顶层目录,识别出 17 个项目和 50 多个业务区域。
  2. 递归扫描所有 Controller——一条命令拿到 250+ 个 Controller 的完整路径,按 Areas 分组后,业务领域的轮廓立刻清晰了。
  3. 扫描全部 Entity 文件——900+ 个实体类文件,包括 EF Mapping 配置。Entity 的命名直接揭示了数据模型:设备、工单、物料申请、采购订单、修理工单、预算……

这一步的产出是三份结构化清单,不需要 AI "理解"代码,只需要机械提取文件名和目录结构。但这三份清单构成了后续所有分析的骨架。

第三步:按业务语义归类领域

拿到 Controller 和 Entity 清单后,通过命名模式识别业务领域。例如:

DeviceInfo → 设备管理       Parts*    → 备件管理
Mrp*       → 物料/物资管理   Rep*      → 船舶修理
Budg*      → 预算管理       Safe*     → 安全管理
Supplier*  → 供应商管理     PmsDictionay → 系统字典
Book*      → 台账/手册管理   wf*       → 工作流引擎

同时发现了重要线索:很多 Controller 带有 HKMW_ 前缀,而代码库中存在三个解决方案文件(面向不同客户),说明这是一个多租户/多客户变体的系统。这些变体差异必须在需求文档中明确标注。

第四步:深度阅读关键代码

清单和归类解决了"有什么"的问题,但需求文档还需要回答"怎么运作"。我们选择了每个领域最核心的 Entity 文件进行精读:

  • 设备工作项目(device_job)——揭示了基于计数器的保养计划触发机制;
  • 工单(work_card)——揭示了工单从创建、审批到完工的完整状态机;
  • 物料申请(mrp_apply)——揭示了申请→询价→订单→入库的采购链路;
  • 备件库存(parts_material_info/stock/in_out)——揭示了备件台账和出入库流水。

读取实体类的属性定义和 EF Mapping 配置,可以精确到字段级别——字段名、类型、是否必填、最大长度、关联关系。这些是需求文档中数据模型章节的直接素材。

为什么不读所有代码?

5000 个文件全量精读既不现实也不必要。Controller 名称已经覆盖了功能点的"面",核心 Entity 精读补充了业务规则的"点",点面结合足以还原需求全貌。Service 层的业务逻辑可以在需要时按需深入,但对需求文档而言,Controller + Entity 的信息密度已经足够高。

第五步:派发子 Agent 并行撰写

结构化分析完成后,进入文档撰写阶段。这一步的工作量大但目标清晰,适合交给子 Agent 后台执行:

sessions_spawn({
  agent: "lead",
  name: "PMS需求逆推文档",
  task: `基于以下代码分析结果,撰写完整的需求规格说明书...
    - 15个业务领域的Controller清单
    - 核心Entity字段定义
    - 业务流程描述
    - 多客户变体差异标注
    输出:/项目目录/船舶PMS系统逆向需求分析.md`
})

主会话把前三步提取的全部结构化数据(Controller 完整清单、Entity 字段、领域分类)打包传给子 Agent,子 Agent 专注于文档撰写,主会话保持可响应。约 10 分钟后,一份 1600+ 行的需求规格说明书自动生成。


4. 关键技术决策与踩坑记录

决策一:直接读文件 vs 上传文件

❌ 逐文件上传 ✅ 桌面端直接访问
受单次上传数量限制 一次授权,递归扫描
5000 文件需要数百次操作 保持完整目录结构
无法保持目录结构上下文 可过滤编译产物
二进制和配置文件干扰 按需精读,不占上下文

决策二:先提取结构再阅读内容

最容易犯的错误是一上来就让 AI “读代码然后告诉我系统是做什么的”。这种方式在小项目上可行,但面对 5000 个文件时,AI 会被海量信息淹没,产出泛泛而谈的概述。

我们的做法是先建立骨架(目录+文件清单),再填充血肉(精读关键文件)。骨架阶段只提取元数据(文件名、路径、目录结构),不读取文件内容,因此速度极快且不消耗大量上下文。拿到骨架后,AI 对系统全貌有了结构化认知,再精读关键文件时就能精准定位、有的放矢。

决策三:用子 Agent 处理重撰写任务

文档撰写是典型的"输入明确、耗时较长、可独立检查"的任务。主会话已经完成了所有分析工作,把结构化结果交给子 Agent 撰写,既避免了主会话上下文耗尽,又能让用户在等待期间继续对话。

踩坑:Windows 路径中的特殊字符

代码目录路径中包含括号 (BS),在 PowerShell 中如果不用单引号包裹会被解析为表达式。所有涉及路径的命令都必须用单引号包裹:

# 正确:单引号包裹含特殊字符的路径
Get-ChildItem -Path 'D:\Project\(BS)CodeRoot' -Recurse

# 错误:括号会被 PowerShell 解析
Get-ChildItem -Path D:\Project\(BS)CodeRoot -Recurse

踩坑:高危命令确认机制

递归扫描命令(如 Get-ChildItem -Recurse)会被系统安全策略标记为高危操作,需要用户在卡片上点击确认。虽然已授权目录访问,但递归扫描仍会触发二次确认。在实际操作中提前告知用户"接下来会有确认弹窗",可以避免流程中断。


5. 产出物与效果评估

最终交付了一份约 84KB、1646 行的需求规格说明书,包含以下章节:

章节 内容 追溯依据
文档概述 系统简介、术语表(17 项)、优先级定义 .sln 文件、代码注释
系统总体描述 10 类用户角色、3 个客户变体差异、技术架构、17 个项目结构 项目引用关系、Area 命名前缀
功能需求 15 个业务领域逐一展开,200+ 功能点 250+ Controller 名称与分组
非功能需求 船岸协同、多租户、多语言、安全权限等 8 个维度 代码中的 IfLand 字段、RBAC 模型、语言包
数据模型 实体关系图、14 个实体分组、6 项设计特征 900+ Entity 类及 EF Mapping
系统接口 SSO、工作流、邮件、附件等 6 类接口 接口项目、WF5 引擎、邮件服务代码
附录 Controller 完整功能追溯矩阵 全量 Controller 路径清单

这份文档好在哪里

  • 可追溯:每个功能点都标注了对应的 Controller 名称,可以直接回到代码验证;
  • 有优先级:P0/P1/P2 三级标注帮助读者快速识别核心功能;
  • 标注变体差异:清晰区分了三个客户版本的特有功能;
  • 基于实证:所有需求均来自代码中真实存在的类、方法和字段,没有编造。

它的局限

⚠️ 需要人工补充的部分

代码能告诉你"系统做了什么",但无法完全回答"为什么这么做"。某些业务规则背后的历史原因、废弃功能与在用功能的区分、以及未体现在代码中的业务约束(如行业合规要求的具体条款),仍然需要熟悉业务的人员进行校验和补充。AI 逆向出的需求文档是一个高质量的起点,而不是终点。


6. 方法论总结与适用边界

回顾整个过程,我们提炼出一套可复用的**"代码逆向需求"方法论**:

  1. 建立映射模型:先分析目标系统的架构模式(MVC、分层、微服务等),找到代码结构与业务需求之间的映射关系。架构越规范,映射越清晰。
  2. 提取结构骨架:用命令行工具递归扫描目录和文件名,不读内容只取元数据,快速建立全局视图。
  3. 按语义归类领域:基于命名约定和目录结构,将成百上千个文件归入有限的业务领域。
  4. 精读关键节点:每个领域选取 2-5 个核心实体或控制器深度阅读,提取字段级数据模型和关键业务流程。
  5. 结构化输出:将分析结果交给撰写能力强的 Agent,按标准需求文档模板组织成文,确保每个需求点都有代码追溯依据。

适用条件

这套方法在以下条件下效果最好:

  • 系统采用了规范的架构模式(MVC、MVVM、分层架构等),代码结构本身就有业务语义;
  • 命名规范相对统一,文件和类名能够反映业务含义;
  • 有数据模型层(ORM Entity、数据库 Schema)可以提供字段级信息;
  • 目标是还原"系统做了什么"而非"为什么这么设计"。

反之,如果系统命名混乱(如 Controller1.csTempService.cs)、架构不清晰或大量逻辑写在存储过程中,逆向难度会显著增加,需要更多人工介入。

AI 不会替代你理解业务,但它可以把散落在 5000 个文件中的业务逻辑系统性地打捞出来,整理成一个可以审阅、校验和迭代的文档。从"代码即文档"到"代码生成文档",这中间的距离,就是 AI Agent 的价值。

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐