学习与人生——使用 GitHub Copilot 后的思考

起因

在 10 月 27 号的时候,我收到了一封邮件,是一封关于 GitHub Copilot Preview 的测试邀请邮件。当然,这是我提前申请过的,怀着无比激动的心情,体验了一番。三分钟的热度过去之后,随之而来的担忧,不得不让我认真的反思这项技术所带来的问题。

GitHub Copilot

什么是 GitHub Copilot ?

这里引用官方的术语:GitHub Copilot is an AI pair programmer that helps you write code faster and with less work. GitHub Copilot draws context from comments and code, and suggests individual lines and whole functions instantly.

大体意思是:GitHub Copilot 是一个“搭档”程序员,可帮助您以减少工作量和更快地编写代码。GitHub Copilot 从评论和代码中提取上下文(即当前文件内容和光标位置),并立即给出单行或整个函数的代码建议。

GitHub Copilot 可以做什么?

将注释转换为代码

比如说,我在文件中写了一行注释:【新增商品套餐】,然后我就可以在 GitHub Copilot 中看到一个建议:

此时我按下了【Tab】键,GitHub Copilot 就会自动将注释转换为代码,并且自动插入到当前光标位置。甚至 Github Copilot 提示的方法,并不存在我的代码中,而是自动帮我生成的。

自动填充重复代码

我在图中举例一个场景,如果我想在一个方法中完成一系列的事情,但是其中一项是需要把用户信息转换成其它 Dto 对象,而恰好我在另一个地方这么用过的话。此时我只需要写下注释即可:

然后我就可以在 GitHub Copilot 中看到一个建议,并且我主观上认为这个建议是按照我的需求来的,那我便可以按下【Tab】键,GitHub Copilot 就会自动将注释转换为代码,并且自动插入到当前光标位置。

换做以前,我写这段代码的时候,我估计会对代码进行抽样封装,然后再把这段代码放到一个方法中。或者直接找到相应的代码进行复制粘贴。 当然,无论哪种方式,我们自己的处理肯定跟 Github Copilot “不太一样”,要结合上下文和实际情况判断,哪种选择才是最优的。Github Copilot 能给出解,但不一定是最优解。

其它

除此之外,GitHub Copilot 还能自动填写测试方法,甚至还能直接通过它获得一些【隐私信息】,不知道这个问题后面会不会解决。 顺便说一下快捷键,感兴趣的小伙伴们可以去尝试: 在 Windows 或 Linux 上,按 Alt + ] 下一个或 Alt + [ 上一个。 接受建议,按下 Tab 键,就能帮你自动填充了,按下 Esc 就会取消建议。

GitHub Copilot 是如何工作的呢?

根据官方的说明,主要的训练集来源于 GitHub 上的开源仓库的代码(私有仓库有没有用俺就不清楚了),以及自然语言训练。 在你写代码的过程中,GitHub Copilot 会将你的代码上传至服务器,然后 AI 会根据接收到的上下文进行处理,你用的越多,模型的输出就越精确。

误解

为什么会说误解?

很多人肯定跟我一样,对 GitHub Copilot 会产生偏见和误解,认为这不过是“人”写出来的“人工智能”,通过训练大量现有的代码,从而对目标代码进行运算后,给出模板代码而已。 我最开始看到 GitHub Copilot 介绍时,确实是这么想的,但是当我自己体验过后,看法就发生了改变。但也可能是它足够的强大,致使(欺骗)我的想法改变了。 在往后阅读之前,我希望你明白一件事儿:软件开发的主体仍是你自己,并不是 GitHub Copilot,它无法也难以取代你!

我总结了一下一些可能产生的误解,同时也是我暂时还没弄明白的事情(没证据):

  • GitHub Copilot 只是跟官方说的一样,依靠大量现有的训练集和自然语言训练而来。

这里是指,它只能通过已经存在过的代码给你提示,并不能自己想出全新的代码。这点我不敢肯定,但是我认为它迟早能做到。我在使用过程中,它确实能给我提示在我的程序中未出现过的代码,但是没有证据表明其它人没写过。

与其他训练目标是预测下一个词符的大型语言模型一样,Codex 会生成与其训练分布尽可能相似的代码。这样做的一个后果是,这种模型可能会做一些对用户无益的事情。

  • GitHub Copilot 不擅长“编程”,没有“编程思想”

可能真的没有,但是“编程思想”毕竟难以被量化,但是它从某方面来说,是擅长编程的。

  • GitHub Copilot 缺乏创造性

对它自己而言,我不敢说。但是对我而言,可以说是充满了创造性。GitHub Copilot 有时候提示的代码,会让我思考,如何写才是比较好的方案,怎么写才更优雅?

  • GitHub Copilot 的能力不强,“感觉没啥用”

咱不能忘了,这玩意是 AI,时间越长,他只会被训练的越来越聪明。

不知道大家还记不记得 Google 围棋 AI AlphaGo? 这里咱们引用国际围棋联盟秘书长李夏辰的一段话吧:

第一次听说电脑要挑战顶级棋手李世乭时,我非常惊讶。 我觉得挑战者一定对顶级棋手有多强毫无概念; 但事实上,是我对电脑有多强没有概念。

担忧

GitHub Copilot 会取代我吗?

我个人是对此持乐观态度的,因为我觉得它的最终的设计目标一定是最大限度的提升【开发者效率】,而不是很多人担心的【替代开发者】,至少短时间内不会。

GitHub Copilot 无法解决系统复杂度的问题,咱们编程最核心的,并不是你多会用 GitHub Copilot,也不是你会用多少框架,最核心的是人,那个坐在电脑面前敲代码的人。作为一个优秀的开发者,你必须掌握哪些基础知识,而不是陷入框架、插件和工具的使用当中。

最重要的,AI 无法理解来自产品经理和客户的需求,也无法沟通。

GitHub Copilot 安全吗?

咱们可以肯定的一点是,你如果要使用它,那么你的代码以及配置文件,都是会被传送到 GitHub Copilot 的服务器的。这也就意味着你的隐私、配置文件、访问密钥等等,都会有泄露的风险。

如果你在政府或者银行工作,那么请一定不要在工作时使用它,因为风险极大,你必须对此负责!如果你是在普通的公司上班,也请三思而后行!如果你觉得 GitHub Copilot 会给你们公司的开发带来帮助,至少得拉上部门相关负责人和项目组开一个评审会议后再做决定!

总结和一些建议

大家应该都听说过“结对编程”(Pair Programming)吧?这是一种敏捷软件开发的方法,两个程序员在一个计算机上共同完成工作。一个人输入代码,另一个人审查他输入的代码。这是不是和你使用 GitHub Copilot 时很像?但是你却不能和 GitHub Copilot 互换角色,甚至不能和它沟通。

AI 自动生成程序,是根本不可能的事情。就像我上面说的,AI 无法理解来自产品经理和客户的需求,也无法沟通。让 AI 凭空生成一个程序,是没有意义的,所以你必须告诉 AI,你想要什么。而最难的,恰恰就是你“表达需求”的这个过程,难度甚至不亚于编程。咱们好好想一想,编程的本质,是不是在告诉电脑自己想要什么?输入什么就必然输出什么,数据结构、算法等等,已经被 AI 拿去训练了,但是表达“想要什么”,它自己是无法自动完成的。没有任何机器可以代替人的思考,所以俺觉得,程序员是一种无法被机器取代的工作。

你的雇主可能不会这么想,他们可能会认为,好的工具节省了你的编程开销,甚至会成为压你工资的借口之一。他们会把你当成机器上的“可替换零件”,觉得随时可以替代掉。其实这样往往会适得其反,节省人力开销最好的办法,就是聘用优秀的程序员,给他们足够的尊重,良好的待遇、让他们开心的工作和生活,就能让他们做出更好地软件。那些名词满天飞,光说不做的管理者,才是真正浪费公司资源的人,降低软件开发效率和软件质量的祸根。

最好的发展方向是什么?我觉得人的【智慧】+ 机器的【智能】相结合,才应该是未来人工智能发展的方向。

最后给列举一些建议吧:

  • 使用 AI 辅助编程时,注意隐私和法律风险,切记不要随意在公司使用。
  • 不要过度依赖 GitHub Copilot 之类的 AI,编程的主体和核心应该是你自己,也不要因为用着爽就忘记了自己应该如何学习了。
  • 如果你担心被 AI 取代(卷起来了🤣),那么你就应该去面对它,去学习编程知识是你最重要的事情之一。
  • 兴趣不是最好的老师,生存才是!
updatedupdated2022-08-252022-08-25