EasyТеория3 min

Что такое Vibe Coding

Разработка на основе интуиции с AI: когда это работает и когда опасно

Определение

Термин "vibe coding" ввел Андрей Карпатый (Andrej Karpathy) -- один из основателей OpenAI, бывший Director of AI в Tesla. В феврале 2025 года он описал свой подход:

"Есть новый вид программирования, который я называю vibe coding, где ты полностью отдаешься вайбу, принимаешь экспоненциальный рост, и забываешь, что код вообще существует. Я прошу вещи, запускаю, и если не работает -- копирую ошибку обратно и обычно это исправляется."

Vibe Coding Workflow:

┌──────────┐    ┌──────────┐    ┌──────────┐    ┌──────────┐
│ Описать  │───▶│ AI       │───▶│ Запустить│───▶│ Работает?│
│ словами  │    │ генерирует│    │ вручную  │    │          │
│ что нужно│    │ код      │    │ проверить│    │  Да → ✓  │
└──────────┘    └──────────┘    └──────────┘    │  Нет → ↩ │
     ▲                                          │  (ошибку │
     │                                          │  в AI)   │
     └──────────────────────────────────────────┘          │
                                                └──────────┘

Ключевые характеристики Vibe Coding

Характеристика Описание
Без чтения кода Разработчик не вникает в генерируемый код
Итерация через AI Ошибки отправляются обратно в AI для исправления
Ручное тестирование "Работает -- не трогай", проверка глазами
Нет архитектуры Код растет органически, без плана
Нет тестов Автоматические тесты не пишутся
Нет review Код не проходит проверку
Интуитивный подход "Чувствую, что это правильно"

Как работает Vibe Coding на практике

Типичная сессия

Разработчик хочет создать простое веб-приложение для учета расходов:

Шаг 1: Описание

"Создай мне приложение для учета расходов на Vue 3 с Nuxt.
Нужна форма добавления расхода (сумма, категория, дата, описание),
список расходов с фильтрацией по категории и месяцу,
график расходов по категориям за месяц."

Шаг 2: AI генерирует код -- появляются файлы, компоненты, стили. Разработчик не вчитывается, запускает.

Шаг 3: Визуальная проверка -- "Форма есть, список показывает, график рисуется. Выглядит нормально."

Шаг 4: Обнаружение проблемы -- "При добавлении суммы 1.5 она сохраняется как 1. Почему?"

Шаг 5: Ошибка отправляется в AI -- "Суммы с дробной частью не сохраняются правильно. Исправь."

Шаг 6: AI исправляет -- меняет тип данных, разработчик запускает, проверяет глазами. "Теперь 1.5 показывается. Ок."

Цикл повторяется для каждой найденной проблемы.

Что остается незамеченным

При vibe coding разработчик не проверяет:

Что не проверяется:

□ Отрицательные суммы (можно ввести -100)
□ Суммы > MAX_SAFE_INTEGER (JavaScript overflow)
□ XSS через поле описания (<script>alert('hack')</script>)
□ SQL injection при фильтрации
□ CSRF при добавлении расхода
□ Race condition при одновременном добавлении
□ Производительность при 100,000 записей
□ Accessibility (screen readers, keyboard navigation)
□ Locale-зависимое форматирование (1.5 vs 1,5)
□ Timezone issues при фильтрации по дате

Когда Vibe Coding уместен

Vibe coding -- это не всегда плохо. У него есть легитимные сценарии применения:

1. Прототипы и MVP

Цель: проверить гипотезу за минимальное время

Вопрос: "Будут ли пользователи вообще использовать такой продукт?"
Ответ: Не нужен production-quality код, нужна работающая демонстрация

Vibe coding здесь: УМЕСТЕН
Срок жизни кода: дни-недели
Пользователи: 5-50 тестировщиков
Данные: тестовые, не чувствительные

Для прототипов скорость важнее качества. Если идея не подтвердится, код будет выброшен. Если подтвердится -- будет переписан с нуля с инженерным подходом.

2. Хакатоны и конкурсы

Хакатон длится 24-48 часов. Цель -- продемонстрировать идею, а не production-ready систему. Vibe coding позволяет:

  • Быстро пройти от идеи до работающего прототипа
  • Сфокусироваться на UX и демонстрации
  • Не тратить время на тесты и инфраструктуру

3. Личные проекты

Персональный скрипт для автоматизации рутины, бот для домашнего использования, калькулятор для себя -- здесь нет пользователей, нет чувствительных данных, нет SLA.

# Personal script to rename photos by date
# Vibe-coded, works for my needs, no production requirements
import os
from datetime import datetime
from PIL import Image
from PIL.ExifTags import TAGS

def rename_photos(directory):
    for filename in os.listdir(directory):
        if filename.lower().endswith(('.jpg', '.jpeg', '.png')):
            filepath = os.path.join(directory, filename)
            try:
                img = Image.open(filepath)
                exif = img._getexif()
                if exif:
                    for tag, value in exif.items():
                        if TAGS.get(tag) == 'DateTimeOriginal':
                            date = datetime.strptime(value, '%Y:%m:%d %H:%M:%S')
                            new_name = date.strftime('%Y-%m-%d_%H%M%S') + os.path.splitext(filename)[1]
                            os.rename(filepath, os.path.join(directory, new_name))
                            break
            except Exception:
                pass  # Skip problematic files

4. Изучение нового языка/фреймворка

Когда вы учитесь, важнее увидеть работающий результат и понять концепции, чем написать production-ready код. Vibe coding с AI -- отличный способ быстро попробовать что-то новое.

5. Одноразовые скрипты

Миграция данных, разовый импорт, скрипт для анализа логов -- код, который выполнится один раз и будет удален.


Когда Vibe Coding опасен

1. Production-системы

Цена ошибки в production:

┌────────────────┐
│  Vibe Coding   │
│  в production  │
└───────┬────────┘
        │
        ▼
┌────────────────┐   ┌────────────────┐   ┌────────────────┐
│ Безопасность   │   │ Надежность     │   │ Масштабируемость│
│                │   │                │   │                │
│ • SQL injection│   │ • Crashes      │   │ • OOM          │
│ • XSS         │   │ • Data loss    │   │ • Slow queries │
│ • CSRF        │   │ • Inconsistency│   │ • Timeouts     │
│ • Auth bypass  │   │ • Race conds   │   │ • Deadlocks    │
└────────────────┘   └────────────────┘   └────────────────┘
        │                    │                     │
        ▼                    ▼                     ▼
   Утечка данных      Потеря данных        Деградация
   пользователей      пользователей        сервиса

2. Работа с чувствительными данными

Персональные данные, финансовая информация, медицинские записи -- любые данные, утечка которых имеет юридические последствия:

<?php

declare(strict_types=1);

// Vibe-coded: "it works" -- but exposes PII
final class UserController
{
    #[Route('/api/users/{id}')]
    public function show(int $id): JsonResponse
    {
        $user = $this->userRepository->find($id);

        // PROBLEM: returns ALL fields, including sensitive ones
        // No authorization check: any user can see any other user's data
        // No rate limiting: can enumerate all users
        return new JsonResponse($user);
    }
}

// What should be there:
final class UserController
{
    #[Route('/api/users/{id}')]
    #[IsGranted('VIEW', subject: 'user')]
    public function show(
        #[MapEntity] User $user,
        #[CurrentUser] User $currentUser,
    ): JsonResponse {
        // Only return safe fields
        return new JsonResponse(
            UserPublicDTO::fromEntity($user, $currentUser)
        );
    }
}

3. Финансовые операции

Ошибки в финансовых расчетах -- это прямые убытки:

<?php

declare(strict_types=1);

// Vibe-coded: floating point for money = bugs
$price = 19.99;
$quantity = 3;
$total = $price * $quantity;
// Expected: 59.97
// Actual: 59.970000000000006 (floating point precision)

// When this accumulates over millions of transactions:
// Each off by 0.01 = $10,000 discrepancy per million transactions

4. Командная разработка

Vibe-coded код, попавший в общий репозиторий, создает проблемы для всей команды:

  • Коллеги не понимают код (нет документации, нет ясной структуры)
  • Невозможно рефакторить (нет тестов, неизвестные side effects)
  • Конфликты стилей (каждый промпт генерирует свой стиль)
  • Растущий технический долг (никто не хочет трогать "работающий" код)

5. Код с длительным сроком жизни

Если код будет использоваться годами, vibe coding создает бомбу замедленного действия:

Стоимость поддержки vibe-coded кода по времени:

Месяц 1:  ██ (дешево: все помнят, что и зачем)
Месяц 3:  ████ (забыли детали, нужно разбираться)
Месяц 6:  ████████ (баги, которые сложно найти)
Месяц 12: ████████████████ (рефакторинг или переписывание)
Месяц 24: "Давайте перепишем с нуля"

Vibe Coding vs Инженерный подход: сравнение

┌─────────────────────────────────────────────────────────────────┐
│              СПЕКТР ПОДХОДОВ К РАЗРАБОТКЕ                        │
│                                                                 │
│  Vibe Coding ◄────────────────────────────────► Engineering     │
│                                                                 │
│  • Без тестов          Есть тесты, но мало       Полное покрытие│
│  • Без архитектуры     Базовая архитектура        ADR + Design  │
│  • Без review          Self-review               Code review    │
│  • Ручная проверка     Базовый CI                Full CI/CD     │
│  • "Работает и ок"     "Работает правильно"      "Работает      │
│                                                   надежно,      │
│                                                   безопасно,    │
│                                                   под нагрузкой"│
│                                                                 │
│  Скорость: ████████   Скорость: ██████          Скорость: ████  │
│  Качество: ██         Качество: ██████          Качество: ██████│
│  Риск:     ████████   Риск:     ████            Риск:     ██    │
│                                                                 │
│  Подходит:            Подходит:                 Подходит:       │
│  Прототипы            Внутренние инструменты    Production      │
│  Хакатоны             Side-проекты              Финансы         │
│  Обучение             Стартапы (ранняя стадия)  Медицина        │
│  Скрипты              Небольшие команды         Крупные проекты │
└─────────────────────────────────────────────────────────────────┘

Детальное сравнение

Аспект Vibe Coding Инженерный подход
Скорость разработки Максимальная (минуты-часы) Умеренная (часы-дни)
Предсказуемость Низкая Высокая
Тесты Нет или минимальные Полное покрытие
Безопасность "Надеюсь, безопасно" Проверено сканерами
Масштабируемость "Работает для 10 пользователей" Проверено бенчмарками
Поддержка Очень дорогая Управляемая
Командная работа Затруднена Стандартизирована
Документация Нет Полная
CI/CD Нет Полный пайплайн
Обработка ошибок "Если сломается -- исправим" Graceful degradation

Как правильно использовать Vibe Coding

Vibe coding -- это инструмент, а не методология. Как и любой инструмент, он хорош в определенных ситуациях и опасен в других.

Правила безопасного использования

Правило 1: ОСОЗНАВАЙТЕ, что вы vibe-кодите
─────────────────────────────────────────────
Проблема не в самом vibe coding, а в том, что разработчики
делают это неосознанно и не переключаются в инженерный режим,
когда это необходимо.

Правило 2: ОПРЕДЕЛИТЕ срок жизни кода
─────────────────────────────────────────────
< 1 неделя → vibe coding допустим
1 неделя - 1 месяц → добавьте минимальные тесты
> 1 месяц → полный инженерный подход

Правило 3: ОПРЕДЕЛИТЕ аудиторию
─────────────────────────────────────────────
Только вы → vibe coding допустим
Команда → базовое quality gate
Пользователи → полный инженерный подход

Правило 4: ОПРЕДЕЛИТЕ чувствительность данных
─────────────────────────────────────────────
Публичные данные → vibe coding допустим
Персональные данные → инженерный подход
Финансовые данные → строжайший инженерный подход

Правило 5: ЗНАЙТЕ, когда остановиться
─────────────────────────────────────────────
Прототип подтвердил гипотезу → СТОП vibe coding
Код нужен в production → СТОП vibe coding
Появились реальные пользователи → СТОП vibe coding

Переход от Vibe Coding к инженерному подходу

Если прототип оказался успешным и код нужно довести до production:

Шаг 1: Аудит
  └─ Прочитайте ВЕСЬ AI-генерированный код
  └─ Составьте список проблем и рисков

Шаг 2: Архитектура
  └─ Определите структуру (модули, слои, зависимости)
  └─ Задокументируйте решения (ADR)

Шаг 3: Тесты
  └─ Напишите тесты на существующее поведение
  └─ Добавьте тесты на edge cases

Шаг 4: Безопасность
  └─ Security scan
  └─ Проверка авторизации
  └─ Валидация входных данных

Шаг 5: Рефакторинг
  └─ Разбейте monolith на модули
  └─ Удалите дублирование
  └─ Стандартизируйте паттерны

Шаг 6: CI/CD
  └─ Настройте автоматические проверки
  └─ Линтеры, тесты, security scan

Шаг 7: Документация
  └─ API-документация
  └─ Deployment guide
  └─ Runbook

Пример: прототип за 2 часа vs production за 2 недели

Vibe Coding: прототип (2 часа)

Промпт: "Создай REST API для списка задач на Symfony"

Результат за 2 часа:
  ✓ CRUD endpoints работают
  ✓ Базовая валидация
  ✓ JSON responses
  ✗ Нет авторизации
  ✗ Нет пагинации
  ✗ Нет rate limiting
  ✗ Нет обработки конкурентного доступа
  ✗ Нет логирования
  ✗ Нет мониторинга
  ✗ Нет тестов
  ✗ Нет документации

Инженерный подход: production (2 недели)

На основе прототипа, добавлено:

Неделя 1:
  ✓ Аутентификация (JWT) и авторизация (Voters)
  ✓ Пагинация (cursor-based)
  ✓ Rate limiting (Symfony RateLimiter)
  ✓ Input validation (Symfony Validator)
  ✓ Error handling (problem details RFC 7807)
  ✓ Unit + integration тесты (80% coverage)
  ✓ API documentation (OpenAPI/Swagger)

Неделя 2:
  ✓ Logging (structured, Monolog)
  ✓ Monitoring (Prometheus metrics)
  ✓ Health checks (/health endpoint)
  ✓ Optimistic locking (concurrent access)
  ✓ CORS configuration
  ✓ Security headers (CSP, HSTS, etc.)
  ✓ CI/CD pipeline
  ✓ Load testing (k6)
  ✓ Deployment documentation

Разница: 2 часа vs 2 недели. Но прототип обслуживает 1 пользователя на localhost, а production-версия -- тысячи пользователей надежно и безопасно.


Ключевые выводы

  1. Vibe coding -- это инструмент, а не методология. Как молоток: полезен для гвоздей, опасен для стекла.

  2. Знайте, когда вы vibe-кодите. Осознанный выбор подхода лучше, чем случайное скатывание в vibe coding.

  3. Определите контекст -- срок жизни кода, аудитория, чувствительность данных -- перед выбором подхода.

  4. Прототип -- это не product. Если vibe-coded прототип успешен, перепишите его с инженерным подходом.

  5. "Разработка без автоматических проверок и quality gates" -- это точное определение vibe coding и одновременно описание его главного риска.

Андрей Карпатый может позволить себе vibe coding, потому что он один из лучших ML-инженеров в мире и работает с прототипами. Большинство разработчиков работают с production-системами, где цена ошибки несоизмеримо выше.