Как не надо строить документацию: история одного парсера HTML
Как мы пытались обмануть Doxygen, переделать его разметку под наши стандарты и почему это привело нас к созданию собственного движка.
Как Flude вырос из одноразового скрипта в самостоятельный движок документации — по одной архитектурной ошибке за эпизод.
Как мы пытались обмануть Doxygen, переделать его разметку под наши стандарты и почему это привело нас к созданию собственного движка.
Как мы пытались парсить XML, почему ИИ внезапно потянул за собой tree-sitter и почему контроль важнее гениального кода.
Почему проще переписать ИИ-код с нуля, как тесты стали нашим контрактом и как заставить нейросеть саму писать для себя проверки.
Как один вопрос от Infrastructure Lead заставил нас переписать пайплайн документации, отказаться от HTML и случайно создать Flude.
Корпоративная инфраструктура, отпуска коллег и медленные инструменты заставили нас построить независимый CI/CD пайплайн. Рассказываю, как ИИ помог освоить YAML за пару вечеров.
Написать быстрый генератор документации — это весело. Легализовать его в кровавом энтерпрайзе — та еще задача. Рассказываю, как мы доказывали надежность Flude, сравнивая его со старым стандартом.
Мёртвые кросс-ссылки между рукописными гайдами и страницами автосгенерированного API быстро объяснили, почему решение вести гайды в стороне от Flude, чистым Markdown, было ошибкой.
Старая универсальная модель хранила данные как бесформенные строки, что приводило к тихим потерям информации. Мы переписали ядро на строгие типы, заменив тихую деградацию на громкие ошибки валидации.
Никакой драмы с падением прода — только курьёзная и показательная находка. Прогнали автономный ИИ-аудит по ядру движка и наткнулись на условие, которое гарантированно выполняется всегда.
Как мы за один присест распутали монорепозиторий из пяти репозиториев — и чему нас научил единственный на весь аккаунт Cloudflare-токен.
Рабочее название движка оказалось занято брендом отладчика микроконтроллеров. Мы перебирали короткие варианты с подстрокой ude, одновременно оценивая благозвучие, чистоту и продвигаемость.
Каждая пересборка гоняла Doxygen и парсинг XML заново, даже если ничего не изменилось. Двухуровневый кэш на двух отпечатках эту боль снял. Но название неслучайно с подвохом: реальную скорость он дать не может, потому что кэшировать умеет только то, что вообще можно пропустить целиком.
Трижды наш сервер падал от нехватки дискового пространства. История о том, почему нельзя делегировать управление файлами Garbage Collector'у.
Что делать, если парсер генерирует документацию для класса, которого не может найти глобальный текстовый поиск по всему репозиторию? История одной ложной паники.
Поскольку проект состоял из пяти репозиториев, каждый из них обзавёлся своей собственной CI. Красиво архитектурно — и дорого по минутам GitHub Actions. Подняли свою Windows-машину с одним раннером на всех пятерых — и написали для него сторожа, которому предстояло с треском провалиться меньше чем через сутки.
Как архитектура из нескольких репозиториев обернулась ловушками `not our ref` в Git и необходимостью тестировать ядро в двух параллельных реальностях.
Раннер падал каждые две с половиной минуты, а job для одного репозитория не мог запуститься больше суток. Мы искали сетевой баг — с захватом пакетов и дампом памяти в WinDbg. Настоящая причина оказалась в одной строке фильтра API и логике watchdog'а.
Разбираемся, почему разделение одного семейства рендереров на отдельный приватный плагин было ответом не на архитектурный зуд, а на юридический вопрос.