Проведение код-ревью веб-приложения
Код-ревью — это не поиск ошибок, а передача знаний и поддержание консистентности кодовой базы. Хороший ревью выявляет архитектурные проблемы, потенциальные баги, нарушения соглашений и возможности для упрощения.
Что проверяем в ревью веб-приложения
Корректность:
- Логика соответствует требованиям
- Edge cases обработаны (null, пустые массивы, граничные значения)
- Обработка ошибок присутствует и осмысленна
Безопасность:
- Входные данные валидируются и санируются
- SQL-инъекции исключены (параметризованные запросы)
- XSS-уязвимости отсутствуют
- Чувствительные данные не логируются
- Авторизация проверяется на каждом endpoint
Производительность:
- N+1 запросы отсутствуют
- Тяжёлые операции выполняются асинхронно
- Правильное использование кэша
Читаемость и поддерживаемость:
- Функции делают одно (Single Responsibility)
- Имена переменных и функций говорящие
- Сложная логика имеет комментарии
Чеклист для React/TypeScript
// ПЛОХО: any разрушает типизацию
const handleData = (data: any) => { ... }
// ХОРОШО: явный тип
interface UserData { id: number; name: string; email: string; }
const handleData = (data: UserData) => { ... }
// ПЛОХО: useEffect без зависимостей (бесконечный цикл)
useEffect(() => {
setData(processData(data));
}); // нет массива зависимостей
// ПЛОХО: мутация state напрямую
const handleAdd = () => {
items.push(newItem); // мутация
setItems(items);
};
// ХОРОШО
const handleAdd = () => {
setItems(prev => [...prev, newItem]);
};
// ПЛОХО: чувствительные данные в URL
const url = `/api/users?password=${password}`;
// ХОРОШО: в body
fetch('/api/users', { method: 'POST', body: JSON.stringify({ password }) });
Чеклист для API/Backend
// ПЛОХО: нет валидации входных данных
app.post('/users', async (req, res) => {
const user = await db.user.create({ data: req.body }); // доверяем клиенту
});
// ХОРОШО: Zod-валидация
const createUserSchema = z.object({
email: z.string().email(),
name: z.string().min(2).max(100),
role: z.enum(['user', 'editor']), // не позволяем задать 'admin'
});
// ПЛОХО: N+1 запросы
const posts = await db.post.findMany();
for (const post of posts) {
post.author = await db.user.findUnique({ where: { id: post.authorId } }); // N запросов
}
// ХОРОШО: include
const posts = await db.post.findMany({ include: { author: true } });
// ПЛОХО: отсутствие проверки прав
app.delete('/posts/:id', async (req, res) => {
await db.post.delete({ where: { id: req.params.id } }); // любой может удалить чужой пост
});
// ХОРОШО:
app.delete('/posts/:id', authenticate, async (req, res) => {
const post = await db.post.findUnique({ where: { id: req.params.id } });
if (post.authorId !== req.user.id) return res.status(403).json({ error: 'Forbidden' });
await db.post.delete({ where: { id: req.params.id } });
});
Процесс ревью
## Pull Request Template
### Что изменилось
- Добавлена функция авторизации через Google OAuth
- Исправлен баг с двойной отправкой формы
### Как тестировать
1. Перейти на /login
2. Нажать "Войти через Google"
3. Убедиться, что создаётся сессия
### Чеклист
- [ ] Тесты написаны/обновлены
- [ ] TypeScript без ошибок (`tsc --noEmit`)
- [ ] Линтер без ошибок (`npm run lint`)
- [ ] Переменные окружения задокументированы
Инструменты автоматической проверки
# GitHub Actions: автоматические проверки до ревью
- run: npm run typecheck
- run: npm run lint
- run: npm test -- --coverage
- run: npx audit-ci --high
Ревью среднего Pull Request (200–500 строк) — 1–2 часа. Ревью архитектурных изменений — 4–8 часов.







