От RFC до ADR: Принятие решения и сохранение обоснования
RFC обычно касается достижения согласия; ADR фиксирует достигнутое согласие — и причина, по которой ADR со временем теряет актуальность, заключается в том, что обсуждение происходит в чате и комментариях к запросам на внесение изменений, в то время как запись пишется позже, по памяти, одним человеком. Чтобы организовать поток от RFC к ADR так, чтобы запись не зависела от обсуждения: сформулируйте предложение как основное утверждение (название будущего ADR); добавьте контекст в виде отдельных аргументов, чтобы каждую силу можно было оспорить индивидуально; дайте каждой рассматриваемой опции собственный узел-сосед с ее плюсами и минусами — включая отклоненные; проведите раунд комментариев по RFC в виде цепочек (цепочки вопросов и ответов для уточнения, цепочки обзоров для возражений — каждая из них представляет собой четырехходовой диалог между рецензентом и автором опции, при этом N рецензентов означает N параллельных цепочек; цепочки компромиссов для примирения разногласий, где завершенная цепочка фиксирует попытку, независимо от того, была ли она успешной); пусть принимающие решения оценят опции как доказательство того, каково было положение дел — оценка не является решением, это все еще называет человек; фиксируйте принятые последствия как дочерние узлы к выбранной опции; и моделируйте замену, связывая более позднее решение с тем, которое оно заменяет, сохраняя старое читаемым. Использование существующих markdown ADR или протоколов с большим количеством решений возможно через извлечение с помощью ИИ с отметкой о происхождении. Честные ограничения: это не заменяет отслеживаемые репозиторием ADR (экспортируйте и фиксируйте запись); нет встроенного поля статуса ADR, поэтому предложенный/принятый/замененный — это соглашение, которое вы поддерживаете; завершенная цепочка не означает, что стороны согласились — именно это делает разногласия и обязательства понятными.
RFC обычно касается достижения соглашения; ADR фиксирует соглашение после его достижения. ADR портятся, потому что процесс достижения соглашения происходит в чате, а запись происходит позже, по памяти. Запускайте оба в одной структуре:
- Предложение является корневым требованием; контекстные силы отдельны, оспариваемые про-аргументы; каждый вариант — включая отклоненные — получает свой узел
- Раунд RFC — это цепочки: Вопросы и ответы для разъяснения, Обзор для возражений, Компромисс для примирения — четырехходовые диалоги, N рецензентов = N параллельных цепочек
- Рейтинг не является решением: лица, принимающие решения, оценивают как доказательство; названный человек называет это — и объясняет, почему, особенно против аудитории
- ADR — это дерево: ничего не транскрибируется, поэтому ничего не теряется при транскрипции — экспортируйте в репозиторий, если это требуется вашей организации
Решение, которое никто не мог восстановить
Новый технический руководитель задает разумный вопрос: почему каждая служба общается с системой выставления счетов через эту очередь? Существует ADR — ADR-014, четыре предложения, написанные одиннадцать месяцев назад. Контекст: "нам нужна была надежная интеграция с выставлением счетов." Решение: "использовать очередь." Последствия: "некоторое добавленное время задержки." Это технически запись. Она ничего не объясняет.
Вы были там, так что вы знаете, что ADR-014 не говорит: трехнедельные споры в двух каналах Slack и жаркая дискуссия в PR; вариант с синхронным API, который проиграл из-за ограничения по количеству запросов, которое с тех пор было увеличено; возражение старшего инженера, на которое ответили бенчмарком, который теперь никто не может найти. Дебаты состоялись. Запись была сделана позже, по памяти, одним человеком, в пятницу.
Это задокументированный, почти универсальный режим отказа действительно хорошей практики. Предписывающие рекомендации AWS и документы Microsoft Well-Architected оба рекомендуют ADR — и оба отмечают проблему: поддерживать их актуальными требует времени, а управление ими становится сложным по мере увеличения числа команд и выборов. Коренная причина структурная: дебаты и запись находятся в разных местах, поэтому запись всегда является потерянной транскрипцией. Решение состоит в том, чтобы сделать их одним и тем же местом. Эта практика не специфична для инженерии и даже не специфична для ADR. Google требует документ дизайна — проблема, предложенный подход, рассмотренные альтернативы, компромиссы — написанный и проверенный до начала значительной технической работы, практика, изложенная в собственном Программном обеспечении Google. Это та же дисциплина, что и ADR, применяемая на шаг раньше: ADR фиксирует выбор, к которому пришел документ дизайна. Оба терпят неудачу одинаково по одной и той же причине, и оба исправляются одним и тем же шагом — держите аргумент там, где находится запись, а не транскрибируйте одно в другое позже. Читайте каждый шаг ниже как охватывающий оба артефакта.
Почему АДР гниют
Одно предложение из материалов сообщества ADR содержит весь диагноз: RFC обычно касается достижения согласия; ADR фиксирует согласие, как только оно достигнуто. Два артефакта, два момента — и всё, что между ними, утекает. Альтернативы, которые были "очевидно" неверными, не фиксируются (пока они не перестанут быть очевидными). Возражение, которое сформировало окончательный дизайн, сохраняется только как комментарий PR в закрытой теме. Раздел контекста пишется последним, хуже всего, тем, кто проиграл в игре "не я". Встречи, которые должны были привести к решениям, вместо этого производят резюме, а рассуждения, которые делают решение долговечным — то, на чем зависит вся цепочка качества решений — именно то, что теряется при транскрипции.
Что вам нужно
Одно обсуждение Argumentree на каждое RFC. Если у вас есть существующий корпус markdown ADR или протокол заседания с большим количеством решений, загрузите его — извлечение с помощью ИИ превращает его в структурированные аргументы "за" и "против" с прикрепленными исходными отрывками, помеченными как извлеченные, чтобы импортированные утверждения никогда не путались с актуальными (как работает извлечение).
Шаг 1–3: Предложение, контекст, варианты
- 1Укажите предложение как основное утверждение — предложенное решение, а не вопрос: "Мы будем направлять все записи по выставлению счетов через надежную очередь." Это предложение является заголовком будущего ADR. Контрольная точка: корень существует, одно предложение, автором является предлагающий.
- 2Контекст как отдельные про-аргументы. Каждая сила, которая делает решение необходимым — требование надежности, лимит тарифов системы выставления счетов, мандат аудита — является собственным аргументом под корнем. Монолитный параграф "Контекст" нельзя оспорить; три отдельных контекстных утверждения могут быть подвергнуты сомнению, подтверждены или опровергнуты индивидуально. Контрольная точка: ≥2 контекстных аргумента, каждый из которых является силой.
- 3Каждый вариант получает свой собственный узел. Очередь, синхронный API, пакетная задача — родственные аргументы, каждый со своими плюсами и минусами. Плюсы и минусы относительны к родителю, поэтому недостатки варианта зависят от этого варианта, а не от решения. Включите варианты, которые вы ожидаете отклонить: отклоненный родственник — это то, что отвечает на вопрос следующего года "почему мы просто не...". Контрольная точка: каждый вариант, о котором может спросить читатель, существует.
Шаги 4–6: Раунд RFC, который оставляет запись
Теперь этап обзора — обычно это часть, которая разбросана по чату, комментариям и коридорам. Здесь он проходит в виде трех видов структурированного обмена, каждый из которых представляет собой четырехходовой диалог между рецензентом и автором варианта:
Цепочка вопросов и ответов — уточнить
"Что происходит с существующими синхронными клиентами?" Автор опции отвечает, рецензент задает уточняющий вопрос, автор снова отвечает — завершено. Ни одна опция не должна оставлять без ответа вопрос в решении.
Цепочка отзывов — объект
Рецензент оценивает вариант как нецелесообразный; автор отвечает; последующие действия; ответ. N рецензентов = N параллельных цепочек по одному и тому же варианту — каждое возражение является отдельным подлежащим обменом, а не потерянным комментарием в общем потоке.
Цепочка компромиссов — примирить
Два лагеря разделились? Один предлагает средний вариант другому автору. Если это разрешится, у вас будет новый узел опции. Если нет, завершенная цепочка будет записью о том, что это было попытано — что стоит почти столько же.
Завершено ≠ согласовано
Цепочка, достигающая завершенного, означает, что обмен прошел свой путь — вопрос был задан и на него ответили дважды — это не значит, что стороны согласны. Сохраняйте это различие; оно скоро станет важным.
Шаг 7: Принятие решения — и что такое рейтинг не является
Решения принимаются на основе оценок вариантов: каждому присвоена своя оценка. Распределение является подлинным свидетельством — где находилась комната, на записи, до звонка. Но оценка не является решением. Названный человек все равно принимает решение, и если звонок идет против распределения, узел решения — это то место, где это объясняется. (Кто должен быть этим названным человеком и как назначить эту роль до дебатов, а не после, — это отдельная дисциплина — см. учебник по правам на принятие решений.)
Вопрос для вашей команды
Кто принял ваше последнее архитектурное решение — и можете ли вы это доказать? Не кто был на встрече: кто владел решением, и где записаны их обоснования?
Шаг 8–9: ADR, который вам не нужно было писать
Вот в чем суть. Запись — это не документ, который вы пишете позже — это узел выбранного варианта плюс все, что уже к нему прикреплено: аргументы контекста (Context), отклоненные варианты (Options Considered), завершенные цепочки (обсуждение с авторами), оценки (где находилась комната) и аргумент решения с его обоснованием (Decision). Ничего не транскрибируется, поэтому ничего не теряется при транскрипции.
- 1Запишите последствия, которые вы принимаете. Известные недостатки — добавленная задержка, операционная нагрузка от очереди — продолжают существовать как побочные эффекты выбранного варианта, признанные принимающим решение. Запись их делает это решением, а не предпочтением. Контрольная точка: ≥1 принятое последствие на записи.
- 2Экспортируйте, если ваша организация требует отслеживаемых репозиториями ADR. Многие действительно требуют этого — markdown ADR рядом с кодом остается артефактом соответствия. Напишите четырехразделенное резюме из дерева (пять минут, не в пятницу), ссылайтесь на обсуждение для полного дебата. Контрольная точка: ADR репозитория ссылается на дерево; дерево содержит обоснование.
Не соглашайтесь и действуйте, официально.
Шаблон, который сделал знаменитым Amazon — не соглашаться и принимать — имеет проблему читаемости: как кто-то может позже узнать, что несогласие было реальным, услышанным и на него ответили, а не просто проигнорировали? На это отвечает механика цепочки. Цепочка обзора, которая прошла все четыре этапа и завершилась без согласия, является именно тем доказательством: возражение было сделано, на него ответили, его настойчиво обсуждали и снова ответили, зафиксировав это, прежде чем несогласный согласился. Несогласный задокументирован как тот, кто был услышан — что и делает последующее согласие разумным, а не просто послушным.
Не воспринимайте завершение как консенсус.
Завершено означает, что обмен завершен, а не то, что кто-то передумал. Если вы сообщите о завершении цепочки как о согласии, вы создадите ложный консенсус и подорвете доверие, для которого этот механизм существует. Честное прочтение: проконсультировались, ответили, все еще против, все равно обязались — все четыре факта видны.
Шаг 10: Замещение без удаления
Решения стареют. Когда лимит скорости, который убил синхронный вариант, будет повышен, правильным шагом станет новое решение, которое ссылается на то, которое оно заменяет — новый аргумент, связанный с узлом ADR-014, указывающий на то, что изменилось. Старое решение остается читаемым; его обоснование именно то, почему новое решение знает, что оно отменяет.
Одно честное упущение, которое нужно явно учесть: нет встроенного поля статуса ADR. Предложено / принято / заменено не является первоклассным состоянием для аргумента — замена моделируется с помощью ссылок, и поддерживать эту конвенцию — ваша задача. Укажите это в рабочем соглашении вашей команды, а не предполагайте, что продукт это обеспечивает.
Честные ограничения
- ✗Это не заменяет ADR в вашем репозитории, если ваша организация требует, чтобы они были под версионным контролем рядом с кодом. Экспортируйте и зафиксируйте сводку; используйте дерево для той части, в которой markdown плох — дебаты.
- ✗Нет поля статуса ADR. Предложенный/принятый/заменённый — это соглашение о связке, которое вы поддерживаете, а не то, что требует продукт.
- ✗Цепь состоит из четырех витков. Глубокое архитектурное несогласие потребует звонка; цепь является записью того, что уже было испытано до этого.
- ✗Рейтинги — это одно значение с меткой, а не взвешенная многокритериальная оценка.
- ✗Это не заставляет никого писать хороший контекст. Структура снижает стоимость хорошей записи; она не обеспечивает суждение.
Практические занятия
- ✓Одно RFC, одно обсуждение. Сопротивляйтесь мега-дереву, охватывающему всю архитектуру квартала — ссылки на супрессию связывают решения лучше, чем вложенность.
- ✓Семя из того, что существует. Транскрипция с большим количеством решений или ваша старая папка ADR, извлеченная, дает дебатам хороший старт — помеченная как импортированная, чтобы живые аргументы оставались различимыми.
- ✓Поместите имена рецензентов на их цепочки и оставьте их там. Атрибуция — это ответственность; анонимные архитектурные возражения превращаются в фольклор.
- ✓Раздел последствий принадлежит решающему, никому другому. Принятые недостатки, написанные человеком, который их принял, имеют другой вес, чем предупреждения рецензента.
ADR-014, версия, которая отвечает
Вернемся к вопросу нового технического руководителя. В перестроенной версии ADR-014 является узлом: решение очереди с его обоснованием, три контекстные силы (одна из которых теперь устарела — явно), отклоненный синхронный API-собрат, чье фатальное имя указывает на старый лимит скорости, четыре завершенные цепочки обзоров, включая цепочку старшего инженера, и эталон, прикрепленный в качестве доказательства. Технический руководитель читает в течение десяти минут, видит, что лимит скорости изменился, и открывает заменяющее предложение, связанное со старым узлом. Никто не копается в Slack. Это и есть вся суть: цепочки достигают соглашения, дерево фиксирует это — и запись отвечает на вопросы, о которых вы не знали, что они будут заданы.
Источники и дополнительная литература
- Нигард, М. (2011). Документирование архитектурных решений. Блог Cognitect.Эссе, которое популяризировало АДР: контекст, решение, последствия, соответствовало кодексу.
- AWS Предписывающее руководство — Записи архитектурных решений.Фрейминг RFC против ADR и задокументированные проблемы с обслуживанием, которые этот учебник предназначен для решения.
- Microsoft Azure Well-Architected Framework — Записи решений по архитектуре.Практика ADR в контексте обзора Well-Architected.
- Организация ADR на GitHub (adr.github.io).Шаблоны, инструменты и накопленные сообществом соглашения — включая практику поля статуса, которую моделирует этот учебник, связывая.
Часто задаваемые вопросы
В чем разница между RFC и ADR?
RFC (запрос на комментарии) — это процесс достижения согласия: предложение распространяется, обсуждаются альтернативы, поднимаются и отвечаются возражения. ADR (запись архитектурного решения) фиксирует достигнутое соглашение: контекст, рассмотренные варианты, решение, последствия, статус. Режим сбоя, при котором они функционируют как отдельные артефакты, заключается в том, что все между ними утечет — дебаты происходят в чате и комментариях к PR, в то время как запись пишется позже по памяти. Проведение RFC в виде структурированного дерева аргументов позволяет ADR выйти за рамки самого дебата: ничего не транскрибируется, поэтому ничего не теряется при транскрипции.
Почему АДР становятся устаревшими или перестают писаться?
Потому что их написание — это работа по транскрипции. Настоящее обсуждение происходит в потоках Slack, комментариях к обзорам и на встречах; затем один человек восстанавливает раздел Контекст из памяти, обычно кратко и в последнюю очередь. Собственные рекомендации AWS и Microsoft отмечают эту проблему: написание и обновление ADR занимает время, а управление становится сложным по мере увеличения количества решений. Команды не перестают верить в ADR — они перестают платить налог на транскрипцию. Приведение дебатов и записи к одной структуре устраняет налог.
Как провести раунд обзора RFC с записью?
Три структурированных шага, каждый из которых представляет собой диалог из четырех этапов с автором опции. Цепочки вопросов и ответов для уточнения: вопрос, ответ, уточняющий вопрос, ответ. Цепочки обзоров для возражений: оценка, ответ, уточняющий вопрос, ответ — с N рецензентами, открывающими N параллельных цепочек по одной и той же опции, а не одну общую ветку, так что каждое возражение остается атрибутированным и полученным ответом. Цепочки компромиссов для разделений: одна сторона предлагает среднюю позицию другой, и независимо от того, разрешает ли это ситуацию, завершенная цепочка фиксирует, что это было попытано. Контрольная точка перед принятием решения: ни одна опция не имеет неотвеченного вопроса, и каждое существенное возражение существует как завершенная цепочка.
Как работает принцип "не соглашаться и принимать" в записях решений?
Механика цепочки делает её читаемой. Цепочка обзора, которая проходит весь свой путь — возражение, ответ, последующий вопрос, ответ — и завершается без согласия, является подтверждением того, что несогласие было реальным, услышанным и на него ответили до того, как несогласный принял решение. Критически важно, что завершение не означает согласие: это означает, что обмен завершён. Сообщение о завершении как о консенсусе создает ложное согласие и разрушает ценность механизма. Честная запись показывает четыре факта одновременно: проконсультированы, ответили, все еще против, все равно приняли решение — что именно и делает обязательство после несогласия разумным.
Должны ли записи решений заменить ADR в репозитории кода?
Нет — и этот учебник говорит об этом прямо. Если ваша организация требует версионированные ADR рядом с кодом (многие делают это правильно, для соблюдения норм и оффлайн-доступа), сохраняйте их: напишите четырехсекционный резюме в формате markdown из дерева за пять минут и свяжите его с обсуждением. Разделение труда четкое: ADR в репозитории является долговечным артефактом соблюдения норм; дерево содержит то, в чем markdown плох — живые дебаты, отклоненные варианты с их обоснованием, возражения и их ответы, а также оценки.
Как вы помечаете ADR как устаревший?
По соглашению, а не по полю — и стоит быть честным, что нет встроенного статуса предложенного/принятого/замененного для аргумента. Моделируйте замену, создавая новое решение как отдельный аргумент, связанный с тем, который оно заменяет, указывая, что изменилось (повышенный лимит, новое требование). Старое решение остается читаемым — его удаление разрушит именно те рассуждения, на которые новое решение должно ссылаться. Укажите соглашение в рабочем соглашении вашей команды, чтобы оно поддерживалось целенаправленно.
Перестаньте записывать решения. Начните их хранить.
Запустите свой следующий RFC в виде дерева: варианты с их обоснованием, возражения в виде ответных цепочек и ADR, который пишется сам.
Начать бесплатную 14-дневную пробную версию