AI 日报

1.5亿行代码变更背后:代码质量下降,谁来背锅?

  • By 51ITO
  • Feb 20, 2024 - 2 min read



编译丨诺亚

出品 | 51CTO技术栈(微信号:blog51cto)

随着AI技术的发展,如今学习编程或许比以往任何时候都更加容易。但最新研究揭示了AI辅助编程工具对代码质量的影响并不尽如人意。

一、代码搅动上升至7.1% 

该研究由开发者分析公司GitClear基于对1.5亿行代码变更数据的深入分析得出,其中三分之二的数据来源于同意匿名共享数据的私营企业,三分之一则主要来自谷歌、脸书和微软等公司的开源项目。

值得注意的是,GitHub的Copilot自2021年6月进入测试阶段以来,迅速引领了AI编码潮流,目前已有超过百万名付费订阅用户,并且据其CEO托马斯·多姆克透露,在启用Copilot功能的文件中,开发者完成任务的速度提升了55%,并且46%的代码内容是由Copilot协助完成的。

然而,GitClear的研究重点并非单纯关注代码的数量,而是更加关注代码质量本身。研究发现,AI助手倾向于提供“新增代码的建议,但从未给出更新、移动或删除代码的建议”。研究人员还推测,“代码建议算法倾向于提出最有可能被采纳的建议”,而忽视了编写简洁易读代码的重要性。

图片图片

由GitClear分析的代码变更趋势(如上图)表明,新增、删除、更新和复制粘贴的代码数量达到了前所未有的高度,而代码被移动的情况却在减少。他们还注意到“代码搅动”(指一定时间范围内对同一段代码的改动,是“异常”的代码改动,体现代码的返工程度)上升到了7.1%,相较于2020年的3.3%有显著增长。   

这些趋势背后的原因尚未明确,但研究人员认为这可能与日益普遍采用AI编码技术有关。对于更多复制粘贴代码的现象,他们严厉批评称“对长期代码可维护性而言,没有比这更大的祸患了”。

过度使用复制粘贴并不是一个新问题。开发人员这样做可能是因为当时觉得这种方式比找出如何重用现有代码更快更容易,或是因为项目中多位开发者之间沟通不畅,或者从示例或编程问答网站上复制了过多代码。

GitClear的研究人员并未就如何解决识别出的问题提供太多解决方案,而是将这些问题留作后续研究的课题,尽管他们建议工程负责人应“监测输入数据并考虑其对未来产品维护的影响”。

二、不要简单地复制和粘贴

AI编码助手并不会消失,反而可能会不断改进,如同所有新兴工具一样,开发者要学习如何优化它们的使用方法。但对于一部分开发人员包括初学编程的新手来说,如何理性使用这种工具并防止养成依赖性属实是一个难题。

正如一个开发人员所说:“我在某个问题上卡住时,很容易就会想求助于ChatGPT这样的工具,它能轻易帮我找到正确答案。这类辅助工具擅长生成简单的代码,其中一些甚至能在你描述问题后直接给出完整的解决方案。”不过,他很快意识到,这种习惯一旦养成,实际上弊大于利。

如前文所述,机器生成的代码并不总是有用,并且可能会降低代码库的质量。如果只是简单复制并粘贴AI助手生成的代码到源代码中,往往会导致新的错误出现,因为这段代码可能与程序其余部分不协调。尝试修复这些错误可能会相当棘手,特别是当你不清楚生成的代码具体含义时。很多人有时很难分辨错误是因为代码本身有问题,还是因为在错误的上下文中使用了它。

《笨办法学Python》的作者Zed Shaw建议:“如果有人想要利用当前这一批AI工具学习编程,他们应该带着两个目标来着手:首先,花时间学习足够多的编程知识,以便了解工具生成的是什么内容;其次,承担起‘代码审查员’的角色,学会如何识别并改进低质量代码。”

程序员应当具备发现机器生成代码中的错误的能力,而不应完全依赖于这些智能助手。他们尤其需要注意防止明显的版权代码未经许可混入模型输出的结果中。

密歇根大学信息学院计算机科学教授Charles Severance指出:“ChatGPT给出解决方案的速度非常快,并且其回答通常包装在诸如‘我认为这应该能解决你的问题……’这样令人安心的措辞中,这使我们容易关闭批判性思考模式,不再像应该的那样仔细审视其提供的解决方案。”

Severance补充说:“始终假设ChatGPT是一个比你技能较低的程序员。使用AI工具的唯一安全方法是当你确信它产生的解决方案是正确的时候。”这意味着作为开发者,我们要保持警觉和独立判断,确保AI提出的方案既符合需求也无潜在风险,同时通过自身的专业知识进行验证和完善。

三、明确问题并进行准确的表述

GitHub的首席产品官Inbal Shani强调,要有效地使用AI编程工具,用户首先必须明确自己的问题,并在输入提示中清晰地表述出来。GitHub Copilot等工具返回代码的质量直接取决于提问的方式和问题的描述准确性。

她建议,用户应当像与同事交谈那样与Copilot互动,提供尽可能详尽的上下文信息,包括解决问题的目标、意图以及所处阶段,这样就能获得更好的反馈,因为AI能够基于更多背景信息进行更深入的搜索,从而找到合适的代码片段或推荐相应的测试架构。

卡内基梅隆大学的助理教授Phillip Compeau对此观点表示赞同。他认为现今使用的编程语言越来越趋向于人类自然语言的表达方式,而聊天工具正是这一演变过程中的下一步。在教学过程中,Compeau会引导初学编程的学生先不依赖AI技术,但对已掌握基础编程知识的高级学生,则教导他们如何有效利用这类工具提高工作效率。

Compeau表示:“我向学生们展示的一点是,从AI工具生成代码中获取简洁、正确答案的最佳方法是你能够准确无误地阐述计算机需要执行的具体任务。这恰恰是对编程的定义,随着时代的发展,我们所使用的编程语言已经愈发贴近人类语言;聊天工具则是这种演进道路上的一个新阶段。”

在编程中,确定程序应完成什么功能、如何运作及出现问题时的排查至关重要。这些核心技能只能通过长期坚持实践逐渐培养起来。如果想成为一名合格的软件开发者,单纯依赖AI是无法绕过这个学习过程的。然而,若能明智地运用AI工具,的确可以加速提升编程能力,并有望成为一个优秀的程序员——甚至可能在这个过程中享受到乐趣。

参考链接:

https://www.theregister.com/2024/01/27/ai_coding_automatic/

https://devclass.com/2024/01/24/ai-assistance-is-leading-to-lower-code-quality-claim-researchers/