← Vibe Coding — and How to Take It to Production
03 / 07 · 45 min

Reading Code You Did Not Write

How to map an unfamiliar project in 15 minutes, trace data from the screen to the database, and spot red flags in generated code.

Lesson content is currently available in Russian.

What you will learn

  • →Строить карту проекта: зависимости, структура папок, точки входа, роуты.
  • →Прослеживать путь данных от кнопки на экране до запроса в базу.
  • →Использовать агента как экскурсовода по коду и проверять его объяснения.

Карта проекта за 15 минут

Скачайте код своего прототипа (все инструменты умеют экспорт в GitHub) и откройте его в редакторе. Не пытайтесь читать подряд — стройте карту. Для типового сгенерированного проекта на React или Next.js достаточно четырёх остановок.

Первая — package.json в корне. Секция dependencies — это список технологий проекта: увидели react — интерфейс на React, @supabase/supabase-js — база Supabase, tailwindcss — стили. Секция scripts — как проект запускать: почти всегда dev для локального запуска и build для сборки.

Вторая — структура папок. Типовая картина:

src/
  components/   — кусочки интерфейса (кнопки, карточки, формы)
  pages/ или app/ — экраны, каждый файл = адрес в браузере
  lib/ или utils/ — вспомогательный код, подключение к базе
  hooks/        — переиспользуемая логика React

Третья — точка входа: src/main.tsx, src/App.tsx или app/layout.tsx. Отсюда видно, какие провайдеры оборачивают приложение: роутер, тема, клиент базы.

Четвёртая — роуты. В Next.js App Router адреса совпадают со структурой папок: app/habits/page.tsx — это страница /habits. В React-проектах ищите файл с createBrowserRouter или компонентом Routes.

Пятнадцать минут на четыре остановки — и у вас есть карта: что за технологии, где экраны, где логика, где база. Этого достаточно, чтобы не блуждать.

Сверху вниз: от кнопки до базы

Лучший способ понять незнакомый код — проследить один сценарий насквозь. Возьмите конкретное действие, например «пользователь отмечает привычку выполненной», и пройдите его сверху вниз.

Начните с экрана: найдите компонент страницы (например, app/habits/page.tsx) и в нём — кнопку отметки. У кнопки есть обработчик, обычно onClick. Идите по цепочке вызовов: обработчик вызывает функцию, функция — запрос к базе. В сгенерированном коде с Supabase конец цепочки выглядит так:

const { error } = await supabase
  .from('checkins')
  .insert({ habit_id: habitId, done_on: today });

Читается почти как английский: в таблицу checkins вставить строку с идентификатором привычки и датой. Не нужно понимать каждый символ — достаточно видеть глаголы: from — из какой таблицы, select — прочитать, insert — добавить, update — изменить, delete — удалить, eq — фильтр «равно».

Два практических приёма ускоряют трассировку. Первый — глобальный поиск по проекту (Cmd/Ctrl+Shift+F): ищите текст с кнопки («Отметить») — найдёте компонент; ищите имя таблицы («checkins») — найдёте все места, где её читают и пишут. Второй — «где это используется»: клик правой кнопкой по имени функции в редакторе, «Find All References».

Пройдите так три сценария своего приложения — и код перестанет быть чёрным ящиком: вы будете знать не всё, но главное — где что происходит.

Агент как экскурсовод — с проверкой

Самый быстрый способ разобраться в сгенерированном коде — спросить того, кто его сгенерировал. Полезные промпты-шаблоны: «объясни файл app/habits/page.tsx по блокам, для новичка»; «нарисуй текстом путь данных: что происходит от нажатия кнопки Отметить до появления записи в базе»; «какие таблицы есть в базе, какие у них поля и кто на них ссылается»; «что сломается, если я удалю функцию calcStreak».

Одно критическое правило: агент может уверенно ошибаться. Модель отвечает правдоподобно, а не гарантированно точно — она может описать код, которого нет, или пропустить важный побочный эффект. Поэтому каждое объяснение проверяйте по самому коду: агент говорит «отметки сохраняются в таблицу checkins» — откройте код и найдите этот insert глазами; говорит «удалять функцию безопасно» — сделайте глобальный поиск её имени и убедитесь, что вызовов действительно нет.

Хорошая привычка — просить агента указывать точные места: «в ответе ссылайся на конкретные файлы и строки». Тогда проверка занимает секунды: открыл файл, посмотрел, совпало.

И ещё один сильный приём — просить объяснение с позиции риска: «прочитай lib/supabase.ts и скажи, что здесь может быть небезопасно или хрупко». Такой промпт часто вскрывает то, о чём вы не догадались бы спросить: ключи в коде, отсутствие обработки ошибок, запросы без фильтра по пользователю. Это мост к следующему уроку — про безопасность.

Красные флаги в сгенерированном коде

Читая vibed-код, держите в голове короткий список красных флагов — их видно даже без глубоких знаний.

  • Секреты в коде. Строки вида sk-..., eyJ... или password прямо в файлах. Особенно опасно всё, что лежит в клиентских файлах — это попадает в браузер каждого пользователя.
  • Пустые catch. Ошибка проглатывается молча, и приложение «просто не работает» без следов:
try {
  await saveCheckin(habitId);
} catch (e) {
  // тишина — пользователь никогда не узнает, что сохранение не удалось
}
  • Дублирование. Один и тот же блок логики скопирован в три компонента с мелкими отличиями. Агент любит копировать вместо переиспользования; баг потом чинится в одном месте из трёх.
  • Запрос в цикле. await внутри for по списку записей — верный кандидат на проблему N+1, о которой подробно поговорим в уроке про рефакторинг.
  • Файлы-гиганты. Компонент на 500+ строк, где смешаны запросы, логика и вёрстка. Работает, но любое изменение в нём рискованно.
  • Мёртвый код и TODO. Закомментированные блоки, // TODO: fix later, неиспользуемые функции — следы прошлых циклов агента.

Найденный флаг — не повод паниковать и не задача «исправить всё сейчас». Заведите файл TECH_DEBT.md и записывайте находки: файл, строка, что не так. Этот список станет планом работ для уроков про безопасность и рефакторинг.

Practice

Экспедиция по собственному прототипу

Экспортируйте прототип в GitHub, постройте карту проекта по четырём остановкам, проследите два сценария от кнопки до базы и соберите список красных флагов с помощью агента и глобального поиска.

Deliverable

Файл TECH_DEBT.md в репозитории: карта проекта (5–10 строк), два прослеженных сценария со ссылками на файлы и не менее пяти найденных красных флагов.

Checkpoint

Как вы поймёте, что объяснение кода, данное агентом, соответствует действительности?

  • ✓ Названа проверка по коду: найти глазами упомянутый файл, функцию или запрос.
  • ✓ Упомянут глобальный поиск по проекту как инструмент трассировки и проверки.
  • ✓ Сформулировано, что агент отвечает правдоподобно, но не гарантированно точно.

Check yourself

С какого файла начинается карта незнакомого JavaScript-проекта?

01С какого файла начинается карта незнакомого JavaScript-проекта?

Что означает вызов supabase.from('checkins').insert({...}) в коде?

02Что означает вызов supabase.from('checkins').insert({...}) в коде?

Почему объяснения агента о коде нужно проверять?

03Почему объяснения агента о коде нужно проверять?

Какой из фрагментов — красный флаг «пустой catch»?

04Какой из фрагментов — красный флаг «пустой catch»?

Что делать с найденными красными флагами?

05Что делать с найденными красными флагами?

Sources

Reading Code You Did Not Write · Vibe Coding — and How to Take It to Production · VORCL