如何使用GitHub Copilot成为更快乐、更高效的开发人员
Copilot 提供了多种 AI 工具,这些工具从根本上简化了我作为软件开发人员的体验。我用它来生成代码、测试,甚至是简单的应用程序。它还非常适合调试、重构和记录现有代码。
奇怪的是,使用 Copilot 使我开发功能的速度快于业务利益相关者审查它们的速度。
重要的是要注意,包括 Copilot 在内的人工智能工具可能会公然犯错,在纠正后道歉(或不道歉),然后自信地产生同样的错误。但是,只要您意识到 AI 工具的缺点,并且有足够的编码知识来识别它们何时不正确,您就可以在显着提高生产力的道路上减轻它们。
如何设置 GitHub Copilot
有关 Copilot 的设置和基本用法,请查看文档。您可以将 Copilot 添加到个人或企业帐户,并且可以免费试用,试用后价格合理。
将 Copilot 添加到您的 GitHub 帐户后,您需要为您的 IDE 安装插件并登录 GitHub 以访问 Copilot。
在本文中,我们将使用这些Visual Studio Code 扩展:
GITHUB 扩展描述预览副驾驶AI 配对程序员与 in-IDE 代码建议不副驾驶每晚Copilot 的夜间构建,包括最新更改不副驾驶实验室侧边栏中的实验性功能是的副驾驶聊天边栏中的交互式聊天,Copilot X 的一部分是的副驾驶语音语音助手是的
笔记:
此信息在撰写本文时是最新的,但可能会随着 GitHub 开发这些产品而改变。
我还没有收到 Copilot Voice 或 Copilot (X) for Pull Requests 的访问权,所以我对这些的看法是有限的,并且基于 GitHub 的预览文档。
隐私
在进入 Copilot 的一些关键用例之前,先简要说明一下隐私:基本上,如果您信任 GitHub 来托管您的源代码,您可能会相信他们对您的 Copilot 提示和代码片段所做的工作。[查看他们的常见问题文档和隐私声明。]
GitHub Copilot 的用例
GitHub Copilot 的用例很多,尤其是当您添加实验室、聊天和语音的预览功能时。使用 Copilot 的功能可以真正简化开发过程。
以下是一些利用 Copilot 扩展的好方法:
类别分机代码生成副驾驶,副驾驶夜间,副驾驶语音解释代码副驾驶实验室、副驾驶聊天、副驾驶语音语言翻译副驾驶实验室,副驾驶聊天调试副驾驶实验室,副驾驶聊天重构副驾驶实验室,副驾驶聊天测试生成Copilot、Copilot Nightly、Copilot Labs、Copilot Chat代码审查副驾驶聊天语音驱动开发副驾驶语音
代码生成
Copilot 以其代码完成功能而闻名。如果在代码中给出了注释或者您键入了一行代码的开头,Copilot 将建议您可以接受、忽略或探索替代方案的解决方案。它被称为“幽灵文本”。
安装 Copilot 扩展程序并登录后,代码完成就像输入说明一样简单,并在建议出现后按 Tab 键。
Copilot 用于创建方法和调用的 Ruby 注释提示
将代码完成更进一步,Copilot Chat 可以接受一个提示并生成构建整个应用程序的说明。
我要求它在 Node 中使用“产品”的 CRUD 函数创建一个 REST API,它生成了功能代码。整体印象深刻。在同样的提示下,ChatGPT 还为我提供了如何运行代码的说明,这很好。
Copilot Voice 还可以根据语音命令编写或编辑代码。大多数时候,使用带有 Copilot 代码完成功能的键盘比使用语音口述代码行更快。但是考虑使用 Copilot Voice 来创建和运行代码而无需键入或盯着屏幕是很有说服力的。
解释代码
我经常必须盯着屏幕才能弄清楚一段代码在做什么。有时它是我不了解业务上下文的遗留代码。有时它使用我不习惯的特定库。有时我会诅咒写它的人,即使是我。
下面是 Copilot Chat 从上面的“节点中的 REST API...”提示生成的一些代码:
app.get('/products/:id', (req, res) => {
const id = req.params.id;
const product = products.find((p) => p.id === id);
if (product) {
res.json(product);
} else {
res.status(404).json({ error: 'Product not found' });
}
});
我把这段代码输入 Copilot Labs 的“解释”功能。这是回应...
下面是对上面代码的解释:
我们使用路由路径 /products/:id 定义路由。路径中的冒号 : 表示它是一个路由参数。路由参数的值将在 req.params 中可用。例如路由路径是/products/:id,我们向/products/5发起请求,那么req.params的值就是{id:5}。
我们从 req.params 获取 id 并从 products 数组中找到具有给定 id 的产品。如果存在具有给定 id 的产品,我们将其退回。否则,我们将发送一个 404 错误响应,其中包含错误消息“未找到产品”。
这是一段非常简单的代码,响应也清晰明了。在函数上方的代码注释中将其作为文档添加很容易。
另一个很好的例子是正则表达式。我了解正则表达式的工作原理,但我通常没有耐心弄清楚特定正则表达式的作用。我向 Copilot Chat 提供了这个用于电子邮件验证的巨大正则表达式语句:
(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])
它在高层次上解释了正则表达式,表明它被分解为本地和域部分,代表电子邮件地址中“@”符号的前后。然后它描述了每个部分中允许的字符。很有帮助。
语言翻译
开发人员通常需要快速学习新的语言和框架。Copilot Labs 和 Chat 让这一切变得非常简单。这是由 Copilot 转换的一系列 JavaScript 和 Ruby 产品:
let products = [
{ id: '1', name: 'Product 1', price: 10.99 },
{ id: '2', name: 'Product 2', price: 19.99 },
{ id: '3', name: 'Product 3', price: 7.99 }
];
products = [
{ id: '1', name: 'Product 1', price: 10.99 },
{ id: '2', name: 'Product 2', price: 19.99 },
{ id: '3', name: 'Product 3', price: 7.99 }
]
这是一个非常简单的例子,所以让我们试着把它变成一个类,然后换个方向(从 Ruby 到 JavaScript):
class Product
attr_reader :name, :price
def initialize(name, price)
@name = name
@price = price
end
end
class Product {
constructor(name, price) {
this.name = name;
this.price = price;
}
}
这检查出来。为了更好地衡量,我也测试了 TypeScript,它也工作得很好。
调试
这是一个非常方便的功能。您可以向 Copilot Chat 或 Labs 提供有问题的代码或错误消息,它会指出它认为的问题所在。
Copilot Labs“修复错误”刷功能
我不能告诉你我拔了多少根头发,因为我找不到语法错误。Copilot 修复错误的能力只会让我更快乐,更毛茸茸。
您还可以向 Copilot Chat 提供一条没有其他提示的错误消息,它可以告诉您问题所在。我从 Node REST API 代码中任意删除了一个点:
products[productIndex] = { id, ..req.body };
我复制/粘贴了 Chat 中的错误消息,它的响应是...
查看您提供的代码摘录,问题似乎出在第 49 行,其中对象文字中存在语法错误。之前的“..”req.body导致了错误。它应该只是一个点而不是两个。
这是正确的(错误的行和来源)和错误的(它应该只是一个点)。然后它给了我一个带有三个点的代码片段,这也是正确的。
正如我一开始提到的,你必须仔细检查 AI 的工作。尽管如此,Copilot 解析错误消息、描述它认为错误的地方并提出修复建议的能力给我留下了深刻的印象。
重构
另一个很好的用例是重构。考虑下面的代码:
def price_with_discount
price - (price * discount_rate)
end
这种简单的价格计算不考虑nil值、应为数字的字符串或 或price的合理值discount_rate。我们需要代码来做到这一点:
确保price是整数或浮点数(不是零)
确保price不为负
确保discount_rate是一个浮点数(不是零)
Ensurediscount_rate不为负且小于或等于 1
Copilot Chat 轻松处理此问题...
def price_with_discount(price, discount_rate)
raise ArgumentError, "Price must be a positive number" unless price.is_a?(Numeric) && price >= 0
raise ArgumentError, "Discount rate must be a float between 0 and 1" unless discount_rate.is_a?(Float) && discount_rate >= 0 && discount_rate <= 1
price - (price * discount_rate)
end
测试生成
使用 Copilot 生成测试在技术上是上面“代码生成”的一个子集,但我觉得它非常有用,值得一提。
如果您试图涵盖快乐和悲伤的路径、主要用例和边缘情况,则为代码生成单元测试可能会很乏味。我们上面的代码需要测试用例,以确保在满足或不满足要求price_with_discount时引发错误。此外,我们可能想测试以下内容:price``discount_rate
一个price没有一个discount_rate
Aprice合理discount_rate(例如,10% 的折扣)
A price100% discount_rate(例如,如果我们想赠送产品)
对于这些和我们之前的错误案例,这是 Copilot Chat 在进行一些微调(重新提示)并从 Minitest 切换到 Rspec 之后生成的内容。
RSpec.describe Product do
describe "#price_with_discount" do
context "when given a valid price and discount rate" do
it "returns the price with the discount applied" do
product = Product.new("Test Product", 100, 0.2)
expect(product.price_with_discount(product.price, product.discount_rate)).to eq(80)
end
end
context "when given a nil price" do
it "raises an ArgumentError with an appropriate message" do
product = Product.new("Test Product", nil, 0.2)
expect { product.price_with_discount(product.price, product.discount_rate) }.to raise_error(ArgumentError, "Price must be a positive number")
end
end
context "when given a price less than 0" do
it "raises an ArgumentError with an appropriate message" do
product = Product.new("Test Product", -100, 0.2)
expect { product.price_with_discount(product.price, product.discount_rate) }.to raise_error(ArgumentError, "Price must be a positive number")
end
end
context "when given a nil discount rate" do
it "raises an ArgumentError with an appropriate message" do
product = Product.new("Test Product", 100, nil)
expect { product.price_with_discount(product.price, product.discount_rate) }.to raise_error(ArgumentError, "Discount rate must be a float between 0 and 1")
end
end
context "when given a discount rate less than 0" do
it "raises an ArgumentError with an appropriate message" do
product = Product.new("Test Product", 100, -0.2)
expect { product.price_with_discount(product.price, product.discount_rate) }.to raise_error(ArgumentError, "Discount rate must be a float between 0 and 1")
end
end
context "when given a discount rate greater than 1" do
it "raises an ArgumentError with an appropriate message" do
product = Product.new("Test Product", 100, 1.5)
expect { product.price_with_discount(product.price, product.discount_rate) }.to raise_error(ArgumentError, "Discount rate must be a float between 0 and 1")
end
end
end
end
一次测试有效输入,五次测试无效输入。所有六个工作,我不必写他们!
代码审查
Copilot X 的一项功能是Copilot for Pull Requests。以下是一些主要功能:
模板扩展——利用 Copilot 填写您的 PR 模板并解释代码
Gentest – 根据 Copilot 的分析为您的代码生成测试
幽灵文本——在您输入 PR 时接收建议
语音驱动开发
Copilot Voice 以前称为“嘿,Github!”,允许您使用自然语言提示与您的代码进行交互。它看起来令人印象深刻,拥有以下功能:
编写/编辑代码——使用语音控制触发 Copilot 代码建议
代码导航——无需键盘或鼠标即可导航文件
控制 IDE——触发任何 VS Code 命令
代码摘要——获取代码块的摘要
概括
GitHub 正在通过其 Copilot 扩展套件快速生成革命性的开发人员生产力工具。它增加了我在编程中的乐趣,减少了我花在令人麻木的任务上的时间。我鼓励您跟踪 Copilot 的改进,因为它们正在迅速发生。

