Вернуться к блогу
Hola, Amigos! На связи Антон Горохов, Head of Backend в Amiga.
Код-ревью – один из самых противоречивых процессов в разработке.
С одной стороны, все понимают его пользу. Во время проверки находятся ошибки, которые не поймают тесты, видны последствия архитектурных решений и быстрее всплывают риски, которые команда могла не заметить на этапе планирования.
С другой стороны, код-ревью легко превращается в источник раздражения. Pull request неделями ждет проверки. Разработчики спорят о форматировании вместо бизнес-логики. Комментарии растут быстрее самого кода. Релизы задерживаются. В результате процесс, который должен помогать команде, начинает работать против неё.
За годы работы над веб-сервисами, корпоративными системами, мобильными приложениями и e-commerce-проектами мы в Amiga пришли к простой мысли: хорошее код-ревью должно повышать качество продукта и при этом почти не ощущаться как отдельная задача.
Расскажем, как устроен этот процесс у нас.
Проблема обычно не в самом ревью, а в том, что команды пытаются решить через него все сразу.
Типичная ситуация: на одном pull request одновременно ищут баги, обсуждают архитектуру, ловят нарушения линтера, проводят обучение джуниоров, оценивают производительность и заодно спорят о том, как правильнее назвать переменную.
В итоге обычная задача превращается в технический аудит проекта.
Если в команде работает 8-10 разработчиков, такой подход довольно быстро начинает тормозить поставку правок. Новые задачи готовы, но код не попадает в основную ветку, разработчик ждет комментарии, проверяющий занят своей задачей. И начинается второй круг обсуждений.
Чем дольше живет pull request, тем дороже становится его проверка: ревьюеру сложнее вернуться в контекст, автору приходится держать задачу в голове, растёт риск конфликтов при слиянии, тестирование сдвигается, а релиз выходит позже.
На практике мы чаще всего видели две крайности: либо ревью становится формальностью, где изменения просматривают по диагонали и сразу нажимают approve, либо превращается в бюрократию, где каждое решение обсуждают как на архитектурном комитете.
Оба сценария одинаково вредны.
Иллюстрация показывает, как код-ревью превращается в источник задержек, если pull request долго ждет проверки, а обсуждение уходит от сути задачи.
Если смотреть на код-ревью глазами бизнеса, причин проводить его не так много. Но каждая из них напрямую влияет на стоимость развития продукта, скорость изменений и количество проблем, которые команда получит через несколько месяцев.
Есть три причины, по которым мы продолжаем инвестировать время в код-ревью:
1. Ниже стоимость ошибок. Чем раньше найдена проблема, тем дешевле ее исправить. Например, если разработчик случайно изменил логику применения скидок в интернет-магазине, на ревью это можно поправить за несколько минут. В продакшене такая ошибка уже затронет продажи, поддержку и лояльность клиентов.
2. Обмен знаниями внутри команды. Любой продукт постепенно накапливает внутренний контекст: почему логика устроена именно так, где есть ограничения, какие решения уже пробовали и почему от них отказались. Ревью помогает распределять этот контекст между участниками проекта, чтобы команда не зависела от одного специалиста.
3. Контроль технического долга. Технический долг редко появляется из-за одного большого решения. Чаще это цепочка маленьких компромиссов: скопировали кусок кода, отложили вынос в отдельный сервис, решили не трогать архитектуру из-за сроков. Ревью помогает заметить такие решения до того, как они начнут мешать развитию системы.
Схема показывает, как код-ревью снижает стоимость ошибок, распределяет знания внутри команды и помогает раньше замечать технический долг.
Мы стараемся сделать так, чтобы большая часть проверок происходила автоматически еще до участия человека.
Разработчик не должен получать комментарий вроде: «Тут лишний пробел» или «Импорты расположены не по правилам проекта». Такие вещи автоматически проверяют линтеры и форматтеры ещё до того, как код попадёт на ревью.
Точно так же ревьюер не должен сообщать автору, что проект не собирается или что упали тесты. За это отвечают автоматические проверки в CI/CD.
Другими словами, все, что можно проверить без участия человека, должно проверяться автоматически. Тогда ревьюер сможет сосредоточиться на более важных вопросах: логике решения, архитектуре и потенциальных рисках для продукта.
Перед тем как pull request попадет на ревью, у нас обычно запускаются линтеры, статический анализ, unit-тесты, интеграционные тесты и проверки сборки.
Благодаря этому человек может сосредоточиться на том, что действительно требует инженерного опыта.
Проверяет автоматизация | Проверяет ревьюер |
Форматирование | Бизнес-логика |
Линтеры | Архитектура |
Тесты | Поддерживаемость |
Сборка | Риски для продукта |
Статический анализ | Безопасность |
Когда большая часть рутины автоматизирована, код-ревью начинает приносить значительно больше пользы.
Сам процесс можно разделить на три этапа.
Первое правило здорового ревью: pull request должен быть достаточно маленьким, чтобы его реально можно было проверить.
Если изменение занимает несколько сотен строк, ревьюер способен удерживать весь контекст в голове. Если речь идет о тысячах строк, вероятность пропустить важную деталь резко возрастает. Поэтому крупные задачи мы стараемся разбивать на отдельные логические изменения.
Перед отправкой разработчик обязательно проводит самопроверку. Именно на этом этапе обычно находятся временные комментарии, отладочный код, лишние файлы и другие мелочи, которые не должны попадать в общий репозиторий.
После этого подключаются автоматические проверки. Если сборка падает или тесты не проходят, pull request возвращается автору.
Так ревьюер не тратит время на то, что уже должна была проверить машина, а автор получает обратную связь по сути изменения.
Когда код попадает к ревьюеру, начинается самая ценная часть процесса.
В первую очередь нас интересует бизнес-логика. Решает ли изменение поставленную задачу? Учтены ли пограничные сценарии? Что произойдет при ошибке?
Следующий уровень – архитектура. Не создает ли решение будущих проблем? Не появляется ли лишняя связанность между модулями? Не дублируется ли существующая логика?
Отдельно оцениваем поддерживаемость. Иногда можно написать очень умный код, но через полгода никто не вспомнит, почему он работает именно так.
Мы стараемся выбирать решения, которые легко читать, объяснять и развивать.
Еще один важный момент – формат обратной связи.
Мы стараемся разделять обязательные замечания и предложения по улучшению. Это помогает избежать ситуации, когда любой комментарий воспринимается как требование всё переделать.
Если обсуждение начинает занимать больше нескольких сообщений, обычно проще созвониться на десять минут и принять решение голосом.
После исправления замечаний код повторно проверяется и попадает в основную ветку. В идеальном сценарии весь цикл занимает часы, а не дни.
При этом важно не просто закрыть комментарии, а убедиться, что команда одинаково понимает итоговое решение. Иногда в процессе ревью появляются архитектурные договорённости или новые правила работы с кодом. Если их не зафиксировать, через несколько месяцев обсуждение придётся начинать заново.
Главная цель процесса – безопасно и предсказуемо довести довести изменение до релиза, соблюдая все наши требования к качеству сделанного кода.
Схема показывает этапы код-ревью в Amiga: самопроверку, автоматические проверки, комментарии ревьюера, повторную проверку и выход изменения в релиз.
За последние годы мы чаще всего сталкивались с четырьмя проблемами:
1. Огромные pull request. Чем больше изменений, тем ниже качество проверки.
2. Непонятные сроки реакции. Если никто не понимает, когда нужно проверить код, процесс начинает тормозить разработку.
3. Слишком много ревьюеров. Каждый дополнительный участник увеличивает время согласования и количество мнений, которые нужно учесть.
4. Поиск идеального решения. Иногда команда тратит час на обсуждение улучшения, которое никак не влияет на бизнес-результат.
Код-ревью должно помогать выпускать качественный продукт, а не открывать бесконечные инженерные дискуссии.
Есть несколько метрик, которые действительно помогают оценивать качество процесса.
Метрика | Что показывает |
Время до первого комментария | Скорость реакции команды |
Время до merge | Влияние процесса на поставку |
Количество итераций ревью | Качество первоначального решения |
Размер PR | Удобство анализа изменений |
Количество дефектов после релиза | Что ревью пропускает |
Метрики нужны не для контроля разработчиков, а для понимания, где именно процесс начинает давать сбои.
Долгое ожидание первого комментария обычно говорит о проблемах с организацией ревью. Большое количество итераций может указывать на неясные требования или недостаточную проработку решения. А ошибки, которые регулярно обнаруживаются уже после релиза, часто становятся сигналом пересмотреть сам процесс проверки изменений.
Почти всегда да. Глубина проверки может отличаться, но дополнительный взгляд на изменения окупает себя даже на небольших задачах.
Для большинства изменений достаточно одного-двух специалистов. Подключать больше людей стоит только тогда, когда изменения затрагивают архитектуру, безопасность или критичные бизнес-процессы.
Только частично. ИИ хорошо помогает находить подозрительные места в коде, искать дублирование и подсказывать возможные улучшения. Но он часто не знает весь контекст бизнеса, историю проекта и внутренние договоренности команды. Поэтому сегодня ИИ – скорее дополнительный помощник, чем замена ревьюеру.
Обычно причина находится довольно быстро. Либо задачи слишком большие, либо ревьюеров слишком много, либо процесс пытается решать проблемы, которые должны были быть решены еще до начала разработки.
Код-ревью редко становится причиной успеха продукта. Зато плохое код-ревью регулярно становится причиной накопленного технического долга, медленных релизов, конфликтов внутри команды и ошибок в продакшене. Поэтому задача процесса не в том, чтобы проверять каждый символ, а в создании системы, в которой команда быстро выпускает изменения, сохраняет качество кода и делает развитие продукта более предсказуемым.
За годы работы с цифровыми продуктами мы убедились: лучшее код-ревью – то, которое помогает принимать хорошие инженерные решения и не мешает работе команды.