JavaRush /Курси /Claude code /Документація як docs-as-c...

Документація як docs-as-code артефакт

Claude code
Рівень 22 , Лекція 1
Відкрита

1. Документація — частина delivery, а не застосунок

Коли розробник чує слово «документація», мозок іноді перекладає його як «щось текстове, потім допишемо». Для delivery це небезпечний автопереклад. README з неправильного командою ламає запуск не гірше за зіпсований shell-скрипт, а runbook із вигаданим кроком псує вечір усій команді підтримки. Просто тихіше й пасивно-агресивніше.

Уявіть Commerce OS. Команда перевела локальний запуск на docker compose, build зелений, CI щасливий. А в README залишилася стара інструкція: спочатку ./gradlew bootRun, потім npm run dev. Новий розробник іде за документацією, отримує половину середовища, дивні помилки підключення до бази й підозрює все підряд — від Java до ретроградного Меркурія. Формально вада не в коді. Практично вона вже в поставці.

Саме тому ми говоримо про docs-as-code. Документація живе в репозиторії, змінюється разом із кодом, проходить diff і review, приймається лише після перевірки за джерелом істини — не за «спогадами автора», а за кодом, командами, конфігами та спостережуваною поведінкою.

Корисно побачити різницю між двома схожими, але насправді дуже різними завданнями:

Питання Звичайна генерація документації Docs automation у delivery
Головна мета Написати зрозумілий текст Зберегти актуальність інженерного артефакту
Джерело істини Чернетка, знання автора, модель Код, scripts, config, logs, реальні команди
Момент використання Коли завгодно Разом із PR, change і quality gate
Критерій приймання «Звучить переконливо» Команди запускаються, routes збігаються, приклади працюють
Роль Claude Чернетка й редактор Помічник для порівняння, пошуку розбіжностей і оновлення

Документацію приймають не тоді, коли вона звучить упевнено, а тоді, коли її можна перевірити за кодом, командами та поведінкою.

Саме тут і відбувається головний зсув: документація перестає бути додатком до фічі та входить у change set.

2. Які документи Commerce OS вести як код

Якщо автоматизувати все підряд, вийде не інженерна система, а фабрика дуже переконливого шуму. Тому спочатку корисно розділити документи за прив’язкою до реальної поведінки: що сильніше документ пов’язаний із запуском, API, конфігом і підтримкою, то більше сенсу перевіряти його як код.

Для Commerce OS це виглядає приблизно так:

Артефакт Що в ньому перевіряємо Джерело істини Що найчастіше ламається
README.md
локальний запуск, базові команди, env names docker-compose.yml, Gradle tasks, package.json scripts старі команди, зайві кроки, неіснуючі env vars
API docs routes, HTTP method, request/response shape controller, route, тести, DTO POST/PUT плутанина, вигадані поля, застарілі приклади
Runbook кроки діагностики й відновлення реальні команди, логи, алерти команди «з голови», відсутні файли, неправильний порядок дій
Onboarding note як підняти проєкт із нуля чисте середовище та реальні setup steps кроки, які працюють лише в автора на ноутбуці
Changelog fragment що змінилося для користувача або команди merged diff, PR summary зайві обіцянки, пропуск важливих змін

Зверніть увагу на важливу деталь. Ключове слово — delivery artifacts: документи, що безпосередньо беруть участь у запуску, перевірці, експлуатації та розумінні change. На тексті без прив’язки до коду автоматизація швидко починає фантазувати.

Тому є тексти, де Claude — помічник зі структури, але не основний автор: архітектурне рішення, ADR, postmortem, пояснення вибраного компромісу. Тут надто багато відповідальності й людського судження. Модель оформить чернетку, але фінальний сенс — за людиною. Інакше виходить документ, який виглядає серйозно, але відповідає не на те питання.

Тут корисно тримати просте правило: якщо перевіряється механічно за кодом, командами або логами — у docs-as-code workflow. Якщо описує reasoning, відповідальність і компроміси — повністю автоматизувати небезпечно.

3. Звіряйте з кодом, командами та поведінкою

Коли документація стає частиною delivery, головне питання звучить дуже прозаїчно: як саме її перевіряти? Відповідь не романтична, зате надійна — три опори перевірки: код, команди, фактична поведінка. Не збіглася хоча б одна — це не «майже актуальна документація», а звичайна помилка в репозиторії.

Візьмемо простий приклад із Commerce OS. Припустімо, у README досі написано так:

## Локальний запуск

1. `./gradlew bootRun`
2. `npm run dev`
3. Переконайтеся, що PostgreSQL уже запущений локально

Але команда давно перейшла на єдиний сценарій через контейнери:

## Локальний запуск

1. `docker compose up -d`   # піднімає PostgreSQL, backend і frontend
2. `./gradlew test`         # backend-перевірки
3. `npm run lint`           # frontend-перевірки

Саме тут Claude корисний як інструмент порівняння, а не як літературний талант. Дайте йому дуже обмежене завдання:

Порівняй README розділ «Локальний запуск» з docker compose, Gradle tasks і frontend scripts.
Поверни лише:
1. розбіжності;
2. команди, які реально існують;
3. місця, де є невпевненість.
Файли не змінюй.

Такий запит хороший тим, що не просить «поліпшити README» — він просить знайти розбіжності між текстом і джерелом істини. Це набагато інженерніша постановка завдання.

Так само працює звірка API-документації. Візьмемо backend-код:

@RestController
@RequestMapping("/api/orders")
public class RefundController {

    @PostMapping("/{id}/refund")
    public RefundResponse requestRefund(@PathVariable UUID id) {
        return refundService.request(id);
    }
}

Отже, документація не має права раптом розповідати про PUT /api/orders/{id}/refund або про поле amount, якого в коді немає. Коректний фрагмент виглядатиме скромніше й чесніше:

### Запит на повернення
`POST /api/orders/{id}/refund`

Створює запит на повернення для існуючого замовлення.
Відповідь повертається у форматі `RefundResponse`.

Тут є важливий практичний нюанс: перевірки по файлах іноді мало. Команда може існувати в package.json, але не працювати на чистому середовищі. Endpoint може бути оголошений у controller, але падати через відсутній профіль. Тому docs-as-code verification майже завжди вимагає хоча б одного кроку реального виконання — маленького, але справжнього.

Документація, яку перевірили лише «за змістом», залишається чернеткою. Перевірена за командами, route та поведінкою — частина поставки.

4. Нехай Claude звіряє, а не фантазує

З документацією в моделей є улюблений фокус: вони дуже красиво добудовують відсутні деталі. Для блогу терпимо, для README і runbook — катастрофа. Claude тут перевіряючий редактор, а не автор, який «сам здогадається, як у нас влаштований проєкт». Догадується він занадто сміливо.

Добра роль — знайти розбіжності, запропонувати чернетку, позначити невпевненість, послатися на джерело. Погана — вигадувати команди, env vars, endpoints і сценарії відновлення, яких він не бачив.

Тому корисно закріпити це прямо в проєктних інструкціях. У CLAUDE.md Commerce OS:

## Правила для документації
- не вигадуй endpoints, env vars і команди
- для API-тверджень указуй файл-джерело
- якщо не впевнений, пиши "не перевірено"
- ADR і postmortem залишай людині

Це коротко, але дуже практично. Особливо рядок про «не перевірено»: нудний, доки не рятує від абзацу красивої фантазії. У чесної інженерної документації спокійний характер: вона не соромиться сказати «цей сценарій я не підтвердив».

Ось корисне порівняння ролей Claude за типами документів:

Документ Claude доречний Чому
README / setup так можна звірити з командами та scripts
API docs так можна звірити з routes, controller і тестами
Runbook частково чернетка корисна, але кроки треба прогнати реально
Onboarding note так якщо перевіряти на чистому середовищі
ADR частково структура корисна, рішення й аргументи залишаються за людиною
Postmortem частково можна допомогти оформити, але висновки й відповідальність людські

Іноді дуже корисно просити Claude не переписувати документ цілком, а працювати по diff — показати лише рядки, які варто змінити. Інакше разом із однією виправленою командою ви раптово отримуєте півпереписаний README в новому стилі, з новими заголовками та несподіваною філософією життя.

Ще один сильний прийом — просити модель розділяти підтверджені факти та припущення:

Перевірено:
- backend піднімається через `docker compose up -d`

Не перевірено:
- нативний запуск без Docker на Windows

Такий стиль не виглядає глянцево, зате чудово працює в команді. Глянець у runbook рідко комусь потрібен.

5. Документація як diff усередині PR і quality gate

Коли ви починаєте ставитися до документації як до коду, наступний крок очевидний: правка docs входить у той самий PR, що й зміна поведінки. Не «потім допишу», не наступної п’ятниці, не після коментаря тимліда з сумним смайликом. У той самий change set, щоб reviewer бачив причину й наслідок поруч.

Найзручніше закріплювати це прямо в шаблоні PR:

## Перевірка документації
- [ ] README оновлено, якщо змінювалися команди запуску або setup
- [ ] API docs оновлено, якщо змінювалися routes або response
- [ ] приклади команд перевірено на чистому середовищі
- [ ] секрети не потрапили в приклади та `.env`

Тут важливий не сам формат галочок, а звичка: документацію перевіряють не «взагалі», а за конкретною ознакою зміни. Не змінювали запуск — README можна не чіпати. Змінювали response повернення — API note вже обов’язкова частина diff.

Якщо базовий QUALITY_GATES.md уже описує прохід PR -> main, docs-правила краще додавати туди ж окремою секцією — поруч із кодовими перевірками:

## Документація в PR
- README і runbook оновлено, якщо змінювалися команди, env або routes
- команди з docs перевірено на чистому середовищі
- API-описання звірено з controller і тестами
- секрети не потрапили в приклади та документацію

Просто тепер видно, що gate стосується не лише build і test jobs. Той самий принцип потім знадобиться для changelog із release notes: текст перевіряється за спостережуваними змінами, а не за впевненим тоном.

Зверніть увагу, що тут уже трапляються і deterministic, і human-driven перевірки. Secret scan і наявність changed files у docs автоматизуються надійно. А чесну перевірку, що приклад запиту відповідає змісту endpoint, краще поєднувати з review людиною і, за потреби, AI-assisted звіркою за вихідниками.

Дуже важливо не змішувати документацію з «красивим текстом для клієнта». Нас цікавлять delivery artifacts: README, setup, API docs, runbook, onboarding. Маркетинговий текст, локалізація, customer-facing copy живуть за іншими правилами та створять тут лише шум.

Коли документація потрапляє в gate, вона перестає бути хвостом комети. Вона стає таким самим перевірюваним елементом change, як код.

6. Крізний приклад: README і API note без брехні

Тепер зберемо все в один невеликий сценарій, щоб картина не залишилася набором правил. Команда Commerce OS додала обов’язкове ручне підтвердження для повернень дорожчих за 100 доларів. Backend навчився повертати нову ознаку для support-модуля. Код оновили, тести пройшли, а документація живе вчорашнім днем.

Наприклад, тепер backend відповідає так:

{
  "requestId": "rf_123",
  "status": "PENDING_APPROVAL",
  "approvalRequired": true
}

Якщо API note все ще обіцяє просто «повернення створено», support-команда не побачить важливої гілки поведінки. А якщо runbook мовчить про approvalRequired = true, оператор почне повторювати запити, хоча треба чекати ручного рішення. Тобто помилка в документації вже б’є по продукту.

У цьому разі розумний workflow виглядає спокійно й без магії. Просите Claude порівняти controller, DTO та наявний markdown із API-описанням. Перевіряєте реальний response через тест або локальний виклик. Оновлюєте документацію невеликим diff, а не переписуванням половини розділу.

Наприклад, коректний runbook fragment може стати таким:

### Повернення дорожчі за 100 $
Якщо `approvalRequired = true`, оператор не надсилає повторний запит.
Потрібно дочекатися ручного підтвердження в панелі підтримки.
Статус до підтвердження: `PENDING_APPROVAL`.

А поруч у PR — оновлений API note і, якщо потрібно, секція README для локальної перевірки refund flow. Reviewer бачить і код, і docs, і тест. Gate не випускає назовні change, який змінює поведінку, але мовчить про неї в супровідних артефактах.

І ось тут документація нарешті поводиться як інженерний артефакт: не «текст, який треба додати», а частина робочої системи. Збігається з кодом, командами та поведінкою — допомагає рухатися швидше; не збігається — такий самий дефект поставки, як зламаний smoke test. Тому документацію в delivery цінують не за красу, а за перевірюваність.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ