Изначально я скептически относился к генерации кода с помощью ИИ. Ранее опыт с GPT в Copilot вызывал больше раздражения, чем пользы. Ожидал, что Claude, возможно, что-то сгенерирует, но потом придётся неделями доделывать вручную.
Я ошибался. Работоспособное приложение было создано за час. Ещё день ушёл на тестирование и доработку через промпты. В итоге я потратил три недели на рефакторинг, документацию и улучшение процесса разработки. Поделюсь этим опытом.
Что за приложение?
Важно понимать, насколько проект сложнее «Hello World» и отличается от типовых трекеров задач или копипасты open-source решений.
У нас есть инструмент моделирования, к которому нужно было добавить анализ связей в моделях. Например: «В каких процессах и для чего используется та или иная информационная система?»
Сгенерированное приложение включает следующие функции:
- Получение моделей через API из репозитория
- Визуализация графа или таблицы
- Фильтрация по типам объектов и связей
- Быстрый поиск по названию
- Разные режимы отображения композиции (вложенные объекты или связи)
- Легенда
- Всплывающие подсказки
- Подсветка связанных объектов
- Форма свойств
- Проваливание в объект (drill-down)
- Разные алгоритмы компоновки (layout)
- Экспорт в PNG, SVG, CSV
- Возможность поделиться ссылкой с сохранением фильтров и настроек
- Сохранение состояния в Local Storage
- Навигация вперёд/назад без перезагрузки
- Тёмная и светлая тема
- Поддержка нескольких языков
Несмотря на внешнюю простоту, реализация требует сложной логики. Например, в режиме drill-down при фильтрации скрытые объекты могут делать недоступными другие — если они больше не достижимы по прямому пути от корневого элемента.
Архитектура и технологии
Вместо интеграции в основное приложение, я решил сделать отдельный инструмент. Это снизило нагрузку на ИИ и упростило разработку.
Приложение — простой фронтенд на HTML, CSS, JavaScript без фреймворков (React, Vue и т.п.) и без сборщиков. Внешних зависимостей — минимум.
Мне нравится такой подход по трём причинам:
- Простота. Нет проблем с «Uncaught ReferenceError» в production, вечной пересборкой, нехваткой памяти или странной работой React. Никаких костылей ради сборки.
- Свобода. Можно быстро реализовать любую идею — например, реактивность на сигналах. Фреймворки навязывают свои решения, часто странные. Чистые веб-технологии позволяют делать отличные приложения без лишнего шума.
- Расширяемость. Любой человек может создать инструмент для анализа моделей, не вникая в сотни тысяч строк кода и не устанавливая сложные инструменты разработки.
Документация: как я начал управлять процессом
Сначала я описал идею в промпте, попросил Claude сгенерировать спецификацию и код. Затем добавлял фичи в стиле «хочу грабить корованы». На первых итерациях всё работало хорошо.
Но со временем код и документация становились всё менее понятными. Ручное тестирование утомило. Я начал оптимизировать процесс.
Монолитную спецификацию я разбил на отдельные документы:
- Видение продукта
- Функциональные требования
- Нефункциональные требования
- Системные требования
- Сценарии тестирования
- Матрица трассировки требований
- Правила написания документов и кода
Видение продукта
Документ описывает:
- Назначение приложения
- Решаемые проблемы
- Целевую аудиторию
- Отличия от аналогов
- Критерии успеха
- Дорожную карту
Функциональные требования
Список функций, сгруппированных по логическим блокам. Каждой функции присвоен уникальный код для удобства ссылок. Также указано, что не входит в функциональность.
LLM плохо справлялась с группировкой и добавляла лишнюю информацию. Важно критически оценивать вывод ИИ, а не принимать его как есть.
Нефункциональные требования
Включает категории:
- Производительность
- Надёжность
- Удобство использования
- Качество
- Инфраструктура
- Соответствие стандартам
Важно указывать конкретные метрики: например, граф из тысячи объектов должен отображаться за 2 секунды, фильтрация — не дольше 200 мс.
LLM генерировала много воды. После сокращения в 10 раз смысл почти не терялся. Документы стоит жёстко сжимать.
Системные требования
Оформлены по шаблону:
- Пользовательские сценарии: код, название, описание, ссылки на функциональные требования, пользовательская история, шаги с ожидаемыми результатами, краевые случаи
- Бизнес-правила
- Требования к UI/UX
- Технические примечания
LLM часто добавляла куски кода, путала разделы, странно выделяла сценарии. Критически важно соблюдать структуру и не перегружать деталями.
Сценарии тестирования
Для каждого пользовательского сценария — отдельный файл с подробными тестами. Структура:
- Код набора (например, TC-1.1), выровненный с кодом сценария (SR-1.1)
- Ссылка на пользовательский сценарий
- Тестовые сценарии: код, название, предусловия, шаги с ожидаемыми результатами, тестовые данные
Я почти не проверял эти документы, полностью доверившись LLM. Но они упрощают разработку: по ним генерируются автотесты на Playwright.
Процесс выглядит так:
- Обновить системные требования
- Дополнить сценарии тестирования
- Обновить автотесты
- Доработать приложение, чтобы тесты проходили
Это водопадная и test-driven разработка. Без ИИ такой подход нереален из-за объёма рутинной работы.
Я вижу статьи про десятки плагинов, магические SKILL.md и толпы агентов. На мой взгляд — это тупик. Гораздо важнее чёткий процесс, документация и тесты. Это работает и для людей, и для ИИ.
Матрица трассировки требований
Позволяет отследить цепочку: функциональные требования → системные требования → сценарии тестирования → автотесты. Показывает прогресс разработки.
LLM плохо справлялась с этим документом. Я написал Python-скрипт, который автоматически обновляет матрицу по другим файлам. Если можно автоматизировать — лучше не грузить ИИ.
Рекомендации по документированию и разработке
Документы пока далеки от идеала, но я планирую их улучшать. Общие рекомендации:
- Процесс разработки. Была идея — ИИ-агент координирует подагентов. Пишешь «сделай фичу», а он запускает шаги. Пока проще отправлять промпты вручную.
- Рекомендации по документации. Детально описывает назначение и структуру каждого документа. Например, системные требования — для аналитика, без кусков кода.
- Соглашения о коде. Мой любимый документ. Я запрашивал у ИИ: «Оцени код на соответствие соглашению, создай план рефакторинга», затем — «Выполни рефакторинг». Несколько таких итераций — и код стал чище. Важно не включать тривиальное (lint, форматирование).
Универсальные, но с возможной спецификой:
- Руководство по UI/UX
- Стратегия обработки ошибок
Архитектурные документы (специфичны, не для примера):
- Описание архитектуры
- Модель предметной области
- Управление состоянием
- API-спецификация
- Аутентификация
- Словарь терминов
Зачем я их генерировал, если не смотрел? Системные требования были перегружены техническими деталями. Я вынес их в отдельные документы — так они и появились.
Архитектура: от кастомных событий к реактивным сервисам
Изначально приложение — один HTML-файл с CSS и JS. Постепенно разделил на модули. Но из-за сильной связности появились циклические зависимости.
Claude предложил использовать кастомные события. Работало, пока событий не стало больше тридцати. После этого приложение стало нестабильным, автотесты падали, отладка превратилась в кошмар.
Я понял: архитектура неудачная. Переделал на реактивную сервисную архитектуру.
Идея проста:
- Сервисы — хранят и обрабатывают данные.
- Визуальные компоненты — отвечают за рендеринг и обработку ввода.
Данные в сервисах — сигналы. Сигнал — значение (строка, объект и т.д.) и список подписчиков. При изменении значения все подписчики уведомляются: сервисы пересчитывают данные, компоненты — обновляют интерфейс.
Преимущества:
- Упрощённая отладка.
- Единый шаблон реализации — ИИ не гадает, как что-то сделать.
Я мог бы использовать Angular или React + Preact Signals, но хотел без сборки и зависимостей. В итоге сгенерировал свою реализацию сигналов — ровно такую, как нужно.
Архитектура не идеальна: в коде много эффектов, подписывающихся на сигналы. Но их легко зарефакторить с помощью ИИ.
Обязательно включайте линтинг и автоформатирование. Если вы ещё не пробовали oxlint и oxfmt — попробуйте. Они работают с космической скоростью.
Заключение
Вот к каким выводам я пришёл:
Claude пишет код лучше среднего разработчика, документы — лучше среднего аналитика, тесты — лучше среднего тестировщика. Да, ИИ делает ошибки. Но, видя ужасный код и документы, написанные людьми, я уже ничем не шокирован.
По скорости и объёму работы у меня лично нет шансов против ИИ.
Но ИИ уступает людям в идеях и здравом смысле. Даже для простого приложения мне понадобилось три недели, чтобы оно оставалось адекватным, полезным и удобным.
LLM безразлично, будет в приложении 2 экрана и 5 кнопок или 10 вложенных диалогов. Ей всё равно, сгенерировать документ на 10 или 1000 страниц.
ИИ не осознаёт, когда архитектура — полный бред. И вместо двух часов на костыли, нужно просто изменить подход.
Кажется, что ИИ заменит всех. Для рутины — да. У меня нет желания тратить месяц на то, что ИИ сделает за час. Я больше не хочу писать код или документы вручную. И не понимаю, что может мотивировать джунов идти в IT.
Но… с другой стороны… хочется сказать, что нет, не заменит… только я не знаю, как закончить. Пойду спрошу у ИИ…