Как использовать GitHub Copilot, чтобы стать более продуктивным разработчиком
На рынке появляется ряд инструментов ИИ для разработчиков. Но, на мой взгляд, GitHub Copilot стоит выше всех остальных благодаря удобству использования, бесшовной интеграции с IDE и значительному повышению производительности труда разработчиков.
Copilot предлагает множество инструментов искусственного интеллекта, которые радикально упростили мой опыт разработчика программного обеспечения. Я использовал его для создания кода, тестов и даже простых приложений. Он также отлично подходит для отладки, рефакторинга и документирования существующего кода.
Как ни странно, использование Copilot заставило меня разрабатывать функции быстрее, чем заинтересованные лица из бизнеса могут их просматривать.
Важно отметить, что инструменты искусственного интеллекта, включая Copilot, могут быть откровенно неверными, извиняться (или нет) при исправлении, а затем уверенно выдавать ту же ошибку. Но если вы знаете о недостатках инструментов ИИ и обладаете достаточными знаниями в области кодирования, чтобы распознавать их ошибки, вы можете смягчить их на пути к существенному повышению производительности.
Как настроить GitHub Copilot
Для настройки и базового использования Copilot ознакомьтесь с документацией. Вы можете добавить Copilot к индивидуальной или корпоративной учетной записи, и после пробного периода предоставляется бесплатная пробная версия и разумные цены.
После добавления Copilot в свою учетную запись GitHub вам потребуется установить плагины для вашей IDE и войти в GitHub, чтобы получить доступ к Copilot.
В этой статье мы будем использовать следующие расширения для Visual Studio Code:
Расширения GitHub | Описание | Предварительный просмотр |
Copilot | Нет | |
Copilot Nightly | Ночная сборка Copilot, включающая последние изменения | Нет |
Copilot Labs | Экспериментальные функции на боковой панели | Да |
Copilot Chat | Интерактивный чат на боковой панели, часть Copilot X | Да |
Copilot Voice | Голосовой помощник | Да |
Примечания:
- Эта информация актуальна на момент написания этой статьи, но, вероятно, изменится по мере развития этих продуктов на GitHub.
- Я еще не получил доступ к Copilot Voice или Copilot (X) для Pull Requests, поэтому мое мнение о них ограничено и основано на предварительных документах GitHub.
Конфиденциальность
Прежде чем перейти к некоторым ключевым вариантам использования Copilot, небольшое замечание о конфиденциальности: В принципе, если вы доверяете GitHub размещать свой исходный код, вы, вероятно, можете доверять тому, что они делают с вашими подсказками Copilot и фрагментами кода. [Смотрите их FAQ документы и заявление о конфиденциальности.]
Примеры использования GitHub Copilot
Примеры использования GitHub Copilot многочисленны, особенно когда вы добавляете функции предварительного просмотра Labs, Chat и Voice. Использование функций Copilot действительно может упростить процесс разработки.
Вот несколько отличных способов использования расширений Copilot:
Категория | Расширения |
Генерация кода | Copilot, Copilot Nightly, Copilot Voice |
Объяснение кода | Copilot Labs, Copilot Chat, Copilot Voice |
Языковой перевод | Copilot Labs, Copilot Chat |
Отладка | Copilot Labs, Copilot Chat |
Рефакторинг | Copilot Labs, Copilot Chat<br> |
Генерация теста | Copilot, Copilot Nightly, Copilot Labs, Copilot Chat |
Обзоры кода | Copilot Chat |
Голосовое управление | Copilot Voice |
Генерация кода
Copilot известен своими функциями завершения кода. Если в коде есть комментарий или вы вводите начало строки кода, Copilot предложит решение, которое вы можете принять, проигнорировать или изучить альтернативы. Это называется «призрачный текст».
Если у вас установлено расширение Copilot и вы вошли в систему, завершить выполнение кода так же просто, как ввести инструкции и нажать клавишу Tab, как только появится предложение.
Продвинув завершение кода еще на один шаг вперед, Copilot Chat может принимать одну подсказку и генерировать инструкции для создания всего приложения.
Я попросил его создать REST API в Node с функциями CRUD для «продуктов», и он сгенерировал функциональный код. Впечатляет в целом. Получив ту же подсказку, ChatGPT также дал мне инструкции по запуску кода, что было приятно.
Copilot Voice также может писать или редактировать код на основе голосовых команд. В большинстве случаев использование клавиатуры с автодополнением кода Copilot быстрее, чем диктовка строк кода с помощью голоса. Но стоит задуматься об использовании Copilot Voice для создания и запуска кода без необходимости печатать или смотреть на экран.
Объяснение кода
Мне часто приходится смотреть на экран, чтобы понять, что делает блок кода. Иногда это устаревший код, бизнес-контекст которого я не понимаю. Иногда он использует определенную библиотеку, к которой я не привык. Иногда я проклинаю человека, который это написал, даже если это я.
Ниже приведен некоторый код, сгенерированный Copilot Chat из моей подсказки «REST API в Node...» сверху:
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
и находим продукт с заданным идентификатором из массива продуктов. Если продукт с данным идентификатором существует, мы возвращаем его. В противном случае мы отправляем ответ об ошибке 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 и чат делают это довольно легко. Вот массив продуктов на JavaScript и Ruby, преобразованных Copilot:
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 исправлять ошибки делает меня еще более счастливым и волосатым.
Вы также можете дать Copilot Chat сообщение об ошибке без каких-либо других подсказок, и он может сообщить вам о проблеме. Я произвольно удалил точку из кода Node REST API:
products[productIndex] = { id, ..req.body };
Я скопировал/вставил сообщение об ошибке в чате, и он ответил...
Глядя на предоставленный вами отрывок кода, кажется, что проблема заключается в строке 49, где есть синтаксическая ошибка в литерале объекта. «..» перед req.body
вызывает ошибку. Вместо двух точек должна быть одна.
Это и правильно (строка и источник ошибки), и неправильно (что должна быть только одна точка). Затем он дал мне фрагмент кода с тремя точками, что тоже правильно.
Как я уже упоминал в начале, вы должны перепроверить работу ИИ. Тем не менее, я впечатлен способностью Copilot анализировать сообщение об ошибке, описывать, что, по его мнению, является неправильным, и предлагать исправление.
Рефакторинг
Еще один отличный вариант использования — рефакторинг. Рассмотрим код ниже:
def price_with_discount
price - (price * discount_rate)
end
Этот простой расчет цены не учитывает nil
значения, строки, которые должны быть числами, или разумные значения для price
или discount_rate
. Нам нужен код, чтобы сделать это:
- Убедитесь, что
price
является целым числом или числом с плавающей запятой (не нулем) - Убедитесь, что
price
не является отрицательной - Убедитесь, что
discount_rate
является числом с плавающей запятой (не нулем) - Убедитесь, что
discount_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
price
с разумнойdiscount_rate
(например, 10% скидка)price
с 100%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-шаблона и объяснения кода
- Генерация теста — создавайте тесты для своего кода на основе анализа Copilot
- Призрачный текст — получайте предложения, пока вы печатаете PR
Голосовое управление
Ранее известный как «Привет, Github!», Copilot Voice позволяет вам использовать подсказки на естественном языке для взаимодействия с вашим кодом. Выглядит впечатляюще, имея такие возможности
- Запись / редактирование кода — используйте голосовое управление, чтобы вызывать предложения Copilot
- Навигация по коду — перемещайтесь по файлу без клавиатуры или мыши
- Управление IDE — запускайте любую команду VS Code
- Обобщение кода — получайте сводки по блокам кода
Резюме
GitHub быстро создает революционные инструменты для повышения производительности труда разработчиков благодаря набору расширений Copilot. Это доставляет больше удовольствие от программирования и сокращает время, затрачиваемое на утомительные задачи. Я бы посоветовал вам следить за улучшениями Copilot, так как они происходят быстро.
Не обращайте внимания на кликбейтные обещания «10-кратного повышения производительности», но не игнорируйте исследование влияния Copilot на продуктивность и счастье разработчиков.
Потратьте некоторое время на инструменты Copilot, опробовав описанные выше варианты использования, и я думаю, вы будете удивлены тем, как они повлияют на вашу продуктивность и счастье.