复旦大学CodeWisdom团队著作《软件开发大数据分析研究与实践》出版

复旦大学CodeWisdom团队编写的学术著作《软件开发大数据分析研究与实践》近期由电子工业出版社出版。本书是在团队近些年围绕软件开发数据分析及其应用所开展的研究与实践基础上编写而成的,其中大部分研究成果已在企业应用。本书由彭鑫、吴毅坚、陈碧欢三位老师领衔,李弋、董震、娄一翎、刘名威、黄凯锋等老师和博士后以及王翀、周捷、宋学志等几位博士生和科研助理参与编写。

ad44bbf8edf202fb0bbfd25d8b3c0bd4.png

1

2eb5bfada9c4d06ba5dafd672a1c700d.gif

写作背景

“软件定义一切”的发展趋势正日益成为现实。在此背景下,来自各行各业以及各种层次、各种形态的软件需求急剧增长,并对软件开发的效率和质量提出了很高的要求。一方面,新的软件应用领域和软件产品不断拓展,同时已有的软件产品随着环境和需求的变化而快速变化,快速交付以及持续更新已经成为许多软件产品必须面对的现实要求。另一方面,软件作为一种新型的信息化基础设施,其可信性要求越来越高。软件开发组织和开发团队需要兼顾这两个方面的目标,即在满足快速迭代和快速交付软件产品及其更新的同时确保软件的可信性。

然而,软件及其开发过程的高度复杂性和不可见性导致当前软件开发与演化面临诸多的问题和挑战。个人能力、经验以及主观能动性始终在软件开发中起着决定性作用,企业缺乏有效的管理手段来确保软件开发的效率和质量。应对这些问题和挑战的一种可行途径是建立在软件开发大数据分析之上的软件开发的数字化和智能化提升,而机会主要来自于软件开发的流水线化和云化以及软件分析与人工智能技术的发展。软件开发的流水线化和云化使得我们可以利用各种程序分析技术从软件开发过程及软件制品中抽取丰富的数据,从而为软件开发的数字化和智能化提升提供数据基础;人工智能技术的发展使得我们得以利用各种数据挖掘、机器学习、深度学习等智能化技术以及最近流行的大语言模型高效地从软件开发数据中抽取和学习有用的知识,从而为软件开发的数字化和智能化提升提供技术基础。

复旦大学智能化软件工程与系统研究团队(CodeWisdom团队)围绕软件开发的数字化和智能化这一主题开展了大量研究工作,同时与多家企业形成了长期合作关系,在此基础上积累了丰富的技术和实践经验积累。本书在分析现实问题背景的基础上阐述了软件开发的数字化和智能化发展目标并介绍了常用的程序分析技术,然后从软件质量问题分析、软件开发质量追溯体系、代码资产挖掘与代码推荐三个方面介绍了软件开发数据分析技术与实践。希望本书的内容能够对企业分析和掌握整体软件研发技术和管理水平现状并进一步建立规范化的软件研发管理体系及智能化支撑平台有所帮助。

8d540da059a933d74634d3f7778f8e9e.jpeg

2

8212460c77a8e9ed823ef997262d48aa.gif

软件复杂性及其带来的问题和挑战

2.1 快速交付与可信保障的双重压力 

随着信息与计算技术的不断发展,软件表现出了越来越强的渗透性,其应用的触角已经深入我们社会经济生活的方方面面,“软件定义一切”的发展趋势正日益成为现实[1]。软件是信息系统的灵魂,是世界数字化的直接产物、自动化的现代途径、智能化的逻辑载体[2]。

软件的重要性可以从其应用的广度和深度两个方面去看。从软件应用的广度看,时至今日,小到一个智能传感器、一块智能手表,大到一座智慧城市、一张智能电网,无不有赖于软件系统的驱动与驾驭[2]。软件部署和应用的载体也不再局限于服务器和桌面计算机这类通用计算设备了,而是扩展到各种智能设备(例如手机等智能移动终端、咖啡机等家用电器、机床等智能工业设备等、汽车等交通工具)甚至各类智慧空间(例如楼宇、园区、城市)。从软件应用的深度看,软件已经成为信息化社会不可或缺的基础设施,具体表现在[2]:一方面,软件自身已成为信息技术应用基础设施的重要构成成分,以平台方式为各类信息技术应用和服务提供基础性能力和运行支撑;另一方面,软件正在“融入”到支撑整个人类经济社会运行的“基础设施”中,特别是随着互联网向物理世界的拓展延伸、并与其他网络的不断交汇融合。

在此背景下,来自各行各业以及各种层次、各种形态的软件需求急剧增长,并对软件开发的效率和质量提出了很高的要求。一方面,新的软件应用领域和软件产品不断拓展,同时已有的软件产品随着环境和需求的变化而快速变化,快速交付以及持续更新已经成为许多软件产品必须面对的现实要求。另一方面,软件作为一种新型的信息化基础设施,其可信性要求越来越高,包括可靠性(Reliability)、性能(Performance)、信息安全(Security)、功能安全(Safety)和韧性(Resilience)等多个方面的要求。软件开发组织和开发团队需要兼顾这两个方面的目标,即在满足快速迭代和快速交付软件产品及其更新的同时确保软件的可信性。

2.2 软件的复杂性

软件及其开发过程高度不可见。与此同时,软件日益增长的复杂性进一步带来了前所未有的挑战。这种复杂性表现在以下多个方面:

l   软件规模及逻辑复杂性:软件实现的功能越来越多,代码越来越长,同时不同组件和模块之间的交互关系也越来越复杂。这种复杂性带来的不仅是开发人员软件理解上的困难,同时也增加了软件发生质量问题的风险,例如由于特性交互(Feature Interaction)问题引发的软件缺陷。

l   软件的协作开发复杂性:网络及软件技术的发展使得基于网络的大范围协作开发成为一种常态。不仅是基于开源社区以及开源代码托管平台(如GitHub)的开源项目开发,企业软件开发也广泛采用了基于公有云或私有云的网络化开发平台。这种网络化协作开发模式使得参与的软件开发人员规模以及软件开发的开放性持续增长,增加了软件开发及演化过程的管理和协调难度。

l   软件开发生态复杂性:互联网以及开源和商业软件生态的发展使得软件开发越来越具有鲜明的复杂生态系统特征。一方面,软件的开发和演化越来越依赖于一个复杂的软件生态系统,各种开源和商业软件组件和框架在软件产品的开发中得到了大量应用,由此引入了大量复杂的软件生态依赖。一些软件产品还采取了与开源软件的协同演化发展模式,例如商业化的操作系统发行版与对应的开源操作系统之间的协同演化。此外,一些企业中共享共性软件框架和代码的软件产品系列也构成了一种软件生态,并带来了相应的开发复杂性。

l   软件运行生态复杂性:互联网的发展同样使得软件的运行环境越来越复杂,甚至形成了复杂的运行时软件生态,特别是基于云的软件系统(例如微服务系统)。在此生态中不仅存在大量复杂的基础软件(例如操作系统、中间件等),而且软件的不同部分(如服务)之间存在着复杂关系,而传统的系统边界则逐渐模糊。

2.3 问题与挑战

以上这些因素导致了当前软件开发与演化过程中的诸多问题和挑战,其中一些典型表现如下。

8f0955abdf09a0c34a792b6dc797483e.png

1.软件维护的冰山

软件的外部质量(用户与客户所见以及所关心的)与内部质量(开发和维护人员所关心的)可能发生脱离,外部质量良好的软件也有可能存在很多内部质量问题,例如难以理解和维护,从而形成“软件维护的冰山”。特别是对于一些“历史悠久”的软件项目而言,其中的内部质量问题(例如架构退化、重复代码、死代码以及各种代码坏味道等)都是经年累月形成的(即所谓的“冰冻三尺非一日之寒”)。由于时间有限而且这些内部质量问题暂时并不会带来直接的外部质量影响,因此很多时候开发人员都会选择暂时忽略和容忍这些问题的存在。与此同时,软件维护的职责在开发人员之间不断转移,并且代码质量问题的形成及发展过程不可见,导致开发人员普遍存在击鼓传花、法不责众的心态,甚至由于“破窗效应”而不在意一再引入各种代码质量问题、留下“技术债”。这种内部质量问题的累积不仅对于软件开发效率带来越来越大的负面影响,而且也会成为潜在的外部质量问题来源,例如开发人员由于难以理解代码的设计意图而做出错误的技术决策或者由于不知晓多个代码拷贝副本的存在而忽略了需要同步进行修改以保证一致性的地方。

2.随风消逝的知识

软件开发过程涉及多个不同层次、不同方面的知识,例如需求和设计方案以及相关的背景知识、通用组件及其所实现的功能、代码实现背后的设计决策和设计意图等。理想情况下,这些知识应该在规范化的文档中进行描述并与代码建立完善的映射关系。然而,现实情况这些知识很多时候都“随风消逝”了:它们曾经在我们的脑海中或者与同事的交流和讨论中出现过,甚至以某种方式被记录过,但当我们需要的时候总是不知从何处获取。因此,各种重复思考和重复劳动在软件开发过程中司空见惯。例如,代码理解经常被认为是一项很有挑战的任务,我们经常感觉所面对的代码背后隐藏着某种“神秘莫测”的深层意图,特别是在缺少必要的注释和文档的情况下。因此,我们经常会花费大量的时间去理解一段代码及其背后的设计意图,而对于同一段代码的重复思考经常在不同的开发人员身上发生。另一方面,“重新发明轮子”的现象在企业软件开发过程中也屡见不鲜。开发人员虽然也意识到自己正在实现的功能在所属企业的其他项目甚至同一项目的其他模块中已经实现过了,但由于缺少高效的代码资产积累和推荐机制而不得不选择自己重新实现。此外,由于关于各种软件缺陷及其修复方式的知识未能得到有效积累和利用,开发人员还会经常在不同的地方犯同样的错误,这种重复犯错的情况也是软件开发知识缺失的一种表现。

3.开发过程不透明

随着应用需求及软件技术的不断发展,当前的开源及企业软件已经形成了一种复杂的生态系统。新的软件不断地在已有的软件基础上派生出来,例如从一个软件产品那里派生出同一领域中的变体(Variant)产品或者在一个开源软件基础上派生出对应的商用软件。同时,越来越多的功能通过源代码和组件等不同层次、不同形态的软件复用来实现。这些都使得软件的成分及内容来源越来越开放和多样化。此外,开源及企业软件开发已经广泛实现了基于网络化平台的大范围协作式开发,大量开发人员在不同时间、以不同的方式参与软件开发,从而使软件的开发和演化过程更加复杂。这些因素都使得由于软件开发的不可见性而导致的开发过程不透明、不可控的问题更加突出。对内而言,开发过程不透明导致开发人员的贡献和能力难以评价。一些企业通过代码提交数、提交代码行数、缺陷密度等简单指标度量开发人员的开发工作量及质量,难以反映真实情况且极易受操控。对外而言,开发过程不透明导致外部客户或其他第三方难以对软件开发的质量和可信性进行准确评价。已有的一些基于流程规范性的评价方式容易与实际的软件开发内容脱节,难以反映真实情况。

4.脆弱的软件供应链

“供应链”一词原来主要被用于生产制造领域,但近几年来“软件供应链”以及相应的“供应链安全”也逐渐成为企业关注的焦点。由于此前提到的开源与商业相混合的复杂软件生态以及大范围开放式协作开发等因素,软件的成分来源及其依赖关系越来越复杂。一方面,各种代码拷贝泛滥,无形之中埋下了缺陷和漏洞传播、违反许可证条款等方面的风险。另一方面,越来越多的第三方软件组件被用于企业软件开发,这些组件背后还可能存在复杂的依赖链,其中不仅蕴含着缺陷与漏洞传播、违反许可证条款等方面的风险,还可能由于开源组件断供或升级导致的维护风险。此外,与汽车、计算机等电子电器产品不同,软件不存在可明确辨识和区分的组件边界,且组成成分复杂。这些都导致当前软件供应链日益复杂且极其脆弱,极易由于多种不同原因导致质量风险。特别是由于软件的不可见性,许多企业还没有意识到软件供应链的复杂性和脆弱性以及其中所蕴含的质量风险。

3

926d4ba94a92156493979a023e51dac2.gif

软件开发的数字化和智能化

以上提到的各种问题和挑战的一个根源是软件及其开发过程的不可见性和复杂性。虽然软件开发帮助其他行业实现数字化,但一直以来软件开发自身的数字化程度和知识化积累做得并不好。个人能力、经验以及主观能动性始终在软件开发中起着决定性作用,企业缺乏有效的管理手段来确保软件开发的效率和质量。应对这些问题和挑战的一种可行途径是建立在软件开发大数据分析之上的软件开发的数字化和智能化提升,而机会主要来自于软件开发的流水线化和云化以及软件分析与人工智能技术的发展。

软件开发的流水线化和云化为软件开发的数字化和智能化提升提供了数据基础。如下图所示,现代软件开发普遍采用了基于云的软件开发平台以及开发运维一体化(DevOps)和持续集成/持续交付(CI/CD)这样的实践。这就使得软件项目得以在云上留下关于软件开发及代码演化过程的“全息”记录,特别是对于一些开发规范执行较好的项目。其中,项目版本库(如Git)的代码提交(Commit)及分支/合并(Branching/Merging)历史记录了完整的代码演化过程,如果代码提交的原子性(即每次提交只完成一个不可再分的开发任务,如缺陷修复或特性实现)能够得到保障且能够与对应的开发任务(如缺陷报告单、特性开发请求)相关联(如在Commit Message中明确任务类型及对应的任务ID),那么版本库的代码演化历史将能够以一种规范化、易理解的方式反映代码的整个演化过程并为演化过程的数字化分析和知识抽取打下良好的基础。例如,通过缺陷修复相关的代码提交分析可以了解缺陷的发生位置,并在代码差异比较算法的基础上通过前向的代码演化过程追溯了解缺陷代码的引入及发展变化过程;通过缺陷引入和修复相关的代码提交分析可以抽取缺陷修复案例(包括缺陷代码上下文以及修复缺陷的代码修改操作),从而为缺陷检测与缺陷修复知识学习(例如通过模式挖掘或机器学习模型训练)提供数据。从整个开发过程的层面看,如果能够建立分解后的细粒度需求与实现需求的代码提交、测试用例、测试发现的缺陷报告等软件开发制品之间的链接和追踪关系,那么还可以进一步积累更多有价值的软件开发数据。

b01450ef5c132490984bde3125b1b9df.png

软件分析与人工智能技术的发展为软件开发的数字化和智能化提升提供了技术基础。程序分析一直是软件工程领域的一个重要子领域,目前已形成一整套静态分析和动态分析技术。此外,近些年来针对一些特定的软件工程任务形成了相应的专项分析技术,例如代码克隆分析、代码差异分析、代码演化分析等。这些分析技术为我们理解软件代码及其演化历史以及抽取有用的分析信息提供了有力的手段。例如,通过静态分析技术可以获取代码的组织结构(例如模块、包、类、方法等)及依赖关系(例如方法调用、数据访问等);通过代码克隆分析可以了解相同或相似的代码片段在软件项目中所处的位置及其内容;通过代码差异分析可以获取代码提交中对代码的修改位置及修改内容或者识别相似代码片段中共性和差异性的部分。另一方面,数据挖掘、机器学习、知识图谱等智能化技术已经被广泛应用于软件工程领域,用于实现各种软件开发知识挖掘及智能化推荐能力。特别是近几年深度学习和大语言模型(Large Language Model,LLM)技术的发展使得代码搜索、代码生成、缺陷检测、缺陷修复等软件工程任务的智能化水平和方法性能都有了长足的进步。

以上两方面的进展为软件开发的数字化管理和智能化支持打下了坚实的基础。

软件开发的数字化是指建立软件开发制品及其开发过程的数字化和结构化描述,将其作为一种面向软件开发分析和管理的数字化基础设施,在此基础上利用各种数据分析技术实现更加准确和高效的软件开发管理。例如,一些企业通过静态分析抽取软件项目中的程序元素(例如模块/包、类/文件、方法/函数)及其相互之间的关系(例如方法/函数调用、控制流/数据流关系等),形成所谓的代码地图(Code Map),用于支持故障定位、测试生成、架构看护等不同目的;软件供应链管理识别软件不同层次的组成成分(例如模块、组件、文件/类、方法/函数、代码片段等)以及它们的外部来源(如代码拷贝的来源)和依赖(如三方库依赖),并进一步追踪其间接依赖关系,从而有效管理安全、法律和维护等方面的风险;针对软件开发和演化过程建立从特性/缺陷、代码提交到测试用例与测试结果等制品和开发活动之间的追踪关系,同时抽取缺陷案例(从最初引入到后续发展变化直至修复的全过程)、代码克隆案例(相同或相似的代码片段及其引入和发展变化过程)等有价值的信息。

软件开发的智能化是指在软件代码、文档、开发历史等数据基础上通过显式(如挖掘模式、构建知识图谱)或隐式(如训练深度学习模型、微调大语言模型)的方式抽取各方面软件开发知识并根据开发人员的需要实现智能化推荐。这方面进展最显著的就是代码推荐(包括代码搜索、代码补全、代码生成等不同形式):最初,我们主要利用各种信息检索技术实现开源或企业代码库中的代码搜索,同时利用一些基于统计或数据挖掘的方法实现简单的代码补全(例如按照概率推荐指定类的方法调用、按照挖掘的代码模板补全后续代码);后来在海量开源和企业代码基础上训练的深度学习模型实现了基于文本语义(而非关键字匹配)的代码搜索以及逐行代码补全;近几年快速发展的大语言模型则进一步在通用域上实现了函数/方法级代码生成,甚至可以在开发人员的引导下以一种迭代化的方式生成完整的小规模软件应用。企业在特定业务领域中的通用软件组件库也是重要的软件开发知识和可复用资产。通过持续的通用组件抽取和积累并添加必要的描述(如实现功能、应用场景和使用方式等)可以形成特定领域组件库,在此基础上利用知识图谱、深度学习等智能化技术可以实现软件组件推荐,避免重新发明轮子。当前软件开发中的智能化实践主要集中在代码层面,但近期大语言模型的发展使得更高层次上和更大范围内的智能化开发支持成为可能。通过微调、提示工程、检索增强等手段使通用大语言模型与关于需求、设计、实现和测试等不同方面的特定领域软件开发知识充分融合,可以实现需求分析和设计方案推荐、测试方案及测试案例生成、面向任务的缺陷及特性定位以及代码修改方案推荐等更多的智能化开发能力。这方面的研究非常活跃,有望推动相关技术在企业开发实践中落地应用。

7a7e6efe1a06a8428ea0f46829859bbd.gif

参考文献

[1] 彭鑫, 游依勇, 赵文耘. 现代软件工程基础[M]. 北京: 清华大学出版社, 2022.

[2] 国家自然科学基金委员会, 中国科学院. 中国学科发展战略:软件科学与工程[M]. 北京: 科学出版社, 2021.

bbe6c9da1744552592eafa49580cd91c.gif

附:内容简介及章节目录

本书围绕软件开发大数据分析这一主题介绍相关研究与实践。其中:

l   第1章 对软件开发大数据分析的现实问题背景以及软件开发的数字化和智能化发展目标进行介绍和分析,同时对本书的内容进行概述;

l   第2章 对软件开发大数据分析中常用的程序分析技术进行介绍,包括静态分析、动态分析、代码克隆检测、代码差异比较、代码演化分析等;

l   第3章和第4章 针对软件质量问题分析这一主题分别介绍代码层面的缺陷分析技术以及设计层面的设计问题分析技术;

l   第5章、第6章和第7章 围绕数据驱动的软件开发质量追溯体系这一目标分别介绍代码克隆分析与管理、软件供应链风险分析、代码质量与开发效能分析三个方面的技术;

  第8章 围绕软件开发智能化这一主题具体介绍代码资产挖掘与代码推荐(包括代码搜索、代码补全、代码生成等不同形式)技术。

全书目录如下:

7276db4209ae7299811be8a730c47f67.png

7166efd81ae072f4ab05eb26ed29ffbe.png

fee32cf5f28dac5238899bdfb7b7236f.png

71c6c2dc4184254d502102fa6dfc5682.png

5f256a7efaf2f879e02050fe7dca89cb.png

39b1edb6a20175bde1da8756958936cb.jpeg

ac97914fe80bb439f8387b60158e4b8c.jpeg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值