Dev Study
← 何を作るかを言葉にする
レッスン 7 / 10·約 8 分·第21期 何を作るかを言葉にする

MUST の強さは、その文書が宣言した分だけ

リクエストがアプリケーションに届くまで
  1. ブラウザURL入力
  2. DNS名前→IP
  3. ルータ経路選択
  4. ロードバランサ振り分け
  5. Nginx受け口
  6. アプリ処理今ここ
  7. DB保存

仕様に書かなかったことは、実装した誰かが黙って決めます。今回は、書いた語の「強さ」も書かなければ同じことが起きる、という話です。

まず結論

「〜すべき」と書いても、その語がどれだけ強いかを書かなければ、強さは読んだ側が黙って決めます。書かなかったことが実装に委ねられるのと同じ形です。

RFC の大文字の MUST が絶対の要求になるのは、英語の性質ではありません。その文書が冒頭で「BCP 14 のとおりに読む」と宣言しているからです。宣言の無い文書の must は普通の英語で、別の文書は同じ語に別の意味を与えています。

? 読む前に予測

RFC 9110(HTTP Semantics)の中の大文字の MUST が「絶対の要求」を意味するのは、何によってでしょうか。

当てることが目的ではありません。外した予測ほど記憶に残るので、直感で選んでください。

抽象原理

語の強さは、文書が自分で宣言する

依頼文に「ログは残すべき」と書いたとします。残さない実装は誤りでしょうか、それとも許される選択でしょうか。書き手が強さを書いていなければ、決めるのは読んだ人か AI です。書かなかった条件と同じく、書かなかった強さも実装が黙って決めます。

この問題に IETF が出した答えが BCP 14(RFC 2119 と RFC 8174)です。2119 は語を定義します。

  1. MUST This word, or the terms "REQUIRED" or "SHALL", mean that the definition is an absolute requirement of the specification.
  1. 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.
  1. 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 9110 §2.2 が BCP 14 を指す
この文書の中では、大文字のときだけ
MUST絶対の要求
SHOULD外れるなら影響を比べてから
MAY本当に任意
  • ・宣言が無ければ、同じ綴りでも普通の英語として読む(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 も同様です。

RFC 9110 の大文字キーワード出現数(Python 3.14.6 で集計、2026-09-24)表
語 ファイル全体 宣言文と§19参考文献を除く
MUST 129 128
MUST NOT 77 76
SHOULD 93 92
SHOULD NOT 32 31
MAY 105 104
RECOMMENDED 2 1
OPTIONAL 3 2
NOT RECOMMENDED 1 0
REQUIRED 1 0
SHALL 1 0
SHALL 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 でこう定めます。

NASA SP-2016-6105 Rev2 付録C C.1 Use of Correct Terms(印刷頁197)表
Shall = requirement
Will = facts or declaration of purpose
Should = goal

要求を表すのは Shall です。RFC 9110 が宣言しながら一度も使わなかった語が、ここでは要求の語になっています。そして Should は goal(目標) です。RFC 2119 の SHOULD は「外れるなら影響を理解し慎重に比べよ」という条件付きの要求で、目標とは定義が違います。

NASA の文書を RFC の辞書で読むと、目標を要求に近いものとして扱ってしまいます。逆に RFC を NASA の辞書で読めば、SHOULD を努力目標として扱ってしまいます。どちらの誤読も、読み手が辞書を黙って選んだ結果です。

✓ ここまでの確認

NASA のハンドブックに沿って書かれた要求文に Should とあったら、RFC 2119 の SHOULD と同じ意味で読んでよいですか。

⇄ 2つを見比べる
具体例 A

RFC 9110 の SHOULD

§2.2 で BCP 14 を指し、大文字のときだけ 2119 の意味で読むと宣言しています。SHOULD は、外れる正当な理由がありうるが、外れる前に影響を理解し慎重に比べることを求める語です。

RFC 2119 の語表
MUST absolute requirement
SHOULD 外れるなら影響を比べてから
MAY truly optional
具体例 B

NASA 付録C の Should

付録C の C.1 で、要求は Shall、事実や目的の表明は Will、目標は Should と定めています。Should は要求の語ではありません。

NASA 付録C C.1 の語表
Shall requirement
Will facts or declaration of purpose
Should goal

片方の文書の辞書をもう片方に持ち込むと、何が起きるでしょうか。

Should を「条件付きの要求」と読むか「目標」と読むかで、実装が守る範囲がどう変わるかを考えてみてください。

この章のまとめ

  • 語の強さを書かなければ、強さも読み手が黙って決める。
  • RFC の MUST が絶対の要求なのは、文書が BCP 14 を宣言したから。2119 自身が、使う著者が冒頭近くに宣言文を入れるものとしている。
  • RFC 8174 以後、特別な意味は全部大文字のときだけ。小文字は普通の英語。
  • RFC 9110 は11語を宣言し、本文では7語だけを使う(SHALL などは0回)。宣言は辞書で、使う約束ではない。
  • 2119 §6: 命令語は相互運用か害の抑制に必要な所だけ。実装方法の押し付けには使わない。
  • NASA 付録C では Should = goal。同じ綴りでも RFC の SHOULD とは別の語。
  • 大文字が無いことは、義務でない証拠にならない(8174)。

自分の現場で確かめる

読んだだけでは身につきません。手元の環境で実際に見てみてください。

理解度チェック

読んだ直後は「分かった」と感じやすいものです。実際に解いて確かめてください。

問題 1 / 3正解: 0

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)
その項目が本当に任意であることを表す語。含めるか省くかを実装側が選んでよいと、文書が明示的に委ねる。