Тихая смерть технического контента
Вы знаете этот момент, когда вы натыкаетесь на страницу документации, начинаете читать, и уже к третьему абзацу ваши глаза стекленеют? Вы не одиноки. Где-то в канале Slack прямо сейчас разработчик печатает: «Кто-нибудь читал эту документацию? Я так запутался».
Суровая правда: большинство технических материалов не работает не потому, что они неверны, а потому, что забывают, что их будут читать люди — реальные, уставшие, нетерпеливые люди. Мы пишем так, как будто роботы объясняют физику другим роботам, вместо того чтобы преодолеть разрыв между «я это глубоко понимаю» и «я могу объяснить это тому, кто не понимает».
Это не просто проблема письма. Это бизнес-проблема. Плохая документация снижает уровень принятия продукта, затапливает вашу службу поддержки тикетами и вызывает недовольство вашей команды. Хорошая техническая информация, однако, похожа на суперсилу — пользователи быстрее решают проблемы, ваш API получает больше внимания, и внезапно вы не отвечаете на одни и те же вопросы в сотый раз.
Позвольте мне рассказать вам, как создавать технический контент, с которым люди действительно захотят взаимодействовать.
Знайте свою аудиторию лучше, чем они знают себя
Вот неудобная правда: большинство технических писателей полностью пропускают этот шаг. Мы предполагаем, что наша аудитория — это однородная масса людей, которые все понимают, что такое «async/await» или что такое «микросервисная архитектура». Спойлер: это не так.
Ваша первая задача носит археологический характер. Вы должны выяснить, кто ваш реальный читатель:
Оценка уровня навыков:
- Являются ли они senior-разработчиками или стажёрами?
- Знают ли они ваш технологический стек?
- Изучают ли они ваш инструмент параллельно с изучением программирования?
Картирование контекста:
- Читают ли они это в 3 часа ночи, потому что production горит?
- Случайно ли они изучают ваш продукт в понедельник утром?
- Пытаются ли они интегрироваться с вашим API как сторонние разработчики?
Определение болевых точек:
- Какую проблему они пытаются решить?
- Какие предположения могут сбить их с толку?
- Какой режим сбоя не даёт им спать по ночам?
Вот практический фреймворк, который я использую. Прежде чем писать что-либо, я создаю простой профиль читателя:
## Профиль читателя: [Название документа]
**Основная аудитория:** младшие full-stack разработчики, интегрирующие наш API
**Вторичная аудитория:** DevOps-инженеры, настраивающие CI/CD
**Базовый уровень навыков:** знакомы с REST API, не знакомы с нашей системой аутентификации
**Контекст:** реализация функции во время спринта проекта, нужны быстрые победы
**Болевые точки:**
* путаница между областями JWT и разрешениями API
* предыдущие попытки с решением конкурента провалились
* менеджер дышит в затылок
**Мотивация:** реализовать функцию, выглядеть компетентным, уйти домой в разумное время
Это может показаться излишним, но это стоит своего веса в золоте. Когда вы знаете, что ваш читатель — это напряжённый младший разработчик, вы не будете прятать раздел по устранению неполадок на 47-й странице. Вы поместите его на первое место, потому что именно там они будут искать в первую очередь.
Делайте свою домашнюю работу — действительно делайте её
Технические писатели, которые пропускают этап исследования, похожи на поваров, которые никогда не пробовали свою еду. Вы сразу чувствуете проблему.
Прежде чем написать первое слово, вы должны понять:
- как на самом деле работает ваша функция (не только то, что написано в спецификации);
- распространённые режимы сбоев (как пользователи ломают вещи);
- экосистему (что пользователи уже знают от конкурентов?);
- крайние случаи (что составляет 1%, вызывающий 50% тикетов поддержки?).
Это означает больше, чем чтение внутренних документов. Это означает:
- Установка/использование вашего собственного продукта с нуля, как это сделал бы новый пользователь.
- Запуск каждого примера кода, который вы найдёте, чтобы убедиться, что он работает.
- Проверка ваших каналов поддержки, чтобы узнать, с чем на самом деле сталкиваются люди.
- Разговор с инженерами, которые создали функцию (они знают подводные камни).
- Чтение документации конкурентов, чтобы увидеть, как они объясняют похожие концепции.
Реальный пример: я однажды написал документацию для системы аутентификации API, не реализовав её сам. Результат? Руководство, которое было технически правильным, но практически бесполезным, потому что оно пропускало критический шаг в потоке, который был «очевиден» для инженера, но незаметен для меня. Пользователи сразу же сталкивались с проблемой. Ваше исследование — это разница между документацией и документацией, которая работает.
Создайте шаблон для исследований, чтобы оставаться организованным:
## Чек-лист исследования функции: [Название функции]
Техническое глубокое погружение:
- [ ] Код функции просмотрен и понят
- [ ] Архитектура схематически изображена
- [ ] Все опции конфигурации протестированы
- [ ] Ошибки и крайние случаи задокументированы
Перспектива пользователя:
- [ ] Установлено с нуля по начальной настройке
- [ ] Завершено основное использование от начала до конца
- [ ] Пробы типичных сценариев ошибок
- [ ] Тестирование с различными конфигурациями
Конкурентный анализ:
- [ ] Как конкуренты документируют это?
- [ ] Что их пользователи хвалят/жалуются на?
- [ ] Какое наше уникальное преимущество?
Исследование поддержки:
- [ ] Просмотрены последние 20 тикетов поддержки, связанных с этим
- [ ] Определены топ-3–5 болевых точек
- [ ] Найдены недокументированные подводные камни
Архитектура, ориентированная на читателя
Вы, наверное, читали, что нужно «писать ясно». Великолепный совет. Бесполезный без конкретики.
Позвольте мне быть конкретным: ваш технический контент — это не эссе, это инструмент. И как любой хороший инструмент, он должен иметь правильную форму для работы. Это значит структуру, иерархию и неустанную ясность.
Проблема с типовой структурой
Большинство технических документов следуют такому шаблону:
- Введение (цветистое, ненужное).
- Предварительные условия (на семь абзацев позже, чем должно быть).
- Объяснение архитектуры (пользователям пока неинтересно).
- 15 подразделов контента.
- Примеры разбросаны случайным образом.
- Устранение неполадок в конце (должно быть в начале).
Пользователи не читают таким образом. Они просматривают, ищут. У них есть вопрос, и они хотят получить ответ за 90 секунд.
Лучшая структура
Вместо этого организуйте по намерениям пользователя:
Это означает:
- Начните с победы: не объясняйте всё. Сначала покажите пользователям, как выглядит успех. Пример кода, который они могут скопировать и вставить за 30 секунд, даёт вам право объяснять сложность позже.
- Постепенное раскрытие: сначала простое объяснение, глубокое погружение, если они хотят этого. Например:
## Аутентификация
**Быстрый старт:**
```bash
curl -H "Authorization: Bearer YOUR_TOKEN" https://api.example.com/v1/users
Как это работает (если вам интересно): Наш API использует JWT-токены. Вот что происходит… Настройка пользовательских утверждений (продвинутый уровень): Вы можете расширить токены с помощью…
* **Разделяйте проблемы буквально:** используйте чёткие иерархические разделы с заголовками, которые можно сканировать. Не прячьте контент по устранению неполадок в подразделении. Сделайте это отдельным разделом. Пользователи, ищущие помощь, не любят охоту за сокровищами.
* **Увлекательно используйте списки:** упорядоченные списки для последовательностей, неупорядоченные для вариантов. Почему? Потому что:
* Люди сканируют списки быстрее, чем прозу.
* Списки делают очевидным, когда вы пишете для 50 человек вместо одного.
* Их сложнее сделать двусмысленными.
* Вы можете ссылаться на них: «Шаг 4: настройте вебхук».
#### Абзац, который работает
Даже внутри абзацев структура имеет значение. Сравните эти варианты:
**Плохо:**
«Точку доступа API, которая обрабатывает запросы на аутентификацию пользователей, можно получить через HTTPS, сформировав правильно оформленный запрос к нашей службе аутентификации, которая требует наличия определённых заголовков, включая заголовок content-type, который должен быть установлен на application/json, и тело, содержащее параметры имени пользователя и пароля, которые должны быть закодированы в base64 в целях безопасности».
**Хорошо:**
«Для аутентификации отправьте POST-запрос на `/api/auth/login` с JSON-телом, содержащим ваше имя пользователя и пароль. Запрос должен включать заголовок `Content-Type: application/json`. Ваши учётные данные должны быть закодированы
