收益:
- 能够使用人工智能作为代码审查的第二只眼睛,以提高可读性、逻辑性和安全性
- 能够在人工智能支持下规划重构步骤,而不会破坏复杂的代码行为
- 能够通过测试和版本控制比较来验证人工智能的审查和编辑建议
在软件工程中,阅读代码的次数远多于编写代码的次数。一行代码只编写一次,但在几个月的时间里会被读取、修改和构建数十次。这就是为什么代码审查(审查别人或您自己的代码的逻辑、可读性和安全性)和重构(改进代码的结构而不改变其行为)是工程的核心。人工智能成为这两项任务的强大“第二只眼”:它快速建议可读性,指出被忽视的逻辑和安全问题,并将大型重构分解为较小的安全步骤。但有一条关键规则:重构不应该改变行为,唯一保证这一点的是测试。
在本单元中,我们将了解如何以结构化方式使用人工智能进行代码审查,如何在不破坏其行为的情况下修复复杂的代码,以及如何管理技术债务(快速但成本高昂的代码决策)。
概念: 技术债务:今天为了速度而做出的代码决策使得将来的维护变得困难。代码味道:模式本身不是错误,但表明存在问题(函数太长、代码重复)。回归:当一个变化破坏了之前有效的东西时。
在结构化代码审查中使用人工智能
当时间有限时,有必要关注风险最高的问题。自动格式化程序处理缩进和间距等格式问题;您必须将人类注意力集中在逻辑、安全性和边缘情况行为上。当进行人工智能审核时,要求提供一个优先级列表,而不是一连串简单的审核。
- 给出范围。什么代码,做什么,在什么上下文中工作。
- 指定优先级轴。准确性和安全性第一,可读性第二。
- 求具体指正。每个发现的“问题原因”和“建议修复”。
- 您验证调查结果。人工智能也会产生误报;根据代码和测试验证每个发现。
结构化审查提示:“像高级工程师一样检查以下功能。按重要性顺序列出发现结果,并用这些标签标记它们:[关键]逻辑/安全性,[中]边缘情况/性能,[低]可读性/名称。对于每个发现:为什么询问,具体修复建议。不要跳过格式/缩进问题,自动化工具将处理它。代码:[代码]”
以安全为重点的审查提示:“仅出于安全目的审查此代码:缺乏输入验证、注入风险、缺乏授权控制、机密信息泄露、不安全的默认设置。为每个发现添加示例攻击场景。如果没有安全问题,请明确说明‘我没有发现任何关键安全问题’。代码:[代码]”
注意:人工智能说“没问题”并不能证明没有问题。人工智能可能会产生漏报;可以绕过真正的安全问题。人工智能审查是对人工审查和安全测试的补充,而不是替代。在安全关键代码中,有能力的工程师拥有最终决定权。
测试保留重构
重构的黄金法则:先测试,后更改。在修复代码之前,应该进行锁定当前行为的测试,以便您立即知道更改是否会破坏某些内容。 AI重构时不要打乱顺序。
- 测试当前的行为。否则,让人工智能产生“特征测试”(捕获当前行为的测试)。
- 逐步修复它。每一步测试都必须保持绿色。
- 每个步骤后运行它。尽早发现回归。
安全重构计划提示:“下面的60行函数做得太多,很难读。我想重构它而不改变它的行为。首先:列出我需要哪些测试用例来锁定当前的行为。然后:将重构分成小步骤,每个步骤都可以在测试未完成时执行。先不要写代码,先给出计划。代码:[code]”
弱提示/强提示
弱:“让这段代码变得更好。” (结果:不清楚要改进什么;AI 会进行任意更改,可以默默地改变行为。)强:“重构此支付计算函数以提高可读性。约束:行为必须保持完全相同,返回值不得更改。将长函数拆分为有意义的实用函数,将幻数增加到命名常量。逐项列出更改并解释为什么每个项目不更改行为。代码:[code]”
强有力的提示明确指出了“行为必须保持完全相同”的约束以及需要改进的地方。如果没有这个约束,人工智能就会以“改进”的名义改变逻辑,并产生无声的回归。
管理技术债务
方法
短期内
从长远来看
忽略债务
进步快
维护瘫痪,团队速度放慢
重写一切
常设功能开发
回报不确定,风险高
可衡量的、受测试保护的重构
小幅放缓
可持续速度
最健康的方法是第三种:让债务可见(在列表中跟踪它),从最受伤害的地方开始,并对每个修复进行测试证明。人工智能可以很好地帮助识别债务项目并确定其优先顺序,但支付哪些债务是一个商业决策。
迷你箱
案例 1 — 静默回归。开发人员告诉AI“简化这个功能”; AI错误地翻译了一个条件,导致返回计算被破坏。由于没有进行测试,客户投诉后 3 周后出现错误。该团队通过首先编写特征测试来完成相同的工作,并在第一次运行时通过红色测试捕获错误。
案例 2——有用的第二只眼睛。在代码审查中,AI意识到用户授权只在界面检查,而不在服务器检查。这是一个未经授权的访问漏洞。工程师增加服务器端授权检查;人工智能检查可以预防实际的安全事件。
案例 3 — 误报。 AI说“这个变量从未使用过,删除它”;然而,它是通过变量反射机制间接使用的。如果工程师没有根据测试验证建议,则会将其删除,并会出现运行时错误。每项人工智能发现在实施前都必须得到确认。
常见错误
- 无需测试即可重构。没有什么可以确保保留该行为。
- 应用人工智能发现而不验证它们。误报和漏报都会发生。
- 在格式问题上浪费人力。专注于可以通过自动化工具解决的任务会掩盖真正的风险。
- 以“没问题”的答案作为保证。 AI可以绕过漏洞;需要人工审核。
- 试图立即还清全部债务。重大重写是有风险的;通过测试来衡量和保护的步骤是首选。
总之
代码审查和重构决定了代码的寿命。人工智能是强大的第二只眼睛和计划生成器:提供优先发现、安全场景和小步重构计划。但重构不应该改变行为,只有测试才能保证这一点。根据代码和测试验证每个人工智能发现;不要以“没问题”的答案作为证据。让技术债务变得可见,并通过经过衡量、受测试保护的步骤来偿还。
应用任务
取一个 40-70 行的、有点复杂的函数(或者让 AI 生成)。首先按照结构化审核提示,将结果排序为 [CRITICAL]/[MEDIUM]/[LOW];根据代码手动验证至少一项发现。然后,在安全重构计划提示下,首先生成并运行特征测试,然后分小步应用重构,并验证每个步骤的测试是否保持绿色。
清单
- [ ] 我用优先级标签(严重/中/低)构建了评论。
- [ ] 我已经针对代码/测试验证了至少一项 AI 发现。
- [ ] 我在重构之前测试了当前的行为。
- [ ] 我一步一步地进行了更改,并在每一步都进行了测试。
- [ ] 我在提示中指定了“行为必须保持相同”约束。
- [ ] 我已确认安全调查结果需要人工确认。