## Качество кода 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 обновляет документацию Весь цикл качества автоматизирован.