Введение
Я занимаюсь разработкой с помощью AI уже больше года. Начинал как скептик, а теперь без ChatGPT (и его аналогов) не пишу ни строчки кода. Vibe coding — это не про то, чтобы заменить программиста, а про то, чтобы ускорить его в 3-5 раз. Но есть нюанс: AI часто «срезает углы». Он генерирует код, который работает, но не всегда оптимален. В этой статье — мои заметки о том, почему так происходит и как с этим бороться.
Как AI «жульничает» в коде
Когда я прошу Claude или GPT написать функцию для обработки данных, он часто возвращает что-то вроде for (let i = 0; i < array.length; i++) — даже если есть более быстрый map или reduce. Почему? Потому что в обучающих данных больше примеров с циклами, чем с функциональными методами. AI не думает о производительности — он думает о вероятности.
Пример из моего кейса: я попросил AI написать парсер CSV-файла. Он вернул код, который читал весь файл в память и затем парсил. Для файла на 10 строк — ок, но для файла на 1 млн строк — это катастрофа. Я потратил 20 минут на рефакторинг, чтобы сделать потоковый парсер. Вывод: AI не знает контекста нагрузки.
«Срезание углов» в архитектуре
Еще один частый случай — AI не использует готовые библиотеки. Вместо того чтобы подключить lodash или moment.js, он пишет свою реализацию. Это быстро, но небезопасно: тестирование, поддержка, баги. Я заметил, что AI чаще «изобретает велосипед», если в промпте не указать явно «используй библиотеки».
Вот таблица типичных «срезанных углов» и решений:
| Тип угла | Пример от AI | Как исправить |
|---|---|---|
| Игнорирование библиотек | Ручная сортировка массива | Добавить в промпт: «используй _.sortBy из lodash» |
| Отсутствие обработки ошибок | Нет try/catch | Указать: «добавь обработку ошибок для всех асинхронных вызовов» |
| Плохая типизация | Любой тип вместо строгого | Прописать типы вручную или запросить TypeScript |
| Избыточная вложенность | Тройные вложенные циклы | Запросить рефакторинг с разделением на функции |
Почему AI это делает?
Исследование OpenAI (2024) показало, что модели обучаются на коде из GitHub, где 80% — это «быстрые» решения без оптимизации. AI воспроизводит паттерны, которые видел чаще всего. Это не злой умысел — это статистика. Как сказал Андрей Карпатый в своем выступлении на NeurIPS 2023: «AI — это зеркало данных. Если вы даете ему мусор, он вернет мусор, только быстрее».
Поэтому в vibe coding важно не просто дать задачу, а задать контекст: «напиши код для production-среды с учетом производительности и безопасности». Без этого AI будет «срезать углы».
Как я борюсь с этим
Я использую три правила:
1. Четкий промпт. Вместо «напиши функцию» пишу: «напиши функцию на TypeScript с использованием async/await, обработкой ошибок и типизацией». Это сокращает количество правок на 40%.
2. Ревью кода. После генерации я всегда проверяю код на уязвимости и производительность. AI не заменяет code review.
3. Итерации. Если первый результат плох — я не правлю вручную, а даю feedback AI: «перепиши, используя map вместо for». Через 2-3 итерации код становится хорошим.
Пример: недавно я писал интеграцию с Telegram API. Первый вариант от AI был на чистом fetch без обработки rate limit. Я дал feedback — и через 5 минут получил готовый код с очередью и ретраями.
Заключение
AI в vibe coding — это мощный инструмент, но он не идеален. «Срезание углов» — это не баг, а особенность. Если вы знаете, как с этим работать, то экономите часы. Если нет — получаете код, который надо переписывать. Мой совет: не доверяйте AI слепо, проверяйте, уточняйте и итерируйте. Это окупается.
В следующей части разберу, как настроить промпты для production-кода. Подписывайтесь на блог, чтобы не пропустить.
Комментарии