Код-ревью для джуна: как правильно реагировать на критику и учиться на комментариях сеньоров

Код-ревью для джуна: как правильно реагировать на критику и учиться на комментариях сеньоров

Первый код-ревью — это стресс. 47 комментариев к твоему PR, половина — про именование переменных, четверть — про архитектуру, которую ты не понимаешь. Хочется закрыть ноутбук и уйти в курьеры. Но код-ревью — это не экзамен и не наказание. Это самый быстрый способ вырасти от джуна до мидла. Эта статья — практическое руководство: как не принимать критику на личный счёт, что делать с каждым типом комментариев и как превратить ревью в ускоритель карьеры.

1. Зачем джуну код-ревью

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

ПоказательЗначение (2025)
Медианная зарплата IT в России182 700 ₽
Зарплата Junior (без опыта)50 000–80 000 ₽
Зарплата Middle (1–3 года)120 000–180 000 ₽
Зарплата Senior (3–6 лет)200 000–350 000 ₽
Рост зарплат в IT за год+17–19%
Время перехода Junior → Middle1–2 года

Что ускоряет рост джуна

ФакторВлияние на ростПочему

Код-ревью от сеньоров

Очень высокоеПрямая передача опыта, исправление ошибок

Работа над реальными задачами

ВысокоеКонтекст, бизнес-логика, ограничения

Парное программирование

ВысокоеНаблюдение за мышлением сеньора

Чтение чужого кода

СреднееИзучение паттернов и подходов

Онлайн-курсы

СреднееТеория без практики

Книги

Низкое-СреднееДолго, мало обратной связи

Что даёт код-ревью джуну

ПользаОписание

Обратная связь

Узнаёшь, что делаешь не так, пока ошибка не ушла в прод

Изучение стандартов

Понимаешь, как принято писать код в команде

Архитектурное мышление

Видишь, как сеньоры думают о структуре

Знание кодовой базы

Через комментарии узнаёшь о других частях системы

Навык коммуникации

Учишься объяснять свои решения

Уверенность

Со временем комментариев становится меньше

 

2. Психология код-ревью: почему больно

Три стадии реакции на критику

Большинство разработчиков, особенно в начале карьеры, проходят через три эмоциональные стадии:

СтадияЧто чувствуешьЧто думаешь

1. Защита

Раздражение, обида«Но ведь работает! Зачем придираться к мелочам?»

2. Сомнение

Неуверенность, страх«Может, я вообще не подхожу для этой работы?»

3. Рост

Спокойствие, интерес«Это поможет мне писать лучше. Запомню на будущее»

Цель — быстрее добраться до третьей стадии.

Почему критика воспринимается лично

ПричинаМеханизмКак преодолеть

Код = часть тебя

Ты вложил время и силыОтделять себя от кода: «Это не я, это мой код»

Синдром самозванца

Страх, что «раскроют»Все были джунами. Ошибки — норма

Публичность

Комментарии видит вся командаЭто стандартный процесс, не позор

Непонятные термины

Чувствуешь себя глупоСпрашивать — нормально и правильно

Много комментариев

Кажется, что всё плохоКоличество ≠ качество. 50 мелких замечаний лучше 1 критичного

Ключевой сдвиг мышления

Старое мышлениеНовое мышление
«Меня критикуют»«Мой код критикуют»
«Я плохой разработчик»«Я учусь быть лучше»
«Они придираются»«Они делятся опытом»
«Это атака на меня»«Это защита кодовой базы»
«Надо защищаться»«Надо понять и улучшить»

Что помогает

  • Пауза перед реакцией — прочитай, закрой, вернись через 10 минут

  • Фокус на действии — что конкретно нужно исправить?

  • Благодарность — сеньор потратил время на твоё обучение

  • Статистика — считай, сколько замечаний повторяется (должно уменьшаться)

  • Перспектива — через год ты будешь ревьюить других

 

3. Типы комментариев на код-ревью

Классификация комментариев

ТипОписаниеПриоритетПример

Блокирующий

Код не может быть смерженКритичный«Это сломает прод», «SQL-инъекция»

Важный

Нужно исправитьВысокий«Нарушен принцип SRP», «Нет обработки ошибок»

Рекомендация

Лучше исправитьСредний«Можно вынести в отдельную функцию»

Nitpick (NIT)

Мелочь, можно игнорироватьНизкий«Лишний пробел», «Можно короче»

Вопрос

Ревьюер не понимаетСредний«Почему здесь именно так?»

Похвала

Что-то сделано хорошо«Отличное решение!», «Хороший рефакторинг»

Как распознать тип комментария

Маркеры в текстеТипЧто делать
«Нужно», «Обязательно», «Это баг»БлокирующийИсправить немедленно
«Стоит», «Лучше бы», «Рекомендую»Важный/РекомендацияИсправить или обсудить
«NIT:», «Мелочь», «Можно»NitpickНа твоё усмотрение
«Почему?», «Зачем?», «Не понимаю»ВопросОбъяснить или добавить комментарий в код
«Круто!», «Хорошо», «Нравится»ПохвалаЗапомнить, что работает

Примеры реальных комментариев

Блокирующие

КомментарийПроблемаЧто делать
«SQL-инъекция в этом запросе»БезопасностьИспользовать параметризованные запросы
«Это удалит все данные пользователя»Потеря данныхДобавить проверку, бэкап
«Race condition при параллельных запросах»КонкурентностьДобавить блокировку/транзакцию
«Бесконечный цикл при пустом массиве»ЛогикаДобавить проверку на пустоту

Важные

КомментарийПроблемаЧто делать
«Функция делает слишком много (SRP)»АрхитектураРазбить на несколько функций
«Нет обработки ошибок»УстойчивостьДобавить try-catch, валидацию
«Дублирование кода (DRY)»MaintainabilityВынести в общую функцию
«Нет тестов на этот кейс»ПокрытиеНаписать тест

Nitpick

КомментарийСутьПриоритет
«NIT: лишний пробел»ФорматированиеНизкий (линтер поймает)
«Можно написать короче: x ?? 0»СтильНизкий (если работает)
«Предпочитаю const вместо let»СтильНизкий
«Порядок импортов»ФорматированиеНизкий

 

4. Самые частые замечания и как их избежать

ТОП-10 замечаний на код-ревью джунов

МестоЗамечаниеЧастота
1Плохие названия переменных/функций85%
2Нет обработки ошибок78%
3Дублирование кода (DRY)72%
4Слишком длинные функции68%
5Нет тестов или плохие тесты65%
6Хардкод значений60%
7Неоптимальные запросы к БД55%
8Отсутствие комментариев к сложной логике50%
9Нарушение code style команды48%
10Избыточная сложность45%

Замечание 1: Именование

ПлохоХорошоПочему

x, data, temp

userId, orderItems, tempFilePath

Понятно без контекста

process()

calculateTotalPrice()

Ясно, что делает функция

handleClick()

submitOrderForm()

Отражает бизнес-логику

flag

isUserAuthenticated

Булевы начинаются с is/has/can

list

activeUsers

Множественное число для коллекций

Правила именования

ТипПравилоПример
ПеременныеcamelCase, существительные

userName, orderTotal

ФункцииcamelCase, глагол + существительное

getUserById, calculateDiscount

КлассыPascalCase, существительные

UserService, OrderRepository

КонстантыUPPER_SNAKE_CASE

MAX_RETRY_COUNT, API_BASE_URL

Булевыis/has/can/should + прилагательное

isActive, hasPermission

Замечание 2: Нет обработки ошибок

ПлохоХорошо
Игнорировать исключенияЛогировать и обрабатывать
Пустой catch-блокХотя бы логировать ошибку
Возвращать nullБросать исключение или Optional
Общий ExceptionКонкретные типы исключений
Показывать стектрейс юзеруПонятное сообщение об ошибке

Замечание 3: Дублирование кода (DRY)

DRY = Don't Repeat Yourself. Если код повторяется 3+ раз — выноси в функцию.

Признак проблемыРешение
Copy-paste блоков кодаВынести в функцию
Похожая логика в разных местахСоздать общий хелпер
Одинаковые SQL-запросыВынести в репозиторий
Повторяющаяся валидацияСоздать валидатор

Замечание 4: Слишком длинные функции

ПризнакНормаЧто делать
Больше 20–30 строк5–15 строкРазбить на подфункции
Несколько уровней вложенности1–2 уровняEarly return, extract method
Много параметров (5+)1–3 параметраОбъект-параметр или разбить
Делает несколько вещейОдна задачаSingle Responsibility Principle

Замечание 5: Хардкод

ПлохоХорошо

if (status == 1)

if (status == Status.ACTIVE)

setTimeout(3000)

setTimeout(TIMEOUT_MS)

"http://api.example.com"

config.apiUrl

if (role == "admin")

if (role == Role.ADMIN)

 

5. Принципы, которые упоминают на ревью

SOLID

ПринципРасшифровкаЧто значитТипичный комментарий

S

Single ResponsibilityКласс/функция делает одно дело«Эта функция делает слишком много»

O

Open/ClosedОткрыт для расширения, закрыт для изменения«Лучше добавить новый класс, чем менять существующий»

L

Liskov SubstitutionНаследники заменяют родителей«Нарушена контрактность интерфейса»

I

Interface SegregationМного маленьких интерфейсов лучше одного большого«Слишком много методов в интерфейсе»

D

Dependency InversionЗависеть от абстракций, не от реализаций«Лучше инжектить зависимость»

Другие принципы

ПринципЧто значитТипичный комментарий

DRY

Don't Repeat Yourself — не дублируй код«Это уже есть в utils, переиспользуй»

KISS

Keep It Simple, Stupid — делай проще«Слишком сложно, можно проще»

YAGNI

You Aren't Gonna Need It — не делай лишнего«Зачем это? Нет такой задачи»

Fail Fast

Падай быстро при ошибке«Лучше упасть сразу, чем тихо сломаться»

Composition over Inheritance

Композиция лучше наследования«Не надо наследовать, лучше композиция»

Как запомнить принципы

ПринципМнемоника
SRP«Функция = одна задача»
DRY«Копипаст = плохо»
KISS«Если сложно объяснить — упрости»
YAGNI«Нет задачи — нет кода»

 

6. Как отвечать на комментарии

Правила ответа

ПравилоПочему важно

Отвечай на все комментарии

Показывает, что ты прочитал и понял

Благодари за полезные замечания

Создаёт позитивную атмосферу

Объясняй свои решения

Помогает ревьюеру понять контекст

Признавай ошибки

Показывает зрелость

Задавай вопросы

Углубляет понимание

Не спорь ради спора

Экономит время всех

Шаблоны ответов

СитуацияПлохой ответХороший ответ
Согласен с замечанием«Ок»«Исправил. Спасибо, не знал про этот паттерн»
Не согласен«Нет, так лучше»«Я сделал так потому что X. Но если Y важнее, переделаю»
Не понимаю комментарий(Игнорировать)«Можешь пояснить? Не уверен, что понял правильно»
Замечание спорное«Это субъективно»«Интересная мысль. Есть ли гайд команды по этому?»
Нашёл баг«Упс»«Хороший catch! Исправил и добавил тест на этот кейс»

Когда не соглашаться

Иногда ревьюер не прав. Как вежливо не согласиться:

СитуацияКак ответить
У тебя есть контекст, которого нет у ревьюера«Тут есть нюанс: [контекст]. Поэтому сделал так»
Замечание противоречит другому ревьюеру«[Имя] предложил X, а ты — Y. Как лучше поступить?»
Предложение ухудшит производительность«Такой вариант будет O(n²) вместо O(n). Важно ли это здесь?»
Это вкусовщина«Оба варианта работают. Есть ли командное соглашение?»

Чего не делать

ОшибкаПочему плохо
Игнорировать комментарииРевьюер не поймёт, исправил ли ты
Отвечать «ок» на всёНе показывает понимания
Защищаться агрессивноСоздаёт конфликт
Удалять комментарии без ответаТеряется история обсуждения
Писать «это работает»Работающий код ≠ хороший код

 

7. Как задавать вопросы

Почему вопросы важны

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

Какие вопросы задавать

Тип вопросаПримерЧто узнаешь

Почему так лучше?

«Почему Optional лучше null здесь?»Принципы и best practices

Где почитать?

«Есть статья/доку про этот паттерн?»Ресурсы для обучения

Как в нашей кодовой базе?

«Где пример такого подхода в проекте?»Стандарты команды

Что будет если?

«Что сломается, если оставить как есть?»Последствия решений

Это важно сейчас?

«Это блокер или можно в следующем PR?»Приоритеты

Как формулировать вопросы

ПлохоХорошо
«Не понял»«Правильно ли я понимаю, что нужно сделать X?»
«Зачем?»«Какую проблему это решает?»
«Это обязательно?»«Это блокер или рекомендация?»
«Где это написано?»«Есть ли документация или пример в кодовой базе?»

Чему можно научиться через вопросы

ОбластьПримеры вопросов

Архитектура

«Почему сервисы разделены так?», «Как это масштабируется?»

Производительность

«Почему этот запрос медленный?», «Как профилировать?»

Безопасность

«Какие есть уязвимости?», «Как защититься от X?»

Процессы

«Как это деплоится?», «Кто ревьюит критичные изменения?»

Бизнес

«Почему такое требование?», «Кто пользователь?»

 

8. Как готовить PR к ревью

Чек-лист перед отправкой

ШагЧто проверитьИнструмент

1. Self-review

Прочитай свой код как ревьюерGitHub diff

2. Тесты

Все тесты проходятCI/CD

3. Линтер

Нет ошибок линтераESLint, Pylint и т.д.

4. Форматирование

Код отформатированPrettier, Black

5. Комментарии

Удалены TODO, console.log, закомментированный кодГлаза

6. Размер

PR < 400 строкGitHub

7. Описание

Понятное описание измененийPR template

Структура хорошего PR

РазделЧто писатьПример

Заголовок

Что сделано (императив)«Добавить валидацию email в форму регистрации»

Описание

Зачем и как«Пользователи вводили невалидные email. Добавил regex-проверку»

Скриншоты

До/после (для UI)Скриншот формы

Как тестировать

Шаги для проверки«1. Открыть /register 2. Ввести невалидный email»

Связанные задачи

Ссылка на тикет«Closes #123»

Размер PR имеет значение

Размер PRСтрок кодаВремя ревьюКачество ревью
Маленький< 10015–30 минВысокое
Средний100–40030–60 минХорошее
Большой400–10001–2 часаСреднее
Огромный1000+Несколько часовНизкое (пропустят баги)

Оптимально: до 400 строк. Большие изменения лучше разбить на несколько PR.

Что делать, если PR большой

СтратегияКогда использовать

Stacked PRs

Последовательные изменения (PR2 зависит от PR1)

Feature flags

Можно мержить незаконченное

Разделение по слоям

Отдельно: модели, сервисы, API, UI

Рефакторинг отдельно

Сначала рефакторинг, потом фича

 

9. Как учиться на комментариях

Система обучения

ШагЧто делатьИнструмент

1. Записывай

Фиксируй все новые замечанияNotion, заметки

2. Группируй

Объединяй похожие замечанияТаблица/теги

3. Изучай

Читай статьи по темеHabr, Medium, книги

4. Применяй

Проверяй себя перед PRЧек-лист

5. Отслеживай

Считай повторыСтатистика

Таблица для записи замечаний

ДатаЗамечаниеКатегорияЧто изучитьПовтор?
01.03«Нет обработки ошибок»Error handlingTry-catch, Optional
05.03«Функция слишком длинная»SRPClean Code, глава 3
12.03«Нет обработки ошибок»Error handlingДа (2-й раз)
15.03«N+1 запрос к БД»PerformanceEager loading, JOINs

Метрики прогресса

МетрикаКак считатьХороший результат
Комментариев на PRСреднее за месяцУменьшается со временем
Повторяющихся замечаний% повторов от всех< 20%
Время до approvalОт создания до approveУменьшается
Блокирующих комментариевКоличество в месяц→ 0

Ресурсы для изучения

ТемаРесурс
Чистый код«Clean Code» Роберт Мартин
SOLID«Принципы, паттерны и методики гибкой разработки» Р. Мартин
Рефакторинг«Рефакторинг» Мартин Фаулер
Паттерны«Head First Design Patterns»
Тестирование«Unit Testing» Владимир Хориков

 

10. Как самому ревьюить код

Зачем джуну ревьюить

ПользаОписание

Изучение кодовой базы

Видишь, как другие решают задачи

Новые паттерны

Учишься у сеньоров

Критическое мышление

Развиваешь навык анализа

Понимание требований

Узнаёшь, что важно для команды

Видимость

Становишься заметнее в команде

Что джун может комментировать

МожноС осторожностьюЛучше не надо
ОпечаткиАрхитектурные решения«Я бы сделал иначе» без аргументов
Непонятные места (вопросы)ПроизводительностьКритика стиля сеньора
Битые ссылки, импортыАльтернативные подходыБезапелляционные утверждения
Отсутствие тестов
Нарушения гайда команды

Как комментировать вежливо

ПлохоХорошо
«Это неправильно»«Правильно ли я понимаю, что здесь X?»
«Нужно переделать»«Мне кажется, можно рассмотреть вариант Y. Что думаешь?»
«Почему так?»«Интересный подход. Можешь объяснить выбор?»
«Не понимаю»«Хочу разобраться: как это работает в случае Z?»

 

11. Инструменты

Автоматизация проверок

КатегорияИнструментыЧто проверяет

Линтеры

ESLint, Pylint, RuboCopСтиль, потенциальные баги

Форматтеры

Prettier, Black, gofmtФорматирование

Type checkers

TypeScript, mypy, FlowТипы

Security

Snyk, SonarQube, BanditУязвимости

Test coverage

Jest, Coverage.py, JaCoCoПокрытие тестами

Платформы код-ревью

ПлатформаПлюсыМинусы

GitHub

Популярность, интеграцииБазовый функционал ревью

GitLab

Встроенный CI/CD, self-hostedСложнее интерфейс

Bitbucket

Интеграция с JiraМеньше community

Gerrit

Гранулярный контрольСложный в освоении

Phabricator

Мощные инструментыDeprecated

AI-помощники

ИнструментЧто делаетЦена

GitHub Copilot

Автодополнение, объяснение кода$10/мес

CodeRabbit

AI-ревью PRFree tier

Sourcery

Рефакторинг PythonFree tier

DeepCode (Snyk)

AI-анализ безопасностиFree tier

 

12. Чек-лист для джуна

Перед отправкой PR

  • Сделал self-review (прочитал свой diff)

  • Все тесты проходят

  • Нет ошибок линтера

  • Удалил console.log, TODO, закомментированный код

  • PR < 400 строк (или есть причина)

  • Написал понятное описание

  • Указал, как тестировать

При получении комментариев

  • Прочитал все комментарии

  • Не реагирую сразу эмоционально (пауза 10 мин)

  • Определил тип каждого комментария (блокер/важный/NIT)

  • Задал вопросы, если не понял

  • Поблагодарил за полезные замечания

При исправлении

  • Исправил все блокирующие замечания

  • Ответил на каждый комментарий

  • Объяснил решения, если не согласен

  • Записал новые замечания в свой список

  • Проверил, нет ли повторяющихся ошибок

После ревью

  • Добавил новые знания в заметки

  • Изучил тему, если замечание было непонятным

  • Обновил свой чек-лист перед PR

  • Посчитал статистику (комментариев стало меньше?)

 

Итоги

Код-ревью — не экзамен и не наказание. Это самый эффективный способ вырасти как разработчик. Ключевые выводы:

  • Отделяй себя от кода — критикуют код, не тебя

  • Классифицируй комментарии — блокер, важный, NIT, вопрос

  • Отвечай на всё — благодари, спрашивай, объясняй

  • Записывай замечания — веди статистику, отслеживай прогресс

  • Готовь PR правильно — self-review, тесты, маленький размер

  • Задавай вопросы — это ускоряет обучение

  • Ревьюь сам — учись у других, становись заметнее

Через год активного код-ревью ты будешь ловить баги, которые сейчас не видишь, и давать советы новым джунам. А комментарии к твоим PR превратятся из «42 замечания» в «Approved».

А лучшие вакансии для разработчиков ищите на hirehi.ru