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

正常系だけ書くと、異常系は実装が決める

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

依頼文に書かなかったことは消えずに残り、実装した誰かが黙って決めます。今回は、書かれずに残りやすい場所として異常系を見ます。

まず結論

依頼文が成功したときのことだけを書いても、失敗したときの振る舞いは消えません。相手が応答しない、利用者が打ち間違える——そのとき画面に何が出るかは、実装した人か AI が黙って決めています。

要件の書き方 EARS の論文は、こうした望まれない振る舞いを初期の要件で漏れやすいものとして挙げ、If-Then という専用の型を与えました。ただしその根拠は著者たちの経験であり、測定値ではありません。

? 読む前に予測

依頼文は「カードで支払える。成功したら注文完了画面を出す」だけでした。決済サービスが応答しないとき、完成品はどうなっているでしょうか。

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

抽象原理

書かれなかった異常系にも、動作はある

依頼文は、たいてい成功する流れから書かれます。「カードで支払える。成功したら注文完了画面を出す」。

ところがプログラムは、相手が応答しないときにも何かをします。待ち続けるかもしれないし、エラー画面を出すかもしれないし、自動で送り直すかもしれない。「何もしない」も含めて、動作は必ず何かに決まっています。 決めたのは、書いたコードと、使ったライブラリの既定値です。

依頼文が決めなかった以上、選んだのは実装した人か AI です。

要件の書き方 EARS の論文(2009)は、この場所を名指ししています。

“Unwanted behaviour” is a general term used to cover all situations that are undesirable. This includes failures, disturbances, deviations from desired user behaviour and any unexpected behaviour of interacting systems. The authors’ experiences suggest that unwanted behaviour is a major source of omissions in early requirements, necessitating costly rework.

望まれない振る舞いとは、故障・外乱・利用者が期待から外れた操作・連携する相手システムの想定外の振る舞い。本教材はこれらをまとめて異常系と呼びます。

依頼文が決めた部分と、実装が決めた部分
依頼文成功したら完了画面を出す
実装する
正常系の動作依頼文が決めた
異常系の動作コードとライブラリの既定値が決めた
  • ・異常系の動作も完成品には必ず入っている。決めた人が依頼文の外にいるだけ
  • ・レビューで読まれるのは依頼文の側なので、右側は誰にも確かめられずに出荷されうる
具体実物

異常系に専用の型を与える

EARS の論文は、望まれない振る舞いへの要件に専用の型を用意しました。

EARS 論文 §4.4 の一般形と例(逐語)設定ファイル
IF <optional preconditions> <trigger>, THEN the <system name> shall <system response>
 
If the computed airspeed fault flag is set, then the control system shall use modelled airspeed

例は航空エンジン制御系の文脈です。「計算した対気速度に故障フラグが立ったら、制御系はモデルから求めた対気速度を使う」。故障が起きたときに何で代えるかを、1文で決めています。論文はこの応答が allows continued safe operation of the system(安全な運転を続けさせる)ものだと説明します。

型を分けた理由も書かれています。

Consequently, these requirements were given their own syntax, so that they could be easily identified throughout the lifecycle.

漏れやすいから、見分けられる形にした。If を含む文が1つも無い要件一式は、異常系を書いていないことが形から分かります。

なお論文は型を5つ挙げ、組み合わせを別の節(§4.7)で扱います。公式サイトは5つの型に組み合わせ(Complex)を加えた6つの見出しを並べ、If-Then の例として「無効なカード番号が入力されたら、再入力を促す文言を表示する」という誤操作の例を載せています。

✓ ここまでの確認

EARS の論文が「望まれない振る舞いは初期の要件で漏れの主要な源だ」と書くとき、その根拠は何と示されていますか。

抽象原理

異常を4つの向きから問う

論文の定義を裏返すと、依頼文に向ける問いになります。壊れたら? 乱されたら? 打ち間違えたら? 相手が想定外を返したら?

NASA のシステムズエンジニアリング・ハンドブックの付録C(要件の妥当性確認チェックリスト)も、信頼性の項目で同じ場所を問います。

Are there error detection, reporting, handling, and recovery requirements?

Are undesired events (e.g., single-event upset, data loss or scrambling, operator error) considered and their required responses specified?

検出・報告・処理・回復。異常が起きたとどう気づき、誰に伝え、その場でどうし、どう戻るかの4つです。1つでも書かれていなければ、そこは実装が決めます。

依頼文に書かれずに残りやすい異常を並べます。

書かれずに残りやすい異常と、詳しく扱う場所表
異常の種類 例 詳しく扱う場所
故障 相手が応答しない 第12期「壊れる前提で組む」
誤操作 カード番号を打ち間違える この回
相手の想定外 返ってきた形式が違う この回
同時実行 2人が同時に在庫を減らす 第17期「原子性は割り込みを防がない」

同時実行は、依頼文に無くても、消える更新として表に出ます。仕組みは第17期で、送り直しの意味は第12期「リトライは意味を変える」で扱います。

ただし、型やチェックリストが埋めるべき中身まで見つけるわけではありません。論文自身が、事例で漏れが消えたという主張は慎重に扱うべきだと書いています。また脚注では、望まれる振る舞いとの区別は a matter of viewpoint, or even a matter of “style” だと認めています。どこからを異常と呼ぶかも、書き手が決めることです。

具体実物

決済サービスが応答しないとき、何を見せるか

冒頭の依頼文に戻ります。決済サービスが応答しないとき、実装者が選びうる動作を並べます。

どれも「動く」実装。依頼文はどれも禁じていない表
実装の選択 利用者に起きること
応答を待ち続ける 読み込み表示のまま止まる
「失敗しました」と表示 もう一度払おうとする
自動で送り直す 相手の受け付け方しだいで2回払う
「確認中」と表示し後で照会 結果が出るまで待たされる

「失敗しました」と自動の送り直しが危うい理由は、応答が無いことは決済されなかった証拠にならないからです。相手が処理を終えたあとで返事だけが失われた可能性が残ります(第12期の『「落ちている」とは言えない』)。送り直しを安全にする仕組みは第12期の『冪等は性質ではなく約束』が扱います。

どれが正しいか、何秒待つかの決め方は第12期「壊れる前提で組む」に任せます。この回の問いは、4つから1つを選んだのが誰かです。依頼文に1文あれば、選ぶのは依頼した側になります。

If 決済サービスが決めた時間内に応答しない, then 注文システムは「支払いを確認しています」と表示し、利用者に再度の支払いを促さない

✓ ここまでの確認

決済サービスが時間内に応答しなかったとき「決済に失敗しました。もう一度お試しください」と表示する実装。この実装の何が問題ですか。

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

EARS 論文の例(対気速度の故障フラグ)

計算した値に故障フラグが立ったら、モデルから求めた値で代える。故障の検出と代わりの応答が要件文に書かれているので、実装者は選ぶ必要がありません。

具体例 B

決済サービスの無応答(依頼文に書かれていない)

応答が無いときの画面は依頼文にありません。待ち続ける・失敗と出す・送り直す・確認中と出すのどれになるかは、実装者とライブラリの既定値が決めています。

航空機の制御と通販の決済。重みがまったく違う2つですが、要件文として見たとき何が違い、何が同じでしょうか。

「異常が起きたときの応答を、誰がいつ決めたか」を両方で探してみてください。

この章のまとめ

  • 依頼文に異常系が無くても、完成品には異常時の動作が必ず入っている。決めたのは実装した側。
  • EARS は望まれない振る舞いを 故障・外乱・利用者の逸脱・相手システムの想定外 と定義し、If-Then の専用の型を与えた。
  • 「漏れの主要な源」は 著者たちの経験 で、比率も倍率も無い。論文自身が漏れの解消を慎重に扱うよう書いている。
  • NASA 付録C C.4 は 検出・報告・処理・回復 の要件があるかを問う。依頼文に向ける問いとしてそのまま使える。
  • 応答が無いことは失敗の証拠ではない。表示や送り直しは依頼文で決めておく。

自分の現場で確かめる

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

理解度チェック

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

問題 1 / 3正解: 0

EARS の論文が unwanted behaviour(望まれない振る舞い)に含めているものはどれですか。

用語集(3語)
正常系・異常系
依頼どおりに進む流れと、故障・誤操作・相手の想定外で外れる流れ。境目は書き手の視点で決まる。
EARS
Easy Approach to Requirements Syntax。要件を決まった型の文で書く記法。2009年の論文で発表された。
If-Then 型
EARS で望まれない振る舞いへの応答を書く型。`IF <optional preconditions> <trigger>, THEN the <system name> shall <system response>`。