人工智能正在改变软件工程的本质,从以代码为中心的学科转向强调系统思维、验证和编排的学科。新兴范式如“氛围编码”和防御性 AI 编程表明,该领域现在不仅需要技术掌握,还需要更广泛地理解智能系统如何相互作用和进化。
从构建者到策展人的演变
软件工程长期以来主要与编码相关。初级工程师专注于编写代码,随着职业生涯的发展,他们学习更多关于系统设计、架构等方面的知识。但随着 AI 辅助编码工具的兴起,这种主要身份正在发生转变。
如今,工程师正在成为智能的策展人,而不仅仅是实现者。他们通过约束、验证和迭代来帮助塑造 AI 输出,引导生成模型走向可靠的结果。
维护遗留代码曾经是工程师的一大噩梦,但如今 AI 辅助入职使生活变得更加轻松。AI 帮助生成文档、为遗留代码编写单元测试以解释系统行为、修复复杂的扩展错误等。
AI 还协助审查人员审查代码、理解系统设计以及跨系统连接复杂的文档。
工程技艺从代码的机械原理扩展到指导 AI 在整个软件工程生命周期中提供帮助的艺术。
“氛围编码”的兴起
在这个新时代,许多开发人员接受了非正式称为“氛围编码”的做法。它是使用 AI 辅助工具 - 协同程序员、代码生成器或代理 - 根据意图快速生成支架、测试甚至整个功能集的实践。
氛围编码带来了速度和效率的诱人承诺,能够有效地从想法到原型,同时卸载繁琐的样板工作。
然而,在实践中,氛围编码引入了一个隐藏的开销 - 需要仔细检查、调试和强化,以确保 AI 的输出符合生产标准。
判断差距
AI 工具在平坦化某些技术障碍的同时加深了其他障碍。
AI 探索者现在可以比以往更快地生成工作代码。但如果没有适当的系统级上下文和理解,他们可能会将合理性误认为正确性。AI 的信心可能会掩盖关键缺陷,如遗漏的边缘情况、不安全的假设或脆弱的架构。这种迭代过程和意外甚至可能导致对 AI 采用的轻视想法。
AI 策略师则相反,他们将 AI 用作杠杆。他们使用它来探索架构选项、重构遗留系统或测试设计假设。他们的优势在于决定何时信任自动化 - 以及何时推翻它。
结果是判断差距的增长:AI 将工作从手动编码转移到认知评估。能够使用 AI 工具实际扩展自己的最佳工程师正在成为 AI 策略师。
AI 策略师
在当前状态下,AI 有其局限性。一些开发人员报告说,他们在将 AI 生成的代码准备好交付生产之前需要花费更多时间进行修复,以便它与其他生态系统配合使用,因此感到疲劳。一些开发人员理解当前 AI 能力的局限性,并委派适当的任务,试图建立杠杆作用,而不是被它们所挫败。AI 策略师委派适当的工作量,并充当编排和验证代理,大规模部署系统思维。
例如,提供给 AI 以具体缩小问题空间以获得更好输出的.github/copilot-instructions.md 文件:
规范驱动开发:作为开发人员,您可以以 markdown 形式提供代码规范,让 AI 为您生成代码。示例数据库模式以 markdown 形式:
代码审查的重要性
AI 生成的代码通常针对表面正确性进行优化 - 看起来正确 - 而不是深度健壮性。这可能会引入新的风险:
- 安全漏洞通过不安全的导入或过时的依赖项。
- 不可靠的逻辑通过测试但在规模或更改下崩溃。
- 维护债务由重复或幻觉代码引起。
团队很快意识到,AI 生产力伴随着创新税 - 审查、纠正和稳定的成本。对于开发人员来说,意识到他们仍然对作为作者发布的代码和作为审查者审查的代码负责非常重要。
防御性 AI 编程:为信任而工程
为了使 AI 编码可持续,组织必须发展防御性 AI 编程文化 - 一组平衡 AI 的创造力和工程严谨性的原则和实践。
- 信任但验证。将 AI 输出视为草稿,而不是交付物。每个生成的行都必须根据业务逻辑、性能标准和安全策略进行测试、审查和验证。
- 培养责任感并赋予审查人员权力。
- 重新平衡团队工作流程以识别审查负担。高级开发人员应该有时间和工具进行深入检查,而初级人员则接受批判性地推理 AI 输出的培训 - 而不仅仅是接受它们。
- 鼓励所有权。每个 AI 辅助更改都应该有所有者。跟踪代码来源:什么是 AI 生成的,什么是人类审查的,以及什么是合并的。透明度建立信任。
- 领导调试复杂问题:AI 在调试复杂的线程同步问题或相互交织系统中的规模挑战时有时会非常有效。然而,这些场景通常需要具有对问题上下文的深刻理解并能够有效使用 AI 的专家 AI 策略师。
- 编纂护栏:将自动化检查集成到 CI/CD 管道中。
- 设置依赖项扫描仪以检测幻觉或不安全的包。
- 进行针对 AI 生成模式调整的静态分析和代码规范检查。
- 运行单元和集成测试以暴露“快乐路径”盲点。
防御性 AI 编程确保人类判断仍然是自动化生产力的核心。
软件工程技艺的演变
软件工程的本质一直是在约束下的创造力。随着 AI 的出现,这些约束正在发生变化。开发人员正在从构建者演变为编排者。他们的乐趣将不再仅仅来自于编写每一行代码,而是来自于从更高层次的系统理解中进行设计和编排。
技艺得以延续,即使工具发生了变化。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。