У технічному комʼюніті багато дискусій, чи зможе ШІ замінити ту, чи іншу професію. Олена Кірічок, PHP-розробниця з девʼятирічним досвідом в українських, чеських та американських продуктових компаніях, пропонує подивитися на технологію Copilot через ігрову концепцію NPC та Main Character. Головний персонаж у відеогрі — центральна фігура в сюжеті, якою керує сам гравець. Цей персонаж може мати унікальні здібності, завчасно визначені розробниками або налаштовані гравцем. NPC (Non-Player Character) — це персонаж, яким гравець не керує. Він може бути союзником або ворогом, створювати виклики, надавати корисну інформацію, заважати головному герою або просто залишатися фоновим персонажем. Під час свого виступу на PHP fwdays’24 Олена поділилася досвідом використання Github Copilot для розробки PHP, порівняла цей інструмент з конкурентами та пояснила, чим вони кращі чи гірші за продукт Microsoft. Протягом презентації Олена також збирала аргументи, щоб відповісти на питання, яку роль у розробці відіграє Copilot: NPC чи головний герой?
Олена Кірічок також є менторкою та авторкою блогу UA Soft skills & Diversity Tech, партнеркою комʼюніті для жінок в ІТ Wtech в Празі.
Як працює GitHub Copilot
GitHub Copilot працює на основі моделі GPT-4o — це остання версія, натренована на даних до жовтня 2023 року. Copilot працює як проксі: аналізує запит, перевіряє його на токсичність, персональні дані та безпеку, після чого передає запит на модель. Модель обробляє його, а результат знову перевіряється на якість коду, дублювання з публічних джерел і вразливості.
Ключова навичка при роботі з Copilot — Prompt Engineering, вміння правильно формулювати запити. Щоб отримати потрібний результат, варто описувати ціль і конкретні вимоги: наприклад, написати SQL-запит, використовуючи конкретні таблиці й колонки. Крім того, краще розбивати запити на менші частини, додавати приклади і якомога більше контексту. Робота з Copilot схожа на пошук відповідей на Stack Overflow: чим точніше сформульований запит, тим кращим буде результат.
Загалом Copilot підходить для делегування рутинних завдань, як-от написання тестів або генерація конфігів, щоб звільнити час для більш важливих речей. Важливо пам'ятати, що Copilot бачить лише ті файли, які відкриті у вашому редакторі. Тому, якщо, наприклад, ви хочете отримати інформацію щодо файлу, потрібно тегнути його в чаті Copilot.
Не варто сліпо покладатися на Copilot. Перевірка згенерованого коду, аналіз його на відповідність проєкту, а також розуміння контексту — критично важливі. Найгірша практика — брати цей код і одразу пушити на продакшн.
Кейси використання
GitHub Copilot пропонує плагіни для різних IDE, таких як Visual Studio Code, PhpStorm та інші. У своїх прикладах я використовую плагін для PhpStorm. У ньому комунікація більше ведеться через чат. У Visual Studio користувач може обирати між чатом і інтерфейсом редактора залежно від завдання. Copilot також має CLI-версію, що дозволяє ефективно використовувати його в терміналі, наприклад, для генерації команд пошуку або прикладів використання Git.
Хороші практики
Правильна організація запитів. Важливо пам'ятати, що Copilot створює так звану «Персону» на основі вашого проєкту чи питання, тому слід забезпечити схожий контекст для різних завдань.
Використання Copilot під конкретні теми. Наприклад, якщо ви ставите питання з PHP, а потім хочете щось уточнити про JS, то краще для цього використовувати різні чати, щоби Copilot враховував контекст з історії.
Copilot бачить тільки відкриті файли, тому корисно використовувати коментарі та .copilotignore файл, щоби налаштувати доступ інструменту до певних файлів.
Назви файлів і методів мають бути зрозумілими та допомагати Copilot краще зрозуміти контекст.
Надання зворотного зв'язку на відповіді, щоби Copilot міг удосконалювати свої рекомендації.
Робота з config файлами
Корисна функція — команда Explain, яка дозволяє швидко отримати пояснення будь-якого коду чи конфігураційного файлу. Особливо зручно це при роботі з новими проєктами, де потрібно розібратися в документації або внести зміни в конфігурацію.
На прикладі нижче я застосувала цю команду до файлу config.yaml у старому Symfony-проєкті. Copilot розповів, які секції в цьому файлі за що відповідають, а також навіть підсвітив потенційні вразливості, пов’язані з чутливими даними.
Робота з Legacy
Команда Explain також корисна для аналізу методів або невеликих класів у Legacy-коді. Проблема з Legacy полягає в тому, що ці файли часто містять великі блоки коду, де методи можуть мати абсолютно різний функціонал. У таких випадках важливо надати Copilot більше контексту, щоби він правильно зрозумів, що саме ви хочете від конкретного методу. Наприклад, якщо метод виконує запит до бази даних через ORM або репозиторій, корисно відкрити для Copilot відповідний репозиторій.
Також Copilot добре справляється, з генерацією SQL-запитів у Legacy-коді, де часто використовується чистий SQL замість ORM. Цей інструмент може бути корисним, коли потрібно перевести код на новішу версію мови, створити тести або документацію.
Генерація коду
При роботі з генерацією коду за допомогою Copilot, особливо у випадку з Legacy-кодом, важливо залишати коментарі, а іноді навіть чітко описувати кроки, які ви збираєтесь виконати. Це допомагає Copilot уникати повторюваних і нерелевантних рядків коду. Крім того, слід додавати файли з подібними реалізаціями до контексту, щоб Copilot краще розумів завдання.
З мого досвіду, генерація коду, наприклад, для тестів краще працює через чат, тоді як інтерфейс редактора я використовую більше для нових проєктів, де контекст зрозуміліший.
Покриття тестами
Що стосується покриття тестів, обидва варіанти — чат і вікно редактора — можуть використовуватися одночасно. Наприклад, ви можете створити тести через чат, а потім редагувати файли з тестами у вікні редактора. Зазвичай, тести, згенеровані через чат, більш точні та відповідають поставленим вимогам.
Нижче приклад, як працювати з текстами через чат і через вікно редактору.
Звісно, не варто сліпо довіряти згенерованим тестам — їх завжди потрібно перевіряти й адаптувати під конкретний випадок.
Робота з Regex
Copilot також добре працює з регулярними виразами (Regex). Наприклад, він може згенерувати приклад Regex, пояснити його складові та запропонувати варіанти використання.
Недоліки
Основним недоліком Copilot вважають можливі галюцинації при роботі з великими файлами або новими технологіями. Наприклад, я використовувала Copilot зі Swagger (OpenAPI) для документації методів у контролерах. У випадку, якщо методи та їх документація схожі, Copilot працює добре. Проте при переході від Annotations до Attributes, я зіткнулася з численними галюцинаціями.
Ще один недолік — використання застарілих даних, які можуть не відповідати актуальному контексту.
VS Code vs PHPStorm
Перш за все, у VS Code та PHPStorm плагіни імплементовані по-різному. Це пов’язано з тим, що VS Code є продуктом Microsoft, а PHPStorm розроблений компанією JetBrains. Наприклад, у VS Code користувачі можуть вибирати, в якому контексті вони хочуть ставити питання — термінал, редактор коду або весь проєкт загалом. Відмінність PHPStorm — підписані команди, для чого вони використовуються.
Особливість VS Code полягає в тому, що користувач може просто виділити рядок або метод у вікні редактору й поставити питання безпосередньо щодо нього. У PHPStorm ж, користувач повинен скопіювати та тегнути файл у чаті, а потім ставити питання щодо конкретного методу.
Крім того, VS Code може давати кращі відповіді на питання, що стосуються коду, який схожий на той, що є в публічному доступі. Натомість у PHPStorm Copilot може просто повідомити про проблему, не надаючи контексту для її вирішення.
Copilot vs Supermaven vs Codeium
Окрім GitHub Copilot, на ринку також є інші продукти, такі як Supermaven і Codeium, які пропонують схожий функціонал: чат, автодоповнення та генерацію коду в редакторі. Вибір конкретного інструменту залежить від ваших потреб та вимог до безпеки. GitHub Copilot більше підходить, якщо ваша система вже інтегрована з GitHub.
Перевага Codeium в тому, що він безкоштовний для особистого використання. Цей інструмент використовує власну модель для генерації коду, але не надає детальної інформації про неї.
Supermaven дозволяє обирати модель для генерації коду, таких як GPT-4o або GPT-4 Turbo, що дозволяє підлаштовувати інструмент під різні потреби. Ціна для індивідуального та командного використання однакова.
Для більш об'єктивної оцінки, я протестувала ці три інструменти, давши їм декілька завдань.
Завдання №1. Покращити старий файл
GitHub Copilot:
виявив, що у проєкті неправильно використовуються методи, зокрема зазначив, що їх немає, хоча насправді це було не так;
запропонував змінити назву репозиторію на більш доречну, з чим я погоджуюся;
звернув увагу на метод getPattern, але не надав конкретних пропозицій.
Supermaven:
надав детальний список покращень, які можна внести до файлу, а також надав версію цього коду;
запропонував додати обробку можливих винятків, наприклад, з бази даних.
Codeium:
не надав детальних пояснень, натомість видав готовий файл з виправленнями;
змінив тільки метод getPattern, що було подібним на те, що зробив GitHub Copilot.
Завдання №2. Згенерувати тести до методу зі старого проєкту
GitHub Copilot:
не уточнював, які саме мені потрібні тести, а просто надав функціональний тест.
Supermaven:
надав детальні рекомендації щодо встановлення PHPUnit, якщо це необхідно.
запропонував, як покрити метод як юніт-, так і функціональними тестами.
Codeium:
згенерував тести та надав більше пояснень, за що відповідає кожен з них;
надав додаткову інформацію про функціональні тести.
Отже, що обрати:
GitHub Copilot — оптимальний вибір, якщо ваша робота вже інтегрована з GitHub, Однак, він часто не дає достатньо деталей для складних завдань.
Supermaven надає детальніші рекомендації, більше варіантів відповідей та пропонує глибший аналіз, що робить його чудовим інструментом для складних завдань.
Codeium — безкоштовний, але при цьому не поступається функціональністю іншим інструментам.
Використовуючи будь-який інструмент, важливо дотримуватись тих самих правил перевірки, як і для коду, написаного власноруч: виконувати перевірку коду, застосовувати лінтери тощо. Також не варто давати цим інструментам доступ до чутливої інформації. Користуйтеся файлом .copilotignore та памʼятайте про загальну інформаційну гігієну, яку ми використовуємо на просторах інтернету.
Отже, Copilot — це головний герой чи NPC? На мою думку, коли ми дотримуємось найкращих практик роботи з ним, він стає подібним до головного героя: ми можемо його налаштовувати, давати вказівки та контролювати. Так він допомагає нам краще виконувати свою роботу. З іншого боку, коли ми не надаємо йому достатньо контексту, не дотримуємося вимог безпеки, і у нього відбуваються галюцинації, тоді він більше схожий на NPC, який нам заважає досягти своїх цілей.
Commenti