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

简介: 原理与演示。

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 能自动执行已开启的代码检测,比如视频中已开启的依赖包漏洞检测,我们也可以手动开启源码漏洞检测。

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

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

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

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

image.png

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

image.png

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

image.png

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

image.png

原文链接
本文为阿里云原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/512803.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sql server tcp 信号灯超时时间已到_「图文详解」TCP为啥要3次握手和4次挥手?3次挥手不行吗?...

原文链接:https://www.cnblogs.com/qdhxhz/p/8470997.htmlTCP有6种标示:SYN(建立联机) ACK(确认) PSH(传送) FIN(结束) RST(重置) URG(紧急)一、TCP三次握手第一次握手客户端向服务器发出连接请求报文,这时报文首部中的同部位SYN1,同时随机生…

生态和场景一站式集成?来看看小程序的“共享主义”

简介: mPaaS 小程序市场正式上线,海量小程序一站式集成,用场景拉高终端活跃水位。 01 小程序破壁计划 从 2018 年「支付宝」将支付宝小程序全量开放给用户使用开始,整个小程序生态市场发生了新一波的震荡。 小程序商家通过「支付…

拒做背锅侠!如何利用网站性能优化驱动产品体验提升

简介: 对于运维工程师而言,如果要票选五大最抓狂运维支撑场景,花样繁多的各种促销活动一定榜上有名。每个促销季上线都是忐忑不安的不眠夜。大量内容更新、大量客户涌入,大量数据读写,虽有着各种技术方案或工具服务保障…

阿里云飞天论文获国际架构顶会 ATC 2021最佳论文:全球仅三篇

简介: 近日,计算机系统结构国际顶级学术会议 USENIX ATC在线上举行。ATC 始办于1992年,是由USENIX组织的计算机系统领域的顶级会议,至今已成功举办31届,计算机系统领域中Oak语言(JAVA语言的前身&#xff09…

Quorum 和唱票那回事

作者 | 奇伢来源 | 奇伢云存储关于 Quorum 的两个维度前几回说了那么多框架,设计思想的文章。今天分享一个很小的点,etcd 的 quorum 是怎么实现的?Quorum 机制本质就是一个关于多数派的事情,这个多数派应用的有两个方面&#xff1…

java 迷你桌面地图_求教贴,Java桌面小游戏的地图怎么做

展开全部小游戏地e5a48de588b63231313335323631343130323136353331333365656566图一般都是各种图片的拼接,然后保存到2维数组里面比如//数值常量public static final int EMPTY0;//空地什么也没有public static final int BRICK1;//土墙public static final int STONE2;//石头p…

快速界定故障:Socket Tracer网络监控实践

简介: Socket Tracer定位是传输层(Socket&TCP)的指标采集工具,通过补齐网络监控的这部分盲区,来达到快速界定网络问题的目标。 作者 | 四忌 来源 | 阿里技术公众号 一 背景 随着软件应用的集群化、容器化、微服务化,产品的…

剑指企业级云原生,阿里云 CNFS 如何破局容器持久化存储困境

简介: 云原生趋势下,应用容器化比例正在快速增长,Kubernetes 也已成为云原生时代新的基础设施。 据 Forrester 预测,到 2022 年, 全球企业及组织在生产环境运行容器化应用。观察今天的容器和 Kubernetes 的应用现状&am…

Log4j 第三次发布漏洞补丁,漏洞或将长存

整理 | 郑丽媛、禾木木出品 | CSDN这几天,Apache Log4j 2 绝对是众多 Java 程序员提到的高频词之一:由于 Apache Log4j 2 引发的严重安全漏洞,令一大批安全人员深夜修 Bug、打补丁。此次漏洞更是因为其触发简单、攻击难度低、影响人群广泛等特…

二分法求数组最大最小_js-求数组的最大值和最小值

取出数组中的最大值或者最小值是开发中常见的需求,但你能想出几种方法来实现这个需求呢?Math.maxJavaScript 提供了 Math.max 函数返回一组数中的最大值,用法是:Math.max([value1[,value2, ...]])值得注意的是:如果有任…

TailwindCSS v3.0 正式发布!一大波新特性来袭!

作者 | 一只图雀来源 | 程序员巴士今天给大家介绍一篇关于 Tailwind 最新发布的 v3.0 相关的内容。2021 年 12 月 10 日,TailwindCSS 的创始人 Adam Wathan 宣布 TailwindCSS v3.0 正式发布,带来了一系列性能上的改进、对开发工作流的改善以及大量的新特…

曦智科技发布最新光子计算处理器PACE

成功验证光子计算优越性,以光子技术突破集成电路产业边界 2021年12月15日,全球领先的光子计算芯片公司曦智科技(Lightelligence)发布了其最新高性能光子计算处理器——PACE(Photonic Arithmetic Computing Engine&…

python 下载图片到内存卡_python - 获取图像大小而不将图像加载到内存中

如果您不关心图像内容,PIL可能是一种过度杀伤力。我建议解析python magic模块的输出:>>> t magic.from_file(teste.png)>>> tPNG image data, 782 x 602, 8-bit/color RGBA, non-interlaced>>> re.search((\d) x (\d), t).g…

搭载第四代自研神龙架构 阿里云发布RDMA增强型实例等多款新品

12月21日消息,阿里云发布多款基于自研神龙架构的弹性计算新品,包括RDMA增强型实例、800G GPU超算实例、FPGA计算型实例、GPU图形计算型实例等,在性能方面大幅提升,同时增加了多种服务形态,将计算延伸至客户身边&#x…

最新光子计算处理器面世:单个光子芯片集成超万个光子器件,频率达1GHz

12月15日,光子计算芯片公司曦智科技(Lightelligence)发布了其最新高性能光子计算处理器:PACE(Photonic Arithmetic Computing Engine,光子计算引擎)。该处理器单个光子芯片中集成超过10,000个光…

Snowflake如日中天是否代表Hadoop已死?大数据体系到底是什么?

简介: 本文作者关涛是大数据系统领域的资深专家,在微软(互联网/Azure云事业群)和阿里巴巴(阿里云)经历了大数据发展20年过程中的后15年。本文试从系统架构的角度,就大数据架构热点,每…

金蝶携手工商银行完成首单数字人民币费用报销业务

2021年12月17日,金蝶业务系统成功完成首单使用数字人民币进行的公转私支付业务。据悉,这是中国工商银行股份有限公司(以下简称“工商银行”)第一笔使用“数字人民币银企直连”进行的公转私支付费用报销业务,也是金蝶成…

Java对象转换方案分析与mapstruct实践

简介: 随着系统模块分层不断细化,在Java日常开发中不可避免地涉及到各种对象的转换,如:DO、DTO、VO等等,编写映射转换代码是一个繁琐重复且还易错的工作,一个好的工具辅助,减轻了工作量、提升开…

致敬 hacker |盘点内存虚拟化探索之路

简介: 内存虚拟化相比裸机,仍然存在较大差异,是当下值得关注的问题! 云与虚拟化 云计算是通过 Internet 服务的方式提供动态可伸缩资源的计算模式,经过多年的发展已成为企业 IT 技术的重要支撑。虚拟化是云计算的核心…

minwindow java_java中setMinWindowLayout()是什么呀?

展开全部分析代码 ,可以看出SInfo 是JFrame的子类.setMinWindowLayout() 方法,就可能就是该类自定义的方法,因为JFrame并没e68a8462616964757a686964616f31333431373937有该方法.根据该方法名推测, 这个方法应该就是设置界面布局的方法,主要用于调整组件(按钮,输入框...等)的位…