Ответ
Это отличный вопрос, так как хорошо выстроенный процесс код-ревью напрямую влияет на качество продукта. В моей предыдущей команде мы придерживались следующих принципов:
1. Процесс и инструменты
- Инструменты: Мы использовали Pull/Merge Requests (PR/MR) в GitLab/GitHub как центральную точку для ревью.
- Жизненный цикл PR: Каждая задача (фича или багфикс) реализовывалась в отдельной ветке и оформлялась в виде PR. PR не мог быть влит в основную ветку без выполнения двух условий:
- Получение как минимум двух апрувов от других членов команды.
- Успешное прохождение всех шагов CI/CD пайплайна (линтеры, тесты, сборка).
2. Технические аспекты (чек-лист ревью)
При проверке кода мы обращали внимание на следующие моменты:
- Корректность логики: Решает ли код поставленную задачу?
- Читаемость и простота: Код должен быть понятным для других разработчиков. Мы избегали излишне сложных конструкций.
- Стиль кода: Автоматическая проверка с помощью
go fmtиgolangci-lintв CI. - Покрытие тестами: Критически важная бизнес-логика должна была быть покрыта unit-тестами (целевое покрытие > 80%).
- Обработка ошибок: Все ошибки должны корректно обрабатываться, а не игнорироваться.
- Производительность: Отсутствие узких мест, лишних аллокаций в "горячих" участках кода.
- Безопасность: Проверка на возможные уязвимости (например, SQL-инъекции, работа с ненадежными данными).
Мы активно обменивались комментариями прямо в PR, например:
// Комментарий в ревью:
// Предлагаю здесь использовать errors.Is() вместо прямого сравнения.
// Это более гибкий подход, который будет работать с обернутыми ошибками.
// if err == io.EOF { ... } // Так не стоит делать
if errors.Is(err, io.EOF) { ... } // А так — отлично
3. Культура ревью
- Конструктивность: Все замечания должны быть аргументированными и направленными на улучшение кода, а не на критику автора.
- Уважение: Мы придерживались уважительного тона в общении.
- Обмен знаниями: Ревью рассматривалось не только как контроль качества, но и как способ обмена опытом и знаниями в команде.
- SLA: У нас было негласное правило — стараться отреагировать на PR в течение 24 часов, чтобы не блокировать коллег.
Такой комплексный подход позволял нам не только поддерживать высокое качество кодовой базы, но и способствовал профессиональному росту каждого члена команды.
Ответ 18+ 🔞
Слушай, а вот это реально важный вопрос, потому что от того, как выстроено ревью, зависит, будет ли твой код потом читаем, или это будет такая каша, что сам через месяц в неё вникнуть не сможешь, блядь. У нас в прошлой команде был целый ритуал, можно сказать, но рабочий, ёпта.
1. Как всё было организовано, или «Без бумажки ты — какашка»
- Инструменты: Всё крутилось вокруг Pull/Merge Requests (PR/MR) в GitLab. Всё, что сделал, — сразу в ветку и на ревью. Никакого тайного слива кода в
mainпод покровом ночи, нахуй. - Железные правила: Чтобы твой PR смержился, нужно было пройти через два чистилища:
- Получить два апрува от коллег. Не «ой, ок», а именно апрув. Один мог быть от тимлида, второй — от любого другого разраба.
- Чтобы CI/CD пайплайн был весь зелёный. Если линтер ругается, тесты падают или сборка ломается — всё, иди чини, пока не загорится, как ёлка на Новый год. Никаких «ой, да это мелочь, я потом».
2. На что конкретно смотрели, или «Чек-лист для параноика»
Когда открываешь чужой PR, глаза разбегаются. Мы смотрели вот на эту хуйню:
- А оно вообще работает? Решает ли код задачу, или чувак накодил какую-то дичь, которая только в его голове логична?
- Можно это прочитать без бутылки? Читаемость — это святое. Если видишь трёхэтажную тернарку или функцию на 200 строк — сразу вопрос: «Мужик, ты это сам через неделю поймёшь?».
- Стиль: За этим следил не только я, но и
go fmtсgolangci-lintв пайплайне. Автоматика — наш друг, она не устаёт и не злится. - Тесты, ёбушки-воробушки! Критичная логика должна быть покрыта. Цифра >80% покрытия была не пустым звуком. PR без тестов на новую логику — это как идти по охуенно тонкому льду: вроде прошёл, но чувствуешь себя идиотом.
- Ошибки: Если видишь
errи следом// TODO: handle error, то сразу волнение ебать. Ошибки нужно обрабатывать, а не забивать хуй, иначе потом ночью разбудит пейджер. - Не тормозит ли? В «горячих» участках смотрели, нет ли лишних аллокаций памяти или квадратичных алгоритмов там, где можно за O(n).
- Безопасность: Нет ли прямого подставления строк в SQL или работы с юзер-инпутом без валидации. Чтобы не получилось, что через месяц вас взломают через какую-нибудь
'; DROP TABLE users;--.
Вот, например, типичный комментарий в ревью, чтобы не быть голословным:
// Комментарий в ревью:
// Предлагаю здесь использовать errors.Is() вместо прямого сравнения.
// Это более гибкий подход, который будет работать с обернутыми ошибками.
// if err == io.EOF { ... } // Так не стоит делать
if errors.Is(err, io.EOF) { ... } // А так — отлично
3. Культура, или «Как не послать коллегу нахуй в процессе»
А вот это, блядь, самое важное. Технические штуки — это полдела.
- Конструктив, а не унижение: Замечание должно звучать как «Эй, тут можно сделать вот так, будет надёжнее/быстрее/понятнее», а не «Чё за хуйню ты написал, идиот?». Разница, понимаешь, огромная.
- Уважение: Все мы люди, все иногда косячим. Тон должен быть рабочим, а не снобским.
- Учим друг друга: Ревью — это не только контроль, но и способ прокачаться. Часто в комментариях кто-то делился ссылкой на статью или показывал классный приём — это бесценно.
- Не тяни резину: Было негласное правило — посмотреть PR в течение рабочего дня. Сидеть неделю и ждать, пока кто-то соблаговолит глянуть твою работу, — это пиздец как демотивирует. Терпения ноль ебать.
Вот такая, блядь, система. Она не идеальная, иногда всё равно спорили до хрипоты, но она работала. Кодовая база была чистой, а команда росла, потому что все учились друг у друга, а не просто тыкали пальцем в чужие косяки.