Как я навайбкодил приложение для анализа графов с помощью Claude Code

Как я навайбкодил приложение для анализа графов с помощью Claude Code

Изначально я скептически относился к генерации кода с помощью ИИ. Ранее опыт с 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.

Но… с другой стороны… хочется сказать, что нет, не заменит… только я не знаю, как закончить. Пойду спрошу у ИИ…

Читать оригинал