GitHub Copilot 入门实战指南
# GitHub Copilot 入门:实用指南
写代码十年有余,我得承认:GitHub Copilot刚推出时我是持怀疑态度的。"AI帮我写代码?听起来就像是一团乱麻。"但经过过去六个月每天使用后,我可以告诉你,它既比我预期的更有用,也更令人沮丧。让我详细展示如何配置它、它的优势所在,以及哪些情况下它绝对会浪费你的时间。
## 真正的痛点:上下文切换
在Copilot出现之前,最让我崩溃的是:我正全神贯注地写一个React组件,处理复杂的状态更新,然后不得不停下来写一个工具函数。或者我需要查阅一个每半年用一次的库的文档。又或者我需要为一个90%都是模板代码的函数编写测试。每次中断都会耗费15-20分钟的专注时间。Copilot虽然不能完全消除这种成本,但能将其缩短到几秒钟。
## 配置Copilot:十分钟快速设置
首先,前提条件:你需要一个GitHub账号(免费或付费均可),以及VS Code、JetBrains IDE或Neovim中的任意一个。我是在VS Code 1.85+版本上测试的。
1. **安装扩展**:打开VS Code,进入扩展(Ctrl+Shift+X),搜索"GitHub Copilot",安装官方版本(蓝色图标,下载量超过5000万)。没错,确实有仿冒品——跳过它们。
2. **身份验证**:点击状态栏(右下角)中的Copilot图标。它会打开一个浏览器标签页进行授权。你需要登录GitHub。如果使用的是工作账号,请确保拥有正确的组织权限——这个问题让我折腾了20分钟。
3. **启用代码补全**:默认情况下,Copilot是开启的。当它处于活动状态时,状态栏中会出现一个小火花图标。点击它可以关闭,以便需要安静工作时使用。
就这样。无需配置文件,无需API密钥,无需选择模型。这种简洁性既是福音也是诅咒。
## 与Copilot的初次十分钟
打开一个名为`weather.js`的新文件。输入以下内容:
```javascript
// 根据城市名称获取当前天气的函数
```
等待一秒钟。Copilot很可能会建议类似这样的代码:
```javascript
async function getWeather(city) {
const response = await fetch(`https://api.openweathermap.org/data/2.5/weather?q=${city}&appid=YOUR_API_KEY`);
const data = await response.json();
return data;
}
```
按Tab键接受。然后输入:
```javascript
// 将温度从开尔文转换为摄氏度
```
它会建议:
```javascript
function kelvinToCelsius(kelvin) {
return (kelvin - 273.15).toFixed(1);
}
```
再次按Tab键。这就是Copilot最佳状态:处理枯燥、可预测的转换。但接下来就变得棘手了。
## Copilot的失败之处(以及浪费你时间的地方)
**1. 它不理解你的项目上下文。** 有一次我在用Express开发Node.js后端。我输入了`// authenticate user`。Copilot建议了一个基于JWT的身份验证流程——这对80%的项目来说是正确的。但我的项目使用的是基于会话的身份验证,用Redis存储。这个建议完全错误。我不得不删除它,自己编写实际代码。
**2. 它会虚构API。** 这很危险。有一次我输入了`// send email using SendGrid`。Copilot建议了`sgMail.send()`,但函数签名在实际SendGrid v3 API中并不存在。如果我没有查阅文档,生产环境中就会出现运行时错误。
**3. 它不处理边界情况。** Copilot在90%的情况下只会生成理想路径。错误处理?超时?速率限制?除非你明确提示,否则它会跳过这些。
## Copilot的实用提示工程
经过数月的试错,以下是真正有效的方法:
**糟糕的提示:**
```javascript
// 计算运费
```
**好的提示:**
```javascript
// 根据重量和距离计算运费
// 重量单位为千克,距离单位为公里
// 返回以美元计价的费用
// 订单超过100千克时享受10%折扣
```
注释越具体,Copilot的输出就越好。我发现,在注释中包含类型、单位和业务规则,生成的代码需要编辑的工作量能减少80%。
## 实际项目示例:构建待办事项API
让我带你体验一次实际的编码过程。我正在为一个待办事项应用构建简单的Express API。
我这样开始:
```javascript
const express = require('express');
const app = express();
```
Copilot建议了样板代码`app.listen()`和中间件。我一路按Tab接受。然后我输入:
```javascript
// 内存中的待办事项存储
```
Copilot建议:
```javascript
let todos = [];
let id = 0;
```
我接受了。然后我输入:
```javascript
// POST /todos - 创建新待办事项
```
Copilot建议:
```javascript
app.post('/todos', (req, res) => {
const todo = {
id: id++,
title: req.body.title,
completed: false,
createdAt: new Date()
};
todos.push(todo);
res.status(201).json(todo);
});
```
完美。我接受了。然后我输入:
```javascript
// GET /todos - 列出所有待办事项
```
它建议了显而易见的实现。我接受了。然后我输入:
```javascript
// PATCH /todos/:id - 切换完成状态
```
这次Copilot让我惊讶了。它建议:
```javascript
app.patch('/todos/:id', (req, res) => {
const todo = todos.find(t => t.id === parseInt(req.params.id));
if (!todo) {
return res.status(404).json({ error: 'Todo not found' });
}
todo.completed = !todo.completed;
res.json(todo);
});
```
它自动处理了404情况。我并没有提示它这样做。这是Copilot从常见模式中学习的结果。
## 测试陷阱
我写了一个验证电子邮件地址的函数:
```javascript
function isValidEmail(email) {
const re = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
return re.test(email);
}
```
然后我输入了`// tests for isValidEmail`。Copilot建议:
```javascript
describe('isValidEmail', () => {
it('should return true for valid email', () => {
expect(isValidEmail('test@example.com')).toBe(true);
});
it('should return false for invalid email', () => {
expect(isValidEmail('invalid')).toBe(false);
});
it('should return false for email without @', () => {
expect(isValidEmail('testexample.com')).toBe(false);
});
});
```
看起来很棒,对吧?但它遗漏了包含空格的电子邮件这一边界情况。我不得不手动添加那个测试。**永远不要盲目信任Copilot生成的测试。** 它们可能会通过,但可能没有测试到正确的内容。
## 节省时间的键盘快捷键
经过100多个小时与Copilot的相处,以下是我最常用的快捷键:
- **Tab键**:接受建议
- **Esc键**:拒绝建议
- **Ctrl+Enter**:打开Copilot面板(显示10个备选方案)
- **Alt+]**:切换到下一个建议
- **Alt+[**:切换到上一个建议
最被低估的功能:**Ctrl+Enter**。当Copilot给出一个糟糕的建议时,按Ctrl+Enter就能看到10个备选方案。我发现第5或第6个建议通常比第一个更好。
## 重要的隐藏设置
打开VS Code设置(Ctrl+,)并搜索"Copilot"。以下三个设置对我产生了影响:
1. **`github.copilot.enable`**:对Markdown和YAML文件设置为`false`。Copilot在这些文件中毫无用处,只会增加干扰。
2. **`editor.inlineSuggest.enabled`**:保持为`true`。但如果觉得建议分散注意力,可以将其设置为`false`,仅通过Ctrl+Space触发建议。
3. **`github.copilot.advanced`**:这是隐藏设置。在settings.json中添加`"github.copilot.advanced": { "length": 100 }`来限制建议长度。我发现较长的建议(超过100个字符)往往是虚构的。
## 真正的代价:你的注意力
说句实话:Copilot让我在编写模板代码时更快,但在推理复杂逻辑时却更慢。当我在处理棘手的算法或新的设计模式时,我会关闭Copilot。它的建议会打断我的思路,把我引向错误的方向。
我现在有一个心理规则:如果评估建议花费的时间比我自己编写还要长,我就拒绝它。这种情况大约占30%。
## 下一步行动
不要试图让Copilot处理所有事情。相反,今天花20分钟做这个练习:
1. 打开一个包含你上周编写的函数的文件。
2. 删除函数体。
3. 编写详细的注释描述其功能,包括类型、边界情况和错误处理。
4. 看看Copilot会建议什么。
5. 将其与你的原始代码进行比较。
在这20分钟里,你比阅读数小时资料能学到更多关于Copilot的优势和劣势。而且你会清楚地知道何时该信任它——以及何时该自己编写代码。