Один источник правды: почему копировать данные в документацию — плохая идея
Скопировал список студентов из базы в README.md.
На восьмой день данные разъехались.
Что случилось
У меня платформа для курсов. Студенты — в SQLite: имена, цели, прогресс.
Решил сделать README в папке когорты. Скопировал туда имена и цели. Открываешь папку — сразу видно кто есть кто. Красота.
Потом Аня обновила цели через интерфейс. База обновилась. README — нет.
Два источника. Разные данные. Какой правильный?
Single Source of Truth
Один факт — одно место хранения. Остальные ссылаются или генерируются автоматически.
База данных (источник) → README генерируется → актуален
Примеры:
- Версия пакета живёт в
package.json. README её не дублирует. - API эндпоинты генерируются из кода
- Документация функций — из docstrings
DRY применяют к коду, но к документации тоже работает. Дублирование — это долг. Платить придётся рассинхроном.
Что делать
Не дублировать. Нужна информация — открой базу. Звучит радикально, но работает.
Ссылаться. В README пишешь «студенты: см. интерфейс» и даёшь ссылку. Указатель вместо копии.
Генерировать. Скрипт читает базу, обновляет README. Или GitHub Action при каждом коммите.
По-моему, второй вариант — самый реальный. Генерация требует поддержки, а “не дублировать” неудобно для быстрого доступа.
Инструменты для генерации
Если всё-таки выбрал автоматизацию:
markdown-autodocs — GitHub Action. Ставишь маркеры, указываешь источник — при коммите секция обновляется.
<!-- AUTO-GENERATED-CONTENT:START (CODE:src=./data.json) -->
<!-- AUTO-GENERATED-CONTENT:END -->
mdat — CLI для шаблонов. Комментарии превращаются в контент.
Свой скрипт. Иногда 15 строк на Python проще универсального инструмента. У меня такой есть для статистики атомов — читает SQLite, пишет markdown.
Где ещё работает
- Конфигурация — env-переменные в одном
.env, не разбросаны - API-документация — из OpenAPI схемы, не вручную
- Дизайн-токены — цвета в одном файле, компоненты импортируют
В корпорациях это Data Governance. В маленьких проектах — просто не плодить копии.
Что я сделал
README удалил. Вместо него — ссылка на интерфейс.
Если понадобится красивый обзор в markdown — напишу скрипт. Но пока ссылки хватит.
Источники
- Atlassian: Building a Single Source of Truth
- ThoughtSpot: Single Source of Truth — What It Is and Why It Matters
- markdown-autodocs — GitHub Action для автогенерации
- mdat — Markdown Autophagic Templates
- The Case Against Code Comments: Why DRY applies to more than just code
Подписаться на обновления — @sereja_tech