王洋 魏萍
行业应用软件面向垂直领域复杂问题,其经典的组装过程体现为样本程序。样本程序是行业应用软件编码的优良参考,因此,在代码检查环节,也应在代码检查工具中添加相应的样本程序编码规则,运用代码检查工具来实现基于样本程序的代码检查。
现有主流代码检查模型及工具或基于神经网络和机器学习对标准程序集进行学习和训练,使其具备代码检查能力,但对领域特征结合较少;或基于内置规则对代码进行静态检查,容易引发路径组合爆 炸、误报率较高等问题。为解决上述痛点,本文设计了一种基于行业应用软件样本程序的代码检查模式,并在保险领域某中大型研发项目中对该模式进行了验证,结合项目代码总修复时长、需求问题总量、模块测试覆盖率、个人代码修复次数等评价指标,该模式被验证可有效提升代码质量,改善作业效率。
一、相关工作
行业应用软件立足于领域问题,其代码质量提升及代码检查不可脱离领域特征,现有主流代码检查模型及工具主要分为两类:(1)一类是基于神经网络和机器学习对标准程序集进行学习和训练,使其具备代码检查能力,但对领域特征结合较少,如ChatGPT、GitHub Copilot 等。(2)另一类是基于内置规则对代码进行静态检查,如CheckStyle、FindBugs、PMD 等,在提供相对精确分析结果的同时,也带来了路径组合爆炸、误报率较高等问题。
因此,本文设计了一种基于行业应用软件样本程序的代码检查模式,首先基于标准程序集与样本程序集构建代码自动化检查模型,并对模型进行验证;之后,将模型输出作为增量领域规则库判断环节的输入,以实现对代码自动化检查模型输出结果的进一步修正。
我们在保险领域某中大型研发项目中对基于行业应用软件样本程序的代码检查模式进行了验证,通过将代码检查和审核模型与机制渗透到代码编写、代码编译、代码提交、CICD 流水线执行等环节, 设置质量门禁,确保代码符合质量要求,通过代码分析引擎实现质量指标的横向比较、趋势分析,聚焦研发环节,结合研发项目的元信息,有效计算出项目代码总修复时长、需求问题总量、模块测试覆盖率、个人代码修复次数等评价指标,辅助提升代码质量,改善作业效率。
二、样本程序的定义及重要性
(一)样本程序的定义
样本程序是指一个经典的组装过程说明。选择一种经典的组装方法,从头到尾组装一遍,这种“从头到尾的组装”就是样本程序。样本程序除了一套程序代码外,还包括应用框架、编程规范、代码检查 工具等几部分内容组成。
在以从事“行业应用软件”开发为主的软件企业中,大部分工程师做的是一种定制化“脚本”性的工作。虽然这种编程上手并不困难,因为它的本质是一种“集成”性的工作,但由于“集成”的对象和涉及的内容非常多,决定了它不只是一个技术性问题,而且涉及管理、工程化、行业知识、个人表达能力等一系列问题,所以“做好”并不容易,而设计良好的“样本程序”可起到事半功倍的效果。
(二)样本程序的重要性
在一个项目组中,各成员使用样本程序的方法如表1如示。
在项目开发过程中,虽然给相关开发人员指定了样本程序进行编码参考,但在实际过程中,还是需要对样本程序的使用进行跟踪,即对开发人员是否依据样本程序开展开发进行检查。在目前的环境下,大多数项目组只能够采用人工代码走查的方式来进行,这样速度慢、效率低,也容易检查不完全,因此,我们需要尝试在代码检查工具中添加相应的样本程序编码规则,运用代码检查工具来实现基于样本程序的代码检查。基于多领域样本程序进行代码检查,可在提高组装效率的同时,实现质量保证,它自动化地进行代码走查,能够快速搜索到程序代码中不符合编程规范的位置,方便开发人员进行改正。
三、主流代码检查模型及工具分析
我 们 对 ChatGPT、GitHub Copilot、CheckStyle、FindBugs、PMD 这几类主流工具进行应用模式及缺陷分析,主要聚焦其与已有代码检查规则的集成是否便捷、是否兼容领域特征等内容。
(一)ChatGPT
1.应用模式
ChatGPT是人工智能技术驱动的自然语言处理工具,使用 Transformer 神经网络架构(GPT-3.5 架构),可通过连接大量的语料库来训练模型。它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动。目前只提供单一界面。
如图 1 所示,目前来看,ChatGPT 在代码检查方面的规则偏重通用逻辑检查,与领域特征的结合需要通过后续步骤进行修正与完善,但因其界面单一,所以工程可用性较差。
图1 ChatGPT的应用模式
2.缺陷分析
ChatGPT 对代码输入长度有限制,工程应用效率低;同时,对提问者的逻辑描述能力要求较高。它与已有代码检查规则无法有机集成,不能很好地兼容领域特征。
(二)GitHub Copilot
1.应用模式
GitHub Copilot主要用于代码补全,也可通过导入单元测试包自动编写与实现代码匹配的测试,以及将注释转换为代码。它不提供自己的用户界面或应用程序,而是作为扩展安装,包括 Neovim、JetBrains IDE、Visual Studio 和 Visual Studio Code。GitHub Copilot 可 以 处 理 包 括 Python、Java、Type、Ruby、Go、C#和C++等在内的十几种编程语言,也可以理解多语种。GitHub Copilot 基于Open AI Codex 机器学习模型(GPT-3 的一个版本,能够将自然语言转换为代码),相比于其他编程辅助工具,它的上下文理解能力相对强大。无论是文档字符串、注释、函数名称还是代码本身,GitHub Copilot 都可以基于提供的上下文(已输入的代码)合成新代码以进行匹配,拥有模式识别及模式补全功能。
当面临需要编写大量相似但难以转换为循环语句代码的场景时,GitHub Copilot也能自动填充重复代码,在生成样板和重复代码方面效率较高。
2.缺陷分析
GitHub Copilot 的包办测试模式不能主动识别实现代码中的错误,容易将其引入到测试中,从而影响测试效果,因此需要人工参与。
(三)PMD
1.应用模式
PMD 基于源代码分析,主要面向安全编码规则,如“避免声明同名变量”,包括风格类、类型使用等,具备一定的数据流分析和路径分析能力。PMD的检查内容主要包括:空 try/catch/finally/switch 语句块,未使用的局部变量、参数和 private 方法,空 if/ while 语句,过于复杂的表达式(如不必要的 if 语句等复杂类)。
PMD 通过其内置的编码规则对 Java 代码进行静态检查,主要包括对潜在的 bug、未使用的代码、重复的代码、循环体创建新对象等问题的检验。PMD作为一个命令行工具,可以方便地集成在任何 项目构建过程中,作为检验代码质量的关键步骤。可用于开发场景、测试场景、DevOps工作流。
开发场景:在软件开发过程中,开发人员将执行PMD检查作为提交自己工作成果之前的一道保障。只有检测报告中没有出现违规情况才可以提交代码到源码仓库。在提高交付质量的同时提升自身的编 码能力。
测试场景:测试人员从源码仓库检出代码后,在构建项目时可以运行PMD检测项目出厂质量,有助于提前发现潜在问题,规避生产上线后的隐藏问题。可以将 PMD 检测结果作为开发质量的一个考核标准。
DevOps工作流:开发团队(Dev)和运维团队(Ops)相互沟通、融合、协作,促进开发和技术运营与质量保障之间的整合,这对人员、技术以及流程要求都较高。在这个自动化的流水线中,从源代码转换为部 署就绪的产品是非常重要的事情。PMD 与部署管道工具(例如 Jenkins Pipeline)结合,可以在持续构建过程中完成代码质量的持续检测。
2.缺陷分析
PMD主要用于静态代码分析,自定义规则可通过Java和Xpath实现,但编译、打包比较费时。
PMD 通过 JavaCC 生成的 java 抽象语法树节点类型众多,大概有130种以上。针对复杂的规则,还需要同时理解PMD源码。
(四)CheckStyle
1.应用模式
CheckStyle 是 SourceForge 的开源项目,通过对代码编码格式、命名约定、Javadoc 类设计等方面进行代码规范和风格的检查,从而有效约束开发人员更好地遵循代码编写规范。这在统一代码检查规则 库方面的应用十分必要。检查内容主要包括:Javadoc 注释命名规范、多余的ImportsSize度量,如过长的方法、缺少必要的空格、Whitespace重复代码。
2.缺陷分析
CheckStyle 的实现模式主要基于源代码,与PMD 类似,但更侧重编码的语法风格,分析深度不及PMD。
(五)FindBugs
1.应用模式
FindBugs 基于字节码分析,大量使用数据流分析技术,侧重运行时错误检测,如空指针引用等,分析深度大于 PMD 和 CheckStyle。检查内容主要为bytecode 中的 bug patterns,如 NullPoint 空指针检查、没有合理关闭资源、字符串相同判断错(==,而不是equals)等。
FindBugs能通过检查类文件或Jar文件,将字节码与一组缺陷模式进行对比从而及时发现代码缺陷,并完成静态代码分析。
2.缺陷分析
FindBugs作为代码静态扫描,无法扫描到数据,只能针对代码的写法进行扫描探查。
四、基于行业应用软件样本程序的代码检查模式设计及案例研究
(一)模式设计
1.模型训练及构建
基于标准程序集与样本程序集,将其作为输入构建代码自动化检查模型(如图2所示)。模型的建设可基于Open AI Codex机器学习模型。
图2 模型训练及构建
2.模型验证
利用测试集对构建的模型进行测试,调整模型的参数,选择最优的模型用于代码自动化检查环节。
3.已有规则集成及模式完善
第一步代码自动化检查模型的输出,作为第二步领域规则库(持续完善的规则)判断环节的输入,从而实现对代码自动化检查模型输出结果的进一步修正。
当该阶段输出的程序积累到一定规模,即形成具备可规律识别的、涵盖更加全面领域特征点的样本程序后,可作为增量数据反哺代码自动化检查模型,进行模型的修正(如图3所示)。
图3 规则集成及模式完善
(二)保险领域案例研究
1.保险领域研发项目代码检查规则库
基于行业应用软件样本程序的代码检查模式在保险领域某中大型研发项目中进行验证,其中涉及的代码检查规则库主要包括如下几部分:
(1)自动化测试基础规则库
自动化测试基础规则库基于样本程序和演化程序的骨架注释生成,可支撑自动化测试脚本的生成,包括基础流程数据、流程顺序规则、基础元素数据、元素顺序规则、流程与元素顺序规则等内容。
基础流程数据聚焦样本程序骨架注释内容,将id、step、deion 和 tag 分类存储,其中 deion按功能模块或类别进行分类存储。
流程顺序规则基于自动化测试及脚本生成工具的标准对通用业务流程规则的内容进行格式化处理,同时与基础流程数据形成对照关系。
基础元素数据主要识别注释属性tag的内容,然后根据规则抽取对应的基础元素数据,分别进行存储;同时,规则库根据元素标签内容自动对应元素操作,其中的关系式根据自动化测试的通用 html标签和操作得到。
元素顺序规则先根据样本程序中对应的元素顺序预定义基础元素顺序,基于注释内容进行修正,可匹配 id、step、deion 等,形成确定的元素顺序规则。
流程与元素顺序规则根据样本程序的基础业务流程,预定义流程与元素间的顺序对照关系,通过id、deion 的内容修正预定义的内容,形成元素顺序规则。
(2)代码智能审计默认规则库
代码智能审计默认规则库涵盖 Java、前端、SQL。规则分类包括编码错误、编码漏洞、代码异味、安全热点等,按严重等级可分为 Blocker-阻断、Critical-严重、Minor-次要、Info-提示四个等级。平台提供对代码智能审计默认规则库的配置与完善功能,按规则分类和规则等级指导代码智能审计。
(3)代码智能审计自定义规则库
代码智能审计自定义规则库基于保险领域样本程序和词根表、编码规范等积累产生,平台提供对代码智能审计自定义规则库的配置与完善功能,按规则分类和规则等级指导代码智能审计。
部分样本程序规则如表2所示。
2.效果分析
该实证案例通过将代码检查和审核模型与机制渗透到代码编写、代码编译、代码提交、CICD流水线执行等环节,设置质量门禁,确保代码符合质量要求,通过代码分析引擎实现质量指标的横向比较、趋势分析,聚焦研发环节,结合研发项目的元信息,有效计算出项目代码总修复时长、需求问题总量、模块测试覆盖率、个人代码修复次数等评价指标,辅助提升代码质量,改善作业效率。
五、总结与展望
软件程序代码检查因其对多环节的渗透性、及对代码质量提升的高权重特征,是提升软件质量需解决的重要一环。经典的软件代码检查技术及工具在提供相对精确分析结果的同时,也带来了路径组合爆炸、误报率较高等问题,目前基于人工智能的代码检查工具则普遍存在与领域规则结合较弱的现象,不利于行业应用软件工程实施。因此,基于行业应用软件样本程序的代码检查模式将通用规范与领域规则进行了有机结合,实现了面向领域的代码智能审计,大大减少了人工分析的成本,降低了执行门槛。后续,我们将持续完善样本程序骨架,将其作为模型输入,提升其在垂直领域的代码检查效率。
(《中国指挥与控制学会通讯》编辑部供稿)
关注公众号了解更多
会员申请 请在公众号内回复“个人会员”或“单位会员
欢迎关注中国指挥与控制学会媒体矩阵
CICC官方网站
CICC官方微信公众号
《指挥与控制学报》官网
国际无人系统大会官网
中国指挥控制大会官网
全国兵棋推演大赛
全国空中智能博弈大赛
搜狐号
一点号
汽势Auto-First 2024-12-18
新疆无人机03考点 2024-12-18
有事郝说 2024-12-18
中伟视界科技 2024-12-18
农夫笔记NG 2024-12-18