代码智能技术如何应用到日常开发?

本文涉及的产品
云效 DevOps 流水线,基础版人数 不受限
云效 DevOps 测试管理,基础版人数 不受限
云效 DevOps 项目协作,基础版人数 不受限
简介: 原理与演示。

01/  从开发者的烦恼说起


开发者在编写代码时,需要花费大量时间在低层次的重复编码上,特别是针对一些语法比较冗余的开发语言。


同时,开发者经常被戏称为面向搜索引擎编程,因为我们经常需要通过通用搜索引擎去查询文档资料,但是通用搜索引擎的内容质量参差不齐,开发者在找文档、选文档上都需要花费大量时间,这会让我们的开发过程碎片化,无法集中精力聚焦在业务逻辑的开发上。


在代码评审阶段,评审人需要费时费力的人工评审,特别是当变更代码特别多的时候,评审人很难去完成评审任务,只能大致看一下,从而违背了评审的初衷。在评审过程中,传统的代码检测工具无法发现深层次的潜在缺陷,也不能提供缺陷的修复方案,从而为线上故障埋下了隐患


image.png

开发过程中存在的问题


那么诸多的烦恼,应该怎么解决呢?


02/  代码智能如何赋能日常开发


阿里云云效代码智能团队通过AI技术,打造了多款业界领先的智能编码以及代码检测工具,是国内首个将AI能力应用到代码评审场景的团队。此外,我们也通过与学术界的深入合作,通过论文和专利,保持着技术的先进性。下面我们详细介绍。


image.png


代码智能补全能力及原理

在编写代码时,云效Codeup 能通过 WebIDE 为开发者提供智能化的编码辅助,快速完成轻量级编码,也能让开发者通过语言描述快速地找到所需的代码文档或者代码示例,减少编码过程的碎片化。我们来看一个完整的代码智能补全视频演示。

代码智能补全完整视频演示


在编写代码时,只需要输入几个字符,甚至一个字符,代码智能补全插件就能结合代码上下文及其语义,推荐出多个整行的代码补全候选项,前面标注✨图标的就是代码智能补全插件提供的结果。在不同的代码行,输入同一个字符,比如X字符,它就能推荐出更适合当前位置的行级代码补全结果。它也能自动地将代码上文中出现的变量或参数,自动地填充到合适的代码补全候选项中。


image.png


代码智能补全能够帮助开发者减少重复性较高的低层次编码,大幅提升编码效率,以视频演示的代码片段为例,

  • 如果只是使用 IDE 内置的代码补全,需要敲击键盘700次,花费5分钟的时间才能完成代码的编写;
  • 使用某业界顶尖的同类产品,键盘输入次数减少了33%,花费的时间减少了6%。为什么键盘敲击次数减少了很多,时间减少的却很少呢?因为它给出的代码补全候选项过多,并且存在较多的错误,需要开发者花时间去做选择,选择太多反而不是好事;
  • 使用我们云效自主研发的代码智能补全插件,键盘输入次数减少了65%,编码耗时减少了57%,只需要2分钟左右就能完成代码的编写。

那么我们是如何做到的呢?我们使用了多模型融合技术,将擅长点各有侧重的多个模型融合到一起,一个人决策可能不太准,多个人一起决策就能尽可能的减少误判,其中的深度学习模型、语义模型等都能做到代码上下文的感知,输入同一个字符,在不同的代码位置,会推荐不同的代码补全结果,并且能将上文中出现的变量或参数,自动填充到补全的候选项中。


image.png


阿里巴巴内部开发者的使用情况显示,相比于 IDE 内置的补全,代码智能补全能帮助开发者平均提升20%的编码效率。那么代码智能补全的实现原理是怎么样的呢?

我们会将代码解析成抽象语法树,并对AST进行数据处理,我们将处理好的数据通过深度学习模型进行训练,刚开始的几个迭代,还只能生成一些杂乱的序列,模型会将生成的序列与期望生成的序列进行对比,计算误差并更正模型数据,在N个迭代之后,它已经能生成符合语法的正确代码序列。在代码智能补全阶段,我们将深度学习模型、语义模型、统计学模型等多个不同种类的模型融合在一起,去生成代码补全的候选项,然后通过语法校正,避免将不符合语法的代码推荐给开发者。


image.png


代码智能评审在代码评审中,当开发者创建评审时,云效Codeup 会为其推荐更合适的评审人,他可能更熟悉变更的代码,而评审人也能在评审列表上看到每个评审的预估耗时,帮助评审人充分利用碎片化时间进行评审,同时在浏览评审时,开发者经常需要查看某个 API 的定义或引用,而我们提供的语法跳转服务可以让评审人像在 IDE 中一样,在网页端进行代码定义和引用的跳转。此外,我们也提供了更深层次的代码检测工具帮助评审人更快的发现隐藏缺陷,并能快速的修复缺陷。


代码智能安全检测关于代码检测,这里主要聊一下代码内容安全的检测。说到代码安全,每年都会有非常多漏洞被发现,并且被黑客利用。比如早些年的Struts框架上传文件模块的漏洞,能让黑客远程执行Shell命令;近期的比如Chrome的零日漏洞,它存在Use-After-Free的问题,它会允许黑客在渲染进程中去执行远程代码,比如用户如果在Chrome中打开PDF文件,黑客就能通过远程命令获取相关的用户数据。

为此,云效Codeup为开发者提供了依赖包漏洞检测、源码漏洞检测等代码内容安全检测工具。

依赖包漏洞检测

依赖包漏洞检测能帮助开发者发现三方包中存在的漏洞隐患,三方包大部分是开源软件,而开源软件很少进行安全测试,并且黑客也更愿意去发现开源软件的漏洞,因为代码是开源的,比较容易发现安全漏洞,而且一旦发现了安全漏洞,那么它的影响面会很大,绝大部分引用了存在安全漏洞三方包的应用,都会受到黑客攻击的威胁。

image.png


云效Codeup 的依赖包漏洞检测工具会先将代码进行编译构建,并采集代码所有的依赖包,然后通过漏洞匹配算法从漏洞库中查询准确的漏洞信息,为了让漏洞库覆盖更全面,我们集成了多个外部漏洞库以及阿里集团安全团队自建的漏洞库。开发者获取到的漏洞信息会包含建议升级的版本范围,为了减少依赖包版本升级后对应用稳定性产生的影响,我们会对每个依赖包版本进行有效性以及兼容性分析,然后会为开发者推荐建议升级的版本号,并且提供通过一键创建代码评审修复依赖包漏洞的快捷入口。

源码漏洞检测

在代码内容安全检测领域,除了刚才提到的依赖包漏洞检测,我们也提供了对代码库自身的源码漏洞检测工具。

image.png


云效Codeup 基于源伞检测引擎,将代码中的数据流和控制流转换成数学语言,然后对数学语言进行定理证明,能够更准确的推导代码中的路径条件,减少误报。同时,它具备跨函数的全文分析能力,比如有多层的函数调用关系,如果最底层的函数存在一些代码安全风险,并且会影响最上层的业务代码,它也能通过将代码的数据流以及函数调用关系,解析为图结构,通过对代码图谱的分析,能够快速的发现潜在的安全风险。此外,我们对检测出来的漏洞信息也会给与详细的解释,告诉开发者每个漏洞在代码中是怎么一步步带来影响的。我们一起看一个视频。

云效Codeup 代码检测视频


当我们提交完代码后,云效Codeup 能自动执行已开启的代码检测,比如视频中已开启的依赖包漏洞检测,我们也可以手动开启源码漏洞检测。

依赖包漏洞检测能发现众多三方包漏洞,会在详细信息中展示疑似的CVE漏洞信息;源码漏洞检测能发现代码注入、远程命令执行、缓冲区溢出等安全漏洞,并且会在详细信息的右侧展示漏洞在代码中的影响路径。

我们可以在依赖包漏洞的详细信息中,通过一键创建代码评审,帮助我们快速的生成修复指定漏洞的代码变更及其合并请求,评审描述中会提供漏洞的解释信息以及升级包的兼容性分析。


03/  代码智能技术的不断探索


除了上面介绍的已经落地到云效的智能化能力,我们与浙江大学、莫纳什大学、南洋理工大学等高校在代码生成、代码搜索、智能评审等领域进行了深入的合作,在多个领域产出了论文和专利。

image.png


比如,我们与南洋理工大学合作的代码摘要生成项目,很多时候开发者不太喜欢写注释,或者不知道怎么写注释,导致代码的可维护性不高,为了帮助开发者更好的理解代码,我们期望通过对代码逻辑的学习和理解,自动生成出代码片段的摘要注释。我们会先从代码大数据中挖掘出一批代码的片段及其注释,构建代码片段检索库,然后从检索库中找到与目标代码相似的代码片段,并且将目标代码和相似的代码片段都解析成CPG图结构,我们会基于注意力机制通过融合算法将两个图结构融合在一起,然后经过图权重的静态计算及动态计算,并通过模型获得对图信息的编码数据,最后,将相似代码片段的摘要注释进行编码后,与图结构的编码信息聚合在一起,通过解码器就能生成目标代码的摘要注释。相关论文《RETRIEVAL-AUGMENTED GENERATION FOR CODE SUMMARIZATION VIA HYBRID GNN》。


image.png


开发者花费时间比较多的地方除了写代码,就是调试代码,我们期望通过代码缺陷定位去辅助开发者排查缺陷。代码缺陷定位会先从代码变更数据中,挖掘出有效的缺陷代码作为训练集,并且将缺陷代码解析成抽象语法树,然后将抽象语法树按代码行进行拆解,每一行代码对应一个子语法树,将子语法树从叶子节点到根节点编码成多条子路径,最后,将每行代码关联的子路径放到基于注意力机制的深度学习模型中进行训练。当需要代码缺陷定位时,开发者提交代码后,我们会从代码变更中抽取出变更代码行的子路径,通过模型推理,我们就能得到每行代码的缺陷概率,从而辅助开发者排查缺陷。


image.png


除了上面提到的两个合作项目,我们与各个高校在多个领域进行了广泛的合作。我们期望在不久的将来,开发者能在云效的智能化研发平台上,只需要提供文字描述或需求文档,我们就能为其生成出大部分基础代码及其依赖项,并能通过智能编码辅助快速的完成代码填充,代码缺陷也将无处遁形,期望大家可以保持对云效产品动态的关注。


image.png


点击解云效Codeup,在产品内直接感受代码智能技术。


相关实践学习
流水线运行出错排查难?AI帮您智能排查
本实验将带您体验云效流水线Flow的智能排查能力,只需短短1-2分钟,即可体验AI智能排查建议。
ALPD云架构师系列 - 云原生DevOps36计
如何把握和运用云原生技术,撬动新技术红利,实现持续、安全、高效和高质量的应用交付,并提升业务的连续性和稳定性,这是云原生时代持续交付共同面对的机会和挑战。本课程由阿里云开发者学堂和阿里云云效共同出品,是ALPD方法学云架构师系列的核心课程之一,适合架构师、企业工程效能负责人、对DevOps感兴趣的研发、测试、运维。 课程目标 前沿技术:了解云原生下DevOps的正确姿势,享受云原生带来的技术红利 系统知识:全局视角看软件研发生命周期,系统学习DevOps实践技能 课程大纲: 云原生开发和交付:云研发时代软件交付的挑战与云原生工程实践 云原生开发、运行基础设施:无差别的开发、运行环境 自动部署:构建可靠高效的应用发布体系 持续交付:建立团队协同交付的流程和流水线 质量守护:构建和维护测试和质量守护体系 安全保障:打造可信交付的安全保障体系 建立持续反馈和持续改进闭环
相关文章
|
6月前
|
机器学习/深度学习 人工智能 数据库
RAG 2.0 深入解读
本文从RAG 2.0 面临的主要挑战和部分关键技术来展开叙事,还包括了RAG的技术升级和关键技术等。
1205 85
|
4月前
|
API 数据库 数据安全/隐私保护
快递单p图生成器,在线单号转换工具, 快递单号制作器app
这个程序是一个合法的快递单号验证工具,包含以下功能:选择快递公司并验证单号格式
|
6月前
|
人工智能 自然语言处理 API
推荐几个常用免费的文本转语音工具
本文推荐了几款免费的文本转语音工具,包括功能全面的AI易视频、支持多语言的Google TTS、操作便捷的Natural Reader、离线使用的Balabolka以及轻量级的Speech2Go。其中AI易视频特别适合小说转语音,可智能分配角色音色,打造广播剧般的听觉体验。这些工具各具特色,能满足不同场景需求,助力内容创作更高效。
1315 5
|
网络协议 Ubuntu Java
技术笔记:NML工程入门
技术笔记:NML工程入门
|
人工智能 架构师 程序员
通义灵码上线一周年:超 600 万下载量,国内用户规模第一,新功能有奖测评
通义灵码一周年,新功能有奖测评火热开启!参与活动就有机会获得机械键盘、华为手环等好礼哦,快来了解吧。
字符编码问题之GBK确保与ASCII码的兼容性如何解决
字符编码问题之GBK确保与ASCII码的兼容性如何解决
214 0
|
机器学习/深度学习 人工智能 达摩院
阿里巴巴达摩院“绿色能源AI”解决方案
阿里巴巴达摩院决策智能实验室致力于研究决策智能系统需要的国际前沿技术,提升业务运营效率和收益、降低成本。在电力能源行业构建出“绿色能源AI”方案,与国家电网、南方电网等企业合作落地多个项目。代表作软件是行业领先的MindOpt优化求解器、智能电力预测eForecaster、MindOpt Studio决策开发云平台。研究方向包含机器学习、数学建模、优化求解、 时序预测、因果分析、决策方案可解释性、决策推理大模型等。本篇是达摩院“绿色能源AI"方案的介绍幻灯片图,供大家了解方案的能力。
2120 1
阿里巴巴达摩院“绿色能源AI”解决方案
|
机器学习/深度学习 算法 atlas
RAG 2.0架构详解:构建端到端检索增强生成系统
RAG(检索增强生成)旨在通过提供额外上下文帮助大型语言模型(LLM)生成更精准的回答。现有的RAG系统由独立组件构成,效率不高。RAG 2.0提出了一种预训练、微调和对齐所有组件的集成方法,通过双重反向传播最大化性能。文章探讨了不同的检索策略,如TF-IDF、BM25和密集检索,并介绍了如SPLADE、DRAGON等先进算法。目前的挑战包括创建可训练的检索器和优化检索-生成流程。研究表明,端到端训练的RAG可能提供最佳性能,但资源需求高。未来研究需关注检索器的上下文化和与LLM的协同优化。
1902 1
|
IDE Java 程序员
Eclipse 安装插件报错:An error occurred while collecting items to be installed session context was...解决方法汇总
Eclipse 安装插件报错:An error occurred while collecting items to be installed session context was...解决方法汇总
1580 0
Eclipse 安装插件报错:An error occurred while collecting items to be installed session context was...解决方法汇总
|
存储 编译器 数据处理
栈溢出及解决方法
栈溢出及解决方法