AI生成代码必须人工审查:开发者实战工作流
建议先让AI解释代码再做判断;限制每次请求范围;安全错误代价高昂;编译通过不等于行为正确;AI不应取代向资深开发者学习的机会。
完整中文译文
AI 编程工具(ChatGPT、GitHub Copilot、Claude、 Gemini)已经无处不在。大多数人都体验过这些工具带来的效率提升:生成样板代码、调试函数、为现有代码编写文档、向不熟悉新框架的人解释原理。然而,所有有经验的程序员都知道一个重要区别:AI 也许能生成代码,但永远不需要为这些代码的可靠性负责。你能否产出整洁、可维护的代码库,能否在生产环境中减少问题,能否长期支撑你的产品,很大程度上取决于你如何对待 AI——是作为一个编程工具,而不是一个独立的程序员。本文将提供一个实际案例,展示如何在编程流程中集成 AI,同时确保高质量代码。
最大的错误:复制、粘贴、提交
AI 生成代码的大多数问题都源于同一种工作流程:
Prompt ↓ 复制 ↓ 粘贴 ↓ 提交
感觉很高效。直到它不再高效。
AI 生成的代码基于它在训练中学到的模式——而不是你的业务逻辑、编码规范、生产约束或应用架构。因此 AI 可能会:
- 只为"愉快路径"生成可工作的代码
- 忽略所有"边界情况"
- 引入安全问题
- 违反项目约定
- 添加不必要的复杂性
- 使用过时的 API
步骤 1:让 AI 提供构建块,而不是完整系统
使用 AI 的最佳方式之一是限制每次请求的范围。不要这样问:
构建我的认证系统。
而要这样问:
生成一个 JWT 验证中间件。 解释 OAuth 回调处理。 为这个服务编写单元测试。 重构这个函数。 优化这条 SQL 查询。 解释为什么会出现这个竞态条件。
更小的提示词通常能产生更准确、更易维护的结果。AI 在解决孤立问题时表现相当出色。
步骤 2:阅读每一行
这听起来不言自明。但出乎意料的是,许多开发者跳过了这一步。当 AI 生成代码时,问自己:
- 为什么选择这个库?
- 为什么这个算法是合适的?
- 这是否引入了隐藏的复杂性?
- 这真的在解决问题吗?
如果你不能自信地解释每一行代码,那你可能不应该合并它。代码所有权仍然属于开发者——而不是 AI。
步骤 3:验证 API 使用
使用 AI 生成代码时,一个常见问题是框架的文档过时了。AI 模型的训练基于特定时间段内使用的框架版本,然而随着新版本的频繁发布,这些信息很快就会过时。问题在于:当 AI 生成代码示例时,它可能会使用:
- 过时的(已废弃的)React hooks
- 过时的(旧版)Express 中间件
- 已被新版 Laravel 移除的 Laravel 辅助函数
- 自发布以来已过时的 Python 包
- 容器编排的旧版 Kubernetes 语法
步骤 4:首先考虑安全
安全错误代价高昂。AI 生成的代码通常能工作,但会忽略安全默认值。特别注意:
- SQL 注入
- XSS
- CSRF
- 认证逻辑
- 授权检查
- 输入验证
- 文件上传
- 密钥管理
永远不要假设生成的认证代码遵循了当前的最佳实践。安全每次都需要人工审查。
步骤 5:让代码匹配你的项目
即使正确的代码也可能显得格格不入。问自己:
- 命名是否遵循项目约定?
- 函数是否过大?
- 逻辑是否应该移入服务层?
- 错误处理是否一致?
- 测试是否易于理解?
AI 写的是通用软件。你的责任是让它适配团队的架构。一致性降低的维护成本永远比巧妙的代码更有价值。
步骤 6:在 AI 编写之前先让它解释
一个意外有用的工作流程是先请求解释。不要直接:
写解决方案。
而要:
解释三种可能的方法。
你通常会收到关于以下方面的权衡分析:
- 性能
- 简洁性
- 可维护性
- 内存使用
- 可扩展性
只有在理解选项之后,才应该让 AI 生成实现代码。这将 AI 从代码生成器转变为技术讨论伙伴。
步骤 7:与社区知识结合使用 AI
AI 很有用,但不应该取代向有经验的开发者学习。社区仍然很有价值,因为它们提供:
- 真实的生产经验
- 架构讨论
- 调试策略
- 工具比较
- 性能调优
- 工作流程改进
除了实际使用 AI 编码之外,还有很多社区讨论如何改进 AI 的输出以及技术写作/开发者工作流程。例如,Humanize AI Forum 是一个讨论 AI 实用应用的社区;为 AI 开发 prompt;以及如何为各级 AI 开发人工审查流程,以补充你的实践开发技能。阅读他人如何培养对 AI 生成内容的评估能力,通常会提高你判断同样建议的能力。
步骤 8:不要跳过测试
编译通过并不意味着行为正确。要像对待初级开发者的贡献一样对待 AI 生成的代码。编写:
- 单元测试
- 集成测试
- 边界情况测试
- 性能基准测试
如果有帮助,可以让 AI 生成测试。然后也审查这些测试。测试验证行为。审查验证设计。两者都需要。
步骤 9:优化你的提示词
好的提示词产生更好的代码。包含如下上下文:
Language: Go
Framework: Gin
Database: PostgreSQL
Architecture: Clean Architecture
Need: Repository implementation
Transaction support
Unit tests
上下文显著提高输出质量。尽可能避免模糊的提示词。
步骤 10:在 AI 之外持续学习
AI 编程助手的一个隐藏危险是对生成的解决方案产生依赖。不要立即接受答案,而是问自己:
- 为什么这能工作?
- 我能手动实现吗?
- 有更简单的设计吗?
- 权衡是什么?
你的目标不是更快的复制粘贴。你的目标是成为一个更强的工程师。像 Humanize AI Forum 这样的社区经常讨论平衡 AI 辅助与真正的技能发展,提醒开发者长期的专业知识来自理解系统——而不是简单地生成代码。
AI 从根本上改变了软件开发,这是一件好事。它减少了重复工作,加快了原型设计,解释了陌生的概念,并帮助开发者比以往更快地探索解决方案。然而,生产力永远不应该取代责任。最强的工程工作流程不是"AI 写所有代码"。而是:
- AI 加速研究
- AI 起草实现
- 人类审查架构
- 人类验证安全
- 人类拥有最终结果
把 AI 当作一个经验丰富的助手——而不是在生产代码上签字的工程师。这才是可持续扩展的工作流程。