Определение
Термин "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-версия -- тысячи пользователей надежно и безопасно.
Ключевые выводы
-
Vibe coding -- это инструмент, а не методология. Как молоток: полезен для гвоздей, опасен для стекла.
-
Знайте, когда вы vibe-кодите. Осознанный выбор подхода лучше, чем случайное скатывание в vibe coding.
-
Определите контекст -- срок жизни кода, аудитория, чувствительность данных -- перед выбором подхода.
-
Прототип -- это не product. Если vibe-coded прототип успешен, перепишите его с инженерным подходом.
-
"Разработка без автоматических проверок и quality gates" -- это точное определение vibe coding и одновременно описание его главного риска.
Андрей Карпатый может позволить себе vibe coding, потому что он один из лучших ML-инженеров в мире и работает с прототипами. Большинство разработчиков работают с production-системами, где цена ошибки несоизмеримо выше.