写点什么

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

Colin Eberhardt

2021 年 7 月 09 日

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 年 7 月 09 日 09:002506
用户头像

发布了 61 篇内容, 共 11.0 次阅读, 收获喜欢 61 次。

关注

评论 4 条评论

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

理想的程序员

极客思享

spring-boot-route(五)整合Swagger生成接口文档

Java旅途

Java springboot swagger

区块链--凌驾于政治之上的存在

CECBC区块链专委会

区块链 信息技术

架构师训练营第四周作业

邓昀垚

极客大学架构师训练营

Web Storage API的介绍和使用

程序那些事

web tech web storage web storage api storage api

云服务器网站打开速度过慢,如何进行自检

德胜网络-阳

架构师训练营 - 学习笔记 - 第三周

徐时良

极客大学架构师训练营

架构师训练营第 1 期 - 第 3 周 - 学习总结

wgl

极客大学架构师训练营

Architecture Phase1 Week4:HomeWork

phylony-lu

极客大学架构师训练营

架构师训练营第三周心得

CmHuang

区块链带来第四次技术革命 融入生产大幅提高企业收入

CECBC区块链专委会

区块链 数字资产 技术革命

源码分析怎么做?

tison

源码分析

makefile从入门到入门

MySQL从删库到跑路

c++ Linux 编译 makefile

【知识分享】区块链常用术语

CECBC区块链专委会

区块链 货币 网络节点

架构师训练营第四周学习总结

邓昀垚

极客大学架构师训练营

Architecture Phase1 Week4:Summarize

phylony-lu

极客大学架构师训练营

阿里P8大牛爆肝的《Java核心技术总结》+《面试题总结》简直赞爆了

Java架构之路

Java 程序员 面试 编程语言 进阶

一个草根的日常杂碎(10月5日)

刘新吾

随笔杂谈 生活记录 社会百态

Chrome浏览器架构

曲迪

chrome 前端 浏览器 专栏

架构师训练营 Week4 - 课后作业

缓存 自动化 异步 集群 冗余

第二节课后作业

happy

如何开一场高效的会议?

boshi

高效工作 开会

Serverless Frist 的渐进式应用开发框架 Malagu

木香丘

开源 Serverless 云原生 Malagu Framework

架构师训练营第 1 期 - 第 3 周 - 作业

wgl

极客大学架构师训练营

金秋十月重磅技术文——网络编程大揭秘

Java架构师迁哥

编程 程序员

Linux搭建C++开发调试环境

MySQL从删库到跑路

c++ Linux gdb 编译

spring-boot-route(六)整合JApiDocs生成接口文档

Java旅途

Java Spring Boot

小伙伴想学Jenkins自动构建发布项目,我:安排上了!!

冰河

项目管理 jenkins 灰度发布 自动构建 及时发布

架构师训练营 Week4 系统架构 - 学习总结 架构演进

作者谈《阿里巴巴Java开发手册(规约)》背后的故事

Java架构师迁哥

Code Review怎么做

胖鱼2号

技术为帆,纵横四海- Lazada技术东南亚探索和成长之旅

技术为帆,纵横四海- Lazada技术东南亚探索和成长之旅

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