## Качество кода
AI-инструменты для code review, тестирования и документации.
---
### Зачем AI для качества кода?
Традиционные инструменты (линтеры, статический анализ) находят синтаксические ошибки и нарушения стиля. Но они не понимают логику. AI может:
- Найти логические ошибки ("ты проверяешь условие, но потом игнорируешь результат")
- Предложить улучшения архитектуры
- Сгенерировать тесты, о которых ты не подумал
- Написать документацию, понимая что делает код
```
Линтер:
❌ "Отступ 3 пробела вместо 4"
❌ "Неиспользуемая переменная"
AI:
❌ "Эта функция может вернуть null, но вызывающий код не проверяет это"
❌ "Race condition: два потока могут одновременно изменить этот объект"
❌ "SQL-инъекция: user_input напрямую вставляется в запрос"
```
---
### CodeRabbit
**Сайт:** https://coderabbit.ai
**Что это?**
AI, который автоматически ревьюит каждый Pull Request в твоём репозитории.
**В каком виде поставляется?**
GitHub/GitLab App. Устанавливаешь → он подключается к репо.
**Цена?**
- Free: для open-source проектов
- Pro: $15/мес/пользователь
**Проблема, которую решает:**
Ты создал PR. Ждёшь ревью от коллег — они заняты. Проходит день, два. Или коллега смотрит поверхностно: "LGTM" — и пропускает баг. Нет времени на тщательный ревью каждого PR.
**Как работает:**
CodeRabbit — как ревьюер, который всегда онлайн и проверяет каждую строку.
```
┌─────────────────────────────────────────────────────────────┐
│ GitHub Pull Request #42 │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Твои изменения: │ │
│ │ │ │
│ │ + function processPayment(amount) { │ │
│ │ + const result = api.charge(amount); │ │
│ │ + return result; │ │
│ │ + } │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 🐰 CodeRabbit review: │ │
│ │ │ │
│ │ **Проблема безопасности:** │ │
│ │ Нет валидации amount. Если передать отрицательное │ │
│ │ значение, можно сделать "возврат" на любую сумму. │ │
│ │ │ │
│ │ **Предложение:** │ │
│ │ ```js │ │
│ │ if (amount <= 0) throw new Error('Invalid amount');│ │
│ │ ``` │ │
│ │ │ │
│ │ **Также заметил:** │ │
│ │ - Нет обработки ошибок от api.charge() │ │
│ │ - Отсутствует логирование для аудита │ │
│ └─────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
```
Ты создаёшь PR → через минуту CodeRabbit оставляет комментарии:
- К конкретным строкам (как живой ревьюер)
- Общее резюме изменений
- Список потенциальных проблем
- Предложения по улучшению
Можно отвечать на комментарии — CodeRabbit понимает контекст и продолжает диалог.
**Пример:**
PR: добавили новый API endpoint.
CodeRabbit находит:
1. "Нет rate limiting — можно заDDoS'ить"
2. "Пароль передаётся в query string — виден в логах"
3. "SQL-запрос строится конкатенацией — SQL injection"
4. "Нет теста для edge case: пустой массив"
Ты исправляешь → CodeRabbit перепроверяет → "Now it looks good! ✅"
---
### CodiumAI (Qodo)
**Сайт:** https://codium.ai (теперь Qodo)
**Что это?**
AI для автоматической генерации юнит-тестов.
**В каком виде поставляется?**
Плагин для VS Code и JetBrains IDE.
**Цена?**
- Free: базовые функции
- Teams: $19/мес/пользователь
**Проблема, которую решает:**
Ты написал функцию. Нужны тесты. Но писать тесты скучно, и ты не всегда придумываешь все edge cases. В итоге покрытие 30%, и баги находят пользователи.
**Как работает:**
CodiumAI анализирует твою функцию и генерирует тесты для всех возможных сценариев.
```
┌─────────────────────────────────────────────────────────────┐
│ Твоя функция: │
│ │
│ function divide(a, b) { │
│ return a / b; │
│ } │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ CodiumAI генерирует: │
│ │
│ ✅ Базовый случай │
│ test("divides 10 by 2", () => expect(divide(10,2)).toBe(5))
│ │
│ ✅ Дробный результат │
│ test("divides 7 by 2", () => expect(divide(7,2)).toBe(3.5))
│ │
│ ⚠️ Edge case: деление на ноль │
│ test("division by zero", () => expect(divide(10,0)).toBe(Infinity))
│ // Вопрос: это ожидаемое поведение или нужен throw? │
│ │
│ ⚠️ Edge case: отрицательные числа │
│ test("negative numbers", () => expect(divide(-10,2)).toBe(-5))
│ │
│ ⚠️ Edge case: оба аргумента ноль │
│ test("0/0 returns NaN", () => expect(divide(0,0)).toBeNaN())
│ │
│ ⚠️ Edge case: очень большие числа │
│ test("large numbers", () => ...) │
└─────────────────────────────────────────────────────────────┘
```
Ты выделяешь функцию → вызываешь CodiumAI → получаешь:
- Набор готовых тестов
- Edge cases, о которых ты не думал
- Вопросы: "Это баг или фича?"
**Пример:**
Функция `validateEmail(email)`:
CodiumAI генерирует тесты для:
- Обычный email: `
[email protected]` ✅
- Без домена: `test@` ❌
- Без @: `testexample.com` ❌
- Пустая строка: `` ❌
- null/undefined: ? (ты решаешь: throw или false)
- Unicode: `тест@example.com` ? (зависит от требований)
- Очень длинный email: 500 символов
- С плюсом: `
[email protected]` (Gmail alias)
- Несколько @: `test@@example.com`
20 тестов за 10 секунд вместо 30 минут ручной работы.
---
### Mintlify
**Сайт:** https://mintlify.com
**Что это?**
AI для автоматической генерации и хостинга документации.
**В каком виде поставляется?**
SaaS + CLI. Генерирует документацию из кода и хостит её.
**Цена?**
- Free: 1 проект
- Startup: $120/мес
- Growth: $400/мес
**Проблема, которую решает:**
Документация всегда устаревает. Ты написал код, потом изменил, а документацию забыл обновить. Или вообще не было времени её писать. В итоге README врёт, и новые разработчики мучаются.
**Как работает:**
Mintlify — как технический писатель, который читает твой код и пишет документацию.
```
┌─────────────────────────────────────────────────────────────┐
│ Твой код: │
│ │
│ /// <summary> │
│ /// Processes a payment transaction. │
│ /// </summary> │
│ public async Task<PaymentResult> ProcessPayment( │
│ decimal amount, │
│ string currency, │
│ PaymentMethod method) │
│ { │
│ // ... implementation │
│ } │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Mintlify генерирует: │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 📖 ProcessPayment │ │
│ │ │ │
│ │ Processes a payment transaction. │ │
│ │ │ │
│ │ **Parameters:** │ │
│ │ | Name | Type | Description │ │
│ │ |----------|---------------|---------------------| │
│ │ | amount | decimal | Transaction amount │ │
│ │ | currency | string | ISO currency code │ │
│ │ | method | PaymentMethod | Card, Bank, Crypto │ │
│ │ │ │
│ │ **Returns:** PaymentResult │ │
│ │ │ │
│ │ **Example:** │ │
│ │ ```csharp │ │
│ │ var result = await ProcessPayment( │ │
│ │ 100.00m, "USD", PaymentMethod.Card); │ │
│ │ ``` │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ 🌐 Hosted at: docs.yourcompany.com │
└─────────────────────────────────────────────────────────────┘
```
Mintlify:
1. Читает код и комментарии
2. Анализирует типы, параметры, возвращаемые значения
3. Генерирует человекочитаемую документацию
4. Создаёт примеры использования
5. Хостит с красивым UI
6. **Автоматически обновляет** при изменении кода
**Пример:**
У тебя 50 API endpoints. Вместо ручного написания OpenAPI/Swagger:
1. Подключаешь Mintlify к репо
2. Он сканирует контроллеры, модели, комментарии
3. Генерирует docs.yourcompany.com с:
- Списком всех endpoints
- Описанием параметров
- Примерами запросов/ответов
- Интерактивным "Try it" (как Swagger UI)
Изменил код → документация обновилась автоматически.
---
### Когда какой инструмент?
| Задача | Инструмент |
|--------|------------|
| Автоматический ревью PR | CodeRabbit |
| Генерация юнит-тестов | CodiumAI |
| Документация из кода | Mintlify |
Можно использовать все три вместе:
1. Пишешь код
2. CodiumAI генерирует тесты
3. CodeRabbit ревьюит PR
4. Mintlify обновляет документацию
Весь цикл качества автоматизирован.