DevGang
Авторизоваться

Как использовать 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 Голосовой помощник Да

Примечания:

  1. Эта информация актуальна на момент написания этой статьи, но, вероятно, изменится по мере развития этих продуктов на GitHub.
  2. Я еще не получил доступ к 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, как только появится предложение.

Запрос на комментарий в Ruby, который Copilot использует для создания метода и вызова
Запрос на комментарий в Ruby, который Copilot использует для создания метода и вызова

Продвинув завершение кода еще на один шаг вперед, 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. Вот ответ...

Вот объяснение кода выше:

  1. Мы определяем маршрут с путем маршрута /products/:id. Двоеточие : в пути указывает, что это параметр маршрута. Значение параметра маршрута будет доступно в req.params. Например, если путь маршрута — /products/:id и мы делаем запрос к /products/5, то значение req.params будет {id: 5}.
  2. Мы получаем идентификатор из 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 Labs «Исправить ошибку»
Функция кисти Copilot 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. Нам нужен код, чтобы сделать это:

  1. Убедитесь, что price является целым числом или числом с плавающей запятой (не нулем)
  2. Убедитесь, что price не является отрицательной
  3. Убедитесь, что discount_rate является числом с плавающей запятой (не нулем)
  4. Убедитесь, что 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 не соответствуют требованиям. Кроме того, мы можем захотеть протестировать следующее:

  1. price без discount_rate
  2. price с разумной discount_rate (например, 10% скидка)
  3. 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, опробовав описанные выше варианты использования, и я думаю, вы будете удивлены тем, как они повлияют на вашу продуктивность и счастье.

Источник:

#React #GitHub
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

В этом месте могла бы быть ваша реклама

Разместить рекламу