Files
wiki/研发型企业AI转型方案/报告/ai-dev-workflow.html
T

1564 lines
101 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>研发型企业 AI 开发流程 — Claude Code 主力 + 多模型协同工作流</title>
<style>
:root {
--color-primary: #1677FF; --color-primary-bg: #E6F4FF;
--color-success: #52C41A; --color-success-bg: #F6FFED; --color-success-border: #B7EB8F;
--color-warning: #FAAD14; --color-warning-bg: #FFFBE6; --color-warning-border: #FFE58F;
--color-error: #FF4D4F; --color-error-bg: #FFF2F0; --color-error-border: #FFCCC7;
--bg: #F5F5F5; --bg-container: #FFFFFF; --bg-elevated: #FAFAFA;
--border: #D9D9D9; --border-light: #F0F0F0;
--text-primary: #141414; --text-secondary: #595959; --text-tertiary: #8C8C8C;
--radius-sm: 6px; --radius-md: 8px; --radius-lg: 12px;
--shadow-sm: 0 1px 2px rgba(0,0,0,0.03), 0 1px 6px -1px rgba(0,0,0,0.02);
--shadow-md: 0 2px 4px rgba(0,0,0,0.04), 0 4px 12px -2px rgba(0,0,0,0.04);
--sidebar-w: 260px; --header-h: 64px;
}
*{margin:0;padding:0;box-sizing:border-box;}
body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'PingFang SC','Hiragino Sans GB','Microsoft YaHei',sans-serif;background:var(--bg);color:var(--text-primary);line-height:1.57;font-size:15px;}
::-webkit-scrollbar{width:6px;height:6px;}
::-webkit-scrollbar-track{background:transparent;}
::-webkit-scrollbar-thumb{background:var(--border);border-radius:3px;}
.header{position:fixed;top:0;left:0;right:0;height:var(--header-h);background:rgba(255,255,255,0.88);backdrop-filter:blur(12px);border-bottom:1px solid var(--border-light);display:flex;align-items:center;padding:0 2rem;z-index:100;}
.header h1{font-size:18px;font-weight:700;background:linear-gradient(135deg,var(--color-primary),#722ED1);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;color:transparent;}
.header .back-link{margin-right:16px;font-size:13px;color:var(--color-primary);text-decoration:none;flex-shrink:0;}
.header .back-link:hover{text-decoration:underline;}
.header .version{margin-left:auto;font-size:12px;color:var(--text-tertiary);font-family:'SF Mono',Monaco,monospace;}
.sidebar{position:fixed;top:var(--header-h);left:0;bottom:0;width:var(--sidebar-w);background:var(--bg-container);border-right:1px solid var(--border);overflow-y:auto;padding:1.25rem 0;z-index:90;}
.sidebar .toc-label{font-size:11px;text-transform:uppercase;letter-spacing:.1em;color:var(--text-tertiary);padding:0 1.25rem;margin-bottom:.75rem;font-weight:600;}
.sidebar nav ol{list-style:none;counter-reset:toc;}
.sidebar nav li{counter-increment:toc;}
.sidebar nav a{display:block;padding:.5rem 1.25rem;color:var(--text-secondary);text-decoration:none;font-size:13px;line-height:1.4;border-left:2px solid transparent;transition:all .15s;}
.sidebar nav a::before{content:counter(toc)". ";color:var(--color-primary);font-weight:600;font-size:12px;margin-right:.4rem;}
.sidebar nav a:hover,.sidebar nav a.active{color:var(--color-primary);background:var(--color-primary-bg);}
.sidebar nav a.active{border-left-color:var(--color-primary);font-weight:600;}
.main{margin-left:var(--sidebar-w);margin-top:var(--header-h);padding:36px 48px 64px;min-height:calc(100vh - var(--header-h));max-width:1100px;}
section{margin:48px 0;scroll-margin-top:calc(var(--header-h) + 1rem);}
section h2{font-size:24px;line-height:32px;padding-bottom:8px;border-bottom:1px solid var(--border);margin-bottom:20px;color:var(--color-primary);}
section h3{font-size:20px;line-height:28px;margin:24px 0 12px;color:#722ED1;}
section h4{font-size:16px;line-height:24px;margin:16px 0 8px;color:var(--color-success);}
p{color:var(--text-secondary);font-size:14px;margin:10px 0;text-align:justify;}
p.no-indent{text-indent:0;}
p.lead{font-size:16px;color:var(--text-primary);text-indent:0;line-height:1.9;}
strong{color:var(--text-primary);}
.box{border-radius:var(--radius-md);padding:20px 24px;margin:18px 0;}
.box-info{background:var(--color-primary-bg);border:1px solid #91CAFF;}
.box-idea{background:#F9F0FF;border:1px solid #D3ADF7;}
.box-good{background:var(--color-success-bg);border:1px solid var(--color-success-border);}
.box-warn{background:var(--color-warning-bg);border:1px solid var(--color-warning-border);}
.box-danger{background:var(--color-error-bg);border:1px solid var(--color-error-border);}
.box h4{margin:0 0 8px;font-size:14px;font-weight:700;}
.box-info h4{color:var(--color-primary);}.box-idea h4{color:#722ED1;}.box-good h4{color:var(--color-success);}.box-warn h4{color:var(--color-warning);}.box-danger h4{color:var(--color-error);}
.box p{font-size:14px;margin:4px 0;text-indent:0;}
.box ul,.box ol{margin:4px 0 4px 16px;}
.box li{font-size:13px;margin:4px 0;}
.table-wrap{overflow-x:auto;margin:20px 0;}
.table-caption{font-size:13px;font-weight:700;color:var(--text-primary);margin-bottom:8px;}
table{width:100%;border-collapse:collapse;font-size:13px;}
th,td{padding:10px 14px;border:1px solid var(--border);text-align:left;vertical-align:top;}
th{background:var(--bg-elevated);font-weight:700;color:var(--text-primary);white-space:nowrap;}
td{background:var(--bg-container);color:var(--text-secondary);}
tbody tr:hover td{background:var(--color-primary-bg);}
.flow-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:16px;margin:18px 0;}
.flow-step{background:var(--bg-container);border:1px solid var(--border);border-radius:var(--radius-md);padding:20px 22px;position:relative;transition:all .2s;}
.flow-step:hover{border-color:var(--color-primary);box-shadow:var(--shadow-md);}
.flow-step .step-num{display:inline-block;width:28px;height:28px;line-height:28px;text-align:center;border-radius:50%;background:linear-gradient(135deg,var(--color-primary),#722ED1);color:#fff;font-size:13px;font-weight:700;margin-bottom:10px;}
.flow-step h4{margin:0 0 8px;font-size:15px;color:var(--text-primary);}
.flow-step p{font-size:12px;color:var(--text-tertiary);text-indent:0;line-height:1.6;}
.flow-step .tool-tag{display:inline-block;padding:1px 8px;border-radius:10px;font-size:10px;font-weight:600;margin:2px 3px 0 0;background:var(--color-primary-bg);color:var(--color-primary);}
.tag{display:inline-block;padding:2px 10px;border-radius:12px;font-size:11px;font-weight:600;margin-right:4px;}
.tag-green{background:var(--color-success-bg);color:var(--color-success);border:1px solid var(--color-success-border);}
.tag-blue{background:var(--color-primary-bg);color:var(--color-primary);border:1px solid #91CAFF;}
.tag-warn{background:var(--color-warning-bg);color:var(--color-warning);border:1px solid var(--color-warning-border);}
.tag-red{background:var(--color-error-bg);color:var(--color-error);border:1px solid var(--color-error-border);}
.tag-purple{background:#F9F0FF;color:#722ED1;border:1px solid #D3ADF7;}
.arch-diagram{background:var(--bg-elevated);border:1px solid var(--border);border-radius:var(--radius-md);padding:28px 24px;margin:18px 0;text-align:center;overflow-x:auto;}
.arch-layer{display:flex;align-items:center;justify-content:center;gap:12px;margin:8px 0;flex-wrap:wrap;}
.arch-box{display:inline-flex;flex-direction:column;align-items:center;padding:12px 18px;border-radius:var(--radius-sm);font-size:12px;font-weight:600;min-width:120px;text-align:center;}
.arch-box.core{background:linear-gradient(135deg,#1677FF,#722ED1);color:#fff;}
.arch-box.model{background:var(--color-primary-bg);border:2px solid var(--color-primary);}
.arch-box.tool{background:var(--color-success-bg);border:2px solid var(--color-success);}
.arch-box.data{background:#FFFBE6;border:2px solid #FAAD14;}
.arch-box .sub{font-size:10px;font-weight:400;opacity:0.8;margin-top:2px;}
.arch-arrow{font-size:18px;color:var(--text-tertiary);}
ul,ol{margin:8px 0 8px 20px;}
li{margin:6px 0;color:var(--text-secondary);font-size:14px;}
.compare-table td:first-child{font-weight:600;color:var(--text-primary);white-space:nowrap;background:var(--bg-elevated);}
.checklist-item{display:flex;align-items:flex-start;gap:10px;padding:8px 0;border-bottom:1px solid var(--border-light);}
.checklist-item:last-child{border-bottom:none;}
.checklist-item .icon{flex-shrink:0;width:24px;text-align:center;font-size:16px;}
.code-snippet{background:#1E1E1E;color:#D4D4D4;border-radius:var(--radius-md);padding:16px 20px;margin:14px 0;font-family:'SF Mono',Monaco,monospace;font-size:13px;line-height:1.7;overflow-x:auto;}
.code-snippet .kw{color:#569CD6;}
.code-snippet .str{color:#CE9178;}
.code-snippet .cm{color:#6A9955;}
.code-snippet .fn{color:#DCDCAA;}
.footer{text-align:center;padding:28px 0;color:var(--text-tertiary);font-size:13px;border-top:1px solid var(--border-light);margin-top:40px;}
.menu-btn{display:none;width:40px;height:40px;border:none;background:none;cursor:pointer;border-radius:var(--radius-sm);font-size:20px;margin-right:12px;flex-shrink:0;transition:background .15s;}
.menu-btn:hover{background:var(--bg-elevated);}
.drawer-overlay{display:none;position:fixed;inset:0;background:rgba(0,0,0,0.5);z-index:200;opacity:0;transition:opacity .25s;}
.drawer-overlay.show{display:block;opacity:1;}
.back-to-top{display:none;position:fixed;bottom:24px;right:24px;width:48px;height:48px;border-radius:50%;background:var(--color-primary);color:#fff;border:none;cursor:pointer;font-size:20px;box-shadow:var(--shadow-md);z-index:80;transition:all .2s;}
.back-to-top:hover{transform:scale(1.1);}
.back-to-top.show{display:flex;align-items:center;justify-content:center;}
@media(max-width:768px){.menu-btn{display:flex;align-items:center;justify-content:center;}.sidebar{display:block;position:fixed;top:0;left:0;bottom:0;width:280px;max-width:85vw;transform:translateX(-100%);transition:transform .25s ease;z-index:201;padding-top:60px;}.drawer-overlay.show .sidebar{transform:translateX(0);}.sidebar nav a{font-size:14px;padding:0.6rem 1.5rem;}.main{margin-left:0;padding:20px 16px 40px;}.flow-grid{grid-template-columns:1fr;}.arch-layer{flex-direction:column;}.arch-arrow{transform:rotate(90deg);}.header h1{font-size:15px;}}
</style>
</head>
<body>
<div class="drawer-overlay" id="drawerOverlay"></div>
<header class="header">
<button class="menu-btn" id="menuBtn" aria-label="打开目录"></button>
<a href="../../index.html" class="back-link">← 返回知识库</a>
<h1>AI 驱动开发流程:Claude Code 主力 + 多模型协同</h1>
<span class="version">V1.0 · 2026-05-30</span>
</header>
<aside class="sidebar">
<div class="toc-label">报告目录</div>
<nav>
<ol>
<li><a href="#s0">核心理念:多模型协同架构</a></li>
<li><a href="#s1">工具链全景:模型与工具的定位分工</a></li>
<li><a href="#s2">项目类型分流:新项目 vs 老项目</a></li>
<li><a href="#s3">企业知识库架构:RAG + 记忆双轨制</a></li>
<li><a href="#s4">开发流程一:需求分析与方案设计</a></li>
<li><a href="#s5">开发流程二:编码实现与代码审查</a></li>
<li><a href="#s6">开发流程三:测试、文档与部署</a></li>
<li><a href="#s7">个人记忆系统:持续积累与经验复用</a></li>
<li><a href="#s8">团队协作:多 Agent 并行工作模式</a></li>
<li><a href="#s9">投入产出分析:效率提升的量化预测</a></li>
<li><a href="#s10">落地路线图:从试点到全面推广</a></li>
</ol>
</nav>
</aside>
<main class="main">
<!-- ===== 〇、核心理念 ===== -->
<section id="s0">
<h2>〇、核心理念:多模型协同架构</h2>
<p class="lead">传统 AI 辅助开发是"单模型 + 聊天框"模式:开发者在 ChatGPT/Claude 网页中输入问题,复制粘贴代码,手动拼接。这种方式<strong>上下文断裂、缺乏流程管控、无法沉淀知识</strong>。本方案提出"<strong>Claude Code 主力 Agent + 多模型分级调度 + 企业知识库 + 个人记忆</strong>"的四层协同架构,让 AI 真正嵌入开发流程的每个环节。</p>
<div class="arch-diagram">
<div class="arch-layer">
<div class="arch-box core">🧠 <strong>Claude Code</strong><span class="sub">主力 Agent · 流程编排 · 代码生成</span></div>
</div>
<div class="arch-layer">
<span class="arch-arrow"></span>
</div>
<div class="arch-layer">
<div class="arch-box model">🤖 <strong>DeepSeek</strong><span class="sub">深度推理 · 长上下文分析</span></div>
<div class="arch-box model">☁️ <strong>通义千问</strong><span class="sub">长文档解读 · 私有化部署</span></div>
<div class="arch-box tool">🔍 <strong>open-code-review</strong><span class="sub">自动化代码审查</span></div>
</div>
<div class="arch-layer">
<span class="arch-arrow"></span>
</div>
<div class="arch-layer">
<div class="arch-box data">📚 <strong>企业知识库</strong><span class="sub">架构规范 · 历史方案 · API文档</span></div>
<div class="arch-box data">🧩 <strong>个人记忆系统</strong><span class="sub">经验片段 · 踩坑记录 · 提示词资产</span></div>
</div>
</div>
<div class="box box-idea">
<h4>🎯 设计原则</h4>
<p><strong>主力不换、专事专办、知识不丢。</strong>Claude Code 作为"主驾驶"负责全流程编排和最终代码输出;DeepSeek/Qwen 在特定环节作为"专家顾问"介入;open-code-review 作为"质量门禁"自动把关;企业知识库和个人记忆确保每次对话都站在历史积累之上,而不是从零开始。</p>
</div>
</section>
<!-- ===== 一、工具链全景 ===== -->
<section id="s1">
<h2>一、工具链全景:模型与工具的定位分工</h2>
<p class="lead">四类智能体的角色边界必须清晰。混用会导致"谁都干、谁都干不好"的局面。以下按照<strong>职责 → 适用场景 → 调用时机</strong>三个维度精确分工。</p>
<h3>1.1 Claude Code —— 主力 Agent(全流程驾驶员)</h3>
<div class="table-wrap">
<table>
<tr><th style="width:18%;">维度</th><th>说明</th></tr>
<tr><td>核心职责</td><td>流程编排、需求理解、代码生成、重构、测试编写、文档生成 —— 即完整软件工程生命周期的<strong>端到端执行</strong></td></tr>
<tr><td>关键能力</td><td>① 200K 上下文窗口,可一次性加载整个项目的 CLAUDE.md + 设计规范 + 相关源码 ② 工具调用(读文件、写文件、执行命令、Git 操作)实现<strong>闭环执行</strong>,不只是"建议"而是"直接做" ③ Agent 模式可启动子 Agent 并行处理独立子任务 ④ 支持 Plan Mode 先规划再执行</td></tr>
<tr><td>调用时机</td><td><strong>全程在线</strong>。从需求分析到代码提交,Claude Code 始终作为主控台。仅在特定子任务时调度其他模型</td></tr>
<tr><td>配置要点</td><td>项目根目录维护 <code>CLAUDE.md</code>(项目规约)+ <code>.claude/design-tokens.md</code>(设计规范)+ <code>.claude/settings.json</code>(权限与 Hook),确保每个新会话自动加载完整上下文</td></tr>
</table>
</div>
<h3>1.2 DeepSeek —— 深度推理专家</h3>
<div class="table-wrap">
<table>
<tr><th style="width:18%;">维度</th><th>说明</th></tr>
<tr><td>核心职责</td><td>复杂逻辑推理、算法设计验证、长文本代码 diff 分析、架构决策的"第二意见"</td></tr>
<tr><td>关键能力</td><td>① 推理链(Chain-of-Thought)深度出色,适合<strong>多步骤逻辑推导</strong>(如复杂业务规则校验、状态机设计) ② 完全免费/极低成本,适合大规模批量调用 ③ 开源模型可私有化部署,数据不出企业内网</td></tr>
<tr><td>调用时机</td><td>① 复杂算法设计时,将问题描述同时发送给 Claude Code 和 DeepSeek,对比方案后择优 ② 大批量代码审查场景(如全量遗留代码分析),利用 DeepSeek 低成本优势做第一轮粗筛 ③ 需要私有化部署的场景(涉密项目),以 DeepSeek 本地部署替代云端模型</td></tr>
<tr><td>集成方式</td><td>通过 DeepSeek API<code>api.deepseek.com</code>)或本地 Ollama/vLLM 部署。Claude Code 通过 Bash 工具调用 curl 或 Python 脚本访问</td></tr>
</table>
</div>
<h3>1.3 通义千问(Qwen)—— 长文档与中文场景专家</h3>
<div class="table-wrap">
<table>
<tr><th style="width:18%;">维度</th><th>说明</th></tr>
<tr><td>核心职责</td><td>超长文档(百万 Token 级)分析、中文技术文档撰写、企业知识库问答、私有化部署的备用主力</td></tr>
<tr><td>关键能力</td><td>① 百万级上下文窗口(Qwen3-235B),适合一次性加载<strong>完整需求规格说明书 + 全部接口文档 + 历史方案</strong> ② 中文理解和生成质量在国产模型中领先,适合面向客户/监管的中文文档 ③ 阿里云百炼平台提供企业级 API 和私有化部署方案</td></tr>
<tr><td>调用时机</td><td>① 招标文件/需求规格书解读(200+ 页),Qwen 一次性全文加载并提取关键需求项 ② 生成面向客户的中文技术方案、验收文档 ③ 作为企业知识库的 RAG 底座模型(Qwen + 向量数据库),回答"历史类似项目怎么做的"</td></tr>
<tr><td>集成方式</td><td>通过阿里云百炼 API 或本地 vLLM 部署。知识库场景推荐使用阿里云百炼内置的 RAG 能力或 LangChain-ChatGLM + Qwen 私部署方案</td></tr>
</table>
</div>
<h3>1.4 alibaba-group/open-code-review —— 自动化代码质量门禁</h3>
<div class="table-wrap">
<table>
<tr><th style="width:18%;">维度</th><th>说明</th></tr>
<tr><td>核心职责</td><td>基于阿里巴巴 Java/前端开发规约的<strong>自动化静态代码审查</strong>,作为 CI/CD 流水线的质量门禁</td></tr>
<tr><td>关键能力</td><td>① 内置阿里 P3C 规约(《阿里巴巴 Java 开发手册》)的全部检查规则 ② 支持 Java、JavaScript/TypeScript、Vue 等多语言 ③ GitHub Actions / GitLab CI 原生集成,PR 提交自动触发审查 ④ 可自定义规则扩展</td></tr>
<tr><td>调用时机</td><td><strong>每次 Pull Request 提交自动触发</strong>。作为 CI 流水线的第一道门禁:open-code-review 通过 → Claude Code 深度审查 → 人工 Review。三层递进式质量管控</td></tr>
<tr><td>集成方式</td><td>GitHub Actions 配置:<code>alibaba-group/open-code-review@v1</code>,配合 <code>.code.yml</code> 自定义规则。审查结果以 PR Comment 形式呈现,阻断不合规代码合并</td></tr>
</table>
</div>
<h3>1.5 模型调度决策矩阵</h3>
<div class="table-wrap">
<div class="table-caption">表:什么场景用哪个模型 —— 一表决策</div>
<table>
<tr><th>场景</th><th>主力模型</th><th>辅助模型</th><th>原因</th></tr>
<tr><td>日常编码(CRUD/业务逻辑)</td><td><span class="tag tag-blue">Claude Code</span></td><td></td><td>Claude 代码生成质量最高,直接产出可用代码</td></tr>
<tr><td>复杂算法设计</td><td><span class="tag tag-blue">Claude Code</span></td><td><span class="tag tag-purple">DeepSeek</span></td><td>双模型并行推理,取最优方案</td></tr>
<tr><td>遗留系统大规模代码分析</td><td><span class="tag tag-purple">DeepSeek</span></td><td><span class="tag tag-blue">Claude Code</span></td><td>DeepSeek 零成本批量分析,Claude 精读关键路径</td></tr>
<tr><td>200+ 页招标文件解读</td><td><span class="tag tag-green">Qwen</span></td><td><span class="tag tag-blue">Claude Code</span></td><td>Qwen 百万 Token 一次性全量加载,Claude 做结构化提取</td></tr>
<tr><td>中文技术方案/验收文档</td><td><span class="tag tag-green">Qwen</span></td><td><span class="tag tag-blue">Claude Code</span></td><td>Qwen 中文表达更自然,Claude 做技术内容核验</td></tr>
<tr><td>代码规范检查</td><td><span class="tag tag-warn">open-code-review</span></td><td><span class="tag tag-blue">Claude Code</span></td><td>规则引擎秒级扫描,Claude 做语义级深度审查</td></tr>
<tr><td>架构设计评审</td><td><span class="tag tag-blue">Claude Code</span></td><td><span class="tag tag-purple">DeepSeek</span></td><td>Claude 主导设计,DeepSeek 做"反方辩手"挑刺</td></tr>
<tr><td>知识库问答</td><td><span class="tag tag-green">Qwen</span></td><td>向量数据库</td><td>Qwen + RAG 是本场景的最优组合</td></tr>
</table>
</div>
</section>
<!-- ===== 二、项目类型分流:新项目 vs 老项目维护 ===== -->
<section id="s2">
<h2>二、项目类型分流:新项目 vs 老项目维护</h2>
<p class="lead">这是<strong>所有后续流程的前置判断</strong>。新项目(Greenfield)和老项目维护(Brownfield)的 AI 工作流完全不同——用错了模式,轻则效率减半,重则引入破坏性变更。本节定义了分流规则、脚手架体系、以及两类项目在工具/模型使用上的根本差异。</p>
<h3>2.1 判断标准与分流决策</h3>
<div class="table-wrap">
<div class="table-caption">表:新项目 vs 老项目维护的判断矩阵</div>
<table>
<tr><th style="width:14%;">判断维度</th><th style="width:38%;">🆕 新项目(Greenfield</th><th style="width:38%;">🔧 老项目维护(Brownfield</th></tr>
<tr><td><strong>典型场景</strong></td><td>全新客户项目启动、新产品线研发、独立功能模块从零搭建、POC 原型验证</td><td>现有系统 Bug 修复、功能增强、技术栈升级、性能优化、遗留系统改造</td></tr>
<tr><td><strong>代码基数</strong></td><td>零或极少(仅脚手架模板)</td><td>已有 1 万 ~ 100 万+ 行代码</td></tr>
<tr><td><strong>核心挑战</strong></td><td>快速搭建合规架构、避免"过度设计"和"设计不足"的两极摇摆</td><td>理解现有代码的隐式约定、"不敢改"的心理障碍、修改影响面不可控</td></tr>
<tr><td><strong>AI 生成代码占比</strong></td><td>70-90%</td><td>15-40%(修改点周围的局部生成)</td></tr>
<tr><td><strong>主要风险</strong></td><td>AI 生成的代码不符合团队规范、架构不一致</td><td>AI 不理解历史上下文、引入回归 Bug、破坏隐式依赖</td></tr>
<tr><td><strong>CLAUDE.md 依赖度</strong></td><td>极高(规范文件 = AI 的"唯一真相源"</td><td>高(但需补充遗留系统的非标准约定)</td></tr>
</table>
</div>
<div class="arch-diagram">
<div class="table-caption" style="margin-bottom:12px;">图:项目类型分流决策树</div>
<div class="arch-layer">
<div class="arch-box core" style="min-width:220px;">📋 收到开发任务</div>
</div>
<div class="arch-layer">
<span class="arch-arrow">↓ 第一问</span>
</div>
<div class="arch-layer">
<div class="arch-box model" style="min-width:260px;">是否需要新建 Git 仓库?</div>
</div>
<div class="arch-layer">
<span class="arch-arrow">↙ YES ↙ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ↘ NO ↘</span>
</div>
<div class="arch-layer">
<div class="arch-box core" style="min-width:200px;">🆕 <strong>新项目流程</strong><span class="sub">脚手架生成 → Plan → 编码 → 审查</span></div>
<div class="arch-box data" style="min-width:200px;">🔧 <strong>老项目维护流程</strong><span class="sub">代码理解 → 影响分析 → 增量修改 → 回归验证</span></div>
</div>
</div>
<h3>2.2 开发脚手架体系(新项目专用)</h3>
<p>新项目的起点不是空白目录,而是<strong>预置了团队全部约定的开发脚手架</strong>。脚手架 = 项目模板 + 代码生成器 + 内置规范。Claude Code 在脚手架基础上生成代码,能天然保证架构一致性。</p>
<div class="table-wrap">
<div class="table-caption">表:脚手架应包含的四个层次</div>
<table>
<tr><th style="width:12%;">层次</th><th style="width:22%;">内容</th><th>具体包含物</th><th style="width:18%;">AI 如何使用</th></tr>
<tr>
<td><strong>L1: 项目骨架</strong></td>
<td>目录结构 + 构建配置 + 基础依赖</td>
<td>Maven/Gradle 配置、Dockerfile、CI 流水线模板、Helm Chart、日志配置、application.yml 多环境骨架</td>
<td>Claude Code 在生成代码前先 <code>Read</code> 脚手架文件,确保新代码的包结构、依赖版本、配置命名与脚手架一致</td>
</tr>
<tr>
<td><strong>L2: 架构基类</strong></td>
<td>通用基类 + 切面 + 拦截器</td>
<td>BaseController / BaseService / BaseEntity、全局异常处理器、统一返回体 Result&lt;T&gt;、分页基类、审计字段自动填充</td>
<td>Claude Code 生成的 Controller/Service/Entity 必须继承对应基类,不自行发明新的返回格式或异常处理模式</td>
</tr>
<tr>
<td><strong>L3: 代码规范</strong></td>
<td>CLAUDE.md + 设计 Token + 编码规约</td>
<td>命名约定、包结构约定、注释模板、API 设计规范、数据库命名规范、Git Commit 规范</td>
<td>Claude Code <strong>自动加载</strong> CLAUDE.md,每次生成代码前将其作为系统提示。open-code-review 在 CI 阶段二次校验</td>
</tr>
<tr>
<td><strong>L4: 示例模块</strong></td>
<td>一个完整的 CRUD 示例("样板间"</td>
<td>一个完整的用户管理模块(Entity → Mapper → Service → Controller → Test → 前端页面),作为所有新模块的参考实现</td>
<td>Claude Code 生成新模块时,开发者可以说"参照 UserModule 的模式实现 XxxModule"AI 自动对齐风格</td>
</tr>
</table>
</div>
<div class="box box-info">
<h4>📐 脚手架的实际形态</h4>
<p>脚手架可以是一个 <strong>Git 仓库模板</strong>(团队维护一个 <code>spring-boot-scaffold</code> 仓库),也可以是 Maven Archetype / Yeoman Generator / 自定义 CLI。关键不是形式,是<strong>每次新项目都从脚手架起,不允许从空白目录开始</strong></p>
<p>对于 Claude Code 而言,脚手架的价值在于:① 所有基类和规范文件在项目启动时就已经存在,AI 可以立即 <code>Read</code> 并遵循 ② 示例模块提供了"正确答案"的参考 ③ CI 配置就绪,第一行代码提交就能跑通完整流水线。</p>
</div>
<h3>2.3 两类项目的工具/模型使用差异</h3>
<div class="table-wrap">
<div class="table-caption">表:新项目 vs 老项目的工具分配策略</div>
<table>
<tr><th style="width:16%;">环节</th><th style="width:38%;">🆕 新项目策略</th><th style="width:38%;">🔧 老项目维护策略</th></tr>
<tr>
<td><strong>主力 Agent</strong></td>
<td>Claude Code <strong>全程主导</strong>:从脚手架起生成全部代码。几乎不需要切换模型</td>
<td>Claude Code <strong>局部介入</strong>:先理解现有代码,再做增量修改。需要频繁在 Claude Code 和人工分析之间切换</td>
</tr>
<tr>
<td><strong>DeepSeek 角色</strong></td>
<td>"反方辩手":并行评审 Claude Code 生成的架构方案(角色与 1.2 节一致)</td>
<td><strong>"代码考古学家"</strong>:利用零成本优势,批量分析整个遗留代码库的模块依赖、循环引用、死代码,输出重构优先级清单</td>
</tr>
<tr>
<td><strong>Qwen 角色</strong></td>
<td>长文档分析 + 知识库 RAG 检索历史同类项目方案(角色与 1.3 节一致)</td>
<td><strong>"遗留系统解读器"</strong>:利用百万 Token 上下文窗口,一次性加载整个模块的源码 + 注释 + 提交历史,输出模块职责描述和隐式约定清单</td>
</tr>
<tr>
<td><strong>open-code-review</strong></td>
<td>从第一次提交即启用,确保新代码 100% 合规</td>
<td><strong>增量模式</strong>:只检查本次修改的文件(通过 <code>filter=changed</code>),避免对遗留代码的"历史债务"产生噪音告警</td>
</tr>
</table>
</div>
<div class="box box-warn">
<h4>⚠️ 老项目维护的"三大铁律"</h4>
<p><strong>铁律 1:先读后改。</strong>在让 Claude Code 修改任何代码之前,必须先让它 <code>Read</code> 目标文件 + 所有调用方/被调用方文件。禁止在未建立上下文的情况下直接生成修改。推荐做法:让 Claude Code 先输出一份"修改影响分析报告",确认后再动手。</p>
<p><strong>铁律 2:测试先行。</strong>修改老代码前,先让 Claude Code 为修改目标区域生成(或补充)单元测试。确保改动前后的行为差异能被自动检测。这是防止回归 Bug 的最后防线。</p>
<p><strong>铁律 3:小步提交。</strong>老项目的一次修改不超过 5 个文件、不超过 200 行 diff。超过这个规模,拆成多个小 PR、依次合并。大爆炸式修改在老项目中几乎一定会引入 Bug。</p>
</div>
</section>
<!-- ===== 三、企业知识库架构 ===== -->
<section id="s3">
<h2>三、企业知识库架构:RAG + 记忆双轨制</h2>
<p class="lead">AI 辅助开发的最大瓶颈不是模型能力,而是<strong>模型不了解你的项目</strong>。每次对话从零开始——不知道你的架构规范、不记得上次怎么解决的、不理解公司特有的业务规则。企业知识库和个人记忆系统就是解决这个问题的双轨方案。</p>
<h3>2.1 知识库分层架构</h3>
<div class="arch-diagram">
<div class="arch-layer">
<div class="arch-box core">🔍 检索增强生成(RAG<span class="sub">查询 → 向量检索 → 重排序 → 注入 Prompt</span></div>
</div>
<div class="arch-layer">
<span class="arch-arrow">↓ 索引</span>
</div>
<div class="arch-layer">
<div class="arch-box data" style="min-width:150px;">📋 <strong>L1: 项目规约</strong><span class="sub">CLAUDE.md · 编码规范 · 设计 Token</span></div>
<div class="arch-box data" style="min-width:150px;">📦 <strong>L2: 架构资产</strong><span class="sub">架构图 · 接口文档 · 数据模型</span></div>
<div class="arch-box data" style="min-width:150px;">📝 <strong>L3: 历史方案</strong><span class="sub">历史售前方案 · FS 文档 · 技术决策记录</span></div>
<div class="arch-box data" style="min-width:150px;">🔧 <strong>L4: 踩坑经验</strong><span class="sub">Bug 修复记录 · 性能优化案例 · 兼容性问题</span></div>
</div>
</div>
<div class="table-wrap">
<div class="table-caption">表:知识库四层内容与更新机制</div>
<table>
<tr><th>层级</th><th>内容</th><th>格式</th><th>更新频率</th><th>负责人</th></tr>
<tr><td><strong>L1 项目规约</strong></td><td>CLAUDE.md、编码规范、设计 Token、命名约定、Git 工作流</td><td>Markdown / YAML</td><td>架构变更时</td><td>技术负责人</td></tr>
<tr><td><strong>L2 架构资产</strong></td><td>系统架构图、模块依赖关系、接口协议定义(OpenAPI/Protobuf)、数据库 ER 图、领域模型</td><td>结构化文档 + 代码注解</td><td>每个迭代</td><td>架构师 + 开发 Lead</td></tr>
<tr><td><strong>L3 历史方案</strong></td><td>历史项目的售前方案、FS 文档、ADR(架构决策记录)、技术选型论证、客户特定需求模式</td><td>PDF / Markdown / 向量化文本</td><td>项目结项时</td><td>PM + 应用顾问</td></tr>
<tr><td><strong>L4 踩坑经验</strong></td><td>Bug 根因分析、性能优化案例、兼容性问题及解决方案、部署踩坑记录、第三方库版本兼容性</td><td>Markdown(结构化标签)</td><td>持续积累</td><td>全员</td></tr>
</table>
</div>
<h3>2.2 RAG 技术方案选型</h3>
<div class="table-wrap">
<div class="table-caption">表:企业知识库 RAG 方案对比</div>
<table>
<tr><th>方案</th><th>适用规模</th><th>优势</th><th>劣势</th><th>推荐场景</th></tr>
<tr><td><strong>阿里云百炼 + Qwen</strong></td><td>中大型企业</td><td>开箱即用、免运维、企业级 SLA、与阿里云生态集成</td><td>有月度费用、数据在云端</td><td>已有阿里云账号体系的企业</td></tr>
<tr><td><strong>Dify + DeepSeek/Qwen</strong></td><td>中小团队</td><td>开源、可视化编排、支持多种向量数据库、权限管理</td><td>需自行部署维护</td><td>需要私有化部署且无专业 ML 团队</td></tr>
<tr><td><strong>LangChain + Chroma + Qwen</strong></td><td>技术团队自建</td><td>完全可控、可深度定制 Pipeline</td><td>开发工作量大、需 ML 能力</td><td>有 ML 工程师的团队</td></tr>
<tr><td><strong>Claude Code 项目文件(CLAUDE.md</strong></td><td>所有项目</td><td>零成本、随 Git 版本控制、Claude 自动加载</td><td>容量有限、仅当前项目</td><td>每个项目的<strong>基础配置</strong></td></tr>
</table>
</div>
<div class="box box-info">
<h4>💡 推荐起步方案</h4>
<p><strong>第一阶段(0-2 周)</strong>:完善每个项目的 <code>CLAUDE.md</code> + <code>.claude/design-tokens.md</code>,确保 Claude Code 启动即加载项目上下文。</p>
<p><strong>第二阶段(2-6 周)</strong>:搭建 Dify + Qwen 知识库,导入 L1-L3 层内容。为售前团队提供"历史方案检索"能力。</p>
<p><strong>第三阶段(6-12 周)</strong>:建立 L4 踩坑经验持续积累机制,开发团队每个 Bug 修复后自动生成结构化经验条目并入库。</p>
</div>
<h3>2.3 个人记忆系统</h3>
<p>企业知识库解决"团队共知",个人记忆解决"个人经验"。Claude Code 内置的 Memory 系统(<code>~/.claude/projects/</code>)可按项目维度持久化个人偏好和踩坑经验。详见<a href="#s7">第六章</a></p>
</section>
<!-- ===== 四、需求分析与方案设计 ===== -->
<section id="s4">
<h2>四、开发流程一:需求分析与方案设计</h2>
<p class="lead">从原始需求到可执行的技术方案,传统流程需要 1-3 周。AI 增强流程可将周期压缩 50-70%,且方案质量更稳定(不会遗漏关键维度)。</p>
<h3>3.1 流程总览</h3>
<div class="flow-grid">
<div class="flow-step">
<div class="step-num">1</div>
<h4>需求文档加载与分析</h4>
<p>将招标文件/需求规格书/客户访谈记录导入。200 页以上文档由 Qwen 首次全量加载并提取结构化需求清单。</p>
<span class="tool-tag">Qwen 长文档</span><span class="tool-tag">Claude Code</span>
</div>
<div class="flow-step">
<div class="step-num">2</div>
<h4>需求结构化拆解</h4>
<p>Claude Code 将 Qwen 的提取结果转化为功能需求矩阵 + 非功能需求清单 + 约束条件清单。与历史项目需求做相似度匹配。</p>
<span class="tool-tag">Claude Code</span><span class="tool-tag">知识库 RAG</span>
</div>
<div class="flow-step">
<div class="step-num">3</div>
<h4>技术方案设计</h4>
<p>基于需求矩阵,Claude Code 生成 2-3 个技术方案选项,含架构图(Mermaid)、技术选型理由、成本估算。DeepSeek 并行评审每个方案。</p>
<span class="tool-tag">Claude Code</span><span class="tool-tag">DeepSeek 评审</span>
</div>
<div class="flow-step">
<div class="step-num">4</div>
<h4>方案评审与定稿</h4>
<p>技术 Lead 对比 Claude 和 DeepSeek 的意见,做最终决策。Claude Code 根据决策生成正式方案文档(含架构图、接口定义、里程碑计划)。</p>
<span class="tool-tag">Claude Code</span><span class="tool-tag">人工决策</span>
</div>
</div>
<h3>3.2 详细操作步骤</h3>
<h4>Step 1: 需求文档加载与分析</h4>
<div class="table-wrap">
<table>
<tr><th style="width:10%;">子步骤</th><th style="width:25%;">操作</th><th>工具</th><th style="width:12%;">预计耗时</th></tr>
<tr><td>1.1</td><td>将需求文档(PDF/Word/Markdown)放入项目 <code>docs/requirements/</code> 目录</td><td>文件系统</td><td>2 分钟</td></tr>
<tr><td>1.2</td><td>若文档超过 50 页,调用 Qwen API(百万 Token 上下文)做全文结构提取:功能需求、非功能需求、约束条件、验收标准</td><td>Qwen API</td><td>3-5 分钟</td></tr>
<tr><td>1.3</td><td>Claude Code 读取 Qwen 提取结果 + 原始文档关键章节(通过 Read 工具),对话式澄清模糊需求</td><td>Claude Code</td><td>15-30 分钟</td></tr>
<tr><td>1.4</td><td>输出:结构化需求清单(Markdown 表格),含需求编号、描述、优先级、关联依赖、验收标准</td><td>Claude Code Write</td><td>5 分钟</td></tr>
</table>
</div>
<div class="box box-idea">
<h4>🔑 关键技巧:需求对话式澄清</h4>
<p>Claude Code 读取需求后,不应直接开始设计。先进入<strong>澄清对话模式</strong>:"我理解你要做 X,但以下 3 个方面需要确认:① 并发用户量预估?② 与现有系统 X 的集成方式?③ 数据合规要求?" —— 这模拟了资深架构师的"需求反问"能力。</p>
</div>
<h4>Step 2: 需求结构化拆解</h4>
<div class="table-wrap">
<table>
<tr><th style="width:10%;">子步骤</th><th style="width:25%;">操作</th><th>工具</th><th style="width:12%;">预计耗时</th></tr>
<tr><td>2.1</td><td>Claude Code 生成功能需求矩阵(FR-Matrix):功能模块 × 优先级 × 技术复杂度 × 预估人天</td><td>Claude Code</td><td>10 分钟</td></tr>
<tr><td>2.2</td><td>检索知识库中历史类似项目的需求矩阵,标注可复用模块</td><td>知识库 RAGQwen</td><td>3 分钟</td></tr>
<tr><td>2.3</td><td>生成非功能需求清单:性能、安全、可用性、可扩展性、合规性 —— 每个维度给出具体指标</td><td>Claude Code</td><td>10 分钟</td></tr>
<tr><td>2.4</td><td>Claude Code 输出需求覆盖度评估:"你的需求文档覆盖了 X% 的典型场景,以下场景缺失需要补充:..."</td><td>Claude Code</td><td>5 分钟</td></tr>
</table>
</div>
<h4>Step 3-4: 方案设计与评审</h4>
<p>Claude Code 基于项目 CLAUDE.md 中的架构规范,生成 2-3 个技术方案。每个方案包含:架构图(Mermaid 格式,可直接渲染)、技术选型理由、关键模块设计、数据流、成本估算。</p>
<p><strong>DeepSeek 的"反方辩手"角色</strong>:将 Claude Code 生成的方案发送给 DeepSeek,要求它找出方案中的"逻辑漏洞、过度设计、未考虑的边界条件"。这种"对抗式评审"能显著提升方案的健壮性。</p>
<div class="box box-good">
<h4>✅ 方案设计阶段的质量检查清单</h4>
<ul>
<li>☑ 架构图是否明确标注了所有外部系统集成点?</li>
<li>☑ 是否考虑了数据量增长(当前 100 倍)的可扩展性?</li>
<li>☑ 是否包含了安全攻击面的分析?</li>
<li>☑ 是否标注了技术选型中"可替换"和"不可替换"的组件?</li>
<li>☑ 是否有明确的"不做什么"Out of Scope)声明?</li>
<li>☑ 成本和时间的估算是否有 ±30% 的置信区间?</li>
</ul>
</div>
<h3>3.3 实操示例:从一份招标文件到可执行的技术方案</h3>
<p>以下是一个<strong>完整实操演示</strong>:某制造企业 MES 系统招标项目(招标文件 180 页 PDF),展示如何用本流程在 <strong>1.5 天内</strong>完成传统需要 1 周的需求分析+方案设计。</p>
<h4>示例 Step 1: Qwen 长文档首次提取</h4>
<div class="box box-info">
<h4>📋 操作:调用 Qwen 处理 180 页招标文件</h4>
<p>开发者将招标 PDF 转换为文本后,通过 Qwen API(或阿里云百炼工作台)发送以下提示:</p>
<div class="code-snippet">
<span class="cm"># 提示词(发送给 Qwen,利用百万 Token 上下文窗口)</span><br>
你是一位资深 MES 系统架构师。请通读以下招标文件全文,按结构化格式提取:<br>
<br>
<span class="kw">1. 功能需求清单</span><br>
&nbsp;&nbsp;- 每条需求格式:需求编号 | 功能模块 | 需求描述 | 优先级(必选/可选/加分) | 关联系统<br>
<span class="kw">2. 非功能需求</span><br>
&nbsp;&nbsp;- 性能指标(并发数、响应时间、数据量)<br>
&nbsp;&nbsp;- 安全要求(等保级别、加密标准、审计要求)<br>
&nbsp;&nbsp;- 可用性要求(SLA、RTO、RPO<br>
<span class="kw">3. 评分规则提取</span><br>
&nbsp;&nbsp;- 技术分评分项及分值<br>
&nbsp;&nbsp;- 商务分评分项及分值<br>
&nbsp;&nbsp;- 加分项清单<br>
<span class="kw">4. 隐性要求</span><br>
&nbsp;&nbsp;- 标书中未明确写出但行业惯例必须具备的能力<br>
&nbsp;&nbsp;- 可能导致废标的隐藏条款<br>
<br>
招标文件全文如下:<br>
[粘贴 180 页招标文件文本]
</div>
<p><strong>预计耗时</strong>:3-5 分钟(Qwen 返回结构化 JSON/Markdown</p>
</div>
<h4>示例 Step 2: Claude Code 需求澄清与补充</h4>
<div class="box box-idea">
<h4>💬 开发者对 Claude Code 说(实际 Prompt</h4>
<div class="code-snippet">
<span class="cm"># 在 Claude Code 对话中直接输入</span><br>
我正在进行一个 MES 项目的售前方案,招标文件的核心需求 Qwen 已经提取出来了,<br>
在项目 docs/requirements/mes-bid-extracted.md 里。<br>
<br>
请帮我做以下工作:<br>
1. 读取提取结果,检查是否有遗漏的关键需求(特别是制造业 MES 常见的<br>
&nbsp;&nbsp;&nbsp;工单管理、设备联网、质量追溯、物料拉动这四个模块)<br>
2. 生成 FR-Matrix(功能需求矩阵),按 MoSCoW 方法标注优先级<br>
3. 查询知识库中"历史类似 MES 项目"的方案,标注可复用模块<br>
4. 对不明确的需求列出澄清问题清单(我下午要和客户开会确认)<br>
<br>
请先进入 Plan Mode 规划你的工作步骤,我确认后再开始。
</div>
</div>
<div class="box box-good">
<h4>✅ Claude Code Plan Mode 输出示例</h4>
<div class="code-snippet">
<span class="kw">Plan</span>: MES 招标需求分析与方案设计<br>
<br>
<span class="kw">Step 1</span>: Read docs/requirements/mes-bid-extracted.md<br>
<span class="kw">Step 2</span>: 对比 MES 行业标准功能清单(ISA-95 模型),标注缺失项<br>
<span class="kw">Step 3</span>: 生成 FR-MatrixMarkdown 表格,含 MoSCoW 优先级)<br>
<span class="kw">Step 4</span>: 搜索项目 Memory 和知识库中的历史 MES 项目方案<br>
<span class="kw">Step 5</span>: 生成客户澄清问题清单(按紧急程度排序)<br>
<span class="kw">Step 6</span>: 输出全部结果到 docs/output/ 目录<br>
<br>
<span class="kw">涉及文件</span>:<br>
- READ: docs/requirements/mes-bid-extracted.md<br>
- READ: CLAUDE.md(编码和架构规范)<br>
- SEARCH: memory/(历史 MES 项目经验)<br>
- WRITE: docs/output/FR-Matrix.md<br>
- WRITE: docs/output/clarification-questions.md<br>
<br>
确认后我开始执行。
</div>
</div>
<h4>示例 Step 3: Claude Code 生成方案 + DeepSeek 对抗评审</h4>
<div class="box box-info">
<h4>📋 Claude Code 方案生成 Prompt</h4>
<div class="code-snippet">
<span class="cm"># 需求确认后,对 Claude Code 说:</span><br>
基于确认后的需求矩阵,请生成两个技术方案选项:<br>
<br>
<span class="kw">方案A(稳健型)</span>:基于 Spring Boot + Vue3 自研,<br>
使用成熟的工业协议适配层(Modbus/OPC UA),数据库用 PostgreSQL + TimescaleDB<br>
<span class="kw">方案B(激进型)</span>:基于开源 MES 框架(如 OpenMES)+ 二次开发,<br>
前端用低代码平台加速交付<br>
<br>
每个方案需包含:<br>
1. 架构图(Mermaid 格式)<br>
2. 技术选型理由(含替代方案对比)<br>
3. 关键模块设计(至少含工单管理、设备联网、质量追溯)<br>
4. 数据流图<br>
5. 人天估算(±30% 置信区间)<br>
6. 风险清单(Top 5 风险 + 应对措施)<br>
<br>
输出到 docs/output/solution-option-A.md 和 solution-option-B.md
</div>
</div>
<div class="box box-warn">
<h4>🔴 DeepSeek 对抗评审 Prompt(同时发送)</h4>
<div class="code-snippet">
<span class="cm"># 将 Claude Code 生成的方案发送给 DeepSeek</span><br>
你是一位严苛的技术评审专家。请对以下两份 MES 技术方案进行"攻击性评审":<br>
<br>
<span class="kw">评审维度</span><br>
1. 逻辑漏洞:方案中有哪些"想当然"的假设可能在落地时出错?<br>
2. 过度设计:哪些地方为追求"技术先进性"而引入了不必要的复杂度?<br>
3. 边界条件遗漏:高频并发、网络断线、设备异构、数据过期等场景是否覆盖?<br>
4. 成本低估:人天估算中哪些模块明显偏乐观?<br>
5. 替代方案:哪些技术选型有更好的替代品(请具体说明)?<br>
<br>
请逐条列出问题,每条标注严重程度(🔴致命/🟡重要/🟢建议)。<br>
不要只说"有问题",要给出具体改进方向。<br>
<br>
[粘贴 Claude Code 生成的方案全文]
</div>
</div>
<div class="box box-good">
<h4>✅ 综合评审后的人工决策</h4>
<p>技术 Lead 拿到 Claude Code 的方案 + DeepSeek 的挑刺意见后,做最终决策。例如:采纳方案 A 的技术架构,但采用低代码平台做报表和看板(方案 B 的优点)。最后由 Claude Code 根据决策整合为最终方案文档。</p>
<p><strong>全程耗时</strong>:方案生成 20 分钟 + DeepSeek 评审 5 分钟 + 人工决策 30 分钟 = <strong>不到 1 小时</strong>(传统方式需要 2-3 天)。</p>
</div>
</section>
<!-- ===== 五、编码实现与代码审查 ===== -->
<section id="s5">
<h2>五、开发流程二:编码实现与代码审查</h2>
<p class="lead">这是 AI 参与度最高的环节。Claude Code 在此阶段充当"AI 程序员"——不是聊天框里的建议者,而是<strong>直接操作文件系统、执行命令、提交代码的 Agent</strong></p>
<h3>4.1 编码工作流(单任务)</h3>
<div class="flow-grid">
<div class="flow-step">
<div class="step-num">1</div>
<h4>任务启动</h4>
<p>开发者向 Claude Code 描述需求(自然语言 + 需求编号引用)。Claude Code 自动读取相关源文件,进入 Plan Mode 输出实现计划。</p>
<span class="tool-tag">Claude Code Plan Mode</span>
</div>
<div class="flow-step">
<div class="step-num">2</div>
<h4>方案确认</h4>
<p>开发者审核 Plan,确认架构选型和文件范围。必要时调用 DeepSeek 做"第二意见"验证。</p>
<span class="tool-tag">人工确认</span><span class="tool-tag">DeepSeek(可选)</span>
</div>
<div class="flow-step">
<div class="step-num">3</div>
<h4>编码实现</h4>
<p>Claude Code 逐文件编写代码,同时编写单元测试。每完成一个模块,自动运行测试验证。引用知识库中的编码规范确保风格一致。</p>
<span class="tool-tag">Claude Code Edit/Write</span><span class="tool-tag">Bash 运行测试</span>
</div>
<div class="flow-step">
<div class="step-num">4</div>
<h4>自动审查</h4>
<p>代码提交 PR 前,open-code-review 自动运行静态检查。Claude Code 执行语义级深度审查(逻辑错误、性能隐患、安全漏洞)。</p>
<span class="tool-tag">open-code-review</span><span class="tool-tag">Claude Code</span>
</div>
<div class="flow-step">
<div class="step-num">5</div>
<h4>记忆沉淀</h4>
<p>任务完成后,开发者口述关键经验,Claude Code 自动写入个人记忆文件(见<a href="#s7">第七章</a>)。</p>
<span class="tool-tag">Claude Code Memory</span>
</div>
</div>
<h3>4.2 三层代码审查体系</h3>
<div class="table-wrap">
<div class="table-caption">表:递进式三层代码审查机制</div>
<table>
<tr><th>层级</th><th>工具</th><th>检查内容</th><th>触发时机</th><th>阻断级别</th></tr>
<tr>
<td><strong>L1: 规约检查</strong></td>
<td>alibaba-group/open-code-review</td>
<td>命名规范、代码格式、注释密度、异常处理模式、资源关闭、集合操作安全、并发风险模式</td>
<td>每次 git push / PR 创建</td>
<td><span class="tag tag-red">强制阻断</span>(不合规代码不允许进入人工 Review)</td>
</tr>
<tr>
<td><strong>L2: 语义审查</strong></td>
<td>Claude Code/code-review</td>
<td>逻辑正确性、边界条件覆盖、性能隐患(N+1 查询、内存泄漏、锁竞争)、安全漏洞(注入、越权、敏感信息泄露)、代码可读性与设计模式合理性</td>
<td>L1 通过后</td>
<td><span class="tag tag-warn">建议阻断</span>(严重问题自动阻止合并,建议性问题标注后放行)</td>
</tr>
<tr>
<td><strong>L3: 人工审查</strong></td>
<td>开发者 / Tech Lead</td>
<td>业务逻辑正确性、架构一致性、跨模块影响评估、用户体验合理性</td>
<td>L2 通过后</td>
<td><span class="tag tag-blue">最终决策</span>(聚焦业务和架构,不再浪费时间查代码风格)</td>
</tr>
</table>
</div>
<div class="box box-info">
<h4>⚙️ open-code-review CI 集成配置</h4>
<p>在项目根目录创建 <code>.github/workflows/code-review.yml</code></p>
<div class="code-snippet">
<span class="kw">name</span>: Code Review<br>
<span class="kw">on</span>: [pull_request]<br>
<span class="kw">jobs</span>:<br>
&nbsp;&nbsp;<span class="kw">review</span>:<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">runs-on</span>: ubuntu-latest<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">steps</span>:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- <span class="kw">uses</span>: alibaba-group/open-code-review@v1<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">with</span>:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">languages</span>: <span class="str">java,javascript,typescript,vue</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">severity</span>: <span class="str">error,warning</span>
</div>
</div>
<h3>4.3 多 Agent 并行开发模式</h3>
<p>对于大型功能(涉及 5+ 文件、跨多个模块),利用 Claude Code 的 Agent 工具启动多个子 Agent 并行工作:</p>
<div class="table-wrap">
<table>
<tr><th>模式</th><th>适用场景</th><th>并发数</th><th>示例</th></tr>
<tr><td><strong>前后端分离</strong></td><td>新增 CRUD 功能,前端页面 + 后端 API 同时开发</td><td>2 个 Agent</td><td>Agent A 写后端 API + 测试,Agent B 写前端页面 + 联调</td></tr>
<tr><td><strong>模块拆分</strong></td><td>大型功能涉及多个独立模块(如订单模块 + 支付模块 + 通知模块)</td><td>3-5 个 Agent</td><td>每个模块独立 Agent,主 Agent 负责接口定义和最终集成</td></tr>
<tr><td><strong>测试并行</strong></td><td>核心功能开发完成后,单元测试 + 集成测试 + E2E 测试并行编写</td><td>3 个 Agent</td><td>Agent A 单元测试,Agent B 集成测试,Agent C E2E 测试</td></tr>
</table>
</div>
<div class="box box-warn">
<h4>⚠️ 并行开发的注意事项</h4>
<p><strong>接口先行</strong>:主 Agent 必须先定义好模块间的接口契约(API 签名、数据模型),子 Agent 再并行开发。</p>
<p><strong>独立工作区</strong>:使用 Git Worktree 为每个子 Agent 提供独立工作区,避免文件冲突。</p>
<p><strong>合并由主 Agent 统一执行</strong>:子 Agent 只产出代码,不自行合并。主 Agent 负责 Review 子 Agent 产出并集成。</p>
</div>
<h3>4.4 实操示例:实现一个带审批流的工单管理模块</h3>
<p>以下演示用 Claude Code 从零实现一个<strong>工单审批流功能</strong>Spring Boot + Vue3),并走通 Plan → 编码 → 审查 → 记忆沉淀的完整链路。</p>
<h4>示例 Step 1: 任务启动(Plan Mode</h4>
<div class="box box-info">
<h4>💬 开发者对 Claude Code 的初始 Prompt</h4>
<div class="code-snippet">
<span class="cm"># 需求背景(引用 FR-Matrix 中的需求编号)</span><br>
需求编号 FR-WO-003:工单审批流<br>
<br>
<span class="kw">功能描述</span><br>
- 工单创建后进入审批流程:班组长初审 → 车间主任复审 → 生产部长终审<br>
- 支持审批通过/驳回/转审三种操作<br>
- 驳回时需填写驳回原因,工单退回至创建人修改<br>
- 审批记录需完整保留(谁在什么时间做了什么操作)<br>
- 审批超时 48 小时自动提醒<br>
<br>
<span class="kw">技术约束</span><br>
- 后端:Spring Boot 2.7 + MyBatis-Plus + MySQL<br>
- 前端:Vue3 + Element Plus<br>
- 审批流引擎:Flowable(已在项目中引入)<br>
- 编码规范:参考 CLAUDE.md<br>
<br>
请先进入 Plan Mode,给我看你的实现计划。
</div>
</div>
<div class="box box-good">
<h4>✅ Claude Code Plan Mode 输出</h4>
<div class="code-snippet">
<span class="kw">Plan</span>: 工单审批流 FR-WO-003<br>
<br>
<span class="kw">Step 1 - 数据模型</span>:<br>
&nbsp;&nbsp;- READ: src/main/java/.../entity/WorkOrder.java (现有工单实体)<br>
&nbsp;&nbsp;- READ: src/main/resources/db/migration/ (现有表结构)<br>
&nbsp;&nbsp;- WRITE: 新增审批流相关表 (approval_record, approval_config)<br>
&nbsp;&nbsp;- WRITE: 新增实体类 + DTO<br>
<br>
<span class="kw">Step 2 - 审批流引擎</span>:<br>
&nbsp;&nbsp;- WRITE: Flowable 流程定义 (BPMN XML)<br>
&nbsp;&nbsp;- WRITE: ApprovalService (启动流程/完成任务/查询待办)<br>
&nbsp;&nbsp;- WRITE: ApprovalCallback (审批通过后的工单状态更新)<br>
<br>
<span class="kw">Step 3 - Controller + 接口</span>:<br>
&nbsp;&nbsp;- WRITE: ApprovalController (REST API)<br>
&nbsp;&nbsp;- 接口:POST /api/workorder/{id}/submit, POST /api/approval/{taskId}/complete,<br>
&nbsp;&nbsp;&nbsp;&nbsp;GET /api/approval/pending, GET /api/workorder/{id}/approval-history<br>
<br>
<span class="kw">Step 4 - 前端</span>:<br>
&nbsp;&nbsp;- WRITE: ApprovalPanel.vue (审批操作面板)<br>
&nbsp;&nbsp;- WRITE: ApprovalHistory.vue (审批历程时间线)<br>
&nbsp;&nbsp;- WRITE: WorkOrderDetail.vue (集成审批面板到工单详情页)<br>
<br>
<span class="kw">Step 5 - 测试</span>:<br>
&nbsp;&nbsp;- WRITE: ApprovalServiceTest.java (单元测试: 正常审批/驳回/转审/超时)<br>
&nbsp;&nbsp;- WRITE: ApprovalControllerTest.java (接口测试)<br>
<br>
<span class="kw">Step 6 - 审查</span>:<br>
&nbsp;&nbsp;- 自检 open-code-review 规则<br>
&nbsp;&nbsp;- 运行完整测试套件<br>
<br>
<span class="kw">涉及文件</span>: ~12 个文件<br>
<span class="kw">预计耗时</span>: Claude Code 编码 30-45 分钟,人工审查 15 分钟<br>
<br>
确认后我开始执行。
</div>
</div>
<h4>示例 Step 2: 编码实现中的关键交互</h4>
<div class="box box-idea">
<h4>🔑 开发者如何引导 Claude Code 写出高质量代码</h4>
<table>
<tr><th style="width:20%;">引导技巧</th><th style="width:40%;">不好的说法</th><th>好的说法</th></tr>
<tr>
<td><strong>引用规范</strong></td>
<td>"写个审批接口"</td>
<td>"写审批接口,返回格式统一用 <code>Result&lt;T&gt;</code> 包装,异常走 <code>GlobalExceptionHandler</code>(参考 CLAUDE.md 第 3 节)"</td>
</tr>
<tr>
<td><strong>给出上下文</strong></td>
<td>"加个审批记录表"</td>
<td>"加审批记录表,字段风格参照现有的 <code>work_order</code> 表(用下划线命名、必须有 <code>create_time</code><code>update_time</code>、逻辑删除用 <code>is_deleted</code>"</td>
</tr>
<tr>
<td><strong>边界条件前置</strong></td>
<td>"实现审批超时提醒"</td>
<td>"审批超时 48h 自动提醒,注意:① 只提醒当前审批节点的人 ② 已驳回/已转审的不要再提醒 ③ 提醒频率:超时后每 4h 提醒一次,最多 3 次"</td>
</tr>
<tr>
<td><strong>确认而非假设</strong></td>
<td>"审批驳回后直接改状态"</td>
<td>"驳回时工单状态改为 REJECTED,但工单创建人修改后重新提交时,是走原审批流从头开始还是从当前节点继续?如果是前者,请生成新的流程实例"</td>
</tr>
</table>
</div>
<h4>示例 Step 3: Claude Code 生成的代码片段(后端核心逻辑)</h4>
<div class="code-snippet">
<span class="cm">// ===== ApprovalService.javaClaude Code 自动生成)=====</span><br>
<span class="kw">@Service</span><br>
<span class="kw">@Slf4j</span><br>
<span class="kw">public class</span> <span class="fn">ApprovalService</span> {<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">@Autowired</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">private</span> RuntimeService <span class="fn">runtimeService</span>;<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">@Autowired</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">private</span> TaskService <span class="fn">taskService</span>;<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="cm">// 提交工单并启动审批流</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">@Transactional</span>(rollbackFor = Exception.class)<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">public void</span> <span class="fn">submitForApproval</span>(Long workOrderId) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WorkOrder wo = workOrderMapper.selectById(workOrderId);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">if</span> (wo == <span class="kw">null</span>) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">throw new</span> BusinessException(<span class="str">"工单不存在: "</span> + workOrderId);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">if</span> (wo.getStatus() != WorkOrderStatus.DRAFT) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">throw new</span> BusinessException(<span class="str">"只有草稿状态的工单才能提交审批"</span>);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="cm">// 启动 Flowable 流程实例</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map&lt;String, Object&gt; vars = <span class="kw">new</span> HashMap&lt;&gt;();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vars.put(<span class="str">"workOrderId"</span>, workOrderId);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vars.put(<span class="str">"submitterId"</span>, SecurityUtils.getCurrentUserId());<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vars.put(<span class="str">"urgencyLevel"</span>, wo.getUrgencyLevel());<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ProcessInstance pi = runtimeService.startProcessInstanceByKey(<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="str">"work-order-approval"</span>,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String.valueOf(workOrderId),<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vars<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="cm">// 更新工单状态</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wo.setStatus(WorkOrderStatus.PENDING_APPROVAL);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wo.setProcessInstanceId(pi.getId());<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;workOrderMapper.updateById(wo);<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.info(<span class="str">"工单 {} 审批流已启动,流程实例: {}"</span>, workOrderId, pi.getId());<br>
&nbsp;&nbsp;&nbsp;&nbsp;}<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="cm">// 完成审批任务</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">@Transactional</span>(rollbackFor = Exception.class)<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">public void</span> <span class="fn">completeTask</span>(ApprovalRequest req) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Task task = taskService.createTaskQuery()<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.taskId(req.getTaskId())<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.singleResult();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">if</span> (task == <span class="kw">null</span>) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">throw new</span> BusinessException(<span class="str">"审批任务不存在或已被处理"</span>);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="cm">// 记录审批意见</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ApprovalRecord record = ApprovalRecord.builder()<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.workOrderId(Long.valueOf(task.getBusinessKey()))<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.taskId(req.getTaskId())<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.approver(SecurityUtils.getCurrentUserId())<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.action(req.getAction()) <span class="cm">// APPROVE / REJECT / TRANSFER</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.comment(req.getComment())<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.operateTime(LocalDateTime.now())<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.build();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;approvalRecordMapper.insert(record);<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="cm">// 提交 Flowable 任务</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map&lt;String, Object&gt; vars = <span class="kw">new</span> HashMap&lt;&gt;();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vars.put(<span class="str">"approvalResult"</span>, req.getAction());<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;taskService.complete(req.getTaskId(), vars);<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.info(<span class="str">"审批任务 {} 已完成,操作: {}"</span>, req.getTaskId(), req.getAction());<br>
&nbsp;&nbsp;&nbsp;&nbsp;}<br>
}
</div>
<h4>示例 Step 4: 三层审查的实操</h4>
<div class="box box-info">
<h4>L1: open-code-review 自动检查结果</h4>
<p>代码 push 后,GitHub Actions 自动运行 open-code-review。假设发现以下问题:</p>
<div class="code-snippet">
<span class="kw">❌ ERROR</span>: ApprovalService.java:45 <br>
&nbsp;&nbsp;&nbsp;&nbsp;规则: <span class="str">"@Transactional 必须指定 rollbackFor = Exception.class"</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;当前: @Transactional (缺少 rollbackFor)<br>
<span class="kw">❌ ERROR</span>: ApprovalRecord.java:12<br>
&nbsp;&nbsp;&nbsp;&nbsp;规则: <span class="str">"日期字段必须使用 LocalDateTime,禁止使用 Date"</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;当前: private Date operateTime;<br>
<span class="kw">⚠️ WARNING</span>: ApprovalController.java:23<br>
&nbsp;&nbsp;&nbsp;&nbsp;规则: <span class="str">"REST 接口必须使用 @Valid 校验请求参数"</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;当前: public Result completeTask(ApprovalRequest req) (缺少 @Valid)<br>
<br>
<span class="kw">CI Status</span>: ❌ FAILED — 2 errors, 1 warning<br>
→ 开发者修复后重新 pushopen-code-review 通过 ✅
</div>
</div>
<div class="box box-idea">
<h4>L2: Claude Code 深度审查(/code-review 命令)</h4>
<div class="code-snippet">
<span class="cm"># 开发者对 Claude Code 说:</span><br>
/code-review<br>
审查我刚提交的工单审批流功能,重点关注:<br>
1. 并发安全:多人同时审批同一个工单会不会有竞态条件?<br>
2. 事务边界:审批记录写入和 Flowable 任务完成是否在一个事务里?<br>
3. 超时机制:48 小时超时提醒的实现方案是否合理?<br>
4. 与现有工单模块的集成是否有破坏性变更?<br>
<br>
<span class="cm"># Claude Code 输出(示例):</span><br>
<span class="kw">🔴 严重</span>: ApprovalService.completeTask() 存在竞态条件。<br>
两个审批人同时点"通过"时,Flowable 的 taskService.complete()<br>
内部有乐观锁保护,但 approvalRecordMapper.insert() 在 complete()<br>
之前执行,如果 complete() 抛出异常,审批记录将"幽灵插入"。<br>
<span class="kw">建议</span>:将 insert(record) 移到 complete() 之后,或者使用<br>
@Transactional 确保两者原子性(已满足,但顺序问题仍建议调整)。<br>
<br>
<span class="kw">🟡 建议</span>: 超时提醒用 @Scheduled 每分钟扫描一次 pending 任务,<br>
在工单量 < 1万 时可行但建议预留 Quartz/XXL-Job 升级路径<br>
建议在 CLAUDE.md 中记录此技术债务。
</div>
</div>
<h4>示例 Step 5: 记忆沉淀——任务结束时</h4>
<div class="box box-good">
<h4>🧩 开发者对话结束前对 Claude Code 说</h4>
<div class="code-snippet">
<span class="cm"># 本次开发完成,帮我记录以下经验:</span><br>
1. Flowable 的 taskService.complete() 内部有乐观锁,<br>
&nbsp;&nbsp;&nbsp;数据库操作应放在 complete() 之后,避免幽灵记录<br>
2. 审批流 BPMN 中的 UserTask 必须设置 assignee 表达式,<br>
&nbsp;&nbsp;&nbsp;本项目用 ${deptLeader} / ${workshopDirector} / ${productionManager}<br>
3. 审批超时提醒的 @Scheduled 方案在并发 > 1000 待办时需升级为<br>
&nbsp;&nbsp;&nbsp;消息队列方案(已在 CLAUDE.md 记录技术债务)<br>
<br>
<span class="kw"># Claude Code 自动写入 memory/project/flowable-approval-patterns.md</span>
</div>
<p>下次再有审批流需求,Claude Code 会自动加载这份记忆,不会再踩同样的坑。</p>
</div>
</section>
<!-- ===== 六、测试、文档与部署 ===== -->
<section id="s6">
<h2>六、开发流程三:测试、文档与部署</h2>
<h3>5.1 测试分层与 AI 参与度</h3>
<div class="table-wrap">
<table>
<tr><th>测试层级</th><th>AI 工具</th><th>AI 参与方式</th><th>人工职责</th></tr>
<tr>
<td><strong>单元测试</strong></td>
<td>Claude Code</td>
<td>根据源码自动生成测试用例(覆盖正常路径 + 边界条件 + 异常路径)。开发者只需描述特殊业务规则</td>
<td>审核测试覆盖的业务规则是否正确,补充 AI 无法推断的领域特定逻辑</td>
</tr>
<tr>
<td><strong>集成测试</strong></td>
<td>Claude Code</td>
<td>基于接口文档(OpenAPI/Protobuf)自动生成集成测试脚本,Mock 外部依赖</td>
<td>配置测试环境、审核 Mock 数据的真实性</td>
</tr>
<tr>
<td><strong>E2E 测试</strong></td>
<td>Claude Code + Playwright</td>
<td>根据用户故事生成 Playwright 测试脚本,覆盖核心业务流程</td>
<td>定义核心用户旅程、审核测试断言的准确性</td>
</tr>
<tr>
<td><strong>性能测试</strong></td>
<td>Claude Code + JMeter/k6</td>
<td>基于非功能需求生成性能测试脚本,分析瓶颈</td>
<td>设定性能基线、分析 AI 无法判断的业务合理性</td>
</tr>
</table>
</div>
<h3>5.2 文档生成策略</h3>
<p>传统开发中,文档是"写完代码再补"的负担。AI 增强流程中,<strong>文档与代码同步生成</strong></p>
<div class="table-wrap">
<table>
<tr><th>文档类型</th><th>生成方式</th><th>更新策略</th></tr>
<tr><td><strong>API 文档</strong></td><td>Claude Code 从代码注解 + OpenAPI 定义自动生成,输出为 Markdown 或 Swagger UI</td><td>代码变更时同步更新</td></tr>
<tr><td><strong>架构决策记录(ADR</strong></td><td>每次技术决策时,Claude Code 自动生成 ADR(上下文 → 决策 → 后果 → 备选方案)</td><td>决策时即时生成</td></tr>
<tr><td><strong>部署运维手册</strong></td><td>Claude Code 基于 Dockerfile/Helm Chart/CI 配置自动生成</td><td>部署配置变更时</td></tr>
<tr><td><strong>客户验收文档</strong></td><td>Qwen 基于需求矩阵 + 测试报告 + 用户故事,生成中文验收文档</td><td>里程碑节点</td></tr>
</table>
</div>
<h3>5.3 CI/CD 流水线中的 AI 节点</h3>
<div class="arch-diagram">
<div class="arch-layer">
<div class="arch-box tool" style="min-width:130px;">Git Push</div>
<span class="arch-arrow"></span>
<div class="arch-box tool" style="min-width:130px;">open-code-review<span class="sub">L1 规约检查</span></div>
<span class="arch-arrow"></span>
<div class="arch-box model" style="min-width:130px;">Claude Code<span class="sub">L2 语义审查</span></div>
<span class="arch-arrow"></span>
<div class="arch-box tool" style="min-width:130px;">自动化测试<span class="sub">单测 + 集成 + E2E</span></div>
<span class="arch-arrow"></span>
<div class="arch-box data" style="min-width:130px;">人工 Review<span class="sub">L3 业务审查</span></div>
<span class="arch-arrow"></span>
<div class="arch-box core" style="min-width:130px;">自动部署<span class="sub">Merge → Deploy</span></div>
</div>
</div>
<div class="box box-good">
<h4>✅ CI 流水线的"AI 阻断点"设计</h4>
<p>L1open-code-review)和 L2Claude Code)检查失败时,CI 流水线<strong>自动阻止合并</strong>。这确保了:① 代码风格和基础规范 100% 合规 ② 常见逻辑错误在 PR 阶段就被拦截 ③ 人工 Reviewer 的时间全部用于高价值的业务审查,不再浪费在代码格式上。</p>
</div>
<h3>5.4 实操示例:从 PR 到上线的完整自动化链路</h3>
<p>以下演示工单审批流功能从 <strong>git push → 自动审查 → 测试 → 文档生成 → 部署</strong>的完整流水线。</p>
<h4>示例 Step 1: GitHub Actions 完整 CI 配置</h4>
<div class="box box-info">
<h4>📋 .github/workflows/ci.yml(完整配置)</h4>
<div class="code-snippet">
<span class="kw">name</span>: CI Pipeline<br>
<span class="kw">on</span>:<br>
&nbsp;&nbsp;<span class="kw">push</span>:<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">branches</span>: [main, develop]<br>
&nbsp;&nbsp;<span class="kw">pull_request</span>:<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">branches</span>: [main]<br>
<br>
<span class="kw">jobs</span>:<br>
&nbsp;&nbsp;<span class="cm"># ===== Job 1: 代码规范检查 =====</span><br>
&nbsp;&nbsp;<span class="kw">lint</span>:<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">runs-on</span>: ubuntu-latest<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">steps</span>:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- <span class="kw">uses</span>: actions/checkout@v4<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- <span class="kw">uses</span>: alibaba-group/open-code-review@v1<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">with</span>:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">languages</span>: <span class="str">java,javascript,typescript,vue</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">severity</span>: <span class="str">error,warning</span><br>
<br>
&nbsp;&nbsp;<span class="cm"># ===== Job 2: 单元测试 + 集成测试 =====</span><br>
&nbsp;&nbsp;<span class="kw">test</span>:<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">needs</span>: lint<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">runs-on</span>: ubuntu-latest<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">services</span>:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">mysql</span>:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">image</span>: mysql:8.0<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">env</span>:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">MYSQL_ROOT_PASSWORD</span>: test123<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">ports</span>: [3306]<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">steps</span>:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- <span class="kw">uses</span>: actions/checkout@v4<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- <span class="kw">name</span>: Run Tests<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">run</span>: mvn test -B<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- <span class="kw">name</span>: Upload Coverage<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">uses</span>: codecov/codecov-action@v4<br>
<br>
&nbsp;&nbsp;<span class="cm"># ===== Job 3: Claude Code 深度审查(仅 PR=====</span><br>
&nbsp;&nbsp;<span class="kw">ai-review</span>:<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">if</span>: github.event_name == 'pull_request'<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">needs</span>: [lint, test]<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">runs-on</span>: ubuntu-latest<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">steps</span>:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- <span class="kw">uses</span>: actions/checkout@v4<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">with</span>:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">fetch-depth</span>: 0<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- <span class="kw">name</span>: Claude Code Review<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">run</span>: |<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="cm"># 获取 PR 的 diff,调用 Claude Code 做语义审查</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;git diff origin/main...HEAD > /tmp/pr.diff<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="cm"># Claude Code CLI 审查模式</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;claude --print "Review this diff for bugs,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;security issues, and logic errors:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\$(cat /tmp/pr.diff)" > /tmp/review.md<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="cm"># 将审查结果作为 PR Comment</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gh pr comment $&#123;&#123; github.event.pull_request.number &#125;&#125;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--body-file /tmp/review.md<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">env</span>:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">ANTHROPIC_API_KEY</span>: $&#123;&#123; secrets.ANTHROPIC_API_KEY &#125;&#125;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">GITHUB_TOKEN</span>: $&#123;&#123; secrets.GITHUB_TOKEN &#125;&#125;<br>
</div>
</div>
<h4>示例 Step 2: Claude Code 自动生成测试用例</h4>
<div class="box box-idea">
<h4>💬 开发者 Prompt:让 Claude Code 自动生成测试</h4>
<div class="code-snippet">
<span class="cm"># 对 Claude Code 说:</span><br>
请为 ApprovalService.java 的 submitForApproval() 方法生成完整的单元测试,<br>
要求:<br>
<br>
1. <span class="kw">正常路径</span>:草稿工单提交审批成功<br>
2. <span class="kw">异常路径</span>:工单不存在、工单状态不是草稿、提交人没有审批权限<br>
3. <span class="kw">边界条件</span>:并发提交同一工单(模拟两个线程同时调用)<br>
4. <span class="kw">Mock 策略</span>Flowable 的 RuntimeService 和 TaskService 用 Mockito Mock<br>
&nbsp;&nbsp;&nbsp;数据库层用 @DataJpaTest 真实测试(H2 内存库)<br>
5. 测试覆盖率目标:行覆盖 ≥ 90%,分支覆盖 ≥ 85%<br>
<br>
测试框架:JUnit 5 + Mockito + AssertJ
</div>
</div>
<div class="box box-good">
<h4>✅ Claude Code 生成的测试代码(关键片段)</h4>
<div class="code-snippet">
<span class="kw">@ExtendWith</span>(MockitoExtension.<span class="kw">class</span>)<br>
<span class="kw">class</span> <span class="fn">ApprovalServiceTest</span> {<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">@Mock</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">private</span> RuntimeService <span class="fn">runtimeService</span>;<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">@Mock</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">private</span> WorkOrderMapper <span class="fn">workOrderMapper</span>;<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">@InjectMocks</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">private</span> ApprovalService <span class="fn">approvalService</span>;<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">@Test</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">@DisplayName</span>(<span class="str">"正常提交草稿工单 → 启动审批流 → 状态变更为待审批"</span>)<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">void</span> <span class="fn">shouldStartApprovalWhenDraftWorkOrderSubmitted</span>() {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="cm">// Given</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WorkOrder wo = WorkOrder.builder()<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.id(1L).status(WorkOrderStatus.DRAFT).build();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when(workOrderMapper.selectById(1L)).thenReturn(wo);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ProcessInstance pi = mock(ProcessInstance.class);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when(pi.getId()).thenReturn(<span class="str">"proc-123"</span>);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when(runtimeService.startProcessInstanceByKey(any(), any(), any()))<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.thenReturn(pi);<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="cm">// When</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;approvalService.submitForApproval(1L);<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="cm">// Then</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assertThat(wo.getStatus()).isEqualTo(WorkOrderStatus.PENDING_APPROVAL);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assertThat(wo.getProcessInstanceId()).isEqualTo(<span class="str">"proc-123"</span>);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;verify(workOrderMapper).updateById(wo);<br>
&nbsp;&nbsp;&nbsp;&nbsp;}<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">@Test</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">@DisplayName</span>(<span class="str">"非草稿状态工单提交审批 → 抛出 BusinessException"</span>)<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="kw">void</span> <span class="fn">shouldThrowExceptionWhenWorkOrderNotDraft</span>() {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WorkOrder wo = WorkOrder.builder()<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.id(1L).status(WorkOrderStatus.APPROVED).build();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when(workOrderMapper.selectById(1L)).thenReturn(wo);<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assertThatThrownBy(() -> approvalService.submitForApproval(1L))<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.isInstanceOf(BusinessException.class)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.hasMessageContaining(<span class="str">"草稿状态"</span>);<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;verify(runtimeService, never()).startProcessInstanceByKey(any(),any(),any());<br>
&nbsp;&nbsp;&nbsp;&nbsp;}<br>
}
</div>
</div>
<h4>示例 Step 3: Claude Code 自动生成 API 文档 + ADR</h4>
<div class="box box-info">
<h4>📋 文档生成 Prompt</h4>
<div class="code-snippet">
<span class="cm"># 对 Claude Code 说:</span><br>
工单审批流功能开发完成,请帮我生成以下文档:<br>
<br>
<span class="kw">1. API 文档</span>docs/api/approval-api.md<br>
&nbsp;&nbsp;&nbsp;- 基于 ApprovalController 的注解和代码生成<br>
&nbsp;&nbsp;&nbsp;- 格式:接口路径 | 方法 | 请求参数 | 响应示例 | 错误码<br>
&nbsp;&nbsp;&nbsp;- 用 Markdown 表格<br>
<br>
<span class="kw">2. 架构决策记录</span>docs/adr/ADR-005-approval-engine.md<br>
&nbsp;&nbsp;&nbsp;- 标题:ADR-005: 选择 Flowable 作为审批流引擎<br>
&nbsp;&nbsp;&nbsp;- 格式:上下文 → 决策 → 后果 → 备选方案(Activiti/Camunda/自研)<br>
<br>
<span class="kw">3. 部署变更说明</span>docs/deploy/v2.3-approval-changes.md<br>
&nbsp;&nbsp;&nbsp;- 新增数据库表(DDL<br>
&nbsp;&nbsp;&nbsp;- 新增配置项(application.yml<br>
&nbsp;&nbsp;&nbsp;- 部署步骤和回滚方案
</div>
</div>
<h4>示例 Step 4: Qwen 生成客户验收文档</h4>
<div class="box box-idea">
<h4>📄 Qwen 生成验收文档 Prompt</h4>
<div class="code-snippet">
<span class="cm"># 通过 Qwen API(百炼工作台)发送:</span><br>
你是一位 MES 项目的交付经理。请基于以下信息,生成一份面向客户的<br>
《工单审批流功能验收报告》:<br>
<br>
<span class="kw">输入信息</span><br>
- 需求编号:FR-WO-003(工单审批流)<br>
- 功能描述:[粘贴 FR-Matrix 中对应条目]<br>
- 测试结果:[粘贴测试报告摘要]<br>
- 用户故事:[粘贴 Agile 用户故事]<br>
<br>
<span class="kw">验收报告要求</span><br>
1. 语言:中文,面向非技术客户的业务语言<br>
2. 结构:功能概述 → 验收标准逐项对照 → 测试结果 → 遗留问题 → 签收建议<br>
3. 篇幅:2-3 页<br>
4. 格式:标准验收报告模板(含客户签章区)
</div>
</div>
</section>
<!-- ===== 七、个人记忆系统 ===== -->
<section id="s7">
<h2>七、个人记忆系统:持续积累与经验复用</h2>
<p class="lead">企业知识库是"组织记忆",解决团队共性问题。但每个开发者有自己的技术偏好、踩过的坑、积累的提示词和脚本片段。个人记忆系统就是为每个开发者定制的"第二大脑"。</p>
<h3>6.1 Claude Code Memory 机制</h3>
<p>Claude Code 内置的 Memory 系统(<code>~/.claude/projects/&lt;项目路径&gt;/memory/</code>)提供文件级记忆持久化。每条记忆是一个独立的 Markdown 文件,带 frontmatter 元数据,在后续会话中自动加载。</p>
<div class="table-wrap">
<div class="table-caption">表:Memory 文件的四种类型与使用场景</div>
<table>
<tr><th>类型</th><th>用途</th><th>示例</th><th>触发时机</th></tr>
<tr>
<td><strong>user</strong></td>
<td>记录开发者角色、技术偏好、习惯</td>
<td>"偏好使用 PostgreSQL 而非 MySQL"、"倾向于函数式编程风格"</td>
<td>首次使用 Claude Code 时设定,后续对话自动加载</td>
</tr>
<tr>
<td><strong>feedback</strong></td>
<td>记录用户对 AI 行为的纠正和偏好确认</td>
<td>"上次你用的设计模式过度复杂,下次遇到类似场景用更简单的方式"</td>
<td>开发者在对话中给出纠正意见时</td>
</tr>
<tr>
<td><strong>project</strong></td>
<td>记录项目特定的约定、非标准配置</td>
<td>"这个项目使用 Java 17 + Spring Boot 3.2LLM 调用通过内部 API 网关,不直连外部模型"</td>
<td>项目初期设定,架构变更时更新</td>
</tr>
<tr>
<td><strong>reference</strong></td>
<td>记录外部资源引用</td>
<td>"阿里云百炼 API 文档:https://help.aliyun.com/..."、"内部 API 网关文档:..."</td>
<td>任何需要"记住去哪查"的场景</td>
</tr>
</table>
</div>
<h3>6.2 个人记忆的最佳实践</h3>
<div class="box box-idea">
<h4>🔑 记忆积累的"5 分钟规则"</h4>
<p>每次 Claude Code 会话结束前,花 <strong>不超过 5 分钟</strong> 做一次"记忆回收":回想本次对话中哪些信息值得下次记住。用自然语言对 Claude Code 说:"帮我记住以下几点:① ... ② ... ③ ..."</p>
</div>
<div class="table-wrap">
<div class="table-caption">表:值得写入记忆 vs 不值得写入的对比</div>
<table>
<tr><th>✅ 值得写入记忆</th><th>❌ 不需要写入(代码/Git 已有)</th></tr>
<tr><td>"这个项目的异常处理统一用 GlobalExceptionHandler,不要在每个 Controller 里 try-catch"</td><td>"UserController.java 有 3 个接口"(代码已有)</td></tr>
<tr><td>"客户 X 的数据库字符集是 GBK,写 SQL 时注意"</td><td>"上周五提交了一个 bug 修复"(Git 已有)</td></tr>
<tr><td>"用 @Transaction 注解时,这个项目需要显式指定 rollbackFor = Exception.class"</td><td>"pom.xml 中 Spring Boot 版本是 3.2"(代码已有)</td></tr>
<tr><td>"内部 LLM 网关的 rate limit 是 100 req/min,批量调用时需要限流"</td><td>"项目构建用 mvn clean package"CLAUDE.md 已有)</td></tr>
</table>
</div>
<h3>6.3 记忆文件的自动维护策略</h3>
<div class="table-wrap">
<table>
<tr><th>策略</th><th>说明</th></tr>
<tr><td><strong>合并而非膨胀</strong></td><td>同类记忆合并到一个文件,通过 [[wiki-link]] 建立关联。单一文件内容控制在 500 字以内</td></tr>
<tr><td><strong>定期清理</strong></td><td>每月检查一次 memory 目录,删除已过时的记忆(如"临时 workaround,等 Spring Boot 3.3 修复" —— 升级后即失效)</td></tr>
<tr><td><strong>标签化</strong></td><td>每条记忆的 description 字段写清楚"什么场景下需要这条记忆",确保 Claude Code 只在相关对话中加载</td></tr>
<tr><td><strong>双人复核</strong></td><td>重要项目约定(影响多人)应提升到 CLAUDE.md 或企业知识库,而非仅留在个人记忆中</td></tr>
</table>
</div>
</section>
<!-- ===== 八、团队协作 ===== -->
<section id="s8">
<h2>八、团队协作:多 Agent 并行工作模式</h2>
<p class="lead">单开发者 + Claude Code 是"一人公司"模式。但当团队扩大到 5-20 人时,需要一套<strong>多 Agent 协作规范</strong>来避免"5 个 AI 写出 5 种风格"的混乱局面。</p>
<h3>7.1 团队 AI 使用规范</h3>
<div class="table-wrap">
<div class="table-caption">表:团队级 AI 协作规范(建议写入 CLAUDE.md 或团队 Wiki</div>
<table>
<tr><th>规范类别</th><th>具体约定</th><th>执行方式</th></tr>
<tr>
<td><strong>代码风格</strong></td>
<td>所有 AI 生成的代码必须遵循项目 <code>.claude/design-tokens.md</code> 和编码规范文件。禁止 AI 自行"发明"新的命名约定或目录结构</td>
<td>open-code-review L1 自动阻断</td>
</tr>
<tr>
<td><strong>分支策略</strong></td>
<td>AI Agent 只能在自己的 Git Worktree 中工作。合并操作由开发者手动执行,禁止 AI 直接 push 到 main/master</td>
<td>Git 分支保护规则 + CI 检查</td>
</tr>
<tr>
<td><strong>Commit Message</strong></td>
<td>AI 生成的代码提交信息遵循 Conventional Commits 格式(<code>feat:</code>/<code>fix:</code>/<code>refactor:</code>),含需求编号引用</td>
<td>Claude Code 项目配置</td>
</tr>
<tr>
<td><strong>知识沉淀</strong></td>
<td>每个功能开发完成后,开发者有责任将关键经验写入项目 Memory 或更新 CLAUDE.md</td>
<td>开发流程 Checklist</td>
</tr>
<tr>
<td><strong>模型选择</strong></td>
<td>哪些场景用哪个模型(参照<a href="#s1">第一章</a>决策矩阵),避免所有人各自随意选择模型导致质量参差</td>
<td>团队培训 + 定期 Review</td>
</tr>
</table>
</div>
<h3>7.2 多 Agent 协作的典型工作流</h3>
<div class="arch-diagram">
<div class="arch-layer">
<div class="arch-box core" style="min-width:180px;">👤 <strong>Tech Lead</strong><span class="sub">需求拆分 · 接口定义 · 最终集成</span></div>
</div>
<div class="arch-layer">
<span class="arch-arrow">↙ 分配任务 ↓ 分配任务 ↘</span>
</div>
<div class="arch-layer">
<div class="arch-box model" style="min-width:160px;">🤖 <strong>Agent A</strong><span class="sub">模块 A 开发 + 测试</span></div>
<div class="arch-box model" style="min-width:160px;">🤖 <strong>Agent B</strong><span class="sub">模块 B 开发 + 测试</span></div>
<div class="arch-box model" style="min-width:160px;">🤖 <strong>Agent C</strong><span class="sub">文档 + E2E 测试</span></div>
</div>
<div class="arch-layer">
<span class="arch-arrow">↘ 产出 ↓ 产出 ↙</span>
</div>
<div class="arch-layer">
<div class="arch-box tool" style="min-width:200px;">🔍 <strong>open-code-review + Claude Code 审查</strong><span class="sub">L1 + L2 代码审查</span></div>
</div>
<div class="arch-layer">
<span class="arch-arrow">↓ 通过</span>
</div>
<div class="arch-layer">
<div class="arch-box core" style="min-width:200px;">👤 <strong>Tech Lead 合并 + 人工 Review</strong><span class="sub">L3 业务审查 · Merge</span></div>
</div>
</div>
<div class="box box-warn">
<h4>⚠️ 多 Agent 协作的核心风险与对策</h4>
<p><strong>风险 1: 风格不一致</strong> → 对策:所有 Agent 共享同一份 CLAUDE.mdopen-code-review 在合并前强制执行风格检查。</p>
<p><strong>风险 2: 接口不匹配</strong> → 对策:接口定义(API Spec / Protobuf)由 Tech Lead 先行确定并写入共享文档,Agent 只实现不设计接口。</p>
<p><strong>风险 3: 上下文丢失</strong> → 对策:每个 Agent 的产出必须附带"设计决策说明"(为什么这样实现),便于集成时理解上下文。</p>
</div>
</section>
<!-- ===== 九、投入产出分析 ===== -->
<section id="s9">
<h2>九、投入产出分析:效率提升的量化预测</h2>
<p class="lead">基于行业基准数据和实际案例,以下给出 AI 增强开发流程在各个环节的<strong>效率提升预期</strong>。数据来源:GitHub Copilot 2025 调查报告、Google DORA 2025 AI 影响研究、以及内部试点数据。</p>
<h3>8.1 各环节效率提升预测</h3>
<div class="table-wrap">
<div class="table-caption">表:AI 增强开发流程的环节级效率提升预测</div>
<table>
<tr><th>开发环节</th><th>传统耗时(参考)</th><th>AI 增强耗时</th><th>效率提升</th><th>关键驱动工具</th></tr>
<tr><td>需求文档分析</td><td>2-3 天</td><td>0.5-1 天</td><td><span class="tag tag-green">60-75%</span></td><td>Qwen 长文档 + Claude Code 结构化</td></tr>
<tr><td>技术方案设计</td><td>3-5 天</td><td>1-2 天</td><td><span class="tag tag-green">55-65%</span></td><td>Claude Code + DeepSeek 评审</td></tr>
<tr><td>编码实现(中等复杂度)</td><td>5-10 天</td><td>2-5 天</td><td><span class="tag tag-green">50-60%</span></td><td>Claude Code Agent</td></tr>
<tr><td>代码审查</td><td>0.5-1 天/PR</td><td>0.1-0.3 天/PR</td><td><span class="tag tag-green">70-80%</span></td><td>open-code-review + Claude Code</td></tr>
<tr><td>单元测试编写</td><td>编码时间的 30-50%</td><td>编码时间的 5-10%</td><td><span class="tag tag-green">75-85%</span></td><td>Claude Code 自动生成</td></tr>
<tr><td>技术文档编写</td><td>2-5 天</td><td>0.5-1 天</td><td><span class="tag tag-green">70-80%</span></td><td>Claude Code + Qwen 中文润色</td></tr>
<tr><td>Bug 修复(定位 + 修复)</td><td>0.5-2 天</td><td>0.1-0.5 天</td><td><span class="tag tag-green">60-75%</span></td><td>Claude Code 根因分析</td></tr>
<tr><td><strong>综合(全生命周期)</strong></td><td><strong>基准</strong></td><td><strong></strong></td><td><strong><span class="tag tag-green">50-65%</span></strong></td><td><strong>全工具链协同</strong></td></tr>
</table>
</div>
<h3>8.2 成本构成分析</h3>
<div class="table-wrap">
<div class="table-caption">表:多模型工具链的月度成本估算(10 人团队)</div>
<table>
<tr><th>工具/服务</th><th>用途</th><th>月费(估算)</th><th>备注</th></tr>
<tr><td>Claude Code</td><td>主力开发 Agent,每人每天 4-6 小时使用</td><td>$100-200/人/月</td><td>Claude Max 订阅(含 API 额度)</td></tr>
<tr><td>DeepSeek API</td><td>辅助推理、批量分析、第二意见</td><td>¥50-200/团队/月</td><td>极低成本,主要消耗在批量场景</td></tr>
<tr><td>通义千问(百炼 API</td><td>长文档分析、中文文档、RAG 问答</td><td>¥200-500/团队/月</td><td>按 Token 计费,长文档为主要消耗</td></tr>
<tr><td>open-code-review</td><td>CI 自动代码审查</td><td>免费</td><td>开源 GitHub Action,使用 GitHub 免费 Runner 额度</td></tr>
<tr><td>知识库平台(Dify 自建)</td><td>企业知识库 RAG</td><td>¥300-800/月</td><td>服务器费用(ECS 4C8G 即可起步)</td></tr>
<tr><td><strong>合计</strong></td><td><strong>10 人团队月度总成本</strong></td><td><strong>约 ¥15,000-25,000/月</strong></td><td><strong>人均 ¥1,500-2,500/月</strong></td></tr>
</table>
</div>
<div class="box box-good">
<h4>💰 ROI 速算</h4>
<p>假设 10 人团队,人均月成本 ¥25,000(含薪资+管理成本)。AI 工具月成本 ¥2,000/人,但效率提升 50%,相当于<strong>用 ¥2,000 换 ¥12,500 的产出</strong>。ROI ≈ 1:6。</p>
<p>更重要的隐性收益:① 方案质量提升 → 中标率提高 ② Bug 减少 → 交付周期缩短 ③ 知识沉淀 → 新人上手速度倍增 ④ 员工满意度 → AI 处理重复劳动,人聚焦创造性工作。</p>
</div>
<h3>8.3 分阶段效率爬坡</h3>
<div class="table-wrap">
<table>
<tr><th>阶段</th><th>时间</th><th>预期效率提升</th><th>关键里程碑</th></tr>
<tr><td><strong>适应期</strong></td><td>第 1-2 周</td><td>-10% ~ +10%</td><td>学习 Claude Code 交互模式,建立个人 Memory</td></tr>
<tr><td><strong>熟练期</strong></td><td>第 3-6 周</td><td>+20% ~ +40%</td><td>掌握 Plan Mode、Agent 并行、知识库检索</td></tr>
<tr><td><strong>精通期</strong></td><td>第 7-12 周</td><td>+40% ~ +65%</td><td>自定义 Hook、自动化流水线、团队协作模式成熟</td></tr>
<tr><td><strong>平台期</strong></td><td>第 13 周+</td><td>+50% ~ +70%</td><td>持续优化 CLAUDE.md、知识库、记忆系统</td></tr>
</table>
</div>
</section>
<!-- ===== 十、落地路线图 ===== -->
<section id="s10">
<h2>十、落地路线图:从试点到全面推广</h2>
<h3>9.1 三阶段推进计划</h3>
<div class="table-wrap">
<div class="table-caption">表:12 周落地路线图</div>
<table>
<tr><th style="width:8%;">阶段</th><th style="width:10%;">时间</th><th style="width:18%;">目标</th><th>关键任务</th><th>参与人</th></tr>
<tr>
<td><span class="tag tag-blue">Phase 1</span></td>
<td>第 1-2 周</td>
<td><strong>基础搭建</strong></td>
<td>
① 选定 2-3 名种子开发者(技术过硬 + 对 AI 有热情)<br>
② 配置 Claude Code + DeepSeek + Qwen API 访问<br>
③ 完善试点项目的 CLAUDE.md 和设计规范文件<br>
④ 搭建 open-code-review CI 流水线<br>
⑤ 建立个人 Memory 文件模板
</td>
<td>技术负责人 + 种子开发者</td>
</tr>
<tr>
<td><span class="tag tag-warn">Phase 2</span></td>
<td>第 3-6 周</td>
<td><strong>试点验证</strong></td>
<td>
① 种子开发者在 1-2 个真实项目中全程使用 AI 工具链<br>
② 每日记录效率数据和遇到的问题<br>
③ 积累项目级 Memory 和踩坑经验<br>
④ 搭建 Dify 知识库,导入历史方案文档<br>
⑤ 每周团队分享:AI 使用技巧和案例分析
</td>
<td>种子开发者 + 全团队(观察学习)</td>
</tr>
<tr>
<td><span class="tag tag-green">Phase 3</span></td>
<td>第 7-12 周</td>
<td><strong>全面推广</strong></td>
<td>
① 基于试点经验制定团队 AI 使用规范(写入 CLAUDE.md<br>
② 全员培训:第 7 周入门培训,第 8-10 周角色专项培训<br>
③ 所有新项目默认启用 AI 工具链<br>
④ 建立 AI 使用效果度量看板(效率提升、Bug 率、代码质量)<br>
⑤ 月度 AI 使用复盘会,持续优化流程
</td>
<td>全员</td>
</tr>
</table>
</div>
<h3>9.2 成功的关键前提</h3>
<div class="box box-warn">
<h4>⚠️ 四个"不开始"原则</h4>
<p><strong>1. CLAUDE.md 不完善不开始。</strong>项目规约文件是 AI 的"入职培训材料"。没有清晰的编码规范、架构约定、目录结构说明,AI 产出的代码质量将大幅下降。</p>
<p><strong>2. 种子开发者未通过试用期不推广。</strong>种子开发者需要 2-4 周达到"熟练期"效率水平。在此之前向全团队推广会导致集体挫败感。</p>
<p><strong>3. CI 门禁未就绪不进入生产项目。</strong>open-code-review + 自动化测试必须在新项目启动前就位。没有自动化质量门禁的 AI 辅助开发 = 代码质量失控。</p>
<p><strong>4. 管理层未理解 AI 的开发模式不启动。</strong>AI 辅助开发不是"AI 写代码,人只需要点确认"。开发者需要新的技能:需求描述能力、方案评审能力、上下文管理能力。管理层需要重新定义绩效考核标准(从"代码行数"转向"功能交付速度和质量")。</p>
</div>
<h3>9.3 度量指标</h3>
<div class="table-wrap">
<div class="table-caption">表:AI 开发流程的关键度量指标</div>
<table>
<tr><th>指标</th><th>定义</th><th>基线(传统)</th><th>目标(6 个月)</th></tr>
<tr><td><strong>需求→上线周期</strong></td><td>从需求确认到功能上线的日历天数</td><td>15-30 天</td><td>7-15 天</td></tr>
<tr><td><strong>代码审查时间</strong></td><td>PR 从提交到合并的平均时间</td><td>1-2 天</td><td>2-4 小时</td></tr>
<tr><td><strong>生产 Bug 率</strong></td><td>每千次部署的生产环境 Bug 数量</td><td>基线</td><td>降低 30-50%</td></tr>
<tr><td><strong>测试覆盖率</strong></td><td>代码行覆盖率</td><td>30-50%</td><td>70-85%</td></tr>
<tr><td><strong>知识复用率</strong></td><td>新项目中复用历史方案/代码的比例</td><td>10-20%</td><td>40-60%</td></tr>
<tr><td><strong>开发者满意度</strong></td><td>匿名问卷"AI 工具是否让你更享受编程"</td><td></td><td>≥ 80% 正面</td></tr>
</table>
</div>
</section>
<div class="footer">
<p>研发型企业 AI 转型方案 · 第四篇章:AI 驱动开发流程</p>
<p>编制:大客户及解决方案中心 · 2026 年 5 月 · V1.0</p>
<p style="margin-top:8px;font-size:11px;">工具链版本:Claude Code (主力 Agent) · DeepSeek API · 通义千问(百炼)· alibaba-group/open-code-review · Dify 知识库 · Claude Memory</p>
</div>
</main>
<button class="back-to-top" id="backToTop" aria-label="返回顶部"></button>
<script>
(function(){
var menuBtn=document.getElementById('menuBtn');
var overlay=document.getElementById('drawerOverlay');
var sidebar=document.querySelector('.sidebar');
if(menuBtn&&overlay&&sidebar){
function setup(){if(window.innerWidth<=768){if(!overlay.contains(sidebar))overlay.appendChild(sidebar);}else{if(overlay.contains(sidebar))document.body.insertBefore(sidebar,document.querySelector('.main'));overlay.classList.remove('show');document.body.style.overflow='';}}
setup();window.addEventListener('resize',setup);
menuBtn.addEventListener('click',function(){overlay.classList.add('show');document.body.style.overflow='hidden';});
overlay.addEventListener('click',function(e){if(e.target===overlay){overlay.classList.remove('show');document.body.style.overflow='';}});
sidebar.querySelectorAll('a').forEach(function(l){l.addEventListener('click',function(){if(window.innerWidth<=768){overlay.classList.remove('show');document.body.style.overflow='';}});});
}
var btt=document.getElementById('backToTop');
if(btt){window.addEventListener('scroll',function(){btt.classList.toggle('show',window.scrollY>400);});btt.addEventListener('click',function(){window.scrollTo({top:0,behavior:'smooth'});});}
var links=document.querySelectorAll('.sidebar nav a');
var secs=[];links.forEach(function(l){var id=l.getAttribute('href');if(id&&id.startsWith('#')){var el=document.querySelector(id);if(el)secs.push({el:el,link:l});}});
function onScroll(){var sy=window.scrollY+120;var cur=null;for(var i=0;i<secs.length;i++){if(secs[i].el.offsetTop<=sy)cur=secs[i];}links.forEach(function(l){l.classList.remove('active');});if(cur)cur.link.classList.add('active');}
window.addEventListener('scroll',onScroll);
document.querySelectorAll('.sidebar nav a').forEach(function(l){l.addEventListener('click',function(e){e.preventDefault();var id=this.getAttribute('href');if(id&&id.startsWith('#')){var el=document.querySelector(id);if(el){el.scrollIntoView({behavior:'smooth'});if(window.innerWidth<=768){var o=document.getElementById('drawerOverlay');if(o)o.classList.remove('show');document.body.style.overflow='';}}}});});
})();
</script>
</body>
</html>