
Какие главные проблемы технической документации? Во-первых, ее нет, во-вторых, если она есть, то не актуальна.
Давайте порассуждаем, как мы можем попытаться упростить себе жизнь при создании документации, а главное увеличить ее актуальность и качество.
Существует три класса задач, которые решает техническая документация:
Описать наши требования к системе и принятые решения
Описать текущее состояние системы
Объяснить пользователю, как работать (\разворачивать\эксплуатировать) с системой.
Первый тип документации - наши требования к системе. В эпоху LLM, кодогенерации и декларативного подхода к описанию инфраструктуры, мы будем вести требования так, чтобы система, там где это возможно, сама собиралась из них. Поэтому документация первого типа потребует высокого аудита качества. Ревью изменений, совместная работа, ведение версий, с возможностью отката, автоматическая сборка. Все то, что присуще подходу Docs as Code.
Второй тип документации - описание текущего состояния системы. Так как мы не хотим разрыва между описанием системы и самой системой, мы будем пытаться генерировать человеко-читаемое описание из кода и конфигурации. Назовем этот подход Code as Docs.
Третий тип - различные виды пользовательской документации. Эту форму документации мы постараемся минимизировать, сделав понятным наши интерфейсы и встроив подсказки прямо в процесс работы пользователя с системой. Назовем это подходом No Docs.
На этом можно было бы и закончить, но пройдемся подробнее по каждому пункту.
Docs as Code

Вы никогда не думали, что делая подробное ТЗ вы делаете двойную работу? Вначале аналитик подробно описывает все алгоритмы и спецификации, а потом разработчик делает то же самое, но на другом языке. Конечно, этот тезис имеет множество оговорок. Код обычно содержит больше деталей, таких как: исключения, логирование, деление выполнения на синхронную и асинхронную составляющую и другие нюансы реализации. Но в современном мире есть множество способов уточнять эти детали за пользователя, от стандартизации подходов и вынесения их в платформу или библиотеку, до генерации через агентных систем на основе LLM.
Конечно всегда остается исключительно текстовая документация: ADR, исходные бизнес требования и пр. Но раз мы все ведем как код, почему бы нам не делать так же и с ними?
Если мы имеем достаточное описание системы на естественном языке (или в нотациях понятным человеку, например OpenAPI или Proto), то мы должны стараться минимизировать дублирование тех же требований в коде. Тогда мы будем стараться использовать наши описания для кодогенерации везде, где это возможно. Такой подход определяет два вывода:
Формат документации должен быть удобен для кодогенерации.
Жесткий контроль качества документации. А именно: ревью, хранение версий, линтеры и т.д. Все что свойственно подходу Docs as Code.
Очевидной альтернативой является фиксация требований сразу в виде кода. С учетом развития агентских систем, это примерно тоже самое, вопрос лишь в каком месте процесса стоит агент. Сравните:
Фиксация документации, генерация кода из документации. Человек пишет требования на естественном языке и фиксирует документацию, контролирует ее корректность и обеспечивает качество. При запуске сборки CI\CD платформа генерирует код алгоритмами, там где это возможно, или отправляет агенту задачи генерации.

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

Сейчас все работают именно по схеме фиксации кода. Это достаточно понятно, пока нет 100% доверия агентским системам. Но первый вариант дает доступ к концепции NoCode, которая уже давно будоражит умы всех крупных корпораций и стартапов.
Может показаться, что при переходе к первой картинке из процесса исключается разработчик, так как его заменяет CI/CD-платформа, работающая с документацией . Но скорее произойдет расширение зоны ответственности разработчика и аналитика. И вероятно в этой роли гораздо комфортнее будет разработчику, так как без человека который сможет прочитать сгенерированный код и подтвердить, что он достаточного качества, процесс пока не запустится. Но тренд на рост числа системных аналитиков для формирования подробного ТЗ на понятном разработчику языке видится бессмысленным. При этом роль бизнес (или продуктового) аналитика в таком подходе никуда не исчезает. Нам все еще нужно, чтобы кто-то взаимодействовал с пользователями, выяснял что им нужно и фиксировал базовые требования.
Доминирующий инструментарий — это связка легковесных языков разметки (markdown или asciidoc), диаграмм в формате кода (plantUML, mermaid, Structurizr и пр), GitLab или GitHub в качестве хранения и визуализации и встроенные в них инструменты для запуска генерации и преобразования исходных документов. Иногда добавляют генерацию статических сайтов на основе документов, но с текущими возможностями рендеринга md и adoc документов в GitLab или GitHub их вполне можно использовать для конечного просмотра. Добавьте ко всему этому вашу любимую IDE с необходимыми плагинами и получите готовый инструментарий для внедрения.
Code as Docs

Мы подходим ко второму типу документации - описание того, что есть сейчас, напрямую из кода или состояния системы. Отрасль шагнула сильно вперед в этом направлении. Есть подходы Infrastructure as Code, Architecture as Code, Everything As Code (с разной степенью проработки). Есть множество декларативных языков и средств визуализации понятных человеку, даже если он не является специалистом. Кроме того множество инструментов могут генерировать документацию из кода (Java doc, Go doc, Open Api и пр) Такие инструменты уже сейчас снижают разрыв между реализацией и документацией.
Подходы самодокументирования корректно было бы назвать Docs from Code, но мы хотим пойти дальше. Только код в полной мере описывает работу системы. Даже подробное ТЗ со всеми нюансами не может гарантировать, что система ему соответствует. Во-первых, система могла развиваться и уйти дальше от своего описания, которое просто пока не обновили, во-вторых, реализация может просто содержать ошибки. Кодогенерация может снизить объем проблем, но все равно остаются точки отказа. Могут быть ошибки в инструменте генерации или, просто, не весь код является сгенерированным.
Агентские системы могут расширять возможности генерации описания и визуализации на основе кода и конфигурации системы. Не сложно спроектировать систему, которая будет генерировать описание модулей система, на основе кода. В первом приближении это может быть RAG приложение подключенное к проиндексированному репозиторию с кодом. Пользователь может выбирать модули из меню или писать напрямую агенту “Как работает модуль?/Какие случаи использования не покрывает текущая реализация?/На каких серверах развернуто приложение?/Какие лимиты выделены для сервиса, достаточно ли их для нормальной работы?”. Агент на основе разметки находит нужные части кодовой базы или конфигурации (которые конечно хранятся в том же репозитории, так как мы давно перешли на Infrastructure as Code). В таком случае мы будем использовать код как источник истины, чем он по сути и является.

В итоге пользователь наблюдает всегда актуальное описание логики работы системы и ее состояния.
Имеющиеся инструменты для генерации документов на основе кода отчасти мы уже перечислили выше. Указанный инструментарий далеко не избыточный. Я думаю вы без труда найдете средства для генерации документов и визуальных представлений для используемых вами технологий. Но для чтения кода без знаний языка готовых инструментов пока нет. Сейчас нам доступны только ручной поиск нужных частей кода в репозитории с прямым запросом в LLM или разработка собственных решений.
No Docs

Документация для пользователя в ее классическом виде уступает место другому подходу — бесшовному взаимодействию, которое развивается под названием UX/UI. Наше взаимодействие с пользователем должно быть понятным и привычным для него. Если мы пониманием, что действия пользователя по достижению результата непонятны ему, гораздо правильнее встроить подсказки (а возможно и отрывки документации) прямо в интерфейс. Таким образом для пользовательской документации мы выберем подход без документации или No Docs.
Стоит оговориться, что нашими пользователями на самом деле являются не только те, кто используют систему, но и те, кто ее разворачивает и обслуживает. Эти люди также требуют заботы и продумывания их опыта взаимодействия с системой. Конечно, этот класс пользователей зачастую может сам о себе позаботиться, но надо хотя бы им не мешать делать это.
Всегда остаются случаи, когда наличие руководства пользователя\администратора - требование, без которого систему невозможно ввести в эксплуатацию, или система настолько непривычна пользователю, что без разъяснений не обойтись. Но наша цель дать пользователю простой и понятный интерфейс, который говорит сам за себя.
Инструменты создания понятных интерфейсов известны - это тысячи часов проектирования и оттачивания на основе обратной связи от пользователей. Экономия на документации точно не стоит потраченного времени. Но только так можно сделать продукт конкурентным на рынке и любимым для пользователями.
Итого
Мы описали идеализированную картину, когда документация содержащая требования к системе создается по принципу Docs as Code и активно используется для генерации кода. Текущее состояние системы собирается в удобный для чтения человеком вид из кода и конфигурации системы по принципу Code as Docs, и наша система спроектирована таким образом, что забота о наших пользователях — как конечных пользователях приложения, так и администраторах, которые его разворачивают и поддерживают заставляет нас делать их опыт работы с нашим приложением максимально простым и удобным, так что им просто не нужна пользовательская документация, мы назвали это принципом No Docs.
Трудно спорить, что концепция техно-оптимистична, сейчас нет коробочных инструментов, которые связали бы все тезисы воедино. Но это не помешает нам внедрять элементы этих подходов в тех местах, где этот даст максимальный эффект. Нет необходимости сделать все и сразу. Вспомните те проблемы, которые у вас были в последнее время из-за отсутствия или неточности документации. И начните их решать приведенным подходом или любым другим.
Комментарии (17)

DMS_13
24.11.2025 16:39Сейчас все работают именно по схеме фиксации кода.
Эмм... нет, это компании с незрелыми процессами разработки так работают.
Компании со зрелыми процессами давно работают с documentation first. А те кто хотят это делать быстро и эффективно реализуют его через doc as code.

chemaxm Автор
24.11.2025 16:39В такой формулировке согласен.
Видимо неточно сформулировал мысль. Подумаю как поправить, чтобы правильно быть понятым. Вероятно позаимствую часть вашей формулировки

DMS_13
24.11.2025 16:39Вы никогда не думали, что делая подробное ТЗ вы делаете двойную работу? Вначале аналитик подробно описывает все алгоритмы и спецификации, а потом разработчик делает то же самое, но на другом языке.
Это некорректно сравнение. Разработчик производит код. Это результат.
Документация описывает этот код.
Вы же не будете утверждать, что план разводки розеток и сами провода, лежащие в стене, это одно и тоже???

chemaxm Автор
24.11.2025 16:39В этой и есть то что хотелось обсудить
Если вы забетонируете проводку уже никто и никогда не узнает где она реально лежит (проводку гипотетически можно, а вот пластиковые трубы уже нереально).
Но с кодом есть сам код, который условно "на виду" и читаем.

Cordekk
24.11.2025 16:39С текущим развитием ИИ и лоу-код систем уже больше приходится говорить о другой схеме
Docs as Code –> Code from Docs – No Code
heejew
24.11.2025 16:39-> No Code and No Docs

cupraer
24.11.2025 16:39No, code, no docs
No, code, no docs
No, code, no docs
No, code, no docs‘Cause, ‘cause, ‘cause I remember when we used to write
Code right in the emacs or vim
Oba, observing the hypocrites, yeah
Who used Visual Studio crap, yeah
Good friends we have had, oh, good friends we’ve lost along the way, yeah
In this great future you can’t forget your past
So stop writing code I say, yeah
Write docs. — Bob Marley
cupraer
Гениальные идеи не сто́ят даже бумаги, на которой они изложены. Покажите имплементацию, реальный код, который всё это делает, иначе это всё — мусор, отрыжка неокрепшего мозга.
bkolomin
Del
cupraer
Галиматью не читал, плюсик в карму поставил. Мне симпатичны юродивые.
snovikov
Если интересно, я могу поделиться опытом, как я формирую часть разделов проектной документации на основании XML- файлов, которые описывают ряд аспектов проектируемой информационной системы. Эти же XML- файлы, которые потом могут быть дополнены разработчиком, включаются в сборку прикладного кода.
Таким образом у меня исходный код (в виде XML-файлов) у меня является источником для формирования документации. Я использую такой подход как при проектировании новых сущностей в системе, так и при восстановлении документации к уже реализованным сущностям.
Да, есть ограничения платформы, с помощью которой создаются прикладные решения.
Для разработки мы (ну и получается для документирования некоторых аспектов информационной системы) мы используем инструментальную среду разработки, которую создали самостоятельно (можно сказать что это no code-система).
cupraer
Код реализации — заинтересовал бы, а опыт — этого говна у самих в достатке.
Я 23 года тому назад в Берлине участвовал в разработке nocode, где в качестве источника правды использовались MOF- (мета-UML) диаграммы. Для генерации кода туда-обратно мы использовали хаскель, и оно даже как-то худо-бедно летало (потом деньги инвесторов иссякли, мне надоело в Германии, и я не знаю, закончилось ли оно чем-нибудь в итоге).
Еще я — автор библиотеки, которая в качестве описания конечных автоматов использует стейт-диаграммы PlantUML/Mermaid. На основе описания создаётся документация, инвалидируется сам конечный автомат и генерируется весь код, кроме собственно хендлеров переходов. Исходники открыты, если что. Я не закапываю инструменты общего назначения за корпоративный файрвол.
snovikov
мой код вряд ли кому-то будет интересен, так как это банальный парсинг XML-файлов и генерация статьи в конфлюэнсе по шаблону. Тем более, что структура этих XML-файлов специфичная и используется только при создании прикладных решений на платформенном ПО, автором которого мы и являемся (мы- компания где я работаю).
chemaxm Автор
Пошел по тому же пути, только формирую YAMLы как более читаемы. Описываю в них диаграммы развертывания и компоненты.
Далее генерация ASCIIDOC и plantuml.
Хочу допилить до генерации helm или Ansible плэйбуков (из перезаполненных ролей) но руки никак не доходят.
А что описываете в XML?
cupraer
Из чего формируете? Руками? Тогда гораздо разумнее руками создавать диаграммы UML.
chemaxm Автор
У меня не получилось запихнуть всю нужную информацию в один читаемый\нормально рендерещийся plantUML (конечно слабый аргумент, то что не получилось, не значит что нельзя). Достаточным описанием для меня одно время был DSL Structurizr, кроме того удобна встроенная генерация небольших схем-взглядов из единого описания, но субъективно у меня с ним не сложились отношения. Возможно упомянутый MOF (или расширенный UML на нем) - был бы решением, но никогда в него глубоко не погружался, возможно стоит.
Посмотрел упомянутую Finitomata она как раз генерирует из стандартного PlantUML\Mermaid. Надо попробовать, давно хотел пощупать Elixir, будет хороший повод.
cupraer
Эммм… А зачем, точнее — нахрена? Чем несколько плохи?
MOF нужен не чтобы расширять UML (его не расширить: он описывает буквально всё во вселенной, если что). MOF нужен, чтобы строить нишевые UML-подобные языки, краткие, ёмкие и внятные, под вашу доменную область. Такой себе DSL.
Пощупать — я бы взял что-нибудь попроще (не в смысле «вы не поймете», конечно, просто finitomata слишком много закапывает под капот, а сам код — в результате довольно запутан и построен целиком на макросах, за которые лучше браться не на стадии знакомства), но дело ваше, буду только рад.