Code review в JavaScript: что проверять и как давать обратную связь для начинающих
Code review (или ревью кода) — это процесс проверки программного кода одним или несколькими разработчиками до того, как он попадёт в основную ветку проекта. Для новичков эта процедура часто кажется пугающей: «А вдруг я пропущу баг?», «Как сказать коллеге, что его код плохой, не испортив отношения?».
В этой статье мы разберём, на что обращать внимание при code review в JavaScript (включая Node.js), и как давать обратную связь так, чтобы она была полезной, а не обидной. Материал рассчитан на начинающих разработчиков, которые только начинают участвовать в ревью.
Что проверять в JavaScript-коде: чек-лист для начинающих
Чтобы ревью было структурированным, разделим проверку на несколько ключевых блоков. Не пытайтесь охватить всё сразу — начните с наиболее критичных пунктов.
1. Функциональность и логика
Прежде всего убедитесь, что код решает поставленную задачу. Запустите его локально (если это возможно) или мысленно пройдите по всем веткам выполнения. Вот типичные вопросы:
- Правильно ли обрабатываются граничные случаи (пустой массив,
null,undefined)? - Нет ли «магических чисел» (чисел без пояснения, например
if (x > 86400)вместоconst ONE_DAY_IN_SECONDS = 86400)? - Корректно ли работает асинхронный код (Promise, async/await)?
// Плохо: магическое число
if (user.lastLogin < Date.now() - 86400000) { ... }
// Хорошо: константа с именем
const ONE_DAY_MS = 24 * 60 * 60 * 1000;
if (user.lastLogin < Date.now() - ONE_DAY_MS) { ... }
2. Стиль кода и форматирование
Хотя многие проекты используют Prettier и ESLint, вручную стоит проверить:
- Соблюдение единого стиля (отступы, кавычки, точки с запятой).
- Правильные именования переменных, функций и классов (camelCase для переменных, PascalCase для классов).
- Отсутствие закомментированного кода — он только засоряет файл.
// Плохо: неинформативное имя
const d = new Date();
const arr = getData(d);
// Хорошо: имя описывает суть
const currentDate = new Date();
const usersData = fetchUsersData(currentDate);
3. Производительность и безопасность
Для Node.js особенно важны:
- Избегание блокирующих операций в основном потоке (синхронное чтение файлов, тяжёлые циклы).
- Проверка на утечки памяти (например, забытые таймеры или слушатели событий).
- Валидация пользовательского ввода (защита от SQL-инъекций, XSS).
// Плохо: синхронное чтение блокирует Event Loop
const data = fs.readFileSync('bigfile.json', 'utf8');
// Хорошо: асинхронное чтение
const data = await fs.promises.readFile('bigfile.json', 'utf8');
Как давать обратную связь: принципы конструктивного ревью
Теперь, когда вы знаете, что проверять, разберём главный навык code review — умение доносить замечания. Ваша цель — улучшить код, а не самоутвердиться за счёт автора.
1. Будьте конкретны и аргументированы
Вместо «Этот код плохой» напишите: «Здесь есть потенциальная проблема с производительностью: вызов Array.find() в цикле даёт сложность O(n²). Давай заменим на Map». Автор поймёт, что именно не так и как исправить.
2. Используйте «Я-сообщения» и задавайте вопросы
Формулировки вроде «Я не уверен, что этот код обработает случай с пустым массивом. Можем добавить проверку?» звучат мягче, чем «Ты забыл обработать пустой массив». Это снижает защитную реакцию и стимулирует диалог.
3. Хвалите хорошие решения
Code review — это не только критика. Если вы видите элегантное решение или отличную архитектуру, обязательно отметьте это. Например: «Отличная идея вынести валидацию в отдельный модуль! Это сильно упростит тестирование». Положительная обратная связь мотивирует.
Практический пример: ревью кода для Node.js
Рассмотрим небольшой фрагмент кода и напишем к нему конструктивные комментарии.
// Исходный код (плохой пример)
app.get('/user/:id', (req, res) => {
const id = req.params.id;
db.query('SELECT * FROM users WHERE id = ' + id, (err, result) => {
if (err) {
res.status(500).send('Error');
} else {
res.json(result);
}
});
});
Комментарии к ревью:
- Безопасность: Прямая конкатенация в SQL-запросе — это SQL-инъекция. Нужно использовать параметризованный запрос:
db.query('SELECT * FROM users WHERE id = ?', [id], callback). - Обработка ошибок: Всегда возвращать статус 500 без логирования — плохая практика. Добавьте
console.error(err)или передайте ошибку в middleware. - Async/await: Современный Node.js позволяет использовать
async/awaitдля более читаемого кода.
// Исправленный код (хороший пример)
app.get('/user/:id', async (req, res) => {
try {
const { id } = req.params;
const result = await db.query('SELECT * FROM users WHERE id = ?', [id]);
res.json(result);
} catch (error) {
console.error('Database error:', error);
res.status(500).json({ error: 'Internal server error' });
}
});
Заключение
Code review — это не экзамен и не суд. Это инструмент для совместного улучшения кода и обмена опытом. Для начинающего разработчика лучшая стратегия — сначала проверять только очевидные ошибки (безопасность, логика, стиль), а затем постепенно расширять свой кругозор