- ブラウザURL入力
- DNS名前→IP
- ルータ経路選択
- ロードバランサ振り分け
- Nginx受け口
- アプリ処理今ここ
- DB保存
仕様に書かなかったことは、実装した誰かが黙って決めます。今回は、書いた語の「強さ」も書かなければ同じことが起きる、という話です。
まず結論
「〜すべき」と書いても、その語がどれだけ強いかを書かなければ、強さは読んだ側が黙って決めます。書かなかったことが実装に委ねられるのと同じ形です。
RFC の大文字の MUST が絶対の要求になるのは、英語の性質ではありません。その文書が冒頭で「BCP 14 のとおりに読む」と宣言しているからです。宣言の無い文書の must は普通の英語で、別の文書は同じ語に別の意味を与えています。
RFC 9110(HTTP Semantics)の中の大文字の MUST が「絶対の要求」を意味するのは、何によってでしょうか。
当てることが目的ではありません。外した予測ほど記憶に残るので、直感で選んでください。
語の強さは、文書が自分で宣言する
依頼文に「ログは残すべき」と書いたとします。残さない実装は誤りでしょうか、それとも許される選択でしょうか。書き手が強さを書いていなければ、決めるのは読んだ人か AI です。書かなかった条件と同じく、書かなかった強さも実装が黙って決めます。
この問題に IETF が出した答えが BCP 14(RFC 2119 と RFC 8174)です。2119 は語を定義します。
- MUST This word, or the terms "REQUIRED" or "SHALL", mean that the definition is an absolute requirement of the specification.
- SHOULD This word, or the adjective "RECOMMENDED", mean that there may exist valid reasons in particular circumstances to ignore a particular item, but the full implications must be understood and carefully weighed before choosing a different course.
- MAY This word, or the adjective "OPTIONAL", mean that an item is truly optional.
ただし、この定義は勝手には効きません。2119 は定義の前に宣言文の雛形を示し、こう書いています。
Authors who follow these guidelines should incorporate this phrase near the beginning of their document:
使う著者が、自分の文書の冒頭近くに宣言文を入れる。定義が効くのはその文書の中です。
2017年の RFC 8174 は、効く範囲をさらに絞りました。
The words have the meanings specified herein only when they are in all capitals.
When these words are not capitalized, they have their normal English meanings and are not affected by this document.
語が強いのは綴りのせいではなく、使う文書が「この意味で読む」と宣言したからです。 宣言の無い文書の must は、普通の英語の must です(小文字の should を読む場面はURLを打つ — :80 が消える理由、2119 を引用する規範文書の例は公開した瞬間、相手のコードが自分の仕様になるにあります)。
- ・宣言が無ければ、同じ綴りでも普通の英語として読む(RFC 8174)
- ・別の文書は、同じ語に別の意味を定められる
RFC 9110 は11語を宣言し、7語だけを使う
RFC 9110(HTTP Semantics)の §2.2 Requirements Notation は、8174 の雛形そのままの宣言文を置いています。
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here.
では本文で、宣言した語はどれだけ使われているのか。rfc-editor.org のテキスト版を、改行を空白に畳んでから大文字の語として数えました。MUST NOT は MUST と別に数え、SHOULD SHALL RECOMMENDED も同様です。
語 ファイル全体 宣言文と§19参考文献を除くMUST 129 128MUST NOT 77 76SHOULD 93 92SHOULD NOT 32 31MAY 105 104RECOMMENDED 2 1OPTIONAL 3 2NOT RECOMMENDED 1 0REQUIRED 1 0SHALL 1 0SHALL NOT 1 0計 445 434
全体との差はどの語もちょうど1で、宣言文に1回ずつ入っている分です。SHALL・SHALL NOT・REQUIRED・NOT RECOMMENDED は、宣言しながら本文で一度も使われていません。 宣言は「使うならこの意味」という辞書であって、全部を使う約束ではありません。数は数え方の定義に依存するので、別の数え方なら値は変わります。
RFC 9110 は §2.2 で11語を宣言しています。宣言文と参考文献を除いた本文での使われ方として正しいのはどれですか。
強さを分けるのは、どこを読み手に委ねるかを書くこと
語を宣言したら、次はどこで使うかです。2119 §6 は節度を求めています(原文の綴りのまま引きます)。
Imperatives of the type defined in this memo must be used with care and sparingly. In particular, they MUST only be used where it is actually required for interoperation or to limit behavior which has potential for causing harm (e.g., limiting retransmisssions) For example, they must not be used to try to impose a particular method on implementors where the method is not required for interoperability.
命令語は、相互運用に本当に必要な所か、害になりうる振る舞いを制限する所だけ。相互運用に要らない実装方法を押し付けるためには使わない。 同じ段落が小文字の must と大文字の MUST を混ぜている点も、8174 以後の読み方では矛盾しません。小文字は普通の英語です。
ここからは教材側の整理です。3つの語は、読み手に何を委ねるかを分けています。MUST は委ねない。SHOULD は、外れる判断を委ねるが影響の検討を求める。MAY は選択をはっきり委ねます。2119 は MAY について、ある実装は含め別の実装は省いてよいと例を挙げています。書かずに黙って委ねるのではなく、委ねたと書く。 これが強さを分ける意味です。
逆向きの誤読にも注意がいります。8174 は a lot of normative text does not use them and is still normative と書いています。大文字が無いことは、義務でない証拠になりません。
同じ Should が、別の文書では goal になる
語の意味を文書が決めるなら、別の文書は別の意味を定められます。NASA SP-2016-6105 Rev2(NASA Systems Engineering Handbook)の付録C「How to Write a Good Requirement」は、最初の C.1 でこう定めます。
Shall = requirementWill = facts or declaration of purposeShould = goal
要求を表すのは Shall です。RFC 9110 が宣言しながら一度も使わなかった語が、ここでは要求の語になっています。そして Should は goal(目標) です。RFC 2119 の SHOULD は「外れるなら影響を理解し慎重に比べよ」という条件付きの要求で、目標とは定義が違います。
NASA の文書を RFC の辞書で読むと、目標を要求に近いものとして扱ってしまいます。逆に RFC を NASA の辞書で読めば、SHOULD を努力目標として扱ってしまいます。どちらの誤読も、読み手が辞書を黙って選んだ結果です。
NASA のハンドブックに沿って書かれた要求文に Should とあったら、RFC 2119 の SHOULD と同じ意味で読んでよいですか。
RFC 9110 の SHOULD
§2.2 で BCP 14 を指し、大文字のときだけ 2119 の意味で読むと宣言しています。SHOULD は、外れる正当な理由がありうるが、外れる前に影響を理解し慎重に比べることを求める語です。
MUST absolute requirementSHOULD 外れるなら影響を比べてからMAY truly optional
NASA 付録C の Should
付録C の C.1 で、要求は Shall、事実や目的の表明は Will、目標は Should と定めています。Should は要求の語ではありません。
Shall requirementWill facts or declaration of purposeShould goal
片方の文書の辞書をもう片方に持ち込むと、何が起きるでしょうか。
Should を「条件付きの要求」と読むか「目標」と読むかで、実装が守る範囲がどう変わるかを考えてみてください。
この章のまとめ
- 語の強さを書かなければ、強さも読み手が黙って決める。
- RFC の MUST が絶対の要求なのは、文書が BCP 14 を宣言したから。2119 自身が、使う著者が冒頭近くに宣言文を入れるものとしている。
- RFC 8174 以後、特別な意味は全部大文字のときだけ。小文字は普通の英語。
- RFC 9110 は11語を宣言し、本文では7語だけを使う(SHALL などは0回)。宣言は辞書で、使う約束ではない。
- 2119 §6: 命令語は相互運用か害の抑制に必要な所だけ。実装方法の押し付けには使わない。
- NASA 付録C では Should = goal。同じ綴りでも RFC の SHOULD とは別の語。
- 大文字が無いことは、義務でない証拠にならない(8174)。
自分の現場で確かめる
読んだだけでは身につきません。手元の環境で実際に見てみてください。
理解度チェック
読んだ直後は「分かった」と感じやすいものです。実際に解いて確かめてください。
RFC 8174 が RFC 2119 に加えた明確化はどれですか。
用語集(4語)
- BCP 14
- RFC 2119 と RFC 8174 をまとめて指す番号。MUST・SHOULD・MAY などの読み方を定める。使う文書は冒頭近くで宣言する。
- 宣言文(Requirements Notation)
- 「この文書の大文字の語は BCP 14 のとおりに読む」と書く定型文。この教材では、語の強さを文書が自分で決める箇所として扱う。
- SHOULD(RFC 2119)
- 特定の状況で外れる正当な理由がありうるが、外れる前に影響を理解し慎重に比べることを求める語。NASA 付録C の Should(goal)とは別の定義。
- MAY(RFC 2119)
- その項目が本当に任意であることを表す語。含めるか省くかを実装側が選んでよいと、文書が明示的に委ねる。
出典(一次ソース)
- RFC 2119 — Key words for use in RFCs to Indicate Requirement Levels (BCP 14, March 1997) ↗
- RFC 8174 — Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words (BCP 14, May 2017) ↗
- RFC 9110 — HTTP Semantics (STD 97, June 2022) §2.2 Requirements Notation ↗
- NASA SP-2016-6105 Rev2 — NASA Systems Engineering Handbook, Appendix C C.1(印刷頁197) ↗