EE-VibeCoding

Антипаттерны вайбкодинга для начинающих: 10 способов сломать проект

Вайбкодинг — это когда ты описываешь задачу человеческим языком, модель пишет код, ты запускаешь — и оно работает. Иногда. Какое-то время.

А потом ты приходишь на собеседование, и тебя просят объяснить, что делает твой собственный проект. И ты произносишь фразу: «Ну... оно как бы... в общем, я сейчас промпт покажу».

1. Копируй код, не читая. Модель же умная

Если LLM выдала тебе код, значит, код правильный. Зачем тебе знать, что такое async, если оно и так запускается? Зачем разбираться в useEffect, если можно попросить: «сделай, чтобы данные подгружались»? Ты же не хирург — тебе не обязательно знать, что внутри пациента.

Ну, то есть проекта.

Вайбкодер, который «пишет» код, не думаяЭто самый сладкий из антипаттернов. Код работает, дофамин идёт, зачем портить кайф чтением? Я сам так делал. Два дня генерировал React-приложение, которое делало ровно то, что нужно. А на третий день понадобилось поменять одну кнопку — и я 40 минут не мог найти, где она вообще рендерится, потому что в собственном проекте ориентировался как турист в токийском метро.

На собеседовании это выглядит ещё краше. Тебя просят добавить фичу в твой же проект — и ты сидишь, как студент, который купил дипломную работу и теперь объясняет комиссии, что «ну, тут такой подход, потому что... потому что так получилось».

Противоядие: прежде чем вставить код, прочитай его. Если видишь незнакомую конструкцию — спроси модель: «объясни вот эту строку, как будто мне 10 лет». Это займёт минуту. Зато через неделю ты будешь ловить баги глазами, а не пятнадцатым промптом.

2. Тесты — для трусов и бюрократов

Тесты — это для тех, кто не уверен в себе. А ты уверен. LLM написала код. Если бы что-то было не так, она бы сказала. Правда?

...правда?

Любимый сценарий: проект готов, всё локально работает, даже скриншоты для README сделаны. Показываешь заказчику. Он вводит своё имя кириллицей в поле, которое ты тестировал только латиницей. Приложение падает. Без ошибки. Просто белый экран и ощущение экзистенциальной пустоты.

Или лучше: ты пишешь API, модель радостно генерирует эндпоинт за эндпоинтом. Всё работает на localhost:8000/docs. Деплоишь. Первый пользователь отправляет null в обязательное поле — и Postgres вежливо сообщает, что constraint violation. А фронтенд показывает «undefined is not a function». Классика.

Противоядие: проси модель сразу писать тесты. Прямо в промпте: «напиши функцию и юнит-тесты, включая edge cases — пустые строки, null, Unicode, числа за пределами диапазона». И запускай их. Каждый раз. Тест — это не бюрократия, это ремень безопасности. Можешь ездить без него, но однажды пожалеешь.

3. Документацию пусть читают нёрды. Ты — вайбкодер

Зачем читать доку, если можно просто попросить: «подключи мне Stripe»? Модель наверняка знает все API наизусть. А то, что она обучалась на данных двухлетней давности и с тех пор API три раза поменялся — ну, это мелочи.

Вот конкретная история. Человек попросил модель написать интеграцию с мессенджер Bot API. Модель написала. С answerCallbackQuery, с инлайн-кнопками, всё как у людей. Только использовала синтаксис библиотеки, которой не существует. Просто скомбинировала названия из python-мессенджер-bot и aiogram в один франкенштейновский импорт. И код выглядел настолько уверенно, что человек три часа искал баг в своей логике, а не в несуществующем модуле.

Модели галлюцинируют. Причём делают это с покерфейсом. Они не краснеют, не мнутся, не говорят «слушай, я не уверена». Они выдают чушь с интонацией профессора.

Противоядие: перед интеграцией с чем угодно — открой актуальную документацию. Скопируй нужный раздел и вставь в контекст: «вот дока Stripe Checkout API от 2025 года, напиши интеграцию строго по ней». Модель с актуальным контекстом — это другая модель. Это как один и тот же студент с шпаргалкой и без.

4. Безопасность — проблема будущего тебя. А будущий ты — крепкий парень, справится

API-ключ прямо в коде? Ну он же на localhost. SQL-инъекции? Кому нужен мой to-do-list? CORS отключён? Зато всё работает. Пароли хранятся в открытом виде? Да тут три пользователя, все мои друзья.

Реальная хронология:

  • Понедельник: ты заливаешь проект на Git. Токен OpenAI лежит в config.py, строка 14.
  • Понедельник, +14 секунд: бот сканит публичные репозитории и находит твой токен.
  • Вторник, утро: на аккаунте $200 за чужие запросы к GPT-4.
  • Вторник, обед: ты узнаёшь, что Git теперь помечает такие репы предупреждением, и все твои будущие работодатели это увидят.

И это оптимистичный сценарий. В пессимистичном — через незащищённый эндпоинт утекает база данных. Даже если в ней только email'ы твоих трёх друзей — тебе будет неприятно объяснять им это.

Противоядие: чеклист перед каждым коммитом. Секреты — в .env, файл — в .gitignore. Запросы к БД — параметризованные (никаких f-строк с пользовательским вводом!). Входные данные — валидируются. И да, попроси модель провести аудит: «проверь этот код на типовые уязвимости из OWASP Top 10». Она не найдёт всё, но очевидные дыры закроет. А ломают обычно через очевидные.

5. Не ставь задаче границ. Пусть ИИ сам разберётся, что ты хотел

«Сделай приложение для учёта финансов». Точка. Промпт закончен. Какие тут БД, роли, аутентификация — пусть модель решает, ей виднее. Ты здесь за вайб, а не за спецификации.

Хотелось современного UX, получился киберпанк-кошмарМодель не умеет читать мысли. Но она умеет делать вид, что умеет. Ты пишешь «сделай приложение» — она сделает. С собственной реализацией крипто (пожалуйста, нет), с ORM на коленке, с архитектурой, которую нельзя ни тестировать, ни масштабировать. Ты получишь монолит на 2000 строк, где бизнес-логика перемешана с отрисовкой кнопок, и переписать его дороже, чем начать заново.

Я однажды попросил модель «написать CRM». Без уточнений. Она выдала Flask-приложение с SQLite, которое хранило данные клиентов в одной таблице вместе с заметками, задачами и... прогнозом погоды. Нет, я не знаю, зачем там прогноз погоды. Модель тоже не знала. Но она его добавила — с полной уверенностью.

Противоядие: декомпозируй задачу до того, как откроешь чат. «REST API на FastAPI, CRUD для таблицы expenses, PostgreSQL, Alembic для миграций, Pydantic-схемы. Авторизацию пока не трогаем, это следующий шаг». Вайбкодинг — это не «делегируй и забудь», а «ставь задачу и контролируй результат». Ты — продакт-менеджер своего кода.

6. Ошибка? Напиши «исправь». Повтори 15 раз

Ошибка в консоли. Копируешь → вставляешь → «исправь». Модель что-то поменяла, появилась новая ошибка. «Исправь». Ещё одна. «ИСПРАВЬ». Через 20 минут код разросся вдвое, работает хуже, чем вначале, а в git log (если он у тебя вообще есть) написано «fix», «fix2», «fix pls», «fix final», «fix final real».

Это лечение головной боли гильотиной. Модель без контекста не чинит причину, а прячет симптом. Каждое «исправление» — это обходной путь поверх предыдущего обходного пути. Код превращается в архитектурную лазанью: слоёв много, но есть невозможно.

Мой личный рекорд: 11 итераций «исправь» подряд, после которых модель начала отменять свои предыдущие исправления. То есть баг совершил полный кругосветный маршрут и вернулся в исходную точку. С сувенирами в виде трёх лишних try/except и одного бессмысленного time.sleep(2), который, видимо, был добавлен из надежды, что баг просто устанет и уйдёт сам.

Противоядие: перед тем как написать «исправь», прочитай ошибку. Traceback — не ругательство, а карта. Найди строку, пойми, что сломалось. Потом напиши: «TypeError в строке 42: функция ожидает list, получает None. Похоже, fetch_data() возвращает None при пустом ответе. Как лучше обработать этот edge case?» Один хороший промпт бьёт пятнадцать слепых «исправь».

7. Git — для корпоратов. У тебя есть Ctrl+Z и папка «проект_финал_v2_FINAL(3)»

Система контроля версий — это для команд. Ты же один. У тебя есть «Отменить» в редакторе и файловая система с богатым именованием. app.py, app_backup.py, app_old.py, app_DO_NOT_DELETE.py. Кому нужен Git?

Тебе. Git нужен тебе.

Первая причина прагматическая: ты попросил модель «отрефакторить» файл, она весело переписала 200 строк — и оно перестало работать. Ctrl+Z отматывает последние пять правок. А тех 200 строк больше нет. Всё. Предыдущая версия утрачена, как Атлантида.

Вторая причина карьерная: работодатели смотрят Git. И «Initial commit» с 50 файлами и идеальным кодом — это красный флаг. Это говорит либо «я сгенерировал всё за один присест», либо «я не умею пользоваться Git». Оба варианта плохие. А вот аккуратная история коммитов с внятными сообщениями — это история твоих решений. Доказательство того, что ты думал, а не просто копировал.

Противоядие: git init — первая команда в любом проекте. Коммить маленькими осмысленными порциями. «Add expense validation», «Fix Unicode handling in CSV parser», «Refactor DB queries to use parameterized statements». Это не занудство, а профессионализм.

8. Одна модель на все случаи жизни

Ты влюбился в ChatGPT? Прекрасно. Используй его для всего: код, SQL, DevOps, резюме, письма бабушке. Зачем пробовать что-то ещё, если уже есть «тот самый»?

«У меня нет проблем с инструментами — один молоток на все случаи жизни!»Это ловушка первой любви. Ты привыкаешь к одной модели, упираешься в её ограничения — и решаешь, что это ограничения ИИ в целом. GPT плохо работает с длинным контекстом, а ты делаешь вывод, что модели не тянут большие проекты. Одна модель слабо пишет тесты, а ты думаешь, что ИИ не умеет в тестирование.

При этом CLI-агенты вроде Claude Code работают совершенно иначе, чем чат. Copilot в IDE — это третий опыт. Cursor — четвёртый. Каждый инструмент хорош в своём контексте: один лучше рефакторит, другой генерирует тесты, третий лучше держит контекст всего проекта.

Противоядие: пробуй разные модели для разных задач. Ищи не «лучшую», а подходящую. Хороший вайбкодер — это не фанат одной модели, а дирижёр оркестра. У него скрипки для мелодии и барабаны для ритма, а не одна волынка на все случаи жизни.

9. Портфолио не нужно. Промпты — вот твой главный скил

Зачем портфолио, если можно прямо на собеседовании попросить модель написать всё, что нужно? Покажешь им мастер-класс по промптингу в реальном времени. Это же будущее, они оценят.

Они не оценят.

Вариант А: тебе дают тестовое без доступа к ИИ. Ты сидишь перед пустым редактором, как пианист, который учился играть только с автоаккомпанементом. Пальцы помнят клавиши, но мелодию вытянуть не могут.

Вариант Б (хуже): тебе дают тестовое с доступом к ИИ и просят объяснить каждое решение. «Почему тут useCallback, а не useMemo?» — «Ну... потому что модель так написала». Занавес.

Противоядие: собирай портфолио из проектов, которые можешь объяснить вдоль и поперёк. В README пиши не только что проект делает, но и почему ты принял конкретные решения. «Выбрал SQLite вместо PostgreSQL, потому что это однопользовательское десктопное приложение и мне не нужен сетевой доступ к БД» — одно это предложение стоит дороже, чем 500 строк сгенерированного кода. Потому что за ним стоит понимание.

10. Фундамент — это прошлый век. Нынче главное — промпт-инжиниринг

Алгоритмы, структуры данных, сети, паттерны проектирования — кому всё это нужно в 2026-м? Главный навык современности — уметь формулировать промпт. Зачем знать, как работает хеш-таблица, если модель напишет любой словарь?

А затем, что без фундамента ты не сможешь отличить хороший сгенерированный код от плохого. Модель предложила вложенный цикл по двум массивам по 100 000 элементов? O(n²) на ровном месте, но ты этого не видишь — и пропускаешь. Модель выбрала пузырьковую сортировку? Звучит мило, «пузырьки» — что может пойти не так? А потом продакшен ложится, когда данных становится больше, чем три тестовые записи.

Или вот: модель написала SQL-запрос, который на 100 строках работает за 5 мс, а на 100 000 — за 40 секунд. Если ты знаешь, что такое индекс и EXPLAIN, ты это поймаешь на ревью. Если не знаешь, поймаешь в три часа ночи, когда позвонит мониторинг.

Противоядие: используй модель как репетитора, а не как замену знаниям. «Объясни, почему тут лучше set, а не list, для проверки вхождения». «Какая сложность у этого алгоритма и можно ли лучше?». «В чём разница между JOIN и подзапросом в этом случае?». ИИ — отличный учитель. Но учиться всё ещё нужно тебе.

Бонус: тест на зависимость

Открой свой последний проект. Выключи Wi-Fi. Попробуй добавить что-нибудь простое — фильтрацию списка, валидацию формы, пагинацию.

Если через 15 минут ты сидишь и смотришь в экран, как в бездну, — эта статья была для тебя.

И это ладно. Это нормально. Мы все через это проходили. Главное — заметить это сейчас, а не в момент, когда HR спросит: «А расскажите поподробнее про ваш проект».

Вместо заключения

Вайбкодинг — отличный инструмент. Но «умею генерировать код» — это примерно как «умею заказывать еду через Delivery Club». Техническая грамотность, понимание архитектуры, способность читать чужой код (включая код, который модель написала «за тебя») — вот что отличает разработчика от оператора промптов.

LLM — это джуниор-разработчик с энциклопедическими знаниями и нулевой ответственностью. Он напишет всё, что попросишь. Он не скажет «стой, это плохая идея». Он не остановится и не спросит «а ты уверен?». Это твоя работа — думать, проверять, принимать решения.

И чем раньше ты начнёшь это делать, тем быстрее перестанешь быть «тем парнем, который вайбкодит» и станешь тем, кого нанимают.

А если тебе кажется, что ни один из десяти пунктов — не про тебя, перечитай шестой. Он точно про тебя.