惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Cisco Talos Blog
Cisco Talos Blog
V
V2EX
C
Check Point Blog
GbyAI
GbyAI
D
Docker
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
B
Blog RSS Feed
H
Hackread – Cybersecurity News, Data Breaches, AI and More
N
Netflix TechBlog - Medium
T
Troy Hunt's Blog
博客园 - Franky
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Microsoft Security Blog
Microsoft Security Blog
P
Privacy & Cybersecurity Law Blog
WordPress大学
WordPress大学
The Cloudflare Blog
S
SegmentFault 最新的问题
Latest news
Latest news
Microsoft Azure Blog
Microsoft Azure Blog
P
Proofpoint News Feed
I
InfoQ
博客园 - 【当耐特】
NISL@THU
NISL@THU
A
About on SuperTechFans
T
Tailwind CSS Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
The Hacker News
The Hacker News
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Scott Helme
Scott Helme
雷峰网
雷峰网
C
CXSECURITY Database RSS Feed - CXSecurity.com
Security Latest
Security Latest
V
Vulnerabilities – Threatpost
Security Archives - TechRepublic
Security Archives - TechRepublic
A
Arctic Wolf
Hacker News: Ask HN
Hacker News: Ask HN
N
News and Events Feed by Topic
IT之家
IT之家
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
aimingoo的专栏
aimingoo的专栏
T
Threat Research - Cisco Blogs
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
阮一峰的网络日志
阮一峰的网络日志
SecWiki News
SecWiki News
大猫的无限游戏
大猫的无限游戏
S
Security Affairs
The Register - Security
The Register - Security
www.infosecurity-magazine.com
www.infosecurity-magazine.com
L
LINUX DO - 热门话题
T
Tor Project blog

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром T-TOPS: Как распутать гордиев узел проекта после выхода в прод (меч не понадобится) Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
Навайбкодил приложение для анализа графов
2026-04-16 · via Все публикации подряд на Хабре

Навайбкодил приложение для анализа графов

Время на прочтение11 мин

Охват и читатели7.4K

Попробовал создать небольшое приложение с помощью Claude Code. Изначально я был очень скептически настроен, потому что до этого использовал GPT в Copilot, который меня больше бесил, чем делал что‑то полезное. Поэтому я ожидал, что, ну, наверное Claude что‑то сгенерирует, но потом ещё неделю нужно будет вручную допиливать.

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

Что за приложение?

Я думаю, это важный вопрос, чтобы можно было оценить на сколько оно сложнее, чем «Hello World», на сколько отличается от очередного трекера задач или копи‑пасты open source проектов.

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

Сгенерированное приложение выглядит так (исходный код):

Немного опишу функциональность:

  • Получение моделей через API из репозитория

  • Визуализация моделей в виде графа или таблицы

  • Фильтр по типам объектов и связей

  • Быстрый поиск по названию объекта

  • Разные варианты отображения композиции (вложенные объекты или связи)

  • Легенда

  • Всплывающие подсказки

  • Подсветка связанных объектов

  • Форма свойств

  • Проваливание в объект (drill‑down)

  • Разные алгоритмы компоновки (layout)

  • Экспорт модели в png, svg, csv

  • Возможность поделиться ссылкой на модель со всеми фильтрами и настройками

  • Сохранение текущего состояния приложения в Local Storage

  • Возможность перехода вперед/назад без перезагрузки всей страницы

  • Темная и светлая тема

  • Поддержка разных языков

Несмотря на внешнюю простоту за всеми этими пунктами достаточно замороченные требования. Например, в drill‑down режиме если через фильтр скрыть некоторые объекты или связи, то при этом могут быть скрыты и другие объекты и связи, если они больше недоступны по прямому пути от основного объекта.

Ещё немного об общей архитектуре и используемых технологиях.

Можно было бы реализовать всё это как часть основного приложения, но я побоялся что LLM не осилит всю кодовую базу. Поэтому решили сделать в виде отдельного приложения. И на мой взгляд это очень удобный подход. Есть репозиторий моделей с API, а инструмент для анализа моделей — это простейший фронтенд на HTML, CSS, JavaScript, без всяких фреймков (React, Vue, ...), без осточертевшей уже сборки, с минимум внешних зависимостей.

Мне очень нравится такой подход, хотя причины могут быть достаточно спорными:

  • Он максимально простой. Мне не нужно тратить часы чтобы разобраться почему при запуске dev‑сервера всё работает, а в production‑бандле «Uncaught ReferenceError: kakayatoNevedomayaFignya is not defined», а потом найти найти на GitHub сборщика баг, который висит открытым уже много лет со списком костылей как эту проблему обойти, или почему React рендерит страницу 1000 раз вместо одного или почему 8 Гб памяти не хватает для сборки проекта

  • Такой подход даёт максимальную свободу. Например, захотелось запилить реактивное приложение на сигналах — я его запилил. В любом движке (типа React) всегда есть удачные, неудачные или просто странные решения. Я считаю, что чистого HTML, CSS, JavaScript и базовых web API достаточно чтобы делать отличные приложения. Фронтендеры превратили веб‑разработку своими бесконечными фреймвоками и сборщиками просто в какой‑то ад

  • Это прикольный подход к разработке расширений для нашего приложения. Любой человек может достаточно легко сгенерировать или разработать какой угодно инструмент для анализа или редактирования моделей. Если вам годами не хватало какой‑то фичи, то вы можете сделать её сами, не вникая в кодовую базу на сотни тысяч строк, не устанавливая сложные инструменты разработки

Документация

Изначально я накидал в промпте основные идеи и попросил Claude написать спецификацию и сгенерировать по ней код. Затем я активно тестировал приложение и накидывал дополнительные идеи в стиле «хочу, чтобы можно было грабить корованы, обнови спецификацию и код».

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

Монолитный файлик со спецификацией приложения я разбил на несколько документов:

  • Видение продукта

  • Функциональные требования

  • Нефункциональные требования

  • Системные требования

  • Сценарии тестирования

  • Матрица трассировки требований

  • Правила написания документов и кода

Пройдём по каждому типу документов более детально.

Видение продукта

Пример документа.

Документ описывает:

  • Что это за приложение

  • Какие проблемы и каким образом приложение решает, зачем оно нужно

  • Целевую аудиторию

  • Аналогичные приложения и отличие от них

  • Критерии успеха

  • Дорожную карту

Функциональные требования

Пример документа.

Документ содержит список функций, которые должно выполнять приложение. Желательно сгруппировать функции по логическим категориям (функциональным блокам) и присвоить уникальные коды для каждой категории и функции, чтобы было удобно ссылаться на них из других документов. Также можно описать в документе что выходит за рамки функциональности приложения.

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

Нефункциональные требования

Пример документа.

Документ содержит список нефункциональных требований по следующим категориям:

  • Производительность

  • Надежность

  • Удобство использования

  • Качество

  • Инфраструктура

  • Соответствие стандартам и нормам

В целом этот документ достаточно типовой для разных приложений, но всё‑таки желательно добавить здесь конкретные метрики, например, что граф из тысячи объектов должен отображаться за 2 секунды, фильтрация и поиск должны работать не дольше 200 мс.

Со всеми документами была такая проблема, но с этим особенно. LLM генерирует просто тонны вроде полезного и осмысленного текста, но если сократить его в 10 раз, то смысл особо не потеряется. Для каждого требования в документе сейчас одна строка, но в первоначальной версии было по целому разделу. Словом, смело сокращайте документы.

Системные требования

Примеры документов. Они уже достаточно объемные, поэтому для каждого функционального блока удобно сделать отдельный документ.

Системные требования в разных компаниях могут описываться очень по‑разному, но у нас используется такой шаблон:

  • Пользовательские сценарии:

    • Код, название и краткое описание сценария

    • Ссылки на функциональные требования, которые этим сценарием закрываются

    • Пользовательская история

    • Шаги сценария с ожидаемыми результатами

    • Краевые случаи

  • Бизнес‑правила

  • Требования к UI/UX

  • Технические примечания

С этими документами я тоже намучился. LLM упорно добавляла в них куски кода, каким‑то случайным образом распределяла информацию между разделами, например, в шагах процесса описывала сложные бизнес‑правила или детали пользовательского интерфейса, в принципе очень странно выделяла сценарии. Для этого документа важно следовать структуре, не перегружать его деталями.

Сценарии тестирования

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

Если в системных требованиях сценарии описаны очень поверхностно, то здесь описываем все возможные сценарии для разных специфических ситуаций.

Документ содержит:

  • Код набора сценариев. Удобно если эти коды (например, TC-1.1) выравнены с кодами пользовательских сценариев (SR-1.1)

  • Ссылку на пользовательский сценарий

  • Тестовые сценарии:

    • Код

    • Название

    • Предусловия

    • Шаги с ожидаемыми результатами

    • Тестовые данные

В эти документы я практически не заглядывал, полностью положился на LLM. Но при этом они как‑раз и упрощают больше всего разработку. Для каждого сценария генерируется автотест на Playwright. И весь процесс выглядит следующим образом:

  • Я прошу LLM дополнить системные требования

  • Дополнить сценарии тестирования

  • Доработать автотесты

  • Доработать приложение, чтобы тесты проходили

По сути это водопадная и test‑driven разработка. Очень примитивный подход, который благодаря LLM можно воплотить полностью (без LLM просто времени не хватит чтобы писать все эти документы и тесты).

Я иногда вижу статьи, в которых люди рассказывают про десятки полезных плагинов для Claude, про магические SKILL.md файлы, которые превращают LLM в гениального разработчика, про толпы агентов, которые круглосуточно рецензируют документы и код друг друга, обмениваются сообщениями, делают тонны коммитов в минуту. На мой субъективный взгляд это тупик. Достаточно просто хорошо выстроенного процесса разработки, с понятными шагами и правилами, с документацией и тестированием. Это верно как для людей, так и для ИИ агентов.

Если вы хотите эффективно дорабатывать приложение, оставаться владельцем этого кода, понимать что в нём вообще происходит, то на мой взгляд лучше уделять больше внимания качеству документации, тестов и кода, чем созданию супер SKILL.md файлов.

Матрица трассировки требований

Пример документа.

В этом документе мы можем проследить всю цепочку: функциональные требования, системные требования, сценарии трестирования, автотесты. Можем отслеживать прогресс разработки.

Матрица очень тяжело давалась LLM, поэтому сгенерировал Python‑скрипт, который проходит по всем файлам и обновляет документ. Если какие‑то вещи легко автоматизировать, то лучше это сделать, а не мучить LLM.

Рекомендации по документированию и разработке

Примеры документов.

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

Общие рекомендации, не привязанные к конкретному проекту:

  • Процесс разработки — была идея, чтобы ИИ‑агент координировал подагентов по этой инструкции. Пишешь ему запрос «реализуй такую‑то фичу», а он запускает подагентов для каждого шага. Но пока мне не очень нравится этот документ и проще отправить несколько промптов вручную чем через координатора

  • Рекомендации по ведению документации — это детальное описание назначения и структуры каждого документа. Например, там важно упомянуть, что системные требования пишутся аналитиком, а не разработчиком и там не должно быть кусков кода

  • Соглашения о написании кода — этот документ мне нравится больше всего, я активно использовал его при рефакторинге. Пишешь агенту «оцени код на соответствие соглашению, и создай новый документ с планом рефакторинга», а затем «выполни рефакторинг кода в соответствии с планом». Я сделал несколько таких итераций рефакторинга, это реально очень удобно. В этом документе не должно быть тривиальных вещей, которые легко проверяются линтером или исправляются автоформатированием кода

Относительно универсальные документы, но которые в принципе могут содержать проектную специфику:

Архитектурные документы, специфические для конкретного проекта (они все важны, но я в них даже толком не заглядывал, не стоит использовать их в качестве примера):

Зачем тогда я их генерировал, если даже не смотрел? Системные требования были перегружены техническими деталями, вынес их отдельно, так эти документы и появились.

Код

То, что LLM умеют генерировать тонны документов вы и так знаете, а что насчет кода?

Как я уже говорил, приложение изначально было вполне работающее. Но естественно на первой итерации это был один большой HTML‑файл, в котором было всё — и CSS, и JavaScript. Я постепенно с помощью LLM раскладывал его на отдельные файлы. Поначалу всё шло неплохо, но в какой‑то момент между модулями из‑за сильной связности начали появляться циклические зависимости.

И Claude мне предолжил гениальную идею: можно уменьшить связность через кастомные события. Но когда количество событий достигло трех десятков, то приложение стало работать совсем нестабильно, всё больше токенов тратилось на попытки разобраться почему валятся автотесты и как их исправить. Я понял, что архитектура неудачная и решил всё переделать на реактивной сервисной архитектуре.

Идея максимально примитивная. Всё приложение строится из сервисов (которые хранят данные и отвечают за их обработку) и из визуальных компонентов (которые отвечают за рендеринг и обработку событий от пользователя). Для хранения данных в сервисах используются сигналы. Сигнал — это значение (строка, число, массив, объект, ...) и список подписчиков на это значение. Когда значение сигнала изменяется, то он уведомляет об этом всех своих подписчиков, которые либо пересчитывают какие‑нибудь зависимые данные (если подписчик — это сервис), либо обновляют интерфейс (если подписчик — это визуальный компонент).

Такой подход хорош тем, что упрощает отладку кода и исправление ошибок. Плюс он достаточно универсальный, LLM не нужно принимать решение как что‑то реализовать, всё реализуется по единому шаблону.

Скорее всего, у меня вообще не возникло бы таких проблем, если бы я использовал готовый движок типа Angular или React + Preact Signals. Но я хотел приложение без сборки и с минимальными зависимостями. В итоге я просто сгенерировал свою реализацию сигналов, ровно такую какую мне нужно.

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

Разумеется стоит включить все мыслимые проверки линтера и автоформатирование кода. Если вы ещё не перешли на oxlint и oxfmt, обязательно попробуйте, они работают просто с космической скоростью.

Заключение

В итоге этого эксперимента я пришёл к следующему.

На мой максимально субъективный взгляд, Claude пишет код лучше, чем среднестатистический разработчик, пишет документы лучше, чем среднестатистический аналитик, пишет тесты лучше, чем среднестатистический тестировщик. Безусловно он делает ошибки, но я насмотрелся таких отвратительных документов и кода, написанных людьми, что LLM уже не может меня ничем шокировать.

Более того, в плане скорости и объёма работы лично у меня просто ноль шансов против LLM.

Но, тем не менее, LLM безусловно уступает людям в плане идей и здравого смысла. Даже для такого простого приложения мне пришлось потратить три недели, чтобы приложение оставалось адекватным, выполняло полезные функции и им было приятно пользоваться. LLM вообще без разницы будет в приложении 2 простых экрана и 5 кнопок или 10 вложенных диалогов. Как и без разницы сгенерировать документ на 10 или 1000 страниц.

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

Казалось бы, что всё пропало, ИИ нас всех заменит. Для рутинных задач конечно заменит, у меня вообще нет желания тратить месяц на работу, которую ИИ сделает за час. Более того, у меня в принципе полностью отшибло желание писать документы или код вручную. И я не понимаю что должно мотивировать джунов идти в ИТ.

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