Блог

Всі статті

Код-рев’ю за допомогою ШІ

У сучасному світі з’являється все більше інструментів, систем та підходів, які за допомогою ШІ допомагають автоматизувати, а в деяких випадках, взагалі замінити людську участь. Звісно, в ІТ-сфері є маса ніш, де вже відзначився ШІ. Одну з таких ніш ми з вами розберемо. 

Мене звати Олександр, я вже понад 7 років працюю в NLT та одну із таких ніш, я спробую для вас розібрати. А саме, це автоматизація код-рев’ю.

На сьогодні існує кілька десятків сервісів на основі ШІ, які допомагають проводити код-рев’ю. Проаналізувавши рейтинги цих сервісів –  можна виділити 12 найпопулярніших.

Кожен із сервісів я протестував на основі невеликого проєкту для мобільної платформи iOS. Я додав до нього новий пулл-реквест з великим файлом і для чистоти експерименту “пропустив” той самий пулл-реквест через усі сервіси. Це був файл В’юКонтроллера розміром 730 рядків, написаний на Swift. У ньому було достатньо логіки, анімацій та різного коду для того, щоб ШІ було де “розвернутися”. Також я додав кілька змінних до файлу, що не використовуються. 

Приклад: тестувати послуги в безплатному режимі можна було тільки з умовою того, що мій репозиторій повинен бути публічним. Цей файл я також вирішив взяти з публічного репозиторію, а не використовувати дані з комерційного проєкту. По-перше, NDA ніхто не скасовував, а по-друге, вирішив підстрахуватися, через те що у мене не було інформації, як ці сервіси можуть працювати/використовувати інформацію в безплатному режимі.

У ході експерименту я звертав увагу на такі аспекти роботи:

  • сумісність із системами управління репозиторіями коду
  • вартість
  • обмеження по мовах програмування
  • рівень аналізу коду

В результаті було зроблено узагальнену таблицю, з результатами по кожному з них, яка включає низку висновків та особистий рейтинг. Далі результати роботи кожного із сервісів.

Pluralsight

Даний сервіс підтримує роботу тільки з кодом написаним на Python, провести експеримент і оцінити його роботу не вдалося.

Сoderabbit

Codacy

Codeclimate

Deepsource

CodeBeat

Houndci

File Length Violation: File should contain 400 lines or less: currently contains 739 (file_length)

Trailing Whitespace Violation: Lines should not have trailing whitespace. (trailing_whitespace)

І ще 14 подібних зауважень про trailing_whitespace

Pylint

Цей сервіс підтримує роботу тільки з кодом написаним на Python, провести експеримент і оцінити його роботу не вдалося.

ESLint

Даний сервіс підтримує роботу тільки з кодом написаним на JS та йому подібних мовах, провести експеримент та оцінити його роботу не вдалося.

Chat GPT 3.5

Найменування: ви дотримуєтеся хороших практик у назві змінних та функцій. Однак, намагайтеся використовувати більш інформативні імена, щоб код був зрозумілішим. Наприклад, toggleArgeementState має друкарську помилку, повинно бути toggleAgreementState.

Поділ обов’язків: ваш контролер виконує безліч таких завдань як, відображення інтерфейсу, обробку введення користувача, управління станом і навіть взаємодію з вашою view model. Розгляньте поділ обов’язків та застосування патернів архітектури, таких як MVVM, щоб спростити керування кодом та тестування.

Залежності: у вас є кілька залежностей, таких як UIStackView, UIButton та UIViewControllerKeyboardHelper. По можливості, намагайтеся інжектувати залежності або використовувати інверсію управління, щоб зробити клас більш тестованим і уникнути жорсткої залежності від конкретних класів.

Обробка помилок: схоже, що у вашому коді немає обробки помилок. Розгляньте, як ви можете обробити помилки, які можуть виникнути в процесі роботи вашої програми, та надати користувачам інформацію про проблеми.

Дублювання коду: код має деяке дублювання. Наприклад, визначення обробників кнопок orgNameSelectButton та orgNameClearButton є схожими. Можна створити один метод для обох, щоб зменшити дублювання коду.

Керування клавіатурою: ваш код містить керування клавіатурою для поля введення. Розгляньте можливість використання бібліотек або патернів, які можуть зробити цей код більш узагальненим та легко використовуватися.

Версійність Swift: переконайтеся, що ваш проєкт налаштований та використовує актуальну версію Swift.

Обробка жестів: ваш код містить обробку жестів, таких як UITapGestureRecognizer. Переконайтеся, що ви правильно керуєте та звільняєте ресурси, пов’язані з цими жестами.

RxSwift: ви використовуєте RxSwift (Rx) для реактивного програмування. Переконайтеся, що ви правильно керуєте підписками, щоб уникнути витоку пам’яті.

Анімації: у вас є анімація показу та приховування елементів. Перевірте, що вони коректно керуються та анімуються, і що вони не призводять до втрати продуктивності.

Chat GPT 4.0

Назва та структура коду: FAThirdStepViewController – ім’я класу слідує загальним угодам, але мало що говорить про його функціональність. Спробуйте вибрати ім’я, яке краще визначає призначення контролера.

Всередині класу є безліч private lazy var, що нормально, але може ускладнити читання коду. Розгляньте можливість угруповання пов’язаних властивостей та їх ініціалізаторів у розширення, щоб покращити читаність.

Константи та літерали: Вкладені enum у Consts для угруповання пов’язаних констант – це гарний підхід, проте переконайтеся, що всі константи дійсно необхідні та використовуються. Константи, які використовуються лише один раз і не мають загального значення, можна визначити локально у місці їх використання.

Використання #imageLiteral застаріло, краще використовувати UIImage(named:) для покращення сумісності коду та підтримки різних ресурсів зображень.

UI елементи: ініціалізація UI елементів як lazy var – це звичайна практика, але переконайтеся, що lazy var дійсно потрібна для кожного елемента.

Розгляньте використання фабричних методів або виділення коду створення UI в окремі методи/розширення для кожного UI елемента, щоб зменшити обсяг коду в контролері та спростити його читання.

Множинне використання замикань: використання once.perform усередині обробників подій – це цікава ідея, але може ускладнити розуміння потоку коду. Переконайтеся, що це абсолютно необхідно і не призводить до несподіваної поведінки.

Робота з клавіатурою: keyboardConstraint ініціалізується, але його початкове значення не задається. Переконайтеся, що це не викликає проблем під час роботи з layout.

Робота з моделлю уявлення: делегування процесів у viewModel – відмінний підхід. Переконайтеся, що всі необхідні дії обробляються в моделі представлення і що спілкування з viewModel є чистим і зрозумілим.

Localizability: тексти зашиті прямо в код. Для підтримки локалізації їх слід виносити окремі файли локалізації.

Accessibility: переконайтеся, що компоненти UI підтримують доступність (accessibility), такі як підписи для читалок екрана, це не згадується в коді.

Кастомні UI компоненти: titleWithStepsView, Select, Input, DotsLoader, Buttons.Component.TextWithArrow, CheckBox – переконайтеся, що всі кастомні компоненти мають чіткі інтерфейси і вони добре інтегровані в загальну архітектуру програми.

Робота з мережею та довгі операції: Немає згадок щодо обробки мережевих запитів або довгих операцій. Якщо такі є, переконайтеся, що ви правильно обробляєте асинхронні дзвінки, показуєте індикатори завантаження та обробляєте помилки.

СервисСтоимостьКомментарий
1Pluralsight29$/місяць з продуктаЛише для Python
2Сhat GPT GPT – 3.5 – безплатно
GPT – 4.0 – 20$/міс.
Не вбудовується в гіт. Вставляти можна лише текст – файл не приймає.  
Надає один з кращих аналізів коду.
3Сoderabbit12$/місяць з розробникаGitHub, Gitlab. 
Перевіряє існуючі та нові PR. 
Один з кращих результатів.
4Codacy15$/місяць з розробникаGitHub, Gitlab, Bitbucket. 
Перевіряє існуючі та нові PR. 
Має великий дашборд з багатьма налаштуваннями та статистикою. 
Аналіз поверхневий, на рівні стилю коду.
5DeepCode25$/місяць з продуктаGitHub, Bitbucket та CLI. 
Аналіз поверхневий, на рівні стилю коду.
6CodeclimateДля приватних 16$ 
з розробника на місяць
Лише для GitHub. 
Помилок не знайшов.
7DeepsourceВід 8$/місяць з розробникаGitHub, Gitlab, Bitbucket. 
Може також робити скан усього проєкт,  але помилок не знайшов.
8SonarQubeВід 150$  на рік.GitHub, Gitlab, Bitbucket.
Перевірити не вдалося через необхідність розгортання серверної інфраструктури.
Відгуки в Інтернеті позитивні
9CodeBeat20$/місяць з розробникаGitHub, Gitlab, Bitbucket. 
Може робити аналіз одразу всього проєкт 
Має власний дашборд. 
Результати середні.
10PylintБезплатноЛише для Python
11ESLint20$/місяць з розробникаЛише для JavaScript та схожих мов
12HoundciВід 29$ за 50 рев’юВбудовується лише в GitHub. 
Перевіряє лише створені нові PR. 
Результати слабкі – нагадує роботу SwiftLint.

Особистий рейтинг

1-ше місце – Code Rabbit

  • вбудовується в популярні системи керування репозиторіями коду – GitHub. 
  • gtlab вміє перевіряти не лише нові пулл-реквести, а й існуючі.
  • результати перевірки залишає у вигляді коментарів у самому пулл-реквесті.
  • зробив один з найкращих код-рев’ю. Знайшов такі моменти: вказав на змінні, що не використовуються; попередження про можливе надмірне оголошення змінної; попередження про можливу логічну помилку з використанням загального ресурсу `Once`; рекомендація про кращий підхід з використанням таргету для кнопки; вказівку на логічний БАГ при використанні умовного оператора; рекомендація щодо використання бібліотеки для роботи з клавіатурою через поточну складність реалізації; зауваження щодо використання констант; модифікаторів класу.

2-е місце – Chat GPT

  • найбільшою перевагою вважаю її рівень аналізу. Приклад, він виявився одним із найкращих. Знайшов такі моменти – помилки в іменуваннях; визначив навантаженість класу та рекомендував розділити відповідальність; рекомендація по роботі із залежностями; вказав на можливе дублювання коду; зробив рекомендації щодо роботи з клавіатурою, анімаціями, реактивним підходом та багатьма іншими (див. повний опис вище).
  • основний недолік – неможливість інтеграції із системами управління репозиторіями коду. Код для аналізу необхідно вставляти вручну. Також немає розуміння – як Chat GPT може розпоряджатися кодом, який він аналізує.

3-тє місце – CodeBeat

  • вбудовується у більшість популярних систем керування репозиторіями коду – GitHub, Gitlab, Bitbucket.
  • має власний дашборд з безліччю інформації.
  • один з небагатьох сервісів, що робить аналіз усього проєкт, а не лише окремих пулл-реквестів.
  • рівень аналізу – середній. Може оцінювати як код-стайл, так і складність коду.

Загальні висновки

  • Більшість сервісів можуть вбудовуватися в GitLab у вигляді окремої програми.
  • Тільки два сервіси зробили сканування всього проєкту, інші працюють тільки з ПР/МР.
  • Половина послуг була забракована, взагалі не дала результатів або заточена лише під одну мову (Python or JS).
  • Всі послуги мають безплатний тариф, але він лише для громадських репозиторіїв. Для приватних — тариф у середньому 15-30 $ на місяць, за одного розробника.
  • Більшість сервісів дають поверхневі зауваження лише на рівні – код стайлу – перевищення довжини класу/функції/рядки, праві/ліві відступи тощо.

На закінчення хотів би сказати що в цілому такі послуги здатні дати певний буст розробці й з розвитком ШІ цей буст буде все відчутнішим.

Автор Олександр Бондарь