Блог

Всички статии

Код-ревю с помощта на ИИ

В съвременния свят се появяват все повече инструменти, системи и подходи, които с помощта на ИИ помагат да се автоматизира, а в някои случаи и изцяло да се измести човешкото участие. Естествено, в IT-сферата има много ниши, където ИИ вече е оставил следа. Една от тези ниши ще разгледаме заедно.

Казвам се Александър, вече повече от 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_whitespacePylint 

Pylint

Тази услуга поддържа работа само с код, написан на Python, така че не успях да проведа експеримента и да оценя работата му.

ESLint

Тази услуга поддържа работа само с код, написан на JS и подобни езици, така че не успях да проведа експеримента и да оценя работата му.

Chat GPT 3.5

Име: Спазвате добри практики при наименованието на променливи и функции. Въпреки това, се опитайте да използвате по-информативни имена, за да бъде кодът по-разбираем. Например, toggleArgeementState има правописна грешка, трябва да бъде toggleAgreementState.

Зависимости: Имате няколко зависимости, като 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$/месец.
Не се интегрира в Git. Може да се вмъква само текст – не приема файлове.
Дава един от най-добрите анализи на кода.
3Сoderabbit12$/месец на разработчикGitHub, Gitlab. Проверява съществуващи и нови ПР.
Един от най-добрите резултати
4Codacy15$/месец на разработчикGitHub, Gitlab, Bitbucket. Проверява съществуващи и нови ПР.
Има голям дашборд с множество настройки и статистики.
Анализът е повърхностен, на ниво код стайл.
5DeepCode25$/месец за продуктGitHub, Bitbucket и CLI. Анализът е повърхностен, на ниво код стайл.
6Codeclimate16$ на разработчик на месецLishe за GitHub.
Не познавам нито един pomilok.
7DeepsourceОт 8$/месец на разработчикGitHub, Gitlab, Bitbucket. Може също така да прави сканиране на целия проект, но да не намери грешки
8SonarQubeОт 150$ на годинаGitHub, Gitlab, Bitbucket.
Не успях да проверя, тъй като беше необходимо да разположа сървърна инфраструктура.
Отзивите в интернет са положителни
9CodeBeat20$/месец на разработчикGitHub, Gitlab, Bitbucket.
Може да прави анализ на целия проект наведнъж.
Има собствен дашборд.Резултатите са средни.
10PylintБезплатноСамо за Python
11ESLint20$/месец на разработчикСамо за JavaScript и подобни езици
12HoundciОт 29$ за 50 ревютаИнтегрира се само в GitHub. Проверява само създадените нови ПР.
Резултатите са слаби – напомня на работата на SwiftLint.

Личен рейтинг

1-во място – Code Rabbit

  • интегрира се с популярни системи за управление на хранилища на код – GitHub, Gitlab
  • може да проверява не само нови пулл-реквести, но и съществуващи
  • оставя резултатите от проверката като коментари в самия пулл-реквест
  • направи един от най-добрите код ревюта. Намери следните моменти: посочи неизползвани променливи, предупреди за възможно излишно обявяване на променлива, предупреди за възможна логическа грешка при използване на общ ресурс Once, препоръка за по-добър подход с използване на таргет за бутон, указа логически бъг при използване на условен оператор IF, препоръка за използване на библиотека за работа с клавиатура поради текущата сложност на реализацията, забележки по използването на константи и модификатори на клас.

2-ро място – Chat GPT

  • считам за главното му предимство нивото на анализа, тъй като се оказа един от най-добрите. Намери следните моменти – грешки в имената, определи натовареността на класа и препоръча разделяне на отговорностите, даде препоръка за работа със зависимости, посочи възможно дублиране на код, направи препоръки за работа с клавиатура, анимации, реактивен подход и много други (вижте пълното описание по-горе)
  • основният недостатък е невъзможността за интеграция със системи за управление на хранилища на код. Кодът за анализ трябва да се вмъква ръчно. Също така липсва разбиране как Chat GPT може да управлява кода, който анализира.

3-то място – CodeBeat

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

Заключения

  • Повечето сервиси могат да се интегрират в GitLab като отделно приложение
  • Само два сервиса  проведоха сканиране на целия проект. Останалите работят само с ПР/МР
  • Половината  бяха отхвърлени, тъй като или не дадоха резултати, или бяха ориентирани само към един език (Python или JS)
  • Всички услуги предоставят безплатен тариф, но той е само за публични хранилища. За частни – тарифът е средно 15-30$ на месец за един разработчик
  • Повечето услуги дават повърхностни забележки само на ниво стил на кода – превишаване на дължината на класа/функцията/реда, десни/леви отстъпи и т.н.

В заключение, бих искал да кажа, че като цяло тези услуги могат да повишат ефективността на разработката и с развитието на ИИ този ефект ще бъде все по-осезаем.

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