HarmonyOS开发者限时福利来啦!最高10w+现金激励等你拿~ 了解详情
写点什么

GitHub Copilot 体验:AI 辅助编程提前看

Colin Eberhardt

  • 2021-07-09
  • 本文字数:3845 字

    阅读完需:约 13 分钟

GitHub Copilot体验:AI辅助编程提前看

我的感觉是,Copilot 目前还不会给编程带来革命。但尽管有上面列举出来的这些问题,我还是坚信它会在未来产生重大的、改变游戏规则的影响力。


Copilot 是 GitHub 新出的“人工智能结对编程工具”,一经发布就引起了不小的轰动。我很荣幸得到了 Copilot 的预览版测试资格,而这篇博文旨在分享我对这款工具的初步想法和体验。一句话来说,我被它的强大能力震撼了。把玩了几个小时,它真的让我发自内心地赞叹了好几次,你的开发工具肯定是做不到这种程度的!

 

然而,目前来说这款工具在实践中存在不少局限,我将在这篇文章中具体讨论。总结下来就是:

 

  • Copilot 会在意想不到的时候突然出现,打断我的思路

  • 自动完成功能感觉不像是正经的“结对编程”,交互模式好像走偏了

  • 检查 Copilot 的工作会增加认知负担

 

我的感觉是,这款工具目前还不会给编程带来革命。但尽管有上面列举出来的这些问题,我还是坚信它会在未来产生重大的、改变游戏规则的影响力。

 

如果你有兴趣了解更多信息,请继续阅读……

Copilot 是什么?


Copilot 是 OpenAI 的最新开发成果,OpenAI 是一家总部位于旧金山的人工智能公司,最近获得了微软的大量支持(10 亿美元)。OpenAI 最近的 GPT3(生成式预训练变换器)引爆了媒体头条,这是他们的第三代语言模型,基于大规模神经网络,具有 1750 亿个参数,在大规模的文本语料库上完成了训练。

 

引用Arram Sabeti的话:


我接入了 OpenAI GPT-3 API 体验了一番,不得不说我真的大受震撼。它比我尝试过的所有 AI 语言系统都更通顺自然。


GPT3 能够根据简单的提示生成非常通顺自然的散文。此外,很多人通过他们的 API 开发了许多有趣的工具,包括基于问题的搜索引擎、能让你与历史人物交谈的聊天机器人,甚至可以生成吉他谱。最后,Sharif 还创建了一个令人印象深刻的演示,可以基于文本提示创建 HTML 布局——从这里已经可以看到 Copilot 的雏形了。

 

Copilot 基于 Codex,它是 GPT3 的衍生模型,已经在来自 GitHub 的大量开源代码上进行了训练。它直接与 VSCode 集成,可以根据当前上下文(即你的代码)和它在训练过程中获得的“知识”的组合来生成建议。

 

顺便说一句,从这里你也可以清楚地看到微软的战略投资(支持 OpenAI、收购 GitHub、创建 VSCode)是如何形成整体,塑造他们的未来产品矩阵。

Copilot 初体验


Copilot 非常易用,只需安装 VSCode 插件(不幸的是目前仅限邀请测试者体验,抱歉!),开始编写代码并等待 Copilot 介入即可。Copilot 可以理解一大堆编程语言,目前它在 Python、JavaScript、TypeScript、Ruby 和 Go 上的表现尤其出色。

 

Copilot 会分析当前文件的内容(包括代码和注释)以提出建议。我们这里通过一个特意做的演示来看看它的实际效果。

 

在工作面试中设置编程挑战环节是很常见的。在 Scott Logic,我们的标准问题之一是计算一个移动平均线。让我们看看 Copilot 是否能够应对挑战。

 

我只需输入一个简单的注释和一个函数名称,Copilot 就会提出以下建议——整个函数的完整实现:

注意:灰色文本是 Copilot 建议,其显示方式与其他自动完成工具都是一样的。按 T​​ab 接受建议。

 

惊鸿一瞥,令人印象深刻。

 

我又找了一整套简单编程任务来考验 Copilot,包括验证回文、找到最长的字符串等——在所有任务里它都会立即创建正确答案。观察它如何通过注释、函数签名和变量名的组合来理解问题是很有趣的。

 

Copilot——你被录用了。

 

到了这里,我们很容易想到 Copilot 应该是调用了大量的算法和函数目录,并简单地选择最接近的匹配项来给出建议。简单的实验表明事实并非如此,只是恰好这些算法提供了一种简单的方法来展示 Copilot 的能力。

 

我们换一些更有挑战性的东西来测试它吧。Advent of Code是一年一度的盛会,参与者将面对一系列复杂的编程挑战。Copilot 能否解决第一天的挑战呢?

 

同样,我们会给 Copilot 一条注释(直接来自 AoC 说明),看看它会给出什么:

初看上去它似乎给出了一个解决方案,它确实意识到需要找到两个相加到 2020 的数字,然后返回它们的乘积。然而,虽然这个方案需要对数组条目的所有组合执行彻底搜索,但 Copilot 建议执行的搜索中,i 和 j 分别在数组开始和结束时初始化、递增/递减直到最终相遇。

 

我试图重新编写注释和函数名称来换着花样给 Copilot 各种提示,每次它都会提出一个看起来很合理的算法,但没有一个是正确的。


在工作中使用 Copilot


根据简单的注释生成算法代码是一项令人印象深刻的壮举,但这并不能代表我们大多数开发人员的日常工作方式。我让 Copilot 和我一起处理了几个副项目,看看它是如何应对更现实的挑战的——下面的这个例子是使用 D3 可视化时区数据。

 

D3 代码有点特殊,它采用了与标准 JavaScript 完全不同的风格,因此对 Copilot 提出了一个有趣的挑战。

 

在这里展示我的体验还是比较困难的,因为需要考虑的上下文太多了,但我会尽量做一个简短的总结。这些提示的出现频率往往不高,而且也比较简短。不过也有一些令人惊叹的时刻。

 

这里它建议了几行代码,这些代码显然是基于前面几行代码生成的,并且是正确的:

有时,它给出的建议不过是一个函数签名补全,或者一小段不完整的代码片段。尽管它建议的代码往往有点可笑,但显然我的代码或训练语料库中没有足够的提示或线索来确定意图。

 

不管怎么说,有时它确实很有用。例如,我想要一个简单的轴来渲染月份:

是的,“padding”并不是我想要的,但让我印象非常深刻的是它生成了一个完整的月份名称数组。

 

我在一系列项目中与 Copilot 一起工作了几个小时,结果好坏参半。我认为 Copilot 在说服我默认开启它之前还有一段路要走,因为如下原因……

对 Copilot 的思考

反应迟缓,有时干脆不出现


我当然不会说 Copilot 很慢,毕竟建议只需几百毫秒就能弹出。但在编写代码时,你敲键盘的速度往往会很快,一般不会让 Copilot 有机会弹出并执行它的操作。Copilot 可能想提出建议的时候会暂停一下,这时候我也会犹豫一下。如果接下来它给出的是高质量的建议那会很不错。但很多时候,我只是在盯着闪烁的光标,思考 Copilot 是不是觉得无聊,跑去煮咖啡了?

 

Nat(GitHub CEO)在 Twitter 上提到,他们可能会添加一些 UI 来表明 Copilot 是否正在思考中,这将在一定程度上解决这个问题。但这也给我带来了另一个问题……

自动完成不是 Copilot 的理想交互模式


对于大多数开发人员来说,他们的打字速度是一个瓶颈因素。我们的大脑比手指动得更快。但经验丰富的开发人员敲键盘的速度非常快。自动完成功能与快速打字是很配的,原因很简单,它是可预测的。我知道 IDE 何时可能会启动自动完成、关闭大括号、导航属性或在我的代码中的其他地方完成变量名称。这种功能不会打断我的思路,只会加快我的速度。

 

Copilot 的不同之处在于它是不可预测的。你无法准确预测它什么时候会冒出来(尽管通过练习你会有不错的预测准确率),结果你的思路被打断了。

 

我觉得自动完成不是 Copilot 的最佳交互范式。我很难说更好的范式应该是什么样的,或者目前是否存在!不过我确实知道我想要什么。我希望能够在不等待 Copilot 的前提下继续打字。我不想预测它什么时候会出现。

 

如果 Copilot 实际上只比我落后几个字符,那我一点也不介意,也许它可以创建一个建议来替换我刚刚输入的一些文本。

 

我相信一些聪明的交互设计师可以在这里想出一些办法!但是现在,我们还是回去用简单且可预测的内容自动完成功能吧。

认知负担


这也让我意识到了 Copilot 可能面临的最大挑战,也就是验证其建议所需的认知负担。正如你在本文前面看到的,它创建的代码几乎总是正确的,但深入研究下去,你会发现它并不总是按你的预期工作。上面的代码示例提供了一个很好的例子。

 

验证 Copilot 创建的代码可能非常耗时,并且容易出错。我个人更喜欢它生成简单的两行或三行建议,让我几乎可以立即完成验证。再长一点的话,我就开始怀疑自己编写代码可能更简单了,比费心去验证它的正确性省事多了。

总结


我相信 Copilot 会在市场上大受欢迎。那些简单演示中表现出来的令人惊叹的部分足以让许多企业将其添加到他们的标准工具集中了。但我认为 Copilot 真正实现生产力提升还需要一段时间,不过我坚信这样的未来不远了。

 

值得注意的是,GitHub 将 Copilot 描述为“你的人工智能结对程序员”。目前它还不是理想的合作伙伴。用它就相当于你的结对编程搭档可以在未通知的情况下,在意想不到的时刻抓住你的键盘,敲进去一对似是而非的结果。

 

就个人而言,我认为这里的问题更多是由自动完成范式的固有局限性造成的。如果能解决这个问题,程序员与 Copilot 的关系就会和谐很多。

 

我们更进一步来看“结对编程”这个范式,你的结对搭档应该和你持续交流。你们的讨论范围从细节/语法级别,到更高级别的重构或合适模式都会涵盖。

 

未来我们真的能找到一个人工智能结对编程助手与我们一起工作吗?在 2021 年初,我一直持怀疑态度。但是在使用 Copilot 之后,我认为这样的未来离我们不远了。

 

最后,这篇博文是用 Markdown 写的,所以我想我应该打开 Copilot,看看它认为这篇文章适合怎么结尾。

原来它这么谦虚啊!

 

欢迎在r/programming上分享你对本文的想法和评论。


作者介绍


我叫Colin Eberhardt,是 Scott Logic 的技术总监,是一位多产的技术作者、博主和演讲者,涉及很多技术主题。

 

我的博客内容涉猎广泛,包括 WebAssembly、HTML5/JavaScript 以及使用 D3 和 d3fc 的数据可视化等。还有很多主题与我之前的技术爱好相关的帖子,包括 iOS、Swift、WPF 和 Silverlight 等。

 

我是 FINOS 的董事会成员,该组织鼓励金融领域的开源合作。我在 GitHub 上也非常活跃,为许多项目做出了贡献。

 

原文链接:


https://blog.scottlogic.com/2021/07/03/github-copilot-first-thoughts.html


2021-07-09 09:0016840
用户头像

发布了 74 篇内容, 共 28.5 次阅读, 收获喜欢 83 次。

关注

评论 4 条评论

发布
用户头像
代表着编程的未来,看好!
2021-07-12 10:54
回复
用户头像
我也想知道,用开源代码训练,这个开源协议怎么考虑?
2021-07-09 10:45
回复
这个是目前很多人诟病的地方。它不遵循任何协议,只要在GitHub上能看到代码的都算它的资料库,微软称fair use
2021-07-11 20:13
回复
嗯,对于是否采用一个代码库进行训练,至少还得检查代码库支持的协议
2021-07-13 10:57
回复
没有更多了
发现更多内容

类是如何加载的?

王磊

Java

软件测试/测试开发 | 实战演练接口自动化如何处理 Form 请求?

测试人

软件测试 自动化测试 接口测试 测试开发

国产 ETL工具 ETL产品 数据交换系统

weigeonlyyou

postgresql hadoop elasticsearch Prometheus 时序数据库

海外拥有最庞大社区人群的Verasity($VRA),后市值得期待

股市老人

开源数据可视化工具对比:PowerBI VS. DataEase

cynthia

开源 Power BI 数据可视化 大屏 DataEase

Verilog HDL基本语法规则

timerring

FPGA

IDEA配置java的git路径

孙永潮

【如何提高IT运维效率】深度解读京东云基于NLP的运维日志异常检测AIOps落地实践

京东科技开发者

运维 AIOPS nlp 京东云 企业号 1 月 PK 榜

软件测试/测试开发 | 接口自动化测试如何处理 Header cookie

测试人

软件测试 自动化测试 接口测试 测试开发

企业架构治理指什么,如何做?

涛哥 数字产品和业务架构

架构治理 企业构架

如何妥善且优雅地做好解聘工作?

石云升

极客时间 1月月更 技术领导力实战笔记

模块六作业

Ryan

架构

会声会影2023功能强大的视频编辑软件

茶色酒

会声会影2023

防火墙运维的新思考|流量+访问控制策略

智维数据

运维 防火墙 IT

感受 Vue3 的魔法力量

京东科技开发者

前端 代码 Vue3 京东云 企业号 1 月 PK 榜

模块5 微博高性能计算架构设计

KING

空降负责人如何与团队建立信任?

石云升

极客时间 1月月更 技术领导力实战笔记

2022年回顾:一个37岁中年程序员的一百场面试

无人之路

自动驾驶 面试 求职 大厂 跳槽

真正的AI需要实际的需求

felix

人工智能 算法

复习前端:浏览器渲染机制

devpoint

DOM CSSOM 渲染树 重绘 重排

IntelliJ中高效重构的 10 个快捷方式

JAVA旭阳

Java

什么是AirServer?2024版本如何下载安装包

茶色酒

AirServer

PHP转Go实践:xjson解析神器「开源工具集」

王中阳Go

php golang 高效工作 学习方法 Go web

Verilog HDL仿真常用命令

timerring

FPGA

CrossOver2023软件Mac电脑版虚拟机安装包

茶色酒

CrossOver2023

KaiwuDB 荣获稀土掘金引力榜-年度最佳实践案例

KaiwuDB

多模数据库 数据库解决方案

为什么我推荐接口调试一定要用Apipost?

不想敲代码

接口测试 API 研发管理工具

简述styled-components性能

devpoint

CSS React 样式组件 前端性能

复习前端:CSS

devpoint

CSS Flex scss BFC

消息队列存储数据消息Mysql设计

闲人Eric

架构实战营

基于AbstractProcessor扩展MapStruct自动生成实体映射工具类

京东科技开发者

Java’ 端口映射 spring、 企业号 1 月 PK 榜 set|get

GitHub Copilot体验:AI辅助编程提前看_语言 & 开发_InfoQ精选文章