Code review в Java: что проверять и как давать обратную связь новичкам

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Code review в Java: что проверять и как давать обратную связь

Code review (ревью кода) — это не просто формальность перед мержем пул-реквеста. Это мощный инструмент для повышения качества кода, обмена знаниями и предотвращения багов. Для начинающих Java-разработчиков участие в ревью часто вызывает страх: «А вдруг меня раскритикуют?», «А что если я пропущу критическую ошибку?». В этой статье мы разберем, на что обращать внимание при проверке Java-кода и как давать обратную связь так, чтобы она помогала, а не демотивировала.

1. Что проверять в Java-коде: чек-лист для начинающих

Первый и самый важный шаг — знать, на что смотреть. Не пытайтесь найти всё сразу. Сфокусируйтесь на ключевых областях. Вот базовый чек-лист для code review на Java:

  • Логика и корректность: Решает ли код поставленную задачу? Есть ли очевидные логические ошибки? Правильно ли обрабатываются граничные случаи?
  • Naming (именование): Соответствуют ли имена переменных, методов и классов Java-конвенциям (camelCase, PascalCase)? Являются ли они говорящими? int a — плохо, int numberOfUsers — хорошо.
  • Обработка ошибок: Есть ли try-catch блоки? Используются ли конкретные типы исключений вместо общего Exception? Не глотаются ли исключения молча (пустой catch)?
  • Производительность: Есть ли очевидные проблемы, такие как создание объектов внутри циклов, использование конкатенации строк через + в цикле (лучше StringBuilder), или ненужные вызовы методов?
  • Тестирование: Покрыт ли код юнит-тестами? Проверяют ли они только позитивные сценарии или также негативные и граничные?

Пример плохого кода, который должен быть замечен на ревью:

public void processData(List data) {
    for (Object item : data) {
        String s = "";
        for (int i = 0; i < 1000; i++) {
            s += item.toString() + i; // Потенциальная проблема производительности
        }
        System.out.println(s);
    }
}

Что здесь не так? Использование + в цикле создает множество промежуточных объектов String. Лучше заменить на StringBuilder. Также не хватает проверки data на null.

2. Как давать конструктивную обратную связь

Самый сложный аспект code review — это не техническая проверка, а коммуникация. Ваша цель — не показать, кто умнее, а помочь команде расти. Вот несколько правил:

  • Фокус на коде, а не на авторе. Вместо «Ты написал ужасный код» скажите «Этот метод можно упростить, используя Stream API».
  • Используйте вопросительную форму. Вместо утверждений задавайте вопросы. Пример: «Почему здесь выбран ArrayList, а не LinkedList? Учитывая частые вставки в начало списка, LinkedList может быть эффективнее».
  • Объясняйте «почему». Простое «Исправь это» не работает. Напишите: «Давай заменим == на .equals() для сравнения строк, потому что == сравнивает ссылки, а не содержимое».
  • Хвалите хороший код. Если видите элегантное решение, отметьте это. «Отличное использование паттерна Builder здесь — код стал намного читаемее».

Пример плохого комментария: «Это говнокод, перепиши». Пример хорошего комментария: «Мне кажется, что этот блок можно вынести в отдельный приватный метод, чтобы улучшить читаемость основного метода. Что думаешь?»

3. Типичные ошибки новичков в Java и как их подсвечивать

Зная типичные ошибки, вы сможете быстрее их находить и давать более релевантные советы. Вот топ-3 ошибки, которые часто встречаются на ревью у начинающих Java-разработчиков:

Ошибка 1: Игнорирование контрактов equals() и hashCode()

Новички часто создают классы с полями, используют их в HashSet или HashMap, но не переопределяют equals() и hashCode(). Это приводит к тому, что объекты с одинаковыми данными считаются разными.

Как дать обратную связь: «Обрати внимание: если мы используем этот объект в HashSet, нам нужно переопределить equals() и hashCode(), иначе коллекция будет работать некорректно. Вот ссылка на документацию по контракту этих методов».

Ошибка 2: Избыточная сложность

Попытка реализовать сложный паттерн там, где достаточно простого if-else или цикла. Или использование Stream API там, где обычный цикл читается проще.

Как дать обратную связь: «Код рабочий, но он получился сложным для восприятия. Давай попробуем упростить: заменим этот вложенный цикл на один проход по коллекции. Читаемость повысится, а производительность не пострадает».

Ошибка 3: Магические числа и строки

Использование чисел в коде без пояснений. Например, if (status == 4).

Как дать обратную связь: «Что означает число 4? Лучше вынести его в константу с понятным именем, например, private static final int STATUS_COMPLETED = 4;. Это сделает код самодокументируемым».

4. Процесс code review: от открытия PR до мержа

Чтобы ревью было эффективным, придерживайтесь простого процесса:

  1. Проверьте описание PR. Понятно ли, что делает этот код? Есть ли ссылка на задачу?
  2. Пробегитесь по изменениям. Сначала получите общее представление о том, что изменилось.
  3. Проверьте ключевые файлы. Начните с тестов, потом с основной логики. Тесты должны показывать, как код должен работать.
  4. Блоги

    Рекомендаций по книгам