在软件开发的未来,人工智能(AI)有望承担起繁琐的任务,例如重构复杂代码、迁移遗留系统和追踪竞争条件,从而使软件工程师能够专注于架构设计和真正具有创新性的难题。麻省理工学院计算机科学与人工智能实验室(CSAIL)的研究人员发布了一份新论文,指出尽管近期人工智能取得了显著进展,但要实现这一目标,仍需正视当前面临的挑战。
该论文题为《人工智能在软件工程中的挑战与路径》,深入探讨了代码生成之外的诸多软件工程任务,指出了当前的技术瓶颈,并提出了克服这些瓶颈的研究方向,旨在让人类专注于高级设计,同时实现例行工作的自动化。
麻省理工学院电气工程与计算机科学教授、CSAIL首席研究员兼该研究的资深作者 Armando Solar-Lezama 认为,尽管人工智能领域取得了巨大进步,但要充分实现自动化的承诺,仍有很长的路要走。当前,人们普遍认为软件工程仅仅是“大学生编程的一部分”,即根据规范实现一个小功能,或者解决 LeetCode 风格的编程面试题。然而,实际的软件工程实践远不止于此,它包括日常的代码重构、大规模的系统迁移,以及持续不断的测试和分析。
软件工程的真实面貌:挑战与复杂性
软件工程的实践远比人们通常认为的更为广泛和复杂。它不仅仅是编写新的代码,还包括对现有代码进行日常的重构,以优化设计;进行大规模的系统迁移,将数百万行的 COBOL 代码转换为 Java 代码,从而重塑整个业务;以及进行持续不断的测试和分析,例如模糊测试、基于属性的测试等,以发现并发错误或修复零日漏洞。此外,软件工程还包括繁琐的维护工作,例如记录旧代码、为新团队成员总结变更历史,以及审查代码的风格、性能和安全性。
在工业规模的代码优化中,对 GPU 内核进行重新调整或对 Chrome 的 V8 引擎进行多层优化仍然非常困难。当前的评估指标是为简短、独立的问题而设计的。尽管多项选择题仍然在自然语言研究中占据主导地位,但它从未成为人工智能代码的标准。SWE-Bench 是该领域的标准,它只是要求模型修补 GitHub 问题。虽然这很有用,但它仍然类似于“大学生编程练习”模式,仅涉及几百行代码,存在公共存储库数据泄露的风险,并且忽略了其他实际情况,例如人工智能辅助的重构、人机协作编程或跨越数百万行代码的性能关键型重写。因此,除非基准测试能够扩展到捕获这些高风险场景,否则衡量进展(并加速进展)仍然是一个开放的挑战。
人机沟通:弥合差距,实现有效协作
人机沟通是另一个需要解决的障碍。第一作者 Alex Gu 认为,当前人机交互的方式非常有限。当要求系统生成代码时,通常会收到一个大型的非结构化文件,甚至是一组单元测试,但这些测试往往流于表面。人工智能在有效利用更广泛的软件工程工具(从调试器到静态分析器)方面的能力也存在差距。开发人员无法控制模型编写的内容,并且缺乏人工智能暴露自身信心的渠道。如果人工智能无法表达其自身的确定性(例如,“这部分是正确的,这部分可能需要仔细检查”),那么开发人员可能会盲目信任人工智能生成的看似合理但实际上存在缺陷的代码。
另一个关键问题是人工智能需要知道何时应该向用户寻求澄清。当前的人工智能模型在处理大型代码库时会遇到很大的困难。尽管基础模型可以从公共 GitHub 中学习,但每个公司的代码库都是独一无二的。这导致人工智能生成的代码看起来合理,但实际上却调用了不存在的函数、违反了内部风格规则或未能通过持续集成管道。因此,人工智能生成的代码经常出现“幻觉”,即创建看起来合理但与特定内部约定、辅助函数或架构模式不符的内容。
规模化挑战:应对大型代码库和代码检索的难题
规模化是人工智能在软件工程中面临的另一大挑战。当前的人工智能模型在处理大型代码库时会遇到很大的困难,这些代码库通常包含数百万行代码。尽管基础模型可以从公共 GitHub 中学习,但每个公司的代码库都是独一无二的。这导致人工智能生成的代码看起来合理,但实际上却调用了不存在的函数、违反了内部风格规则或未能通过持续集成管道。因此,人工智能生成的代码经常出现“幻觉”,即创建看起来合理但与特定内部约定、辅助函数或架构模式不符的内容。
此外,模型还经常错误地检索代码,因为它检索的是名称(语法)相似但功能和逻辑不同的代码。标准的检索技术很容易被执行相同操作但外观不同的代码片段所欺骗。由于没有解决这些问题的灵丹妙药,作者呼吁社区共同努力,创建更丰富的数据,捕获开发人员编写代码的过程(例如,开发人员保留和丢弃的代码、代码如何随着时间的推移进行重构等),共享评估套件,衡量重构质量、错误修复的持久性和迁移的正确性方面的进展,以及透明的工具,让模型能够暴露不确定性,并邀请人类进行指导,而不是被动接受。
社区协作:共同应对挑战,推动人工智能在软件工程中的发展
Gu 将该议程定义为“行动号召”,呼吁更大的开源合作,这是任何单一实验室都无法实现的。Solar-Lezama 设想了渐进式的进步——“研究结果分别解决了这些挑战中的每一个”——这些进步将反馈到商业工具中,并逐渐将人工智能从自动完成助手转变为真正的工程合作伙伴。
软件已经渗透到金融、交通、医疗保健和日常生活的方方面面,而安全构建和维护软件所需的人力正成为一个瓶颈。能够承担繁琐工作的人工智能将使开发人员能够专注于创造力、战略和伦理。但这一未来的实现取决于我们承认代码完成只是简单的一部分,而困难的部分在于其他一切。我们的目标不是取代程序员,而是增强他们的能力。当人工智能能够处理繁琐和可怕的任务时,人类工程师最终可以将时间用于只有人类才能做的事情。
Mistral AI 的人工智能科学家 Baptiste Rozière 认为,随着人工智能编码领域涌现出如此多的新作品,社区经常追逐最新的趋势,因此很难退一步思考哪些问题是最重要的。他很喜欢阅读这篇论文,因为它清晰地概述了人工智能在软件工程中的关键任务和挑战,并概述了该领域未来研究的有希望的方向。
Gu 和 Solar-Lezama 与加州大学伯克利分校教授 Koushik Sen 和博士生 Naman Jain 和 Manish Shetty、康奈尔大学助理教授 Kevin Ellis 和博士生 Wen-Ding Li、斯坦福大学助理教授 Diyi Yang 和博士生 Yijia Shao,以及即将上任的约翰·霍普金斯大学助理教授 Ziyang Li 共同撰写了这篇论文。他们的工作得到了美国国家科学基金会 (NSF)、SKY Lab 工业赞助商和附属机构、英特尔公司通过 NSF 资助以及海军研究办公室的部分支持。研究人员将在国际机器学习会议 (ICML) 上展示他们的工作。