近年来,研究人员在深度学习技术方面取得了显著进展,这反过来也极大地推动了其他研究领域的发展,如自然语言处理、图像处理、语音识别和软件工程。各种深度学习技术已成功应用于促进软件工程任务的完成,包括代码生成、软件重构和故障定位等。许多论文在顶级会议和期刊上发表,展示了深度学习技术在解决各种软件工程任务中的应用。然而,尽管已有一些综述提供了深度学习技术在软件工程中的总体应用情况,但这些综述更多地关注学习技术,即使用了哪种深度学习技术以及如何训练或微调深度模型来解决软件工程任务。我们仍然缺乏能够解释由深度学习技术驱动的软件工程子领域进展、挑战和机遇的综述。为此,本文提出了首个面向任务的深度学习驱动的软件工程综述。该综述涵盖了十二个受深度学习技术显著影响的主要软件工程子领域。这些子领域涵盖了软件开发和维护生命周期的各个阶段,包括需求工程、软件开发、测试、维护和开发者协作。我们相信,深度学习有望为整个软件工程学科带来革命性的机遇,因此提供一个涵盖尽可能多软件工程子领域的综述有助于未来研究更系统地推动深度学习驱动的软件工程前沿。在所选的每个子领域中,我们重点介绍了通过应用深度学习技术取得的主要进展,并指出了该子领域中可用的数据集。我们还讨论了与每个综述的软件工程子领域相关的挑战和机遇。
近年来,深度学习取得了令人瞩目的进展,最早由Hinton等人在2006年提出[1]。由于Hinton等人[3]提出的无监督逐层训练,深度神经网络的训练主要障碍被克服。从那时起,大多数人工智能(AI)研究人员转向深度学习,构建包含数十、数千甚至数百万层的深度神经网络[4]。他们还提出了各种新颖的深度神经网络结构,如卷积神经网络(CNN)[5]、循环神经网络(RNN)[6]、长短期记忆网络(LSTM)[7]、双向LSTM[8]以及Transformer[9]。随着深度学习的进步和普及,硬件厂商如NVIDIA推出了专门为深度学习设计的更强大的计算设备。这一切共同推动了机器学习技术的发展,并使基于深度学习的人工智能成为21世纪最有前景的技术之一。 鉴于深度学习的显著进展,各种深度学习技术已被用于完成软件工程任务[10]。尽管自然语言处理(NLP)、图像和视频处理以及语音处理是当前深度学习技术的主要目标,深度学习也已成功应用于众多领域,包括数据挖掘[11]、机械制造[12]、生物医学工程[13]和信息安全[14]。在软件工程领域,研究人员成功利用各种深度学习技术完成了诸多重要任务,如代码生成[15]、代码补全[16]、代码摘要[17]、软件重构[18]、代码搜索[19]、故障定位[20]、自动化程序修复[21]、漏洞检测[22]和软件测试[23]。在所有这些任务中,深度学习技术已被证明是有用的,显著提升了现有技术水平。深度学习驱动的软件工程成功的一个可能原因是深度学习技术的显著进展,另一个可能原因是大量的软件工程数据公开可用于训练先进的神经模型。随着开源软件应用的普及,开发人员分享了大量的软件需求、源代码、文档、缺陷报告、补丁、测试用例、在线讨论以及不同工件之间的日志和追踪关系。这些数据为软件工程任务训练专门的深度神经模型提供了可行性。 据我们所知,已有几篇关于深度学习在软件工程中应用的综述(例如,Yang等人[10],Watson等人[24],以及Niu等人[25])。虽然这些综述提供了深度学习在软件工程中应用的整体图景,但仍缺乏对深度学习技术在软件工程各子领域进展、挑战和机遇的详细分析。
在本文中,我们详细综述了深度学习技术在主要软件工程子领域中的应用。我们选择提供一篇覆盖整个软件工程学科深度学习技术研究的综述,而不是为不同子领域分别撰写综述,原因如下。首先,软件工程有一个核心目标,研究人员采用分而治之的策略,将软件工程划分为不同的子领域。然而,深度学习的进步可能为我们提供机会,打破不同子领域的研究界限,推动整个软件工程学科的发展。换句话说,深度学习可能为未来的软件工程带来一种通用的变革手段。因此,我们认为一篇涵盖所有软件工程子领域的深度学习综述对软件工程研究人员更有帮助。其次,深度学习属于表征学习,而软件工程的深度学习技术高度依赖于软件开发中的不同工件。由于软件工程的不同子领域通常共享一些常见的工件,将不同子领域放入同一篇综述有助于不同子领域的研究人员理解不同深度学习技术的优缺点。例如,基于源代码的深度学习技术可能会影响所有与代码理解、生成和修改相关的子领域。
在准备这篇综述时,一个问题是软件工程是一个大领域,深度学习技术的应用可能只涉及一些子领域的较小部分。当面对这样一个子领域时,那里涉及的深度学习论文较少,我们认为这些论文难以反映该子领域的深度学习研究的本质。因此,我们并未覆盖所有软件工程子领域,而是聚焦于那些深度学习已经产生显著影响的子领域。幸运的是,深度学习已深刻影响了软件工程,通过我们选择的子领域,我们已经能够形成关于深度学习在软件工程中应用的整体性和有见地的图景。为了实现我们的目标,我们在每个选定的子领域中重点介绍了主要的技术进展、挑战和机遇。据我们所知,这是首个面向任务的深度学习驱动的软件工程综述,为深度学习驱动的软件工程研究提供了技术概述。
另一个问题是软件工程与深度学习的对齐。从软件工程的角度来看,研究工作主要根据软件开发生命周期分为五个阶段(即需求、设计、实现、测试和维护),每个阶段可进一步分为不同的软件开发活动。同时,从深度学习的角度来看,研究工作是根据目标学习任务进行分组的,最显著的特征是其输入和输出,因为深度学习通常是端到端的方式进行的。即,使用相同形式的输入-输出对通常被视为同一个任务,但可能会有不同的任务来实现相同的目标。为了平衡这两种观点,我们根据目标对研究工作进行了分组。即,我们将实现相同目标或一组相似目标的研究视为一个子领域,并相应地将研究工作分为12个子领域(表1列出了每个子领域的论文数量):需求工程、代码生成、代码搜索、代码摘要、软件重构、代码克隆检测、软件缺陷预测、错误发现、故障定位、程序修复、缺陷报告管理和开发者协作。我们相信这种组织方式对来自软件工程和深度学习领域的读者都友好。每个子领域在软件工程中具有明确的语义,从深度学习的角度来看,子领域中的任务高度相关。我们进一步按照软件开发五个阶段的顺序排列子领域。这种组织方式的另一个好处是,它自然避免了某个子领域过于拥挤。然而,这种组织方式也显示出一些缺点。从软件开发生命周期的角度来看,许多子领域属于软件维护阶段,而在我们的综述中,其他阶段的子领域较少。我们要强调的是,尽管这大致反映了更多的研究工作集中在软件维护上,但并不意味着软件维护比软件工程的其他阶段更重要。
在收集本文的论文时,我们聚焦于2000年至2023年间在软件工程和人工智能的主要会议和期刊上发表的论文。表2和表3列出了我们搜索深度学习在软件工程中应用的会议和期刊。值得注意的是,由于我们并未执行系统性的文献回顾,因此并未遵循严格的数据收集程序(即论文收集)。因此,虽然表2和表3列出了我们综述论文的会议和期刊,但论文的选择也经过了作者的主观判断,以确保适当性。也就是说,我们的综述主要目的是为读者提供深度学习驱动的软件工程技术进展的整体图景,而不是精确描述不同软件工程子领域的研究工作分布情况。由于许多研究人员对深度学习驱动的软件工程感兴趣,论文数量迅速增加。因此,本综述中讨论的论文数量已显著超过了最近系统性文献回顾中调查的论文数量(如Yang等人[10]和Watson等人[24])。此外,这篇综述属于AI4SE主题(即将人工智能技术应用于软件工程),而另一个相关主题SE4AI(即应用软件工程技术增强人工智能系统)的研究也非常密集。我们主观判断的一个重要目标是避免将SE4AI的论文纳入我们的论文收集中。