Узнаем, как GitHub Copilot повышает эффективность работы инженеров из GitHub, позволяя автоматизировать повторяющиеся задачи, сохранять концентрацию и многое другое.
Совсем недавно я занимался разработкой новой фичи для чата GitHub Copilot. Моя задача заключалась в том, чтобы чат мог распознавать зависимости проекта пользователя — это позволило бы ему давать умные ответы на вопросы пользователя. Я мог просто перечислить зависимости проекта и считать задачу выполненной; но я знал, что для извлечения высококачественных ответов из этих больших языковых моделей нужно быть осторожным — чтобы не перегрузить промпт и не сбить модель с толку, передав ей слишком много контекста. Это вызывало необходимость в предварительной обработке списка зависимостей и выборе наиболее релевантных для включения в промпт.
На создание пригодных для машинной обработки форматов для самых известных фреймворков на разных языках программирования ушли бы дни. И в это время я обратился к Copilot.
Я просто сделал запрос в чате своей IDE:
Посмотри на выбранную структуру данных и создай не менее 10 примеров, соответствующих этой структуре данных. Данные должны охватывать самые известные фреймворки для языка программирования Go.
Это была моя первая партия зависимостей, поддающихся машинной обработке. Всего через 30 минут я собрал полную коллекцию значимых зависимостей почти для всех поддерживаемых языков, дополненную параметризованными модульными тестами. Выполнение этой задачи без GitHub Copilot заняло бы несколько дней, поэтому полчаса было отличным результатом.
Это заставило меня задуматься: а какой удачный опыт с Copilot получали мои коллеги в GitHub? В этой небольшой статье рассмотрим несколько ситуаций, в которых мы используем GitHub Copilot.
1. Полуавтоматизация повторяющихся задач
Полуавтоматизация повторяющихся задач — это тема, которая нашла отклик у моего коллеги из другой команды. Он рассказал, что им было поручено разрабатывать и поддерживать несколько живых сервисов, многие из которых используют протокольные буферы для передачи данных. Во время обслуживания они часто сталкиваются с ситуацией, когда им нужно увеличить идентификационные номера в определениях protobuf, как показано в приведенном ниже фрагменте кода:
protobuf
google.protobuf.StringValue fetcher = 130
[(opts.cts_opt)={src:"Properties" key:"fetcher"}];
google.protobuf.StringValue proxy_enabled = 131
[(opts.cts_opt)={src:"Properties" key:"proxy_enabled"}];
google.protobuf.StringValue proxy_auth = 132
[(opts.cts_opt)={src:"Properties" key:"proxy_auth"}];
Он особенно ценит наличие в редакторе GitHub Copilot completions для этих задач. Это значительно экономит время, избавляя от необходимости вручную генерировать идентификационные номера. Вместо этого можно просто переходить по вкладке с предложениями о завершении до тех пор, пока задача не будет выполнена.
2. Избегание отвлекающих факторов
Вот ещё один любопытный пример использования, о котором мне рассказал коллега. Ему нужно было разработать регулярное выражение для перехвата блока кода Markdown и извлечения идентификатора языка. Полностью погрузившись в работу, он предпочёл не прерывать её, переключившись на чат, хотя это могло бы дать решение. Вместо этого он применил творческий подход, формализовав свою задачу в комментарии к коду:
// Приведённая строка содержит блок кода с идентификатором языка.
// Создайте regexp, который соответствует блоку кода и захватывает идентификатор языка.
// Используйте тегированные группы захвата для языка и кода.
Это побудило GitHub Copilot сгенерировать регулярное выражение в качестве последующего утверждения в редакторе:
После удаления комментария задача была быстро решена.
3. Структурирование заметок, связанных с данными
Один из наших инженеров технической поддержки поделился случаем, с которым она с коллегой столкнулись на прошлой неделе. Это была пятница, и они пытались устранить неполадку у конкретного клиента. В итоге они нашли решение, создавая различные заметки в VSCode. И поскольку в GitHub мы отдаём приоритет удалённому сотрудничеству, просто решить задачу было недостаточно — необходимо было также проинформировать наших коллег о процессе, чтобы обеспечить наилучший опыт для будущих запросов клиентов. Поэтому, после выполнения этой сложной задачи им нужно было задокументировать, как они пришли к решению.
Коллега запустила GitHub Copilot Chat и просто набрала что-то вроде: «Организуй мои заметки, структурируй их и собери данные в редакторе в таблицы Markdown». Задача была выполнена в течение считанных секунд, и они со спокойной душой пошли отдыхать.
4. Изучение и обучение
Совершенствование имеющихся навыков и приобретение новых — неотъемлемая часть пути каждого инженера. Джон Берриман, мой коллега, решил использовать GitHub Copilot для решения нетривиальной задачи по кодированию на совершенно незнакомом ему языке программирования. Его целью было изучить язык Rust, и в воскресенье он приступил к этой работе с помощью чата GitHub Copilot. Задача заключалась в разработке программы, способной преобразовывать любые числовые данные в их письменный эквивалент на английском языке. Изначально кажущаяся простой, эта задача оказалась сопряжена с различными сложностями, такими как работа с числами
teen
, соглашения об именовании десятков, размещение «и» в выводе и многое другое.Спустя 23 минуты и 9 секунд он успешно создал функциональную версию, написанную на Rust, несмотря на отсутствие опыта работы с этим языком. Примечательно, что он документировал процесс на протяжении всей работы.
Берриман использует старую экспериментальную версию GitHub Copilot для написания программы на Rust:
gudvinr
Бесплатно и, вероятно, с нарушением лицензий, на которых обучался :)