简介: 原理与演示。

01/  从开发者的烦恼说起

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

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

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

开发过程中存在的问题

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

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》。

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

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

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

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

  1. 20 个JavaScript基本代码片段,解决你日常开发中的常见问题

    英文 | https://levelup.gitconnected.com/20-essential-snippets-to-code-like-a-pro-in-javascript-c7a6ef4 ...

  2. 【C#/.NET 日常开发技巧】JWT+ActionFilter 简便控制器代码

    微信公众号:趣编程ACE 关注可了解更多.NET日常开发技巧,如需源码,请公众号留言 源码; JWT+ActionFilter 简便控制器代码 这是微软关于过滤器的介绍:https://docs.mi ...

  3. NC65在日常开发中常用的代码写法

    标题 NC65开发相关代码 版本 1.0.1 作者 walton 说明 收集NC在日常开发中常用的代码写法,示例展示 1.查询 1.1 通过BaseDAO查询结果集并转换 //通过BaseDAO进行查 ...

  4. Java日常开发的21个坑,你踩过几个?

    前言 最近看了极客时间的<Java业务开发常见错误100例>,再结合平时踩的一些代码坑,写写总结,希望对大家有帮助,感谢阅读~ 1. 六类典型空指针问题 包装类型的空指针问题 级联调用的空 ...

  5. 如何使用Arthas提高日常开发效率?

    简介: 1. Arthas有什么功能,怎么用,请看:Arthas使用手册 2. Arthas命令比较复杂,一个帮助生成命令的IDEA插件:arthas idea plugin 使用文档 3. 基于Ar ...

  6. Android日常开发问题总结:这些问题火候不够,随时变成删库跑路!

    日常开发中碰到了各种开发问题,捡选了一部分分享出来.有些问题非常简单,属于编码规范类,有些属于特定情况下碰到的问题,不是很常见.不太准确的地方,欢迎共同探讨下~ 1.requestFeature() ...

  7. 推荐10个实用的日常开发和写作必备工具

    前言 分享几个我日常开发或写作过程中经常用到的工具软件和网站,看看哪些是你没用过的,喜欢的话可以点赞和收藏哦-. 1. 截图工具(snipaste) 官网地址 snipaste是一款截图+贴图工具,按 ...

  8. 【Unity3D日常开发】Unity3D中实现计时器工具类-正计时、倒计时、暂停计时、加速计时

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有 ...

  9. Android日常开发收集的Tips

    Android日常开发收集的Tips 1. 时间戳转时间: 要注意时间戳的位数,10位的是秒级别的,13位的是毫秒级别的, 因此,在转化为时间中,也有稍微的区别. // 10位的秒级别的时间戳long ...

最新文章

  1. electron 打包把node代理服务打包进去_用 Node.js 官方镜像打包一个 express 服务
  2. 【雷达对抗】频率测量与频谱分析-概述
  3. 所有程序自适应高分辨率(未完善)
  4. linux下修改max_user_processes和open_file的最大值
  5. WPF 使用NotifyIcon控件
  6. 详细记录一次npm i canvas报错的解决过程
  7. iPhone 5的发布日期估计为9月21日挂
  8. java横向分割面板后怎么加标签_java面板,标签,布局问题代码执行
  9. java俄罗斯方块代码_java俄罗斯方块代码.doc
  10. 云原生技术开放日PPT大放送 | 五星级的云原生开发体验
  11. 零成本建立医学数据库之实践
  12. java里VO是什么?
  13. NOIP2012 模拟试题二 腾讯大战360
  14. Android学习日记(yzy): Accessibility辅助功能
  15. 西部数码虚拟服务器,西部数码虚拟主机301转向功能介绍
  16. 好用的录音软件排行 有哪些电脑录音工具
  17. CMS自动生成静态任务
  18. CISSP AIO7 学习笔记 - 第二章 资产安全 2.1-2.8小节 附送脑图
  19. 重磅!实在智能首创“智能融合拾取”技术!
  20. 【无人驾驶 | 国内篇】主要玩家介绍

热门文章

  1. 摇杆怎么映射到键盘_[评测]YAMAHA PSRSX900:雅马哈升级幅度最大的高端编曲键盘键盘中国原创评测...
  2. python矩阵相乘例题_百道Python入门级练习题(新手友好)第一回合——矩阵乘法...
  3. Java开发以及Web 和移动程序员必须了解的10个框架
  4. 修改epo服务器 gps,epo
  5. xcode动态改变窗口大小_详细的理论要点+3个经典案例,帮助你深入理解动态面板...
  6. 【LeetCode笔记 - 每日一题】423. 从英文中重建数字(Java、字符串、偏思路)
  7. 【LeetCode笔记】199. 二叉树的右视图(Java、二叉树、层序遍历)
  8. cuda卸载_Ubuntu18.04英伟达显卡驱动、Cuda安装
  9. ebs 供应商地点信息_供应商,地址,业务实体,地点关联银行账户
  10. html5写入唯一标识,id - 唯一标识符 - html5全局属性