开发者在编写代码时,需要花费大量时间在低层次的重复编码上,特别是针对一些语法比较冗余的开发语言。
同时,开发者经常被戏称为面向搜索引擎编程,因为我们经常需要通过通用搜索引擎去查询文档资料,但是通用搜索引擎的内容质量参差不齐,开发者在找文档、选文档上都需要花费大量时间,这会让我们的开发过程碎片化,无法集中精力聚焦在业务逻辑的开发上。
在代码评审阶段,评审人需要费时费力的人工评审,特别是当变更代码特别多的时候,评审人很难去完成评审任务,只能大致看一下,从而违背了评审的初衷。在评审过程中,传统的代码检测工具无法发现深层次的潜在缺陷,也不能提供缺陷的修复方案,从而为线上故障埋下了隐患。
开发过程中存在的问题
那么诸多的烦恼,应该怎么解决呢?
02/ 代码智能如何赋能日常开发
阿里云云效代码智能团队通过AI技术,打造了多款业界领先的智能编码以及代码检测工具,是国内首个将AI能力应用到代码评审场景的团队。此外,我们也通过与学术界的深入合作,通过论文和专利,保持着技术的先进性。下面我们详细介绍。
代码智能补全能力及原理
在编写代码时,云效Codeup 能通过 WebIDE 为开发者提供智能化的编码辅助,快速完成轻量级编码,也能让开发者通过语言描述快速地找到所需的代码文档或者代码示例,减少编码过程的碎片化。
在编写代码时,只需要输入几个字符,甚至一个字符,代码智能补全插件就能结合代码上下文及其语义,推荐出多个整行的代码补全候选项,前面标注图标的就是代码智能补全插件提供的结果。在不同的代码行,输入同一个字符,比如X字符,它就能推荐出更适合当前位置的行级代码补全结果。它也能自动地将代码上文中出现的变量或参数,自动地填充到合适的代码补全候选项中。
代码智能补全能够帮助开发者减少重复性较高的低层次编码,大幅提升编码效率,以视频演示的代码片段为例,
如果只是使用 IDE 内置的代码补全,需要敲击键盘700次,花费5分钟的时间才能完成代码的编写;
使用某业界顶尖的同类产品,键盘输入次数减少了33%,花费的时间减少了6%。为什么键盘敲击次数减少了很多,时间减少的却很少呢?因为它给出的代码补全候选项过多,并且存在较多的错误,需要开发者花时间去做选择,选择太多反而不是好事;
使用我们云效自主研发的代码智能补全插件,键盘输入次数减少了65%,编码耗时减少了57%,只需要2分钟左右就能完成代码的编写。
那么我们是如何做到的呢?我们使用了多模型融合技术,将擅长点各有侧重的多个模型融合到一起,一个人决策可能不太准,多个人一起决策就能尽可能的减少误判,其中的深度学习模型、语义模型等都能做到代码上下文的感知,输入同一个字符,在不同的代码位置,会推荐不同的代码补全结果,并且能将上文中出现的变量或参数,自动填充到补全的候选项中。
阿里巴巴内部开发者的使用情况显示,相比于 IDE 内置的补全,代码智能补全能帮助开发者平均提升20%的编码效率。那么代码智能补全的实现原理是怎么样的呢?
我们会将代码解析成抽象语法树,并对AST进行数据处理,我们将处理好的数据通过深度学习模型进行训练,刚开始的几个迭代,还只能生成一些杂乱的序列,模型会将生成的序列与期望生成的序列进行对比,计算误差并更正模型数据,在N个迭代之后,它已经能生成符合语法的正确代码序列。在代码智能补全阶段,我们将深度学习模型、语义模型、统计学模型等多个不同种类的模型融合在一起,去生成代码补全的候选项,然后通过语法校正,避免将不符合语法的代码推荐给开发者。
代码智能评审在代码评审中,当开发者创建评审时,云效Codeup 会为其推荐更合适的评审人,他可能更熟悉变更的代码,而评审人也能在评审列表上看到每个评审的预估耗时,帮助评审人充分利用碎片化时间进行评审,同时在浏览评审时,开发者经常需要查看某个 API 的定义或引用,而我们提供的语法跳转服务可以让评审人像在 IDE 中一样,在网页端进行代码定义和引用的跳转。此外,我们也提供了更深层次的代码检测工具帮助评审人更快的发现隐藏缺陷,并能快速的修复缺陷。
代码智能安全检测关于代码检测,这里主要聊一下代码内容安全的检测。说到代码安全,每年都会有非常多漏洞被发现,并且被黑客利用。比如早些年的Struts框架上传文件模块的漏洞,能让黑客远程执行Shell命令;近期的比如Chrome的零日漏洞,它存在Use-After-Free的问题,它会允许黑客在渲染进程中去执行远程代码,比如用户如果在Chrome中打开PDF文件,黑客就能通过远程命令获取相关的用户数据。
为此,云效Codeup为开发者提供了依赖包漏洞检测、源码漏洞检测等代码内容安全检测工具。
依赖包漏洞检测
依赖包漏洞检测能帮助开发者发现三方包中存在的漏洞隐患,三方包大部分是开源软件,而开源软件很少进行安全测试,并且黑客也更愿意去发现开源软件的漏洞,因为代码是开源的,比较容易发现安全漏洞,而且一旦发现了安全漏洞,那么它的影响面会很大,绝大部分引用了存在安全漏洞三方包的应用,都会受到黑客攻击的威胁。
云效Codeup 的依赖包漏洞检测工具会先将代码进行编译构建,并采集代码所有的依赖包,然后通过漏洞匹配算法从漏洞库中查询准确的漏洞信息,为了让漏洞库覆盖更全面,我们集成了多个外部漏洞库以及阿里集团安全团队自建的漏洞库。开发者获取到的漏洞信息会包含建议升级的版本范围,为了减少依赖包版本升级后对应用稳定性产生的影响,我们会对每个依赖包版本进行有效性以及兼容性分析,然后会为开发者推荐建议升级的版本号,并且提供通过一键创建代码评审修复依赖包漏洞的快捷入口。
源码漏洞检测
在代码内容安全检测领域,除了刚才提到的依赖包漏洞检测,我们也提供了对代码库自身的源码漏洞检测工具。
云效Codeup 基于源伞检测引擎,将代码中的数据流和控制流转换成数学语言,然后对数学语言进行定理证明,能够更准确的推导代码中的路径条件,减少误报。同时,它具备跨函数的全文分析能力,比如有多层的函数调用关系,如果最底层的函数存在一些代码安全风险,并且会影响最上层的业务代码,它也能通过将代码的数据流以及函数调用关系,解析为图结构,通过对代码图谱的分析,能够快速的发现潜在的安全风险。此外,我们对检测出来的漏洞信息也会给与详细的解释,告诉开发者每个漏洞在代码中是怎么一步步带来影响的。
当我们提交完代码后,云效Codeup 能自动执行已开启的代码检测,比如视频中已开启的依赖包漏洞检测,我们也可以手动开启源码漏洞检测。
依赖包漏洞检测能发现众多三方包漏洞,会在详细信息中展示疑似的CVE漏洞信息;源码漏洞检测能发现代码注入、远程命令执行、缓冲区溢出等安全漏洞,并且会在详细信息的右侧展示漏洞在代码中的影响路径。
我们可以在依赖包漏洞的详细信息中,通过一键创建代码评审,帮助我们快速的生成修复指定漏洞的代码变更及其合并请求,评审描述中会提供漏洞的解释信息以及升级包的兼容性分析。
03/ 代码智能技术的不断探索
除了上面介绍的已经落地到云效的智能化能力,我们与浙江大学、莫纳什大学、南洋理工大学等高校在代码生成、代码搜索、智能评审等领域进行了深入的合作,在多个领域产出了论文和专利。
比如,我们与南洋理工大学合作的代码摘要生成项目,很多时候开发者不太喜欢写注释,或者不知道怎么写注释,导致代码的可维护性不高,为了帮助开发者更好的理解代码,我们期望通过对代码逻辑的学习和理解,自动生成出代码片段的摘要注释。我们会先从代码大数据中挖掘出一批代码的片段及其注释,构建代码片段检索库,然后从检索库中找到与目标代码相似的代码片段,并且将目标代码和相似的代码片段都解析成CPG图结构,我们会基于注意力机制通过融合算法将两个图结构融合在一起,然后经过图权重的静态计算及动态计算,并通过模型获得对图信息的编码数据,最后,将相似代码片段的摘要注释进行编码后,与图结构的编码信息聚合在一起,通过解码器就能生成目标代码的摘要注释。相关论文《RETRIEVAL-AUGMENTED GENERATION FOR CODE SUMMARIZATION VIA HYBRID GNN》。
开发者花费时间比较多的地方除了写代码,就是调试代码,我们期望通过代码缺陷定位去辅助开发者排查缺陷。代码缺陷定位会先从代码变更数据中,挖掘出有效的缺陷代码作为训练集,并且将缺陷代码解析成抽象语法树,然后将抽象语法树按代码行进行拆解,每一行代码对应一个子语法树,将子语法树从叶子节点到根节点编码成多条子路径,最后,将每行代码关联的子路径放到基于注意力机制的深度学习模型中进行训练。当需要代码缺陷定位时,开发者提交代码后,我们会从代码变更中抽取出变更代码行的子路径,通过模型推理,我们就能得到每行代码的缺陷概率,从而辅助开发者排查缺陷。
除了上面提到的两个合作项目,我们与各个高校在多个领域进行了广泛的合作。我们期望在不久的将来,开发者能在云效的智能化研发平台上,只需要提供文字描述或需求文档,我们就能为其生成出大部分基础代码及其依赖项,并能通过智能编码辅助快速的完成代码填充,代码缺陷也将无处遁形,期望大家可以保持对云效产品动态的关注。