最近我发现 Github Copilot,一种通过建议整个片段(通常仅基于自然语言注释)来帮助编写代码的 AI,现在可以作为商业服务使用。不再需要等待测试访问,我已经为自己登记了两个月的免费试用期。
我不得不说——我的期望很高。我之前玩过一些 OpenAI API。我相信它使用与 Copilot 相同的模型,所以我知道这可能是一次令人兴奋的体验。我已经将它安装为 Visual Studio Code 扩展,并开始想知道我应该如何挑战我的新虚拟同事。
阅读了一些社区评论和文章,我发现 Copilot 的优势之一是它比当今任何闪存和骨骼开发人员都了解更多的编程语言、框架和 API。毕竟,它使用曾经存在的每一个公共 GitHub 存储库进行学习。它不仅仅是一种生产力工具。它也可以是一种发现新事物的互动方式。
在期待以这种方式使用它的同时,我决定制作一款游戏。克隆 Space Invaders 似乎是一个合适的选择,但为了让这更有趣,我做了一些假设:
我已经设置了屏幕录制,打开了我的麦克风做一些评论,启动了 Visual Studio,然后写了我的第一个请求:
"""main function for a pygame"""
Copilot 开始给我一行又一行的代码。我刚刚通过接受大量进口的建议列表输入了自己。一开始很热情,我很快发现自己陷入了一遍又一遍地添加相同的两行代码的无限循环中。不好。
一个糟糕的开始,我很快意识到我正在尝试做太多,太快。要求 Copilot 首先添加 PyGame 导入,然后创建一个显示窗口的函数就可以了。
那时,我也意识到,通过使我的要求更精确,我可以改进结果。写的时候
"""create a function showing a game window"""
我已经让它工作了,除了它只显示一秒钟然后立即退出的事实。然后我想我需要对我的期望非常直截了当。将其更改为
"""create a function showing a game window and then left it open"""
Copilot 扩展了代码,添加了一个防止窗口关闭的基本游戏循环。
看来我和我的哥们开始互相交流了。好的!
下一步是创建一个宇宙飞船类。我在一个单独的文件中创建了一个类,再次开始编写另一个请求并发现另一个很酷的东西。结果 Copilot 不仅建议了代码,还建议了我正在写的评论的内容。我已经开始要求使用箭头键来移动我的飞船,它建议了一个完整的句子。
我不得不说,如果 Copilot 真的能理解项目的进展情况,我有点怀疑。分析当前编辑文件中的代码是一回事。弄清楚这些文件如何相互关联是另一回事。
副驾驶说:“我帮你搞定了”。它知道其他文件中的类,在我们的游戏类中使用 spaceship 没有问题。 Copilot 还发现我们已经定义了特定的游戏窗口大小,并在将宇宙飞船定位在屏幕底部中心时使用它。
你一定会想——“这个工具太棒了”。正确的?
有点像,但我们的关系不仅仅是月光和玫瑰。有些问题是微不足道的,比如我要求 Copilot 为我编写的函数中不必要的逻辑。一些建议延迟了,我已经浪费了一些时间来等待它们。
有时我因为自己的错误而感到沮丧。我留下了一条评论,该函数应该在文件顶部返回零,然后在下面写另一条评论,我正在弄清楚为什么 Copilot 试图在我的函数末尾返回零。但与我花了将近一个小时解决的问题相比,这算不了什么。
我正在寻找将船放置在正确的位置并将其大小设置为 50x50 像素的大小。我试图以多种方式表达我的评论。总是得到相同的结果。代码不起作用,因为 Copilot 决定使用 PyGame 中不存在的方法。
顽固的骡子试图在我加载的精灵对象上调用 set_size 和 set_center ,每次都得到:
AttributeError: 'pygame.Surface' object has no attribute 'set_size'
无数次我试图改写我的请求,总是得到根本不起作用的代码。太令人沮丧了。
在某些时候,我什至认为我应该停止录制并忘记它。将 Copilot 标记为不适合此目的并结束实验。然而,我觉得必须有办法克服这一点。
我认为使用 Copilot 可以忘记文档,但结果证明是我不了解 PyGame 的基础知识是我的错。我不明白 Rect 有助于在场景中移动对象的概念。我不明白如何使用实用程序类来缩放我的精灵。
在文档中找到该信息打破了魔咒。我能够建议一个 Copilot 不同的策略,将表示为 Surface 对象的精灵与 Rect 分开并将它们分别传递到屏幕。
本课程的其余部分是平静的蛋糕。我生成的代码越多,Copilot 就越聪明。当它读懂我的想法并让子弹和外星人朝着正确的方向移动时,这真是太神奇了。添加一个分数计数器是小菜一碟,Copilot 自动计算出应该将与入侵者的子弹碰撞次数相加。
毕竟,这是成功的。游戏运行良好,我在不到 2 小时的时间里就从头开始学习。 Copilot 编写了至少 99% 的代码,我几乎不需要查看文档,尽管没有它,我可能仍然会被我的新朋友提供的不正确代码所困扰。
您可以在 YouTube 上观看这个 2 小时长的视频,观看我的所有努力:
👉
没有准备,没有编辑,没有技巧。纯粹的即兴创作。
只是一个快速警告 - 这是情绪化的。我有一半的时间只是为了大笑而感到沮丧,并为朝着正确方向迈出的每一步而感到非常兴奋。
你也可以在我的 Github 上找到它生成的源代码。正如我在视频中提到的那样,它并不漂亮,但它确实有效:
👉 https://github.com/lukasz-wronski/copilot-invaders
希望你喜欢它。谢谢阅读!