Как стать автором
Обновить
«Лаборатория Касперского»
Ловим вирусы, исследуем угрозы, спасаем мир

Каждому сотруднику по личному помощнику: как мы подружились с AI-ревью

Уровень сложностиПростой
Время на прочтение6 мин
Количество просмотров2K

Вы любите делать код-ревью? 

«Не могу дождаться следующего PR!», — ответит абсолютно никто.

Понимаю! Ревью — штука необходимая, но давайте честно: утомляет, забирает время и ресурс, который можно потратить на другие задачи. Делегировать, казалось бы, хорошая идея… но кому? Личного ревьюера на полную ставку ни у кого нет.

Меня зовут Александр Федотов, я руководитель группы разработки в «Лаборатории Касперского». В своей команде я уже не раз пытался упростить ревью: менял подходы, вводил правила, подключал автоматизацию. Но все равно ощущение такое, что можно сделать еще лучше. Тем временем, коллеги реализовали интеграцию TFS с внутренней AI-моделью ЛК. И вот одним морозным зимним днем, во время настройки каких-то доступов, я попал в раздел Manage Features, где наткнулся на неприметный пунктик Pull Request AI, который позволял воспользоваться преимуществами этой интеграции.

Не теряя времени, я активировал фичу и стал счастливым обладателем раздела AI в каждом PR. С тех пор ревью стало другим. И теперь я не просто верю в автоматизацию — я ею пользуюсь и хочу поделиться с вами своими мыслями об этом.

Как это работает на практике

Кажется, мы уже привыкли к тому, что ревью — это долго и сложно. Судя по общению с другими разработчиками на тему AI-ревью, кто-то просто не знает, что такая опция есть. Кто-то не верит, что робот справится. А кто-то не хочет заморачиваться и пробовать новое, а зря.

Я первым в команде решил подключить AI-ревью — и уже с первых попыток понял, что это штука не для «затестить», а реальный инструмент. Он показывает, куда стоит посмотреть в коде, помогает быстрее в него вникнуть и главное — дает базу для нормального фидбэка. А иногда — и вовсе ловит то, что ты бы точно пропустил.

Реальные истории

1) Попробуйте найти ошибку в коде:

public void AssertVirtualDesktopSupported()
        {
            if (!OperatingSystemInfo.IsWin7)
            {
                Assert.Fail("Virtual desktops not supported");
            }
        }
Ответ AI

Логическая ошибка: метод AssertVirtualDesktopSupported проверяет поддержку виртуальных рабочих столов только для Windows 7, что неверно. Виртуальные рабочие столы поддерживаются начиная с Windows 10. Необходимо изменить условие на проверку версии Windows 10 или выше. 

Хороший кейс: найдена логическая ошибка, основанная на контекстуальном знании фичей ОС.

2) Попробуйте найти ошибку в коде:

std::vector<ModuleVersion> GetVersions() 
{
 
    // Parses version strings such as "1.2", "1.2;3.4", "1,2"
 
    std::wstring str = ExtractParameterString(SUPPORTED_VERSION);
    
    std::vector<ModuleVersion> result;
    unsigned int startPos = 0;
    unsigned int semicolonPos = 0;
    unsigned int dotPos = 0;
    std::wstring strVersion, strMajorVersion, strMinorVersion;    
    
    do
    {
        semicolonPos = str.find_first_of(L';', startPos);
        strVersion = str.substr(startPos, semicolonPos);
 
        dotPos = strVersion.find(L'.');
        strMajorVersion = strVersion.substr(0, dotPos);
        if (dotPos != std::wstring::npos)
            strMinorVersion = strVersion.substr(dotPos + 1);
        else
            strMinorVersion.clear();
 
        ModuleVersion version = {0};
        version.majorVersion = _wtoi(strMajorVersion.c_str());
        version.minorVersion = _wtoi(strMinorVersion.c_str());
 
        result.push_back(version);
 
        startPos = semicolonPos;
        
    } while (startPos != std::wstring::npos);
 
    return result;
}
Ответ AI

В методе GetVersions переменная startPos не обновляется корректно внутри цикла do-while, что приводит к бесконечному циклу. Необходимо правильно обновлять startPos после каждого найденного разделителя ;.

Чистая алгоритмическая ошибка. Конечно, ее можно найти запуском/отладкой/вчитыванием, но отладка выполняется далеко не всегда, а наш AI консистентен.

3) Чем плоха такая замена?

Было: 

public MainWindowViewService(
            Func<ImportRequestViewModel> importRequestViewModelFactory)
        {
            _importRequestViewModelFactory = importRequestViewModelFactory;
        }
 
public void RaiseImportRequest(Item item)
        {
            var viewModel = _importRequestViewModelFactory.Invoke();
            var interaction = new ImportRequestInteraction(viewModel, item);
            ImportRequestedEvent.Invoke(interaction);
        }

Cтало:

public MainWindowViewService(IUnityContainer container)
        {
            _container = container;
        }
 
public void RaiseImportRequest(Item item)
        {
            var viewModel = _container.Resolve<ImportRequestViewModel>();
            var interaction = new ImportRequestInteraction (viewModel, item);
            ImportRequestedEvent.Invoke(interaction);
        }
Ответ AI

Замена фабрики Func< ImportRequestViewModel > на IUnityContainer может привести к более тесной связности с контейнером внедрения зависимостей, что затруднит тестирование класса без использования конкретного контейнера.

Этот комментарий относительно очевиден, но тем не менее полезен и может быть оставлен без участия живого человека.

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

Что же нам понравилось больше всего?

Сам себе ревьюер

Можно запускать AI еще до того, как ты отправил код на ревью человеку. Он сразу покажет, что ему не нравится — и это можно исправить до того, как кто-то из кожи и костей откроет PR. По нашему опыту это здорово повышает продуктивность взаимодействия разработчиков на ревью, поскольку остается меньше мест для обсуждения и вольной интерпретации.

Без вкусовщины

AI не будет спорить, как лучше назвать переменную или сколько отступов ставить. У него вообще нет вкуса — в хорошем смысле! Только факты, только код-стайл. Он не будет предлагать замен и переименований, провоцирующих длительную и бесплодную дискуссию. 

Поспорить с роботом о прекрасном можно, но зачем?

Быстрое ревью

Иногда мы вынуждены пробегаться по PR быстро: времени мало, задач много. В такие моменты наш AI-помощник — просто находка, в отличие от нас, он не устает и готов комментировать PR 24/7.

Поэтому в случаях, когда требуется быстрое ревью, можно опереться на комментарии помощника, а возможные замечания человека исправить в следующих PR.

Учимся на своих ошибках 

AI-ревью способствует повышению качества обучения и развития разработчиков. Хорошо настроенный AI не только указывает на проблему, но и объясняет, почему изменение необходимо, часто с примерами. Это превращает каждый PR в обучающий момент. В долгосрочной перспективе такая практика помогает команде расти профессионально, развивая навыки написания более чистого, понятного и безопасного кода.

 

А как у других?

Наша интеграция с Pull Request AI в TFS — не единственный способ подключить AI к ревью. Вот несколько способов, позволяющих привлечь к этой работе роботов:

Google Critique

В Google AI активно используется в системе Critique, применяемой для анализа PR внутри монорепозитория. Система может не только указывать на ошибки, но и предлагать патчи, автоматически учитывая контекст предыдущих изменений и историю кода. Благодаря этому Google снижает нагрузку на старших разработчиков, которым не нужно вручную просматривать каждую строку кода. Это позволяет поддерживать высокое качество программного обеспечения даже при огромных объемах и скорости изменений.

Amazon CodeGuru Reviewer

Компания Amazon также активно использует AI-инструменты для анализа Pull Request в своих внутренних системах. Сервис CodeGuru анализирует код Java и Python, выявляя узкие места в производительности, ошибки, связанные с ресурсами, и нарушения лучших практик. Эти рекомендации интегрируются непосредственно в процесс ревью, облегчая работу разработчиков и повышая надежность систем. CodeGuru применяется как на ранних этапах, так и в рамках CI/CD, автоматически отклоняя PR с критичными проблемами.

Code Review by Gemini AI · Actions · GitHub Marketplace · GitHub 

Gemini тоже уже в деле. Его можно интегрировать в GitHub через Actions — он будет автоматически запускаться при открытии PR и анализировать код.


GitHub Copilot

У Copilot имеется режим, в котором он помогает не писать, а проверять код. Он объясняет, что делает тот или иной кусок, подсказывает потенциальные баги и следит, чтобы все соответствовало требованиям.

Также GitHub предоставляет CodeQL — инструмент анализа уязвимостей, использующий ИИ для выявления паттернов потенциальных атак, таких как SQL-инъекции или XSS.

Сегодня Copilot успешно интегрирован в процесс ревью PR у таких крупных компаний, как Microsoft и Shopify.

DeepCode AI

Инструмент доступен как в виде расширений для IDE, так и в виде настройки для репозиториев в GitHub. Одно из его отличительных качеств: анализ изменений в PR и сравнение их с огромной базой известных уязвимостей и паттернов плохого кода. Это помогает поддерживать высокое качество даже в условиях, когда PR поступают от большого количества внешних участников с разным уровнем опыта, что в условиях интеграции с GitHub повышает надежность и безопасность открытого ПО.

CodeRabbit

Плагин для GitHub, который комментирует PR как человек.
Он встраивается прямо в обсуждение и пишет конкретные замечания — от стиля до логики.

Что в итоге

Мы пришли к такому выводу: игнорировать AI-ревью в 2025 году — это как сознательно не пользоваться новыми возможностями языка или фреймворка. Только если отказ от фич можно еще как-то объяснить — например, сложной миграцией или зависимостью от старой кодовой базы, то в случае с ревью внедрение нашего помощника в процессы не оказывает негативного влияния на текущую разработку и не требует адаптации. 

Он подключается безболезненно, не требует переделок и не ломает привычные процессы. Да, помощник может ошибаться. Но ведь и мы ошибаемся — согласитесь, каждый хоть раз пропускал в ревью что-то важное.

Зато он помогает пройти обязательные этапы ревью — быстрее, аккуратнее и без лишней нагрузки на команду. Можно экономить ресурс людей и при этом снижать риск пропустить что-то важное — особенно то, что обычно ускользает из-за усталости или нехватки времени.

Конечно, технологии еще будут развиваться. Но даже сейчас они уже работают. И дают ощутимый эффект: код становится чище, а PR закрываются быстрее.

Теги:
Хабы:
+12
Комментарии6

Публикации

Информация

Сайт
www.kaspersky.ru
Дата регистрации
Дата основания
Численность
5 001–10 000 человек
Местоположение
Россия