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

У сучасному світі з’являється все більше інструментів, систем та підходів, які за допомогою ШІ допомагають автоматизувати, а в деяких випадках, взагалі замінити людську участь. Звісно, в ІТ-сфері є маса ніш, де вже відзначився ШІ. Одну з таких ніш ми з вами розберемо.
Мене звати Олександр, я вже понад 7 років працюю в NLT та одну із таких ніш, я спробую для вас розібрати. А саме, це автоматизація код-рев’ю.
На сьогодні існує кілька десятків сервісів на основі ШІ, які допомагають проводити код-рев’ю. Проаналізувавши рейтинги цих сервісів – можна виділити 12 найпопулярніших.
- Pluralsight
- Сoderabbit
- Codacy
- DeepCode
- Codeclimate
- Deepsource
- SonarQube
- CodeBeat
- Pylint
- ESLint
- Houndci
- Сhat GPT
Кожен із сервісів я протестував на основі невеликого проєкту для мобільної платформи 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 – переконайтеся, що всі кастомні компоненти мають чіткі інтерфейси і вони добре інтегровані в загальну архітектуру програми.
Робота з мережею та довгі операції: Немає згадок щодо обробки мережевих запитів або довгих операцій. Якщо такі є, переконайтеся, що ви правильно обробляєте асинхронні дзвінки, показуєте індикатори завантаження та обробляєте помилки.
| Сервис | Стоимость | Комментарий | |
| 1 | Pluralsight | 29$/місяць з продукта | Лише для Python |
| 2 | Сhat GPT | GPT – 3.5 – безплатно GPT – 4.0 – 20$/міс. | Не вбудовується в гіт. Вставляти можна лише текст – файл не приймає. Надає один з кращих аналізів коду. |
| 3 | Сoderabbit | 12$/місяць з розробника | GitHub, Gitlab. Перевіряє існуючі та нові PR. Один з кращих результатів. |
| 4 | Codacy | 15$/місяць з розробника | GitHub, Gitlab, Bitbucket. Перевіряє існуючі та нові PR. Має великий дашборд з багатьма налаштуваннями та статистикою. Аналіз поверхневий, на рівні стилю коду. |
| 5 | DeepCode | 25$/місяць з продукта | GitHub, Bitbucket та CLI. Аналіз поверхневий, на рівні стилю коду. |
| 6 | Codeclimate | Для приватних 16$ з розробника на місяць | Лише для GitHub. Помилок не знайшов. |
| 7 | Deepsource | Від 8$/місяць з розробника | GitHub, Gitlab, Bitbucket. Може також робити скан усього проєкт, але помилок не знайшов. |
| 8 | SonarQube | Від 150$ на рік. | GitHub, Gitlab, Bitbucket. Перевірити не вдалося через необхідність розгортання серверної інфраструктури. Відгуки в Інтернеті позитивні |
| 9 | CodeBeat | 20$/місяць з розробника | GitHub, Gitlab, Bitbucket. Може робити аналіз одразу всього проєкт Має власний дашборд. Результати середні. |
| 10 | Pylint | Безплатно | Лише для Python |
| 11 | ESLint | 20$/місяць з розробника | Лише для JavaScript та схожих мов |
| 12 | Houndci | Від 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 $ на місяць, за одного розробника.
- Більшість сервісів дають поверхневі зауваження лише на рівні – код стайлу – перевищення довжини класу/функції/рядки, праві/ліві відступи тощо.
На закінчення хотів би сказати що в цілому такі послуги здатні дати певний буст розробці й з розвитком ШІ цей буст буде все відчутнішим.
Автор Олександр Бондарь