GitHub Copilot预览版出来之后,我用了一段时间,发现了很多实用的进阶技巧。本文分享了这些技巧,包括如何写好提示词、如何利用上下文、如何生成测试、如何调试和重构、以及常见的坑。如果你在用Copilot或者打算用,希望这些技巧能帮你提升编程效率。

一、什么是GitHub Copilot

先简单介绍一下GitHub Copilot。

GitHub Copilot是GitHub和OpenAI合作开发的AI编程助手,它基于OpenAI的Codex模型,可以根据代码上下文和注释,自动生成代码建议。它支持多种编程语言和框架,可以作为插件安装在VS Code、JetBrains等IDE中。

Copilot的核心功能是:

  • 根据注释生成代码
  • 根据函数名和参数生成函数体
  • 自动补全代码
  • 生成测试用例
  • 翻译代码(比如把Python翻译成JavaScript)
  • 解释代码

我用了一段时间之后,发现Copilot确实能提升编程效率,特别是写一些重复性的代码(比如CRUD、数据转换、样板代码)的时候,能节省很多时间。但是要用好Copilot,也需要一些技巧。下面就来分享我总结的进阶技巧。

二、技巧1:写好提示词(Prompt)

Copilot的生成质量很大程度上取决于你给的提示词。提示词写得好,生成的代码就好;提示词写得不好,生成的代码就差。

1. 用自然语言描述你要做什么

不要只写一个函数名,要用自然语言详细描述你要做什么。比如,不要只写function parseDate(),而是写一段注释:

// 解析日期字符串,支持多种格式(YYYY-MM-DD, YYYY/MM/DD, MM-DD-YYYY)
// 如果解析失败返回null
function parseDate(dateStr) {

这样Copilot就能根据你的描述,生成更符合需求的代码。

2. 说明输入输出和边界条件

在提示词里说明输入输出的格式,以及边界条件怎么处理。比如:

# 计算两个日期之间的工作日天数
# 输入:start_date, end_date (datetime对象)
# 输出:int,工作日天数
# 边界:如果start_date > end_date,返回0
def workdays_between(start_date, end_date):

这样生成的代码会更健壮,考虑到边界情况。

3. 指定使用的库和风格

如果你有特定的库或者编码风格要求,在提示词里说明。比如:

// 使用lodash实现数组去重,保留第一次出现的元素
// 不要修改原数组
function unique(arr) {

这样Copilot就会用你指定的库和风格来生成代码。

4. 给例子

给Copilot一些输入输出的例子,它会生成更准确的代码。比如:

# 将字符串转换为蛇形命名法
# 示例:"camelCase" -> "camel_case"
# 示例:"PascalCase" -> "pascal_case"
# 示例:"kebab-case" -> "kebab_case"
def to_snake_case(s):

有了例子,Copilot就能更准确地理解你的需求。

三、技巧2:利用上下文

Copilot会读取当前文件的上下文,包括已经写的代码、导入的库、定义的函数等。所以,提供好的上下文,能让Copilot生成更准确的代码。

1. 先导入需要的库

在写代码之前,先把需要的库导入。Copilot会根据导入的库,生成使用这些库的代码。比如,如果你导入了axios,Copilot就会用axios来发请求,而不是用fetch。

2. 定义好类型和接口

如果你用的是TypeScript或者其他有类型的语言,先定义好类型和接口。Copilot会根据类型来生成代码,减少类型错误。

interface User {
  id: number;
  name: string;
  email: string;
}

// 根据用户ID获取用户信息
async function getUser(id: number): Promise<User> {

3. 在同一个文件里写相关的代码

Copilot主要看当前文件的上下文,所以把相关的代码放在同一个文件里,Copilot就能更好地理解你的项目结构和编码风格。

4. 打开相关的文件

Copilot也会看你在IDE中打开的其他文件。所以,写代码的时候,可以把相关的文件(比如类型定义、工具函数、类似的实现)打开,Copilot会参考这些文件的内容。

四、技巧3:用Copilot生成测试

Copilot生成测试用例非常好用,这是我最常用的功能之一。

1. 选中函数,生成测试

在VS Code里,选中一个函数,然后打开Copilot,输入"为这个函数写单元测试",Copilot就会生成对应的测试用例。

生成的测试通常会覆盖正常情况、边界情况、异常情况,比很多人自己写的测试还全面。

2. 指定测试框架

在提示词里说明你用的测试框架,比如Jest、Mocha、pytest等,Copilot会用对应的语法来生成测试。

// 用Jest为下面的函数写单元测试
// 包括正常情况、边界情况、异常情况
function calculateDiscount(price, discount) {

3. 生成测试数据

Copilot还可以生成测试数据。比如,你需要一些模拟的用户数据,只要写个注释,Copilot就能生成。

// 生成10个模拟用户数据,包含id, name, email, age
const mockUsers = 

4. 用Copilot检查测试覆盖

写完测试之后,可以让Copilot帮你检查测试覆盖了哪些情况,还有哪些情况没覆盖。

五、技巧4:用Copilot调试和重构

Copilot不只是写代码的工具,还可以用来调试和重构。

1. 让Copilot解释代码

如果你看不懂一段代码,可以让Copilot解释。选中代码,输入"解释这段代码的作用",Copilot会用自然语言给你解释。

这对阅读别人的代码或者 legacy 代码很有帮助。

2. 让Copilot找bug

如果你的代码有bug,但是找不到原因,可以让Copilot帮你找。把代码贴给Copilot,描述一下问题,它可能会发现你忽略的bug。

比如:"下面的函数在输入为负数的时候返回错误的结果,帮我找bug"。

3. 让Copilot重构代码

Copilot可以帮你重构代码。比如,把一个很长的函数拆分成多个小函数,把重复的代码提取成公共函数,优化性能等。

// 重构下面的函数,拆分长函数,消除重复代码
// 保持功能不变
function processOrder(order) {

4. 让Copilot优化性能

如果你觉得一段代码性能不好,可以让Copilot帮你优化。

# 优化下面的函数性能,减少时间复杂度
# 当前是O(n^2),优化到O(n)
def findDuplicates(arr):

六、技巧5:用Copilot学习新技术

Copilot还是一个很好的学习工具。当你学一门新语言或者新框架的时候,可以用Copilot来辅助学习。

1. 看Copilot怎么写

当你不知道某个功能怎么实现的时候,可以写个注释,看Copilot怎么写。然后理解它的实现,学习它的写法。

比如,你刚学React,不知道怎么写一个自定义Hook,可以写个注释,看Copilot的实现,然后学习它的模式。

2. 让Copilot解释新概念

遇到不懂的概念或者API,可以让Copilot解释。比如"解释一下React的useEffect的依赖数组是怎么工作的"。

3. 翻译代码

如果你熟悉一种语言,想学另一种语言,可以让Copilot把你熟悉的语言翻译成新语言。比如把Python翻译成JavaScript,这样你就能对比着学。

4. 生成学习示例

让Copilot生成一些学习用的示例代码。比如"给我5个使用Array.reduce的例子,从简单到复杂"。

七、技巧6:高效使用Copilot的工作流

总结一下我用Copilot的高效工作流:

  1. 先写注释和类型:写代码之前,先写好注释说明需求,定义好类型和接口
  2. 让Copilot生成骨架:让Copilot生成函数的基本结构和主要逻辑
  3. 审查和修改:仔细审查Copilot生成的代码,修改不符合需求的地方
  4. 让Copilot生成测试:写完函数之后,让Copilot生成测试用例
  5. 运行测试,迭代改进:运行测试,如果有问题,让Copilot帮忙调试和修复
  6. 重构优化:功能完成之后,让Copilot帮忙重构和优化

这个工作流能大大提升编程效率,而且生成的代码质量也有保障。

八、常见的坑和注意事项

用Copilot的时候,有一些坑需要注意。

坑1:不要盲目相信Copilot生成的代码

Copilot生成的代码不一定是对的,有时候会有bug,有时候会用已经废弃的API,有时候会有安全漏洞。所以,一定要仔细审查生成的代码,不要直接就用。

我遇到过Copilot生成的SQL语句有SQL注入漏洞,也遇到过生成的函数逻辑有错误。如果不审查直接用,可能会出大问题。

坑2:Copilot可能会生成不存在的API

Copilot有时候会"幻觉"出一些不存在的API或者函数。比如,它可能会调用一个库的某个方法,但是这个方法根本不存在。所以,生成的代码一定要运行测试,确认能正常工作。

坑3:注意代码版权

Copilot生成的代码可能和某些开源项目的代码很像,甚至直接复制了有版权的代码。在商业项目中使用的时候,要注意版权问题。建议对生成的代码做一些修改,不要直接复制粘贴。

坑4:不要泄露敏感信息

Copilot会把你的代码上下文发送到服务器,所以不要在使用Copilot的时候,把敏感信息(比如密钥、密码、客户数据)写在代码里。

坑5:Copilot不是银弹

Copilot是一个辅助工具,不能替代程序员的思考和判断。它擅长写重复性的、样板式的代码,但是对于复杂的架构设计、算法优化、业务逻辑,还是需要人来做。

不要因为有了Copilot就不思考了,那样你只会变成一个代码审查员,而不是一个程序员。

九、Copilot的局限性

Copilot虽然强大,但是也有一些局限性:

  1. 上下文有限:Copilot只能看到当前文件和打开的几个文件,不能理解整个项目的架构。所以对于需要全局理解的任务,它可能做不好。
  2. 不擅长复杂逻辑:对于复杂的业务逻辑、算法、架构设计,Copilot的生成质量不高,需要人来做。
  3. 可能生成不安全的代码:Copilot有时候会生成有安全漏洞的代码,需要人来审查。
  4. 不理解业务需求:Copilot不懂你的业务,它只能根据你的描述来生成代码。如果你的描述不准确,生成的代码就不符合需求。
  5. 语言和框架覆盖不均:对于热门的语言和框架(比如JavaScript、Python、React),Copilot的支持很好。对于小众的语言和框架,支持就比较差。

十、写在最后

GitHub Copilot是一个很强大的AI编程助手,用好了能大大提升编程效率。但是它不是银弹,不能替代程序员的思考和判断。

用好Copilot的关键是:写好提示词,提供好的上下文,仔细审查生成的代码,用它来做它擅长的事情(重复代码、测试、样板代码),把精力放在更重要的事情上(架构设计、业务逻辑、算法优化)。

AI编程是未来的趋势,Copilot只是一个开始。随着AI技术的发展,AI编程助手会越来越强大。作为程序员,我们要学会使用这些工具,提升自己的效率,而不是害怕被替代。

最后用一句话结束本文:"AI不会取代程序员,但是会用AI的程序员会取代不会用AI的程序员。"愿每一个程序员都能学会使用AI工具,提升自己的能力,在技术的浪潮中立于不败之地。