Документация как код
Updated Jul 2026
Относимся к документации как к программному обеспечению
Подход docs-as-code применяет практики разработки программного обеспечения — контроль версий, код-ревью, непрерывную интеграцию, автоматизированное тестирование — к документации. Вместо того чтобы документация жила в отдельной вики, которая тихо гниёт, она живёт рядом с кодом, который описывает, проходит через тот же процесс ревью и развёртывается через тот же пайплайн. Для QA-команд этот подход особенно мощный, потому что тестовая документация, тестовые отчёты и метрики качества могут генерироваться, валидироваться и публиковаться автоматически.
Почему docs-as-code
Традиционные инструменты документации (Google Docs, Confluence, SharePoint) имеют фундаментальную проблему: они отключены от кодовой базы. Когда код меняется, документация не обновляется автоматически. Никто не замечает, когда вики-страница становится неточной. Нет процесса ревью для отлова ошибок. Нет истории версий, коррелирующей с изменениями кода.
| Традиционная документация | Docs-as-Code |
|---|---|
| Хранится в вики или на общем диске | Хранится в Git-репозитории рядом с кодом |
| Редактируется через веб-интерфейс | Редактируется в текстовом редакторе или IDE |
| Нет процесса ревью | Ревью pull request, как и код |
| История версий скрыта | История Git показывает каждое изменение с контекстом |
| Нет CI/CD | Автоматизированные сборки, проверка ссылок, проверка орфографии |
| Отключена от изменений кода | Изменения документации в том же PR, что и изменения кода |
| Форматирование варьируется хаотично | Единообразное форматирование через линтеры и шаблоны |
| Трудно искать по репозиториям | Стандартные текстовые файлы ищутся любым инструментом |
Выбор правильного формата
Markdown
Наиболее распространённый формат для docs-as-code. Простой, читаемый как plain text, широко поддерживаемый.
Сильные стороны:
- Практически нулевой порог входа
- Читаемый без рендеринга
- Поддерживается GitHub, GitLab, Bitbucket и большинством генераторов статических сайтов
- Отличная экосистема инструментов (линтеры, форматтеры, редакторы)
Слабые стороны:
- Ограниченные возможности форматирования (нет предупреждений, вкладок или сложных макетов без расширений)
- Нет нативной поддержки включений или повторного использования контента
- Синтаксис таблиц неудобен для сложных таблиц
Лучше всего для: README-файлов, тестовой документации, runbooks, API-руководств, большинства QA-документации.
AsciiDoc
Более мощный язык разметки с нативной поддержкой сложных структур документов.
Сильные стороны:
- Нативные предупреждения (NOTE, TIP, WARNING, IMPORTANT)
- Включения (импорт контента из других файлов)
- Генерация оглавления
- Условный контент (показ/скрытие на основе переменных)
- Перекрёстные ссылки между документами
Слабые стороны:
- Более крутая кривая обучения, чем у Markdown
- Меньше поддержки инструментами, чем у Markdown
- Не поддерживается нативно рендерингом GitHub (рендерится как базовый текст)
Лучше всего для: Комплексных документов тестовой стратегии, документов стандартов, документации, требующей сложной структуры.
reStructuredText (rST)
Стандарт для документации Python. Мощный, но с самой крутой кривой обучения.
Сильные стороны:
- Нативные директивы для сложного контента
- Отлично подходит для API-документации (интеграция со Sphinx)
- Сильные перекрёстные ссылки
- Отраслевой стандарт в экосистеме Python
Слабые стороны:
- Незнакомый синтаксис для большинства разработчиков
- Менее читаемый как plain text, чем Markdown
- Меньшее сообщество за пределами Python
Лучше всего для: Тестовых фреймворков на Python, проектов, уже использующих Sphinx.
Сравнение форматов
| Функция | Markdown | AsciiDoc | reStructuredText |
|---|---|---|---|
| Кривая обучения | Очень низкая | Средняя | Высокая |
| Читаемость как plain text | Отличная | Хорошая | Умеренная |
| Таблицы | Базовые | Продвинутые | Продвинутые |
| Включения / повторное использование | Только расширения | Нативно | Нативно |
| Предупреждения | Только расширения | Нативно | Нативно |
| Рендеринг GitHub | Отличный | Базовый | Хороший |
| Генераторы статических сайтов | Много (Hugo, Jekyll, MkDocs, Docusaurus) | Antora | Sphinx |
| Поддержка IDE | Отличная | Хорошая | Хорошая |
Рекомендация для большинства QA-команд: Начните с Markdown. У него самый низкий барьер для внедрения. Переходите на AsciiDoc или rST, только если столкнётесь с ограничениями, которые расширения Markdown не могут решить.
Генераторы документации
Docusaurus
Генератор статических сайтов на React от Meta. Отлично подходит для документации проектов с версионированием.
| Аспект | Детали |
|---|---|
| Формат | Markdown (MDX с компонентами React) |
| Версионирование | Встроенное версионирование документов |
| Поиск | Интеграция с Algolia DocSearch |
| Лучше всего для | Документации продуктов, баз знаний QA с потребностью в версионировании |
| Усилия по настройке | Средние (требуется Node.js) |
MkDocs (с темой Material)
На Python, простой, быстрый. Тема Material добавляет отполированный интерфейс с отличным поиском.
| Аспект | Детали |
|---|---|
| Формат | Markdown |
| Поиск | Встроенный полнотекстовый поиск |
| Расширения | Предупреждения, вкладки, аннотации кода, диаграммы |
| Лучше всего для | QA-команд, которые хотят простоту и скорость |
| Усилия по настройке | Низкие (pip install mkdocs-material) |
GitBook
Коммерческая платформа с чистым интерфейсом. Хорош для команд, которые хотят хостинговое решение.
| Аспект | Детали |
|---|---|
| Формат | Markdown (редактирование через веб-интерфейс или синхронизация с Git) |
| Совместная работа | Редактирование в реальном времени, комментарии, ревью |
| Лучше всего для | Команд, которые хотят управляемую платформу документации |
| Усилия по настройке | Очень низкие (SaaS) |
| Стоимость | Бесплатно для open source, платно для команд |
Confluence
Наиболее распространённая корпоративная вики. Не совсем docs-as-code, но может быть интегрирована.
| Аспект | Детали |
|---|---|
| Формат | Визуальный редактор (с плагинами импорта Markdown) |
| Интеграция | Глубокая интеграция с Jira, экосистема Atlassian |
| Лучше всего для | Корпоративных команд, уже в экосистеме Atlassian |
| Ограничение | Не под контролем версий, нет CI/CD, трудно синхронизировать с кодом |
Тестовая документация в репозитории
Размещение тестовой документации рядом с тестовым кодом
Наиболее эффективное место для тестовой документации — рядом с самими тестами.
Пример структуры репозитория:
project/
├── src/
│ ├── checkout/
│ │ ├── checkout.ts
│ │ └── checkout.test.ts
│ └── payment/
│ ├── payment.ts
│ └── payment.test.ts
├── tests/
│ ├── e2e/
│ │ ├── checkout.spec.ts
│ │ └── README.md ← What these tests cover
│ ├── performance/
│ │ ├── load-test.js
│ │ └── README.md ← How to run, thresholds, history
│ └── test-data/
│ ├── fixtures/
│ └── README.md ← How test data works
├── docs/
│ ├── test-strategy.md ← Overall test strategy
│ ├── test-environments.md ← Environment setup guide
│ └── runbooks/
│ ├── deploy-verification.md
│ └── incident-response.md
└── README.md
Преимущества совместного размещения:
- Разработчики видят тестовую документацию, когда меняют тестовый код
- Изменения документации ревьюируются в том же PR, что и изменения кода
- Git blame показывает, кто написал документацию и когда
- Документация всегда версионно совпадает с кодом
Что размещать в репозитории vs на внешней вики
| В репозитории | На вики / внешне |
|---|---|
| Тестовая стратегия и подход | Заметки со встреч и решения |
| Как запускать тесты | Командные процессы и церемонии |
| Документация тестовых данных | Руководства по онбордингу |
| Настройка среды | Записи архитектурных решений |
| Runbooks для автоматизированных процессов | Руководства по устранению проблем (эволюционирующие) |
| Документация API-тестов | Межкомандная документация |
Автоматизация документации
Тестовые отчёты
Автоматизированные тестовые отчёты, генерируемые CI/CD-пайплайнами, предоставляют актуальные метрики качества без ручных усилий.
Что генерировать автоматически:
| Отчёт | Инструмент | Триггер |
|---|---|---|
| Результаты юнит-тестов | JUnit XML + генератор отчётов | Каждый запуск CI |
| Результаты E2E-тестов | Playwright HTML report, Allure | Каждый запуск CI |
| Покрытие кода | Istanbul/NYC, JaCoCo, coverage.py | Каждый запуск CI |
| API-документация | Генераторы Swagger/OpenAPI | При изменениях API |
| Бенчмарки производительности | k6, Gatling, Locust reports | Ночью или еженедельно |
| Аудит зависимостей | npm audit, Snyk, Dependabot | Ежедневно |
| Нестабильность тестов | Собственное отслеживание или инструменты аналитики тестов | Еженедельно |
Отчёты покрытия
Отчёты покрытия могут генерироваться и публиковаться автоматически:
# Example GitHub Actions step
- name: Generate coverage report
run: npx nyc report --reporter=html --reporter=text
- name: Publish coverage to GitHub Pages
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./coverage
Линтинг документации
Автоматизированные проверки, поддерживающие высокое качество документации:
| Инструмент | Что проверяет |
|---|---|
| markdownlint | Единообразие форматирования Markdown |
| vale | Качество прозы, соответствие стайлгайду |
| textlint | Грамматика, орфография, читаемость |
| linkcheck | Битые ссылки в документации |
| cspell | Проверка орфографии с пользовательскими словарями |
Пример конфигурации CI для линтинга документации:
# .github/workflows/docs.yml
name: Documentation Quality
on: pull_request
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Lint Markdown
uses: DavidAnson/markdownlint-cli2-action@v14
- name: Check links
uses: lycheeverse/lychee-action@v1
with:
args: --verbose docs/**/*.md
- name: Spell check
uses: streetsidesoftware/cspell-action@v5
Процесс ревью документации
Кто ревьюирует
| Тип документации | Основной ревьюер | Вторичный ревьюер |
|---|---|---|
| Тестовая стратегия | QA Lead | Engineering Manager |
| Тест-кейсы / планы | QA-коллега | Разработчик (для технической точности) |
| Runbooks | QA-коллега | DevOps (для операционной точности) |
| Документация API-тестов | Автор QA | Разработчик API |
| Руководства по онбордингу | Недавний новичок (валидирует точность) | QA Lead |
Когда ревьюировать
- При изменении: Каждое изменение документации проходит через PR-ревью, как и код
- По расписанию: Ежеквартальный просмотр всей активной документации на точность и актуальность
- По триггеру: Когда происходит связанный инцидент, ревьюируйте соответствующие runbooks и документацию
Как ревьюировать документацию
| Проверка | Вопрос |
|---|---|
| Точность | Информация корректна и актуальна? |
| Полнота | Чего-то не хватает, что нужно читателю? |
| Ясность | Поймёт ли это человек, незнакомый с контекстом? |
| Действенность | Может ли читатель успешно следовать этим инструкциям? |
| Единообразие | Соответствует ли это стайлгайду и шаблонам команды? |
| Актуальность | Это всё ещё релевантно? Есть ли ссылки на устаревшие инструменты или процессы? |
Поддержание документации в актуальном состоянии
Автоматическое обнаружение устаревания
Настройте системы, которые оповещают, когда документация не обновлялась в течение определённого периода:
- На основе Git: Скрипт, проверяющий дату последнего коммита для каждого файла документации и отмечающий те, что старше 90 дней
- На основе вики: Confluence и Notion поддерживают отслеживание «последнего обновления»; некоторые поддерживают автоматические напоминания
- На основе CI: Добавьте задачу, которая запускается еженедельно и создаёт тикеты для устаревшей документации
Концепция скрипта проверки устаревания:
# Find documentation files not updated in 90 days
find docs/ -name "*.md" -mtime +90 -print
Модель владения
У каждого документа должен быть назначенный владелец. Владелец — не обязательно автор; это человек, ответственный за поддержание документа в актуальном состоянии.
| Роль | Ответственность |
|---|---|
| Владелец | Обеспечивает точность и актуальность документа; ревьюирует ежеквартально |
| Автор | Написал оригинальный контент; может больше не быть владельцем |
| Ревьюеры | Проверяют точность при предложении изменений |
| Потребители | Сообщают о неточностях и предлагают улучшения |
Расписания обслуживания
| Тип документации | Частота ревью | Триггер для немедленного ревью |
|---|---|---|
| Тестовая стратегия | Ежеквартально | Крупное изменение продукта, новый член команды |
| Runbooks | Ежемесячно | Связанный инцидент, изменение процесса |
| Руководства по онбордингу | С каждым новым наймом | Обратная связь от нового сотрудника |
| Документация тестовых сред | Ежемесячно | Изменения среды |
| Документация инструментов | Ежеквартально | Обновления версий инструментов |
Практическое упражнение
- Перенесите один фрагмент тестовой документации из вашей вики в репозиторий кода. Настройте его как файл Markdown в соответствующем расположении.
- Добавьте шаг линтинга документации в ваш CI-пайплайн (markdownlint, проверка ссылок или проверка орфографии).
- Настройте автоматическую генерацию и публикацию тестовых отчётов для вашего проекта.
- Создайте таблицу владения документацией для ключевых документов вашей команды. Определите документы-сироты.
- Реализуйте механизм обнаружения устаревания: скрипт, напоминание в календаре или автоматическую проверку, отмечающую документы старше 90 дней.