Перейти к основному содержимому

Design Docs: когда писать, а когда пропустить

· 8 мин. чтения
Artur Pan
CTO & Co-Founder at PanDev

Команда из восьми инженеров, которую я консультировал в прошлом году, держала правило: любой тикет больше 3 story points требует design doc. Получалось около четырёх документов в неделю, по полдня на написание и ещё полдня на циклы ревью. Итого 32 инженерных часа в неделю — четыре полных рабочих дня на документы, которые большинство людей пробегало глазами один раз и больше не открывало. CTO считал, что у них высокая дисциплина. Данные говорили, что у них перегруз документации и провал по velocity.

Обратная крайность ещё хуже. Stack Overflow Developer Survey 2019 года назвал «плохую документацию внутренних систем» блокером продуктивности №2 — сразу после технического долга. Полностью отказаться от design docs значит, что каждый рефакторинг через полгода превращается в археологические раскопки.

Это фреймворк, которым я пользуюсь, чтобы решить: какие изменения заслуживают документа, какие — комментария на 3 предложения в RFC, а какие — ничего.

Проблема: документы, написанные не ради дела​

Design docs проваливаются двумя путями, и оба избегаемы.

Провал 1: Документ как ритуал. Он существует, потому что процесс требует существования. После апрува никто его не открывает. Автор потратил полдня; ревьюеры — час календарного времени; артефакт принёс ноль ценности для принятия решения.

Провал 2: Не написан там, где был нужен. Что-то собрали, через полгода сломалось неочевидным образом, и на post-mortem спрашивают «почему это решение не задокументировано?». Сеньор, принимавший решение, уже ушёл. Логика утеряна. Перестройка стоит 3x от первоначального усилия.

Engineering-practices guide от Google формулирует цель прямо: design doc существует, чтобы вытащить разногласия на поверхность до того, как появится код, потому что цена разногласия на этапе дизайна — минуты, а на этапе code review — дни. Если ваш документ не вытаскивает разногласия, вы либо написали его слишком поздно, либо он не был нужен.

Академические данные это подтверждают, но с оговорками. Ernst et al. (2015), Measure It? Manage It? Ignore It? в IEEE Software, обнаружили, что команды, пишущие целевые design docs, релизят с 20-30% меньшим количеством пост-релизных дефектов, чем команды со стихийной документацией — но только когда документ фиксировал tradeoffs, а не переописывал код. Документ, повторяющий содержимое PR, хуже, чем отсутствие документа: он добавляет календарное трение без добавления обоснования.

Фреймворк из трёх вопросов​

Flow-диаграмма: три вопроса да/нет, ведущие либо к полноценному design doc, либо к короткому RFC, либо к пропуску документации. Три вопроса, три исхода. Большинство изменений уходят в «пропустить» или «RFC-комментарий». Полноценный документ нужен меньшинству.

Вопрос 1: Объём работы больше 1 инженер-недели?​

Если один инженер доделывает изменение за неделю, обычно разумнее просто собрать его и дать описанию PR нести контекст. Описание PR — это лёгкий design doc со 100% прочтения, потому что ревьюер физически не может замержить, не открыв его.

Порог в неделю не случаен. Работа дольше недели почти всегда пересекает границы модулей, и как только границы пересечены, у разных людей появляются мнения про интерфейс. Вот тут письменная форма становится дешевле обсуждений.

Вопрос 2: Изменение затрагивает больше одной команды?​

Кросс-командные изменения требуют документа независимо от объёма. Даже миграция схемы на полдня, которая трогает два сервиса, нуждается в однастраничном design doc, потому что две команды не встретятся раньше PR, а PR — неподходящая площадка для споров об интерфейсе.

Однокомандные изменения — даже большие — часто решаются в общем /rfcs/ канале или ветке pull request. Круг ревьюеров маленький и уже делит контекст, так что длинный письменный артефакт приносит убывающую отдачу.

Вопрос 3: Изменение обратимо в пределах одного рабочего дня?​

Это тест «радиуса поражения», заимствованный из SRE-практик. Если откат занимает у одного инженера один день, описывайте постфактум, а не до. Если откат займёт неделю или физически невозможен (миграция схемы, изменение публичного API, смена формата данных), решение стоит того часа, который уйдёт на написание.

«Обратимо за день» — удобная эвристика, потому что она чисто ложится на MTTR-данные. В командах, которые мы измеряли, средний деплой восстанавливается меньше чем за 4 часа, когда у изменения есть понятный путь отката. Изменения без пути отката — это те, что доминируют в MTTR, и именно их стоит документировать.

Матрица решения​

Объём > 1 неделиКросс-командаОбратимо за деньЧто делать
НетНетДаПропустить — ship с нормальным описанием PR
НетНетНетКороткий RFC-комментарий (200-400 слов)
НетДаЛюбое1-страничный design doc
ДаНетДаRFC-тред в общем канале
ДаДаЛюбоеПолный design doc, обязательно
ДаНетНетПолный design doc, обязательно

Шесть комбинаций, три письменных исхода. Матрица не пускает команду в режим «документ на каждый тикет» и не пускает в режим «документов нет никогда».

Анатомия design doc, который реально используют​

Документ, который переоткрывают через полгода, состоит из пяти секций — и никаких больше. Всё сверх пяти — это место, где прячется slop.

1. Контекст (3-5 предложений)​

Что спровоцировало работу. Тикет, инцидент, стратегическая цель. Один абзац. Если длиннее — заголовок тикета уже делает эту работу за вас.

2. Решение (1-3 буллета)​

Что мы собираемся собрать, сказано плоско. Не «рассматриваемые варианты». Решение. Варианты живут в секции 4.

3. Почему это, а не альтернативы (сердце документа)​

Два-три рассмотренных варианта, к каждому — один абзац, почему отклонён. Это единственная секция, оправдывающая существование документа. Если не можете назвать альтернатив, вы не исследовали пространство, и документ преждевременен.

4. Риски и план отката​

Что может пойти не так. Как откатимся. Если откат — «revert коммита», так и напишите в 5 словах. Если откат — «миграция данных назад по 12-шаговому runbook», пишите runbook.

5. Открытые вопросы​

Вопросы, на которые вы не смогли ответить в одиночку. Это единственная секция, которой ревьюеры действительно пользуются. Открытый вопрос — приглашение; закрытый — сигнал, что спросить надо было раньше.

Всё. Пять секций. Если в вашем шаблоне есть «критерии успеха», «влияние на пользователя» и «дальнейшая работа» — это ритуал, а не фиксация решения.

Типичные ошибки​

ОшибкаПочему это вредитКак исправить
Документ написан, когда код уже наполовину готовРевью превращается в rubber-stamp — решение уже принятоПисать в момент подлинной неопределённости, а не после
Документ повторяет PR без нового обоснованияДобавляет календарное время, ноль ценностиЕсли описывает код — делайте это описанием PR
Документ с 20 «рассмотренными вариантами»Театр анализа — реального ранжирования нетМаксимум 3 альтернативы, по одному жёсткому абзацу на отклонение
Документ в Google Doc, который никто не может найтиЗнание испаряется за 6 месяцевХранить в репозитории под /docs/design/ или /rfcs/ — ищется grep'ом, проходит PR-ревью
Все апрувят, никто не ревьюитСоц-апрув без давления решенияТребовать хотя бы одного именованного «ревьюера» с письменным комментарием

Как понять, что это работает​

Метрика — не «количество написанных design docs». Это vanity-счёт. Отслеживайте две вещи:

  • Доля документов, переоткрытых хотя бы раз после апрува — если меньше 30%, документы не используются, их ставят «для галочки». Шаблон слишком тяжёлый или фильтр объёма слишком широкий.
  • Частота rework'а после решения — как часто решение, принятое в design doc, пересматривается или отменяется в течение 90 дней. Меньше 15% — документ ловит ошибки дизайна; больше 30% — документ рубберстампит решения, которые должны были остаться в форме RFC.

В PanDev Metrics мы отслеживаем активность по файлам, связанным с тикетами, — когда инженер переключает IDE-фокус на файл, упомянутый в design doc, это сигнал, что документ работает. Если документ ни разу не посещали после мержа, он кандидат на удаление при следующей уборке. Это данные из IDE heartbeat-телеметрии, сопоставленные с Git и трекером.

Честное ограничение наших данных: мы видим события open файла и фокус IDE, но не видим, прочитал и понял ли инженер документ, или пролистал его за 30 секунд. Документ, который пролистали, не сильно лучше того, который не открывали. Качественный сигнал остаётся важным.

Контрарная позиция​

Большинство инженерных блогов советуют писать больше design docs. Я советую писать меньше, короче и раньше.

Меньше — потому что ритуальная документация хуже отсутствующей: она тренирует инженеров относиться к документам как к накладным расходам, из-за чего пропускают те, что действительно важны. Короче — потому что 5-страничный документ находит 3 читателей, а 1-страничный — 10. Раньше — потому что документ, написанный посреди реализации, это политическое прикрытие, а не фиксация решения.

Если ваша команда в режиме «документируем всё», ослабляйте правила объёма, пока хотя бы одно изменение в спринте не остаётся без документа. Если в режиме «не документируем ничего» — начинайте с комбинации «кросс-команда + необратимо». Оба края лечатся одним и тем же фреймворком; разница лишь в том, куда подтягивать.

Когда этот фреймворк не подходит​

В регулируемых средах — medtech, авионика, оборонка — обязательная документация часто перекрывает фильтр объёма. Обратимое за день изменение в FDA-регулируемой кодовой базе всё равно требует трассируемой записи решения. Фреймворк оптимизирован под B2B SaaS; если документ будет читать аудитор — пишите независимо от матрицы.

Исследовательские организации работают по другим правилам. Двухнедельный разведочный прототип не требует design doc; двухнедельный прототип, идущий в прод, — требует. Если результат — статья, то документ — это статья.

Похожие материалы​

Готовы увидеть метрики своей команды?

30-минутная персональная демонстрация. Покажем как PanDev Metrics решает задачи именно вашей команды.

Забронировать демо