Проведення код-ревью веб-програми
Код-ревью — це не пошук помилок, а передача знань та підтримання консистентності кодової бази. Хороше ревью виявляє архітектурні проблеми, потенційні баги, нарушення угод та можливості для спрощення.
Що перевіряємо в ревью веб-програми
Коректність:
- Логіка відповідає вимогам
- Edge cases оброблені (null, пусті масиви, граничні значення)
- Обробка помилок присутня та осмисленна
Безопасність:
- Вхідні дані валідуються та саніруються
- SQL-інєкції виключені (параметризовані запити)
- XSS-уязвимості відсутні
- Чутливі дані не логуються
- Авторизація перевіряється на кожному endpoint
Продуктивність:
- N+1 запити відсутні
- Важкі операції виконуються асинхронно
- Правильне використання кеша
Читабельність та maintainability:
- Функції роблять одне (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 годин.







