尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

3个可复用AI编程工作流:从代码生成审查到遗留代码重构与测试文档同步

3个可复用AI编程工作流:从代码生成审查到遗留代码重构与测试文档同步 1. 为什么“能立刻复用”比“功能强大”更重要我见过太多人收藏了几百个AI编程工具从代码补全到自动化测试从文档生成到架构设计每个工具看起来都很厉害但真正到了项目里能稳定用起来的没几个。问题出在哪不是工具不行是这些工具没有被串成工作流。单个AI工具就像一把好用的螺丝刀但你不会拿螺丝刀去盖房子。盖房子需要的是从测量、切割、组装到验收的一整套流程。AI编程也是一样真正提升效率的不是某个工具多强而是你把几个工具按照固定顺序串起来形成一条可重复、可预期、可交付的流水线。这篇文章要聊的3个工作流都是我在实际项目中反复跑过、踩过坑、最终固化下来的方案。它们分别覆盖了代码生成与审查、遗留代码理解与重构、自动化测试与文档同步这三个最高频的场景。每个工作流都只需要2到3个工具配置时间不超过半小时但一旦跑通每天至少能省出1到2小时的重复劳动。适合谁看如果你已经用过ChatGPT或Copilot写代码但总觉得“差点意思”——生成的东西要改半天、上下文老是丢、改完代码忘了更新文档——那这篇文章就是写给你的。如果你还没开始用AI辅助编程也没关系我会从最基础的操作讲起确保你能跟着做出来。注意下面所有工作流都不依赖特定付费工具核心逻辑可以用你手头任何AI编程助手实现。我用的组合是Cursor加Claude加GitHub Actions但换成Copilot加GPT加Jenkins思路完全一样。2. 工作流一代码生成到审查的闭环流水线2.1 这个工作流解决什么问题大部分人用AI写代码的流程是这样的打开聊天窗口描述需求复制生成的代码粘贴到编辑器运行报错再复制错误信息回去问再粘贴再运行……这个循环里有两个致命问题上下文断裂和审查缺失。上下文断裂是指AI不知道你项目的整体结构、命名规范、已有工具函数生成的东西经常“能用但格格不入”。审查缺失是指AI生成的代码你直接就用没有经过系统性的检查埋下隐患。这个工作流的核心思路是把“生成”和“审查”拆成两个独立步骤中间加一个结构化提示词模板作为桥梁让AI在生成时就带上项目上下文在审查时用另一套标准来挑毛病。2.2 具体配置步骤第一步建立项目上下文文件在项目根目录创建一个.ai-context.md文件内容包含# 项目上下文 ## 技术栈 - 语言Python 3.11 - 框架FastAPI - 数据库PostgreSQL SQLAlchemy - 测试pytest httpx ## 代码规范 - 函数命名snake_case - 类命名PascalCase - 所有公共函数必须有类型注解 - 所有API端点必须有docstring - 错误处理统一使用自定义异常类 ## 已有工具函数 - utils/validators.py邮箱、手机号、URL验证 - utils/response.py统一响应格式封装 - db/session.py数据库会话管理 ## 禁止事项 - 不要使用print调试用logging - 不要直接拼接SQL用ORM - 不要硬编码配置用环境变量这个文件的作用是给AI一个“项目说明书”。每次让AI生成代码时把这个文件内容附在提示词前面生成质量会有质的提升。第二步设计生成提示词模板不要每次手写提示词建一个模板文件.ai-prompts/generate.md你是一个资深Python后端工程师正在为以下项目编写代码。 [项目上下文] {context} [任务] {task_description} [要求] 1. 严格遵循项目代码规范 2. 优先复用已有工具函数 3. 包含完整的类型注解和docstring 4. 包含单元测试 5. 如果涉及数据库操作使用现有session管理 [输出格式] 先输出实现代码再输出测试代码最后列出你做出的假设和需要确认的点。用的时候把{context}替换成.ai-context.md的内容{task_description}替换成具体需求。第三步建立审查提示词模板生成完代码后不要直接使用。新建一个对话用审查模板你是一个严格的代码审查者请审查以下代码。 [项目上下文] {context} [待审查代码] {code} [审查清单] 1. 是否有安全漏洞SQL注入、XSS、敏感信息泄露 2. 是否有性能问题N1查询、不必要的循环、内存泄漏 3. 是否符合项目代码规范 4. 错误处理是否完善 5. 边界条件是否覆盖 6. 测试是否充分 [输出格式] 按严重程度分级列出问题Critical / Major / Minor 每个问题给出具体行号和修复建议。2.3 实操中的关键细节这个工作流跑通的关键在于上下文文件的维护。我一开始偷懒.ai-context.md写得很简略结果AI生成的代码还是老出问题。后来我定了个规矩每次项目结构有变化、新增工具函数、修改规范第一件事就是更新这个文件。现在它成了项目文档的一部分新同事入职也看这个。另一个细节是审查要用不同的AI会话。如果你在同一个对话里让AI“生成然后审查”它会倾向于认为自己生成的东西没问题。开新对话把代码贴进去用审查模板挑出来的问题明显更多。我实测过同一个代码块同模型同参数新会话审查能多找出30%左右的问题。还有一个坑不要一次性生成太多代码。我试过让AI一次生成整个模块500多行结果审查时发现架构层面就有问题改起来还不如重写。现在我的习惯是单个函数或单个API端点为单位最多不超过100行。小步快跑每步都审查整体效率反而更高。2.4 常见问题排查问题原因解决方法生成的代码不用项目里的工具函数上下文文件没提或提得不明显在上下文文件里用单独章节列出工具函数并举例说明用法审查时AI说“代码看起来没问题”审查提示词不够具体把审查清单写得更细每条都给正反例生成的测试跑不起来AI不知道测试环境配置在上下文文件里加上测试运行命令和fixture说明每次都要手动复制粘贴上下文没有自动化写个脚本把上下文文件和任务描述拼成完整提示词一键复制这个工作流我用了大半年最直观的感受是代码返工率从大概40%降到了10%以下。以前AI生成的代码我至少要改三四轮现在基本一轮审查加小修就能用。3. 工作流二遗留代码理解与安全重构3.1 场景与痛点分析每个程序员都会遇到这种任务接手一个老项目没有文档原作者已离职代码能跑但没人敢动。传统做法是硬着头皮读代码画流程图一点点理清逻辑。一个中等规模的模块读懂可能要两三天。AI在这个场景下能帮大忙但直接把几千行代码贴给AI是没用的——上下文窗口不够而且AI会“幻觉”出一些不存在的逻辑。正确做法是分层拆解加交叉验证。3.2 分层拆解的具体操作第一层文件级摘要先把项目里所有源文件列出来对每个文件生成一句话摘要。提示词请阅读以下代码文件用一句话概括它的核心职责。 不要描述具体实现只说这个文件在系统中扮演什么角色。 文件名{filename} 代码 {code} 输出格式文件名 - 一句话职责把所有文件跑一遍你就得到了一张“项目地图”。这一步不需要理解细节只需要知道每个文件大概干什么。第二层函数级拆解挑出核心文件对里面的每个函数生成详细说明。提示词请分析以下函数输出 1. 函数目的一句话 2. 输入参数说明每个参数的类型、含义、约束 3. 返回值说明 4. 副作用修改了哪些外部状态、调用了哪些外部服务 5. 关键逻辑步骤编号列出 6. 可能的边界条件 函数代码 {code}这一步会产出大量信息建议用表格整理函数名目的关键副作用边界条件process_order处理订单主流程写orders表、发MQ消息库存不足、支付超时validate_items校验订单项无空列表、数量为负第三层调用关系重建有了函数级信息后让AI帮你重建调用关系以下是模块A中所有函数的签名和目的说明。 请分析这些函数之间的调用关系输出一个调用链列表。 格式调用者 - 被调用者 : 调用条件 函数列表 {function_list}这一步能帮你发现一些隐藏的逻辑比如某个函数只在特定条件下被调用或者存在循环调用。3.3 安全重构的策略理解完代码后下一步是重构。但遗留代码重构有个铁律先加测试再改代码。AI在这里的作用是帮你快速生成“特征测试”——不是验证代码对不对而是记录代码当前的行为确保重构后行为不变。提示词模板以下是一个遗留函数。请为它生成特征测试characterization test。 特征测试的目的是记录当前行为不是验证正确性。 即使你觉得某个行为是bug也要为它写测试并在注释中标注“疑似bug”。 函数代码 {code} 要求 1. 覆盖所有分支 2. 覆盖边界条件 3. 使用项目现有的测试框架 4. 每个测试用例加注释说明它锁定的是什么行为生成测试后跑一遍确保全部通过。然后开始重构。重构时用这个提示词以下是一个遗留函数及其特征测试。 请重构这个函数要求 1. 不改变任何外部行为测试必须全部通过 2. 提高可读性拆分长函数、消除重复、改善命名 3. 保持或提升性能 4. 每次只做一个改动输出改动前后的对比 函数代码 {code} 特征测试 {tests}3.4 实操心得与避坑心得一不要相信AI对代码意图的推断。AI经常说“这个函数看起来是用来做X的”但实际可能是做Y的。我的做法是AI的推断只作为假设必须通过运行代码或查日志来验证。有一次AI说某个函数是“计算折扣”结果实际是“计算税费”差点改错。心得二重构要小步提交。每完成一个小重构就提交一次commit message写清楚改了什么。这样如果测试挂了回滚成本很低。我见过有人一次性重构了十几个函数测试挂了之后完全不知道是哪个改动引起的。心得三保留原始代码作为参考。重构时不要直接删掉旧代码先注释掉或者放到单独文件里。等新代码稳定运行一段时间后再清理。这个习惯救过我两次——有一次重构后的代码在生产环境出了边界问题直接切回旧代码顶了一阵。常见问题速查问题排查思路解决AI说“无法理解代码逻辑”代码太长或太绕拆成更小的片段一次只分析一个函数特征测试跑不过代码有隐藏依赖检查是否依赖了全局状态、时间、随机数用mock隔离重构后性能下降引入了不必要的抽象对比重构前后的profiling数据回退有问题的改动调用关系图对不上AI幻觉用IDE的“Find Usages”功能交叉验证这个工作流我最近在一个5年历史的Django项目上用过原本预计两周的理解加重构实际用了4天完成核心模块。当然AI不是万能的它帮我省的是“读代码和写测试”的时间真正的架构决策还是得自己做。4. 工作流三测试、文档与代码的三向同步4.1 为什么需要三向同步代码、测试、文档这三样东西在大多数项目里都是脱节的。代码改了测试没更新文档还是半年前的。传统做法是靠流程和纪律来保证同步但人总会忘。AI可以把这个同步过程自动化。核心思路是以代码为唯一真相源用AI自动生成测试和文档并在CI流程中强制检查一致性。4.2 自动化生成测试每次代码提交时用AI分析diff自动生成或更新对应的测试。具体做法是在CI里加一个步骤# .github/workflows/ai-sync.yml name: AI Sync on: pull_request: types: [opened, synchronize] jobs: generate-tests: runs-on: ubuntu-latest steps: - uses: actions/checkoutv4 - name: Get diff run: git diff origin/main...HEAD diff.txt - name: Generate tests run: | python scripts/ai_generate_tests.py \ --diff diff.txt \ --context .ai-context.md \ --output tests/generated/ - name: Run tests run: pytest tests/ai_generate_tests.py的核心逻辑import openai def generate_tests(diff, context): prompt f 以下是一个代码变更的diff。 请为新增或修改的函数生成单元测试。 项目上下文 {context} 代码变更 {diff} 要求 1. 只测试变更部分不要重复已有测试 2. 覆盖正常路径和边界条件 3. 使用项目现有的测试框架和fixture 4. 如果变更涉及数据库使用事务回滚 response openai.chat.completions.create( modelgpt-4, messages[{role: user, content: prompt}] ) return response.choices[0].message.content4.3 文档自动更新文档同步的逻辑类似但触发时机不同。我建议在合并到主分支后触发文档更新def update_docs(changed_files): for file in changed_files: if not file.endswith(.py): continue code read_file(file) existing_doc read_doc_for(file) prompt f 以下是代码文件和它当前的文档。 请更新文档使其与代码一致。 要求 1. 只修改与代码变更相关的部分 2. 保持文档原有格式和风格 3. 如果新增了公共函数补充对应的API文档 4. 如果删除了函数从文档中移除 代码 {code} 当前文档 {existing_doc} new_doc call_ai(prompt) write_doc(file, new_doc)4.4 一致性检查与强制门禁光生成还不够还要检查。在CI里加一个检查步骤def check_consistency(): issues [] # 检查每个公共函数是否有测试 for func in get_public_functions(): if not has_test(func): issues.append(f函数 {func} 缺少测试) # 检查每个API端点是否有文档 for endpoint in get_api_endpoints(): if not has_doc(endpoint): issues.append(f端点 {endpoint} 缺少文档) # 检查文档中的示例代码是否能运行 for example in get_doc_examples(): if not run_example(example): issues.append(f文档示例无法运行{example}) if issues: print(一致性问题) for issue in issues: print(f - {issue}) exit(1)这个检查作为PR的必过项不过不让合并。一开始团队可能会抱怨“太严了”但跑一个月后大家就习惯了而且文档和测试的覆盖率会肉眼可见地提升。4.5 实操中的经验与教训教训一AI生成的测试不要直接信。我遇到过AI生成的测试“永远通过”——因为它mock了所有东西包括被测试的函数本身。所以生成的测试必须经过人工review重点看是否真的调用了被测代码、断言是否有意义、mock是否过度。教训二文档更新要保留人工编辑的部分。有些文档段落是人工写的背景说明、设计决策AI更新时可能会覆盖掉。我的做法是在文档里用特殊标记标注哪些段落是AI可更新的!-- AI-UPDATE-START -- ## API 参考 这部分由AI自动更新 !-- AI-UPDATE-END -- ## 设计决策 这部分人工维护AI不要动教训三CI里的AI调用要有超时和降级。AI服务偶尔会慢或者不可用不能让整个CI卡住。我的配置是AI调用超时30秒超时后跳过生成步骤只跑一致性检查并输出警告但不阻塞合并。常见问题速查问题原因解决生成的测试重复diff太大AI没看清已有测试限制diff大小或在提示词里附上已有测试列表文档格式乱了AI不懂项目的文档规范在上下文文件里加文档模板和示例CI时间太长每个PR都全量生成只对变更文件生成增量更新AI生成的测试有安全风险测试里硬编码了密钥加一个后置检查扫描生成的测试文件5. 三个工作流的组合使用与个人体会这三个工作流不是孤立的。实际项目中我通常是这样组合的新功能开发用工作流一生成加审查遇到老代码用工作流二先理解再重构重构完成后用工作流三自动补测试和文档。三个工作流共享同一个.ai-context.md文件所以上下文是一致的。工具选型上我目前用的是Cursor做编辑器内的生成和审查Claude做长上下文的理解和重构分析GitHub Actions做CI里的自动化。但这不是必须的你完全可以用VS Code加Copilot加GitLab CI或者JetBrains全家桶加其他AI插件。核心是流程设计不是工具本身。最后分享一个我踩过的最大的坑不要试图让AI一次做完所有事。我一开始想搞一个“全自动”流水线从需求描述直接到合并请求结果发现AI在每一步都会引入小错误这些小错误累积起来最后的结果完全不可用。后来我改成每个工作流只做一件事每步都有明确的人工检查点整体效率反而更高。AI编程工作流的价值不在于“替代人”而在于“让人专注于真正需要判断力的部分”。生成代码、写测试、更新文档这些事AI做得比我快但决定做什么、为什么这么做、做到什么程度这些还是得我来。把重复劳动交给流水线把思考留给自己这才是用好AI编程的正确姿势。
返回列表