Код-ревью с помощью ИИ
В современном мире появляется всё больше инструментов, систем и подходов, которые с помощью ИИ помогают автоматизировать, а в некоторых случаях и вовсе заменить человеческое участие. Естественно, в IT-сфере есть масса ниш где уже отметился ИИ. Одну из таких ниш мы с вами разберём.
Меня зовут Александр, я уже больше 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. Проверяет существующие и новые ПР. Один из лучших результатов. |
4 | Codacy | 15$/месяц с разработчика | GitHub, Gitlab, Bitbucket. Проверяет существующие и новые ПР. Имеет большой дашборд с множеством настроек и статистик. Анализ поверхностный, на уровне код стайла. |
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 | Free | Только для Python |
11 | ESLint | 20$/месяц с разработчика | Только для JavaScript и ему подобных языков |
12 | Houndci | От 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$ в месяц за одного разработчика.
- Большинство сервисов дают поверхностные замечания только на уровне – код стайла – превышение длины класса/функции/строки, правые/левые отступы и т.д.
В заключение, хотел бы сказать что в целом такие сервисы способны повысить эффективность разработки, и с развитием ИИ этот эффект будет всё ощутимее.
Автор Александр Бондарь