GitHub Copilot — один із ШІ-інструментів, які змінюють підходи розробників до щоденного кодування. Він допомагає прискорити робочі процеси, однак, як будь-яка нова технологія, викликає чимало критики та непорозумінь: чи правда дає оптимізацію до 55%, як заявляють у компанії? Олексій Румянцев, Максим Драгомірецький та Олесь Марола, розробники компаній з екосистеми Genesis, діляться кейсами використання GitHub Copilot на фронтенді та бекенді, а також лайфхаками, як бути продуктивнішим із допомогою цього інструменту. Вони також розповіли, як не можна використовувати Copilot, як запобігти витоку конфіденційної інформації, та як він працює в сторонніх програмних середовищах.
> Що далі
Що таке GitHub Copilot
GitHub Copilot — ШІ-інструмент для розробників, який працює в IDE. Він надає підказки автодоповнення та генерує фрагменти коду, використовуючи систему OpenAI Codex, розроблену Microsoft. Copilot підтримує всі популярні мови програмування та фреймворки, а також інтегрований у різні середовищами розробки (Visual Studio Code, JetBrains, Neovim, Visual Studio, Azure Data Studio тощо). Модель навчається на базі відкритих репозиторіїв GitHub — найбільшого осередку вихідного коду світу, який налічує понад 100 млн розробників.
Основні функції GitHub Copilot включають:
автоматичне доповнення коду;
підказки для використання API та бібліотек;
документацію для функцій та класів;
виявлення потенційних помилок;
створення тестів тощо.
Бета-версія GitHub Copilot зʼявилася в липні 2021 року. У дослідженні 2022 року в компанії заявили, що розробники приймають у середньому 30% пропозицій інструменту. В останньому звіті цей показник зріс до 55%.
GitHub Copilot позиціонують як продукт, що виконує нецікаві рутинні завдання, дозволяючи розробникам фокусуватися на високорівневих завданнях. Його творці не планували замінити розробників і не передбачали виконання завдань зі складною логікою, проте з кожним новим продуктом його можливості зростають. Так, Copilot Labs пропонує функції рефакторингу та автоматичної документації, перекладу та пояснення коду, а також покращену функцію генерації тестів, Copilot X — автоматичну генерацію pull-реквестів та чат із підтримкою GPT-4. Компанія відкриває доступ до нових продуктів спочатку для середовища Visual Studio Code, а після офіційного релізу — для всіх інших IDE.
Як використовувати GitHub Copilot
Щоби розпочати роботу з Copilot, потрібно встановити плагін в IDE та пройти автентифікацію за допомогою логіна GitHub. Часто розробники починають тестувати інструмент у пустому проєкті, коли він взагалі не розуміє контексту, тому якість пропозицій досить низька. Наприклад, якщо ми відкриємо пустий проєкт і почнемо вводити console.log, він запропонує рішення для найпоширенішої задачі «Hello, world». Натомість Copilot навчається не тільки на відкритих репозиторіях, але й на коді розробника. Чим довше ним користуєшся, тим більш релевантні пропозиції він надає. Так, якщо одразу відкрити робочий проєкт і почати писати назву функції, Copilot проаналізує код навколо й запропонує варіанти реалізації.
Якщо інструмент генерує нерелевантні пропозиції, можна залишити коментар і пояснити, що має виконувати код, або сформулювати конкретний запит. Таким чином розробник виконує роль оператора, який ставить задачі, перевіряє рішення, приймає або відхиляє їх.
Плюси GitHub Copilot
Прискорення розробки.
Швидке створення прототипів програмного коду для експериментів та валідації ідей.
Спрощення рутинних завдань, таких як генерація шаблонного коду або документації.
Підтримка багатьох мов та фреймворків.
Мінуси GitHub Copilot
Код не завжди працює і не тестується інструментом.
У коді трапляються критичні помилки та вразливості.
Якщо розробник не розуміє, як працюють згенеровані рішення, це може бути шкідливо.
Ліцензійна політика GitHub Copilot та непрозора схема збереження даних.
Інструмент не завжди розуміє специфічні вимоги та контекст проєкту.
Кейси використання GitHub Copilot на фронтенді та бекенді
Уперше спробував GitHub Copilot, коли він тільки викотив безкоштовну бета-версію та був доволі «сирим». Перші враження були приємні, але його адаптивність до синтаксису та зчитування контексту проєкту не зовсім відповідають можливостям, заявленим у рекламі.
На мою думку, одна з його найбільших проблем — те, що він навчається на публічних кодових базах, які не завжди містять якісний код. За моїми спостереженнями, у 2 з 10 випадків він дає нерелевантні пропозиції. Здебільшого він пропонує не вивірені продумані рішення, а перше-ліпше, що буде працювати. Це наче трейні, якому ви можете довірити найпростіше, а потім маєте ретельно перевірити виконання.
Я рідко прошу Copilot створити функцію, метод чи цілий клас, адже на перевірку і виправлення його пропозицій піде більше часу, ніж на написання власноруч. Користуюся ним виключно для вирішення рутинних завдань — прописування полів, написання інтерфесів, коли потрібно перенести код з одного місця в інше, та для написання коментарів — у цих випадках Copilot чудово зчитує контекст.
Я б не радив користуватися ним, як основним інструментом для написання коду.
Скоріше це допоміжний інструмент, який інколи дозволяє зекономити час та прискорити виконання рутинних завдань. Загалом він економить до 10% мого часу, що теж є непоганим результатом.
Усі розробники періодично гуглять базову інформацію, наприклад, функції або RegEx для форматування чи пошуку. На мою думку, ШІ-інструмент економить час саме на ручний пошук та прямий перехід у Google, GitHub чи Stackoverflow. Наприклад, можна залишити коментар створити регулярний вираз, який прибирає пробіли, натиснути Enter, і він одразу запропонує вираз або функцію з ним. Це дуже зручно!
Також я використовую Copilot для створення статичних обʼєктів, генерації коментарів, переносу статичних даних із дизайну та багатьох інших рутинних завдань. Наприклад, мені потрібен масив, для якого вже є заготовки та дані, тоді пишу коментар створити обʼєкт, і він виконує. Думаю, якщо зараз Copilot перестане працювати, у мене виникне дисонанс, адже тепер всю цю дрібну рутину треба писати самому.
Щоби Copilot коректно працював, найкращий лайфхак — добре розуміти, що саме ти хочеш отримати та лаконічно та поетапно формулювати завдання. Не варто просити видати одразу готовий результат.
Трапляються моменти, коли Copilot конфліктує з IDE та редактором. Це неприємно, але цей інструмент настільки добре прискорює мою роботу, що це здається несуттєвим.
Вважаю, що GitHub Copilot може бути корисним для джунів, якщо підходити до його використання відповідально. Так само як не варто копіювати першу ліпшу відповідь зі Stackoverflow, треба ретельно аналізувати та розбиратися, що пропонують ШІ-інструменти.
Приклад генерації методу видалення зайвих пробілів із допомогою ШІ:
Найчастіше я використовую GitHub Copilot для роботи з DI-контейнером. У ньому ми прописуємо всі наявні компоненти та сервіси, які створюють залежності між собою, і конфігуруємо це в спеціальних файлах. Це завдання — суцільний бойлерплейт, адже ти мусиш вказати залежності при написанні сервісу, потім — у конфігураційному файлі. А якщо це загальні інтерфейси, потрібно ще додатково вказати конкретну реалізацію.
Таких сервісів — багато: великих і маленьких, з різними залежностями. До того ж у цій рутині можна помилитися і випадково поміняти місцями компоненти, що додасть нових проблем. Раніше це вимагало багато ручної роботи, зараз цю рутину виконує Copilot. Усе, що мені потрібно зробити — зайти в конфігураційний файл і натиснути одну кнопку. Далі він сам пропонує встановити залежності та зібрати із цих компонентів той сервіс, який мені потрібен.
Також копайлот непогано вміє доповнювати код при написанні методу, який імплементує якусь маленьку частину великої логіки. Це відбувається за умов вдалої назви для методу, щоби ШІ зміг зрозуміти, які аргументи він має приймати.
Я випробував його на написанні юніт-тестів для функцій, але результат мені не сподобався. По-перше, кожен пише тести по-різному, і для того, щоб він писав їх у твоєму стилі, йому потрібно спочатку показати, як це робити. Також він виконує це завдання максимально стандартно. І найскладніше — після генерації десятків тестів, треба в них розібратися та впевнитися, що вони працюють. Отже, це не дуже економить час.
У великих фрагментах коду буде важко відловити баги, адже пропозиція Copilot може містити приховану логіку. Якщо це не базова задача, на кшталт порахувати числа Фібоначчі, а стосується складної бізнес-логіки, краще зробити її власноруч. Щоби Copilot справді економив час, треба делегувати йому лише повторювані бойлерплейт-завдання.
Не згоден, що раціональне використання ШІ-інструменту призводить до деградації розробників. Рутинні завдання, з якими допомагає Copilot, не сприяють навчанню чи прокачуванню якихось навичок — хіба що тайпінгу по клавіатурі. Натомість у розробників з’являється більше часу для цікавих високорівневих задач.
Приклад роботи з DI-контейнером:
Спочатку Copilot створює аргументи у useFactory в такому ж порядку, як вказано в Inject-масиві. Далі він пропонує створити PaymentsService з усіма цими параметрами на своїх місцях. Це не тільки значно швидше, ніж писати вручну, але і значно безпечніше.
Приклад написання невеликої функції з розумінням загальному контексту та інтерфейсів сервісів:
Чи безпечний GitHub Copilot: ліцензії та збереження даних
У користувачів виникає чимало питань щодо безпеки використання GitHub Copilot. Відомо, що він зберігає згенерований код для навчання, але як використовує його? Кому насправді належать права на згенерований код?
У листопаді 2022 року користувачі подали в суд за порушення GPL-ліцензії з вимогою компенсації $9 млрд. Компанія зізналася, що до терабайтів датасету для навчання моделі увійшли всі публічні репозиторії на GitHub без обмежень. Своєю чергою команда GitHub Copilot запевнила, що не копіює фрагменти коду, а відтворює оригінальний код на базі отриманих даних.
Однак у спільноти є питання, як зберігається код, який GitHub парсить для навчання, та чи не може він потрапити в руки зловмисників. «Достеменно невідомо, яка саме інформація з вашого проєкту відправляється на сервери GitHub, адже фактично в нього є доступ до всієї локальної інформації, у тому числі .env-файлів, — ділиться Олексій Румянцев. — Користуючись цим інструментом, треба максимально відгороджувати усю чутливу інформацію, не відкривати поруч файли із секретами та креденшиалами».
Доступ до .env-файлів може призвести до витоку чутливої інформації, такої як паролі, ключі доступу, токени й інші конфіденційні дані. Щоби цьому запобігти, рекомендується не додавати .env-файли до репозиторію та включити їх до файлу .gitignore, щоб їхній вміст не зберігався в системі керування версіями. Розробнику краще заборонити GitHub Copilot доступ до системи керування версіями. Варто також шифрувати конфіденційні дані, перш ніж зберігати їх у .env-файлах, та подбати про аудит доступу.
Загалом, GitHub Copilot — це інструмент, який полегшує роботу, але відповідальність за безпеку залишається на розробниках. Необхідно завжди перевіряти та тестувати генерований код на вразливості.
Лайфхаки роботи з Copilot
Розбийте завдання на етапи та робіть прості конкретні запити. Дозвольте GitHub Copilot генерувати код після кожного кроку, а не просіть його створити великий фрагмент одразу. На відміну від ChatGPT, де промпт може містити багато повідомлень та ітерацій уточнень, у базовому Copilot такої можливості немає — промпт у коментарях до коду має бути максимально коротким.
Наведіть приклад. Такий підхід корисний на початку роботи з інструментом. Наприклад, створюючи юніт-тести, можна відкрити файл із тестами в сусідній вкладці. Так Copilot швидше зрозуміє контекст та стиль написання, а не виконуватиме задачу, як йому заманеться.
Слідкуйте за відкритими вкладками в IDE. GitHub Copilot використовує техніку навчання «сусідні вкладки», яка дозволяє йому контекстуалізувати ваш код, обробляючи всі відкриті файли. Наприклад, працюючи із сервісом, можна відкрити конфігураційний файл, щоби Copilot зрозумів його залежності. Розробники GitHub Copilot рекомендують тримати відкритими 2–3 вкладки, які допоможуть інструменту контекстуалізувати код. Водночас при роботі з Copilot не рекомендується тримати відкритими файли із конфіденційною інформацією.
Використовуйте хороші практики кодування. Структурований код, надання описових імен змінних, методів і функцій, а також дотримання стилів та шаблонів сприятимуть релевантним пропозиціям ШІ.
Якщо інструмент не реагує на коментар, почніть самостійно виконувати своє завдання, написавши кілька літер. Так Ші зорієнтується, що саме вам потрібно й надать вдалу пропозицію.
Що далі
Щороку на ринку зʼявляються нові ШІ-інструменти з розумними чатами, автодоповненням коду, підготовкою документації та виправленням помилок. Ймовірно, можна очікувати, що скоро аналоги Copilot будуть «прикручені» до кожної IDE. Розробникам важливо знати, як користуватися цими інструментами та слідкувати за новинками ринку, щоби тримати себе в тонусі. Правильне використання ШІ робить їх продуктивнішими, тому не можна ігнорувати розвиток цих технологій.
Популярні ШІ-інструменти для розробки:
Нідерландський розробник Гвідо ван Россум, автор мови програмування Python, використовує GitHub Copilot щодня. В Lex Fridman Podcast він стверджує: «хіба розробники втрачають роботу, використовуючи Stackoverflow? Я так не думаю. Це просто допомагає справитися з нудною рутиною. Проте ви не маєте використовувати Copilot в речах, у яких ви погано розумієтеся. Такий інструмент потрібен для завдань на кшталт «нагадай мені, як я це робив». Це лише асистент, який економить час на тайпінгу, але вся креативна робота та прийняття рішень — за вами».
Kommentarer