チュートリアル · エンジニアリング実践

RFCからADRへ:決定に至る過程とその理由を保持する

誰もがADRsが良いことに同意しています。しかし、ほとんどの人がそれを最新の状態に保っていません — なぜなら、議論と記録は異なる場所に存在するからです。そのギャップを埋めれば、ADRsは自ずと書かれます。

AT
Argumentree Team
Engineering Practice
August 24, 2026
11 min 読む

RFCからADRへ:決定に至る過程とその理由を保持する

RFCは通常、合意に達することに関するものであり、ADRは合意に達した後にその合意を記録します。ADRが腐る理由は、議論がチャットやプルリクエストのコメントの中で行われ、その記録が後から一人の記憶に基づいて書かれるからです。RFCからADRへの流れを実行して、記録が議論から外れるようにするには、提案を根本的な主張(将来のADRのタイトル)として示し、文脈を別々の賛成意見として追加して、各力が個別に挑戦できるようにします。考慮されたすべての選択肢には、それぞれの長所と短所を持つ兄弟ノードを与え、拒否されたものも含めます。RFCコメントラウンドをチェーンとして実行します(明確化のためのQ&Aチェーン、異議のためのレビュー・チェーン — 各レビューアと選択肢の著者との間の4ターンの対話で、N人のレビューアがいる場合はN本の並行チェーンになります;分裂を調整するための妥協チェーンでは、完了したチェーンが解決されたかどうかにかかわらず、その試みを記録します)。意思決定者は選択肢を評価し、どのような状況であったかの証拠とします — 評価は決定ではなく、名前のある人間がそれを呼びます。選ばれた選択肢の子として受け入れられた結果を記録し、後の決定を置き換えるものとしてモデル化し、古いものを読みやすく保ちます。既存のマークダウンADRや決定重視のトランスクリプトからのシーディングは、出所がスタンプされたAI抽出を介して機能します。正直な限界:これはリポジトリで追跡されたADRを置き換えるものではありません(記録をエクスポートしてコミットする必要があります);組み込みのADRステータスフィールドはないため、提案/受け入れ/置き換えは維持する慣習です;完了したチェーンは当事者が合意したことを意味するわけではなく、これがまさに異議を唱え、コミットすることを明確にする要因です。

Share:
要約

RFCは通常、合意に達することに関するものであり、ADRは合意が達成された後にその合意を記録します。 ADRは、合意形成がチャットで行われ、記録が後で記憶から行われるため、腐敗します。両方を一つの構造で実行します:

  • 提案は根本的な主張です; 文脈の力は別々で、挑戦可能な賛成意見です; 拒否されたものを含むすべての選択肢には、それぞれのノードがあります
  • RFCラウンドはチェーンです:明確化のためのQ&A、異議申し立てのためのレビュー、和解のための妥協 — 4ターンの対話、N人のレビュアー = Nの並行チェーン
  • 評価は決定ではない: 意思決定者は証拠として評価する; 名前のある人間がそれを呼び、特に部屋に対してその理由を書く
  • ADRは木です:何も書き起こされていないので、書き起こしで何も失われません — 組織が必要とする場合はリポジトリにエクスポートしてください

誰も再構築できなかった決定

新しいテックリードは合理的な質問をします:なぜすべてのサービスがそのキューを通じて請求システムと通信するのですか?ADRがあります — ADR-014、4文、11ヶ月前に書かれました。文脈:「信頼できる請求統合が必要でした。」決定:「キューを使用する。」結果:「いくつかの追加のレイテンシ。」技術的には記録です。何も答えていません。

あなたはそこにいたので、ADR-014が言っていないことを知っています:2つのSlackチャンネルと熱いPRスレッドでの3週間の議論;その後引き上げられたレート制限のために負けた同期APIオプション;今は誰も見つけられないベンチマークで返答されたスタッフエンジニアの異議。議論は行われました。記録はその後、金曜日に1人の記憶をもとに書かれました。

これは、真に良い実践の文書化された、ほぼ普遍的な失敗モードです。AWSの指示的ガイダンスとMicrosoftのWell-Architectedドキュメントの両方がADRを推奨しており、両者ともその苦痛を指摘しています:それらを最新の状態に保つには時間がかかり、チームや選択肢が増えるにつれて管理が複雑になります。根本的な原因は構造的です:議論と記録が異なる場所に存在するため、記録は常に情報が失われた転写になります。解決策は、それらを同じ場所にすることです。この実践はエンジニアリング特有のものでも、ADR特有のものでもありません。Googleは設計文書を要求します — 問題、提案されたアプローチ、考慮された代替案、トレードオフ — これは重要な技術作業が始まる前に書かれ、レビューされるべきものであり、これは会社自身のSoftware Engineering at Googleに示された実践です。これはADRと同じ規律であり、1ステップ早く適用されます:ADRは設計文書が導き出した選択を記録します。両者は同じ理由で同じように失敗し、両方とも同じ動きで修正されます — 記録が存在する場所で議論を行い、その後に一方を他方に転写するのではなく。以下のすべてのステップは、両方のアーティファクトをカバーしていると考えてください。

なぜADRsは腐るのか

ADRコミュニティ自身の資料からの一文が全体の診断を示しています:RFCは通常、合意に達することに関するものであり、ADRは達成された合意を記録します。 二つのアーティファクト、二つの瞬間 — そしてそれらの間のすべてが漏れ出します。「明らかに」間違っている代替案は記録されず(明らかでなくなるまで)。最終的なデザインを形作った異議は、閉じたスレッドのPRコメントとしてのみ生き残ります。コンテキストセクションは最後に、最悪の形で、負けた人によって書かれます。決定を生み出すべき会議は、要約を生み出すだけで、決定を持続可能にする理由付け — 決定品質チェーン全体が依存するもの — は、まさに転写によって落ちてしまいます。

必要なもの

RFCごとに1つのArgumentreeディスカッション。既存のマークダウンADRのコーパスや決定が多い会議の議事録がある場合は、アップロードしてください。AI抽出により、それが構造化された賛成/反対の議論に変換され、元の文章が添付され、抽出されたものとしてスタンプが押されるため、インポートされた主張がライブのものと誤解されることはありません(抽出の仕組み)。

ステップ 1–3: 提案、文脈、選択肢

  1. 1提案を根本的な主張として述べる — 提案された決定、質問ではなく: "すべての請求書の書き込みを耐久性のあるキューを通じてルーティングします." この文は将来のADRのタイトルです。 チェックポイント: 根本が存在し、1文で、提案者によって作成されています。
  2. 2コンテキストは別々のプロ・アーギュメントとして。 決定を必要とする各要因 — 信頼性要件、請求システムのレート制限、監査義務 — はそれぞれ根本的な議論の一部です。単一の「コンテキスト」段落は挑戦されることはありませんが、3つの別々のコンテキスト主張はそれぞれ個別に疑問を呈したり、確認したり、否定したりすることができます。 チェックポイント: ≥2のコンテキストアーギュメント、それぞれが1つの要因。
  3. 3すべてのオプションには独自のノードがあります。 キュー、同期API、バッチジョブ — 兄弟の引数、それぞれに独自の利点と欠点があります。利点/欠点は親に対して相対的であるため、オプションの欠点はそのオプションに付随し、決定には付随しません。拒否することを期待するオプションも含めてください:拒否された兄弟が来年の「なぜ私たちはただ…しなかったのか」という問いに答えます。チェックポイント:読者が尋ねる可能性のあるすべてのオプションが存在します。

ステップ4–6: 記録を残すRFCラウンド

今、レビューラウンドです — 通常、チャット、コメント、廊下に散らばる部分です。ここでは、レビューアとオプションの著者との間で4ターンの対話として構成された3種類の交換が行われます。

Q&Aチェーン — 明確にする

「既存の同期クライアントには何が起こりますか?」オプションの著者が答え、レビュアーがフォローアップし、著者が再度答える — 完了。どのオプションも、決定に未回答の質問を持ち込むべきではありません。

レビューチェーン — オブジェクト

レビュアーはオプションを不適切と評価します;著者が応答します;フォローアップ;応答。N人のレビュアー = Nの並行チェーン 同じオプションに対して — すべての異議はそれぞれの帰属可能なやり取りであり、共有スレッドの中で失われたコメントではありません。

妥協チェーン — 調整する

二つのキャンプが分裂?一方がもう一方の著者に中間の選択肢を提案します。もし解決すれば、新しい選択ノードができます。解決しなければ、完了したチェーンが試みられた記録となります — それもほぼ同じ価値があります。

完了 ≠ 合意

完了に達するチェーンは、交換がその過程を経たことを意味します — 質問が2回行われ、回答された — 当事者が合意したわけではありません。その区別を保ってください;それが重要になろうとしています。

ステップ7: 決定する — そして評価が何でないか

意思決定者は選択肢に評価を付けます:それぞれにラベル付けされた評価があります。この分布は本物の証拠です — その部屋がどのように立っていたか、記録に残っているか、電話をかける前のことです。しかし評価は決定ではありません。名前のある人間が最終的に決定し、その決定が分布に反する場合、決定ノードでその説明が行われます。(その名前のある人間が誰であるべきか、そして議論の前に役割を割り当てる方法は独自の分野であり、意思決定権のチュートリアルを参照してください。)

あなたのチームへの質問

あなたの最後の建築的判断を誰が決定しましたか — そしてそれを証明できますか?会議に出席していた人ではなく、誰がその決定を所有していて、その理由はどこに書かれていますか?

ステップ8–9: 書く必要のなかったADR

ここに報酬があります。記録は後から書く文書ではありません — それは選択されたオプションのノードと、それに既に付随しているすべてのものです:コンテキスト引数(Context)、却下された兄弟(Options Considered)、完了したチェーン(議論、著者と共に)、評価(部屋の状況)、およびその根拠を持つ決定引数(Decision)。何も書き起こされないため、書き起こしによって失われるものはありません。

  1. 1受け入れている結果を記録してください。 既知の欠点 — 追加のレイテンシー、キューの運用負担 — は、選択されたオプションの子供として続き、決定者によって認識されます。それらを書き留めることが、好みではなく決定であることを示します。チェックポイント: 記録に受け入れられた結果が1つ以上。
  2. 2あなたの組織がリポジトリ追跡ADRを必要とする場合はエクスポートしてください。 多くの組織がそうしており、正しいです — コードの隣にあるマークダウンADRがコンプライアンスの成果物として残ります。ツリーから4つのセクションの要約を書いてください(5分、金曜日ではありません)、完全な議論のためにディスカッションにリンクを戻します。チェックポイント:リポジトリADRはツリーを引用し、ツリーは理由を保持します。

意見が異なっても、記録に残してコミットする

アマゾンが有名にしたパターン — 異議を唱えてコミットする — には可読性の問題があります:後になって、異議が本物であり、聞かれ、回答されたことが、押しつぶされたのではなく、どうやって誰が知るのでしょうか?チェーンメカニクスがそれに答えます。完全に4ターンを経て、合意なしで完了したレビューのチェーンは、まさにその証拠です:異議が提起され、回答され、押し進められ、再度回答され、記録に残された後に、異議を唱えた者がコミットしました。異議を唱えた者は、聞かれたことが文書化されており — これが後にコミットすることを単なる従順ではなく合理的にする理由です。

完了を合意として読まないでください。

完了とは、交換が終了したことを意味し、誰かが考えを変えたわけではありません。 チェーンの完了を合意として報告すると、虚偽の合意を作り出し、そのメカニズムが構築するために存在する信頼を損なうことになります。正直な読み方:相談し、回答し、依然として反対し、それでもなおコミットした — すべての4つの事実が見える。

ステップ10: 削除せずに上書きする

決定は時代を経ます。同期オプションを無効にしたレート制限が引き上げられたとき、正しい選択は置き換えるものを参照する新しい決定です — 何が変わったのかを示すADR-014のノードに関連付けられた新しい引数です。古い決定は読みやすいままであり、その理由は新しい決定が何を覆しているのかを知るための正確な根拠です。

明示的に管理すべき一つの正直なギャップ:組み込みのADRステータスフィールドはありません提案済み / 受け入れ済み / 置き換え済みは議論の一級の状態ではなく、置き換えはリンクによってモデル化されており、その慣習はあなたのチームが維持するものです。製品がそれを強制することを仮定するのではなく、チームの作業合意に明記してください。

正直な限界

  • これは、あなたのリポジトリ内のADRsを置き換えるものではありません。あなたの組織がコードの隣にバージョン管理されたADRsを必要とする場合。要約をエクスポートしてコミットしてください。マークダウンが苦手な部分、つまり議論にはツリーを使用してください。
  • ADRステータスフィールドはありません。 提案/受け入れ/置き換えは、製品が強制するものではなく、あなたが維持するリンクの慣習です。
  • チェーンは4回のターンです。 深い建築的な意見の不一致には呼びかけが必要です; チェーンはそれ以前に試みられたことの記録です。
  • 評価は単一のラベル付き値であり、重み付けされた多基準スコアリングではありません。
  • 誰も良い文脈を書くことはありません。 構造は良い記録のコストを下げますが、判断を提供するわけではありません。

実践的なレッスン

  • 1つのRFC、1つの議論。 四半期全体のアーキテクチャを覆うメガツリーに抵抗しましょう — スーパセッションリンクは、ネスティングよりも決定をより良く接続します。
  • 存在するものから種をまく。 決定が多いトランスクリプトや古いADRフォルダーを抽出すると、議論にスタートを切ることができる — インポートされたとラベル付けされているため、ライブの議論が区別できるままになる。
  • レビュアーの名前を彼らのチェーンに付けて、そのままにしておいてください。 帰属は責任であり、匿名の建築に対する異議は民間伝承に変わります。
  • 結果のセクションは決定者のものであり、他の誰のものでもありません。 受け入れた人によって書かれた受け入れた欠点は、レビュアーの警告とは異なる重みを持ちます。

ADR-014、応答するバージョン

新しいテックリードの質問に戻ります。再構築されたバージョンでは、ADR-014はノードです:その理由を伴うキューの決定、三つのコンテキストフォース(そのうち一つは今や古くなっています — 明らかに)、古いレート制限を名指しした致命的なコン名を持つ拒否された同期APIの兄弟、スタッフエンジニアを含む四つの完了したレビューのチェーン、そして証拠として添付されたベンチマーク。テックリードは10分間読み、レート制限が変更されたのを見て、古いノードにリンクされた上位提案を開きます。誰もSlackを掘り起こしません。それが全ての約束です:チェーンは合意に達し、ツリーはそれを記録します — そしてその記録は、あなたが尋ねられるとは思っていなかった質問に答えます。

参考文献とさらなる読み物

よくある質問

RFCとADRの違いは何ですか?

RFC(コメントのリクエスト)は合意に達するプロセスです:提案が配布され、代替案が議論され、異議が提起され、回答されます。ADR(アーキテクチャ決定記録)は、合意に達した後の記録です:コンテキスト、考慮されたオプション、決定、結果、ステータス。これらを別々のアーティファクトとして運用する失敗モードは、それらの間のすべてが漏れ出すことです — 議論はチャットやPRコメントの中で行われ、記録は後から記憶を頼りに書かれます。RFCを構造化された議論ツリーとして運用することで、ADRは議論自体から生じます:何も書き取られないため、書き取りによって失われるものはありません。

なぜADRsは古くなったり、発行されなくなるのですか?

それを書くことは転記作業だからです。本当の理由付けはSlackのスレッド、レビューコメント、会議の中で行われ、その後、一人の人間が記憶を頼りにコンテキストセクションを再構築しますが、通常は簡潔に、最後に行われます。AWSやMicrosoftのガイダンスはその苦痛を指摘しています:ADRsを書くことや更新することには時間がかかり、決定が増えるにつれて管理が複雑になります。チームはADRsを信じることをやめるのではなく、転記のコストを支払うことをやめます。議論と記録を同じ構造にすることで、そのコストを取り除くことができます。

記録を持ってRFCレビューラウンドをどのように実施しますか?

三つの構造化された手順があり、それぞれがオプションの著者との四ターンの対話です。明確化のためのQ&Aチェーン:質問、回答、フォローアップ、回答。異議のためのレビューチェーン:評価、応答、フォローアップ、応答 — N人のレビュアーが同じオプションに対してN本の並行チェーンを開くため、すべての異議が帰属可能で回答される状態を保ちます。分裂のための妥協チェーン:一方が中間の立場を他方に提案し、解決するかどうかにかかわらず、完了したチェーンはそれが試みられたことを記録します。決定前のチェックポイント:どのオプションも未回答の質問を持たず、すべての実質的な異議は完了したチェーンとして存在します。

「異議を唱え、コミットする」は意思決定記録とどのように機能しますか?

チェーンメカニズムはそれを読みやすくします。異議、応答、フォローアップ、応答というフルコースを経て合意なしに完了するレビューのチェーンは、異議が実際に存在し、異議を唱えた人がコミットする前に聞かれ、応答されたことの証明です。重要なのは、完了したということは合意したということではなく、交換が終了したことを意味します。完了を合意として報告することは、偽の合意を生み出し、メカニズムの価値を損ないます。正直な記録は、同時に四つの事実を示します:相談された、応答された、依然として反対している、それでもコミットした — これこそが、異議の後にコミットメントが合理的である理由です。

決定記録はコードリポジトリ内のADRsに置き換わるべきですか?

いいえ — このチュートリアルは明示的にそう述べています。もしあなたの組織がコードの横にバージョン管理されたADRを必要とするなら(多くの組織が、コンプライアンスやオフラインアクセスのために正しく必要としています)、それを保持してください:ツリーから四部構成のマークダウン要約を五分で書き、それを議論にリンクしてください。作業の分担は明確です:リポジトリのADRは耐久性のあるコンプライアンスの成果物であり、ツリーはマークダウンが苦手なもの — 生の議論、理由付きの却下された選択肢、異議とその回答、評価を保持します。

ADRをどのように廃止としてマークしますか?

慣例によるものであり、フィールドによるものではありません — そして、議論に対して提案された/受け入れられた/廃止された状態が組み込まれていないことを正直に言う価値があります。新しい決定を置き換える議論にリンクさせて独自の議論として作成することで、モデルの置き換えを行い、何が変わったのか(引き上げられたレート制限、新しい要件)を明示します。古い決定は読みやすいままにしておきます — それを削除すると、新しい決定が参照する必要のある正確な理由付けが破壊されてしまいます。チームの作業合意の中で慣例を明記し、意図的に維持されるようにします。

決定を転記するのをやめて、それらを保管し始めてください。

次のRFCをツリー形式で実行してください:理由を伴う選択肢、回答されたチェーンとしての異議、そして自動的に書かれるADR。

無料14日間トライアルを開始
クレジットカードは不要です

関連する記事