文/阿里云 - 秦奇
本文章为系列文章,主要介绍代码智能(Code Intelligence)领域涉及的众多有趣的任务(Task),会从这些任务的简介、历史和现状等维度展开介绍,希望让大家对于代码智能有一个深切的认识。 而本文从一个最常用、开发者们最喜欢的功能 -- 代码推荐 开始,希望能够慢慢揭开代码智能神秘的面纱。
代码推荐(Code Completion)
让我们从一个动图开始。

图片来自于Tabnine官网
可以看到,有了智能代码推荐的加持,我们的开发的效率和编程的幸福感得到了极大的提升。
那么代码推荐是什么呢?
我们都用过输入法,输入中文时,大部分的输入法都会根据已输入的字符联想出可能的词组或者句子,这能很大程度提高我们输入的速度。下图 左边是搜狗输入法的效果,会推荐出最可能的输入来供人们选择;右图是讯飞输入法职能纠错的效果图,这些都是现在很常见并且很好用的功能。


那么代码推荐也是类似的,为了让开发者不再需要一个字母一个字母的敲击,“偷懒”的人们开发出了各种好用的提示工具,这些工具都在一定程度上帮助程序员们更好的编程。在使用了具备代码提示能力的编辑器之后,只能说再也回不去NotePad类似的文本编辑器了。
代码推荐也叫代码提示,同时也有很多类似的叫法,比如 IntelliSense(智能感知)、IntelliCode、Autocomplete、 Code Completion、Code Snippets(代码片段)、 Code Suggestion、Code Prediction、Code Hinting。不管叫什么,描述的都是在编程时提供代码提示的能力,此处不用纠结。
代码推荐的历史
第一次关于代码推荐的研究是在1957年,初次提出了拼写检查(Spell-Check)。之后到了1971年,Ralph Gorin开发了第一个拼写检查的应用 -- SPELL,不仅能够根据字母进行提示,并且能够纠正简单的字母错位的拼写错误。
另一个不得不提的代码推荐的实现是 微软的 IntelliSense,这项能力被应用于 Visual Studio中,它提供了很丰富的代码提示能力,包括 类型、变量、函数,代码片段、关键字等。到了2017年,微软的另一个项目 -- IntelliCode 使用机器学习作为代码推荐的底层支持,其也被默认集成到了 VsCode编辑器中。
另一个需要提一下的是 SQL Server Management Studio 自带的 SQL 语法的智能提示,可以提示出常用的关键字 以及 包含的库、表和字段等。SQL 语法作为下一代的高级语言,和目前流行的 JAVA 等面向对象的语言有一定的区别,其代码提示的能力实现也有一些不同。

代码推荐的现状
当前的代码提示可谓到了百家争鸣的时代了,并且它已经当作是编辑器或者IDE的必备核心能力,而且代码提示的好坏直接决定它是否是一个好用的编辑器。
目前学界也有很多相关的研究,包括使用各种算法进行训练的模型和算法。常见的有统计算法和一些自然语言模型。 当前比较热门的模型算是OpenAI提供的 GPT模型了,它从第一个版本到现在的 GPT-3,每次发布都会引发热烈的讨论。而 Tabnine(一个非常受欢迎的代码提示工具),就是基于GPT-2模型,提供了智能并且个性化的代码推荐能力,它能够根据个人的编程习惯推荐出非常个性化的代码,可以说是非常好用了。

另一个不得不提就是当前饱受争议的GitHub Copilot了,它使用了GPT-3模型,使用了10亿多行开源的代码进行训练,并且提供了不错的推荐效果,但因为有时候提示的代码直接是开源存在的代码,被指 抄袭,目前已经有很多开发者发起了抵制 copilot的运动,至于后续还不得而知。

代码推荐的未来
有人说,有了智能代码推荐,后续程序员就要被下岗了。
这句话当作笑话来听就好,千万别当前。虽然说 目前的代码推荐能力确实帮开发者节省了很多的时间,但是还远远未达到完全替代程序员的程度。
类比于自动驾驶的分级,我觉得代码推荐最多也就达到 L1的程度,也就是 “有时能够辅助驾驶员完成某些驾驶任务”。不过,未来可期,就像目前图像转代码已经可以根据设计稿来生成大部分静态代码了,我相信代码推荐也会越来越智能,让程序员简单机械的重复,从而花时间去编写“艺术”。