GitHub Copilot 入门实战指南

codingbeginner

# 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的优势和劣势。而且你会清楚地知道何时该信任它——以及何时该自己编写代码。