Блог

Все статьи

Код-ревью с помощью ИИ

В современном мире появляется всё больше инструментов, систем и подходов, которые с помощью ИИ помогают автоматизировать, а в некоторых случаях и вовсе заменить человеческое участие. Естественно, в 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_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. Проверяет существующие и новые ПР.
Один из лучших результатов.
4Codacy15$/месяц с разработчикаGitHub, Gitlab, Bitbucket. Проверяет существующие и новые ПР.
Имеет большой дашборд с множеством настроек и статистик.
Анализ поверхностный, на уровне код стайла.
5DeepCode25$/месяц с продуктаGitHub, Bitbucket и CLI. Анализ поверхностный, на уровне код стайла.
6CodeclimateДля приватных 16$
с разработчика в месяц
Только для GitHub. Ошибок не нашёл!!!
7DeepsourceОт 8$/месяц с разработчикаGitHub, Gitlab, Bitbucket. Может также делать скан всего проекта,
но ошибок не нашёл!!!
8SonarQubeОт 150$  в год.GitHub, Gitlab, Bitbucket.
Проверить не удалось т.к. нужно было развернуть серверную инфраструктуру.
Отзывы в интернете – положительные.
9CodeBeat20$/месяц с разработчикаGitHub, Gitlab, Bitbucket. Может делать анализ сразу всего проекта.
Имеет собственный дашборд.
Результаты средние.
10PylintFreeТолько для 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 or JS)
  • Все сервисы предоставляют бесплатный тариф но он только для публичных репозиториев. Для приватных – тариф в среднем 15-30$ в месяц за одного разработчика.
  • Большинство сервисов дают поверхностные замечания только на уровне – код стайла – превышение длины класса/функции/строки, правые/левые отступы и т.д.

В заключение, хотел бы сказать что в целом такие сервисы способны повысить эффективность разработки, и с развитием ИИ этот эффект будет всё ощутимее.

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