← Назад к вопросам
Есть ли список требований к коду для Code Review?
1.6 Junior🔥 191 комментариев
#Soft skills и опыт работы
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Список требований к коду для Code Review
Code Review — это систематическая проверка исходного кода перед тем, как он попадёт в основную ветку. Наличие четкого чек-листа требований — признак профессиональной разработки и гарантирует качество кода в production.
Структурированный чек-лист для Code Review
Функциональность
- Код решает заявленную задачу полностью
- Реализованы все требования из тикета/issue
- Нет регрессии (старая функциональность не сломалась)
- Граничные случаи обработаны (null, пустые массивы, ошибки)
- Изменения логичны и минимальны (no scope creep)
Качество кода
SOLID принципы
- Single Responsibility: каждый класс/функция имеет одну задачу
- Open/Closed: открыт для расширения, закрыт для модификации
- Liskov Substitution: подтипы заменяемы базовыми
- Interface Segregation: узкие интерфейсы, не общие
- Dependency Inversion: зависимости через абстракции, не конкреты
DRY, KISS, YAGNI
- Нет дублирования кода (DRY)
- Решение просто и понятно (KISS)
- Нет функционала "на будущее" (YAGNI)
- Удалены commented-out код и неиспользуемые импорты
Читаемость и именование
- Имена переменных, функций, классов понятны и значимы
- Нет магических чисел и строк (используй константы)
- Длина функций разумна (не более 100 строк)
- Сложные алгоритмы задокументированы
- Форматирование консистентно
TypeScript и типизация
- Нет
anyтипов (или обоснованы) - Все функции типизированы (параметры и возвращаемые значения)
- Props компонентов имеют интерфейсы
- Union типы используются вместо boolean параметров
- Типы не дублируются (используй reusable типы)
// ❌ Плохо
function processUser(user: any) { }
function validateEmail(email): boolean { }
// ✅ Хорошо
function processUser(user: User): void { }
function validateEmail(email: string): boolean { }
Архитектура
- Слои соблюдены (presentation → application → domain → infrastructure)
- Зависимости направлены правильно (внутрь слоёв)
- Нет циклических зависимостей
- Database access только через services/repositories
- Бизнес-логика отделена от фреймворка
// ❌ Плохо — прямой доступ к БД из handler
app.get('/users/:id', async (req, res) => {
const user = await db.query('SELECT * FROM users WHERE id = $1', [req.params.id]);
res.json(user);
});
// ✅ Хорошо — через service
app.get('/users/:id', async (req, res) => {
const user = await userService.getUserById(req.params.id);
res.json(user);
});
Тестирование
- Новая функциональность покрыта тестами
- Coverage остаётся >= 90%
- Тесты описывают поведение, а не реализацию
- Нет flaky тестов (которые иногда падают)
- Тесты быстрые (< 100ms на тест в среднем)
- Мокируются внешние зависимости (API, DB)
- Граничные случаи протестированы
// ❌ Плохо — тест описывает реализацию
test('calls findById on repository', () => {
const repo = jest.mock();
userService.getUser('123');
expect(repo.findById).toHaveBeenCalledWith('123');
});
// ✅ Хорошо — тест описывает поведение
test('returns user with correct id', async () => {
const user = await userService.getUser('123');
expect(user.id).toBe('123');
expect(user.name).toBeDefined();
});
Безопасность
- Нет hardcoded секретов (API ключи, пароли)
- Входные данные валидируются
- Защита от SQL injection (используй параметризованные запросы)
- Защита от XSS (санитизируй пользовательский ввод)
- Нет логирования чувствительных данных
- Используются переменные окружения для конфигурации
- Правильные статус коды ошибок (не 500 для валидации)
// ❌ Плохо — SQL injection уязвимость
const user = await db.query(`SELECT * FROM users WHERE id = ${req.query.id}`);
// ✅ Хорошо — параметризованный запрос
const user = await db.query('SELECT * FROM users WHERE id = @userId', {
userId: req.query.id
});
Производительность
- Нет N+1 запросов к БД
- Используются индексы для частых запросов
- Циклические операции оптимизированы
- Не блокирующие операции используют async/await
- Большие объекты не копируются без необходимости
// ❌ Плохо — N+1 запросы
const users = await db.query('SELECT * FROM users');
for (const user of users) {
user.posts = await db.query('SELECT * FROM posts WHERE user_id = @id', { id: user.id });
}
// ✅ Хорошо — один запрос с JOIN
const users = await db.query(`
SELECT u.*, json_agg(p.*) as posts
FROM users u
LEFT JOIN posts p ON u.id = p.user_id
GROUP BY u.id
`);
Логирование и обработка ошибок
- Логируются важные события (создание, обновление, ошибки)
- Нет дублирования логирования ошибок на разных уровнях
- Ошибки обрабатываются (не тихо падают)
- Используются правильные уровни логирования (info, warn, error)
- Контекст логирования полезен для отладки
// ❌ Плохо — дублирование логирования
try {
await userService.create(data);
} catch (error) {
logger.error('Failed to create user', error);
throw error; // Error уже залоггирован в service
}
// ✅ Хорошо — логирование на одном уровне
try {
const user = await userService.create(data);
logger.info('User created', { userId: user.id });
return user;
} catch (error) {
logger.error('Failed to create user', error);
throw error;
}
Работа с базой данных
- Используются миграции для всех изменений схемы
- Миграции протестированы (откат и накат работают)
- SQLAlchemy модели синхронизированы с миграциями
- Используются TIMESTAMPTZ для timestamp полей
- Datetime всегда в UTC с timezone
- Нет race conditions (используется SELECT FOR UPDATE где нужно)
Комментарии и документация
- Публичные функции имеют JSDoc
- Нетривиальная логика задокументирована
- Комментарии объясняют почему, не что
- README обновлён если нужно
- API документация актуальна
Git и коммиты
- Коммиты атомарные (одна логическая единица = один коммит)
- Сообщения коммитов описательные и на русском/английском
- Не более 100 строк изменений в PR (если можно разбить)
- История коммитов чистая (не 50 коммитов с "fix" сообщениями)
# ❌ Плохо
commit: "fixes"
commit: "another fix"
commit: "works now"
# ✅ Хорошо
commit: "feat: добавить кэширование результатов поиска пользователей"
commit: "test: добавить тесты для поиска с фильтрами"
commit: "refactor: извлечь QueryBuilder в отдельный класс"
Backend-специфичные требования
- REST API следует соглашениям (существительные во множественном числе)
- Используется правильный HTTP метод (GET/POST/PUT/DELETE)
- Возвращаются правильные статус коды (200/201/204/400/404/500)
- API версионируется (/api/v1/, /api/v2/)
- Trailing slashes консистентны (без них)
- Pagination реализована для больших коллекций
- Rate limiting где нужно
- CORS настроена правильно
Чек-лист перед отправкой
- Локально всё компилируется и работает
-
make lintпроходит без ошибок -
make testпроходит (тесты не flaky) - Test coverage >= 90%
- Нет console.log() и commented code
- Нет secrets в коде (.env файлы)
- Dependencies обновлены или добавлены с хорошей причиной
Как проводить Code Review эффективно
Структурированный процесс:
- Функциональность — работает ли это?
- Качество — хорош ли код?
- Безопасность — есть ли уязвимости?
- Производительность — эффективно ли это?
- Стиль — соответствует ли стандартам проекта?
Позитивный тон:
# ❌ Плохо
"Это неправильно. Используй правильный паттерн."
# ✅ Хорошо
"Интересный подход! Мы обычно используем это, потому что..."
Профессиональный Code Review — это не критика, а способ улучшить качество кода и развить junior-разработчиков.