設問671本を直すのに、先に検査を書きました。感覚で直し始めないためです。
その過程で、自分が作った検査の欠陥が次々に出てきました。検査は書いた時点では全部正しく見えます。
直す前に検査を書く
順序を逆にすると失敗します。
対象を直してから検査を書くと、書いた結果に合わせて検査が緩みます。 自分の直し方が基準になってしまうからです。
対象を1つも触らずに、基準だけコードで固定してから始めました。
在庫(allowlist)を免罪符にしない
既存の該当分は在庫ファイルへ退避します。ただし2つの向きを両方エラーにします。
| 向き | 意味 |
|---|---|
| 在庫に無い新しい該当 | 基準が緩んだ合図 |
| 直したのに在庫に残っている行 | 「直した気になっている」状態 |
2つ目が肝です。これが無いと在庫が減りません。この向きがあるから在庫は単調に減ります。 802 → 0 になりました。
在庫へ足す機能は用意しません。 足せると、直すかわりに逃がす道ができます。
空になっても空のファイルを残します。 消すと、次に該当が出たとき「逃がす場所を作る」ところから始まってしまいます。空のファイルがあれば、足すのではなく直す、が既定になります。
関門と、直す人が見るものは別に要る
検査は在庫に無いものしか出しません。通ればよい/落ちればだめ、の関門だからです。
すると在庫に入っている分が直す側に見えません。 在庫を無視して中身ごと出す、別の口が要ります。
作った本人には、自分の道具の欠陥が見えない
5人に使わせたら、私が作った検査の不備が2つ出ました。
表示する数字と、判定に使う数字が違っていました。 表示は生の文字数、判定は識別子を除いた長さ。表示を見て直すと外します。
句読点を消して照合していました。 文をまたいで偶然つながった文字列を「写した」と判定し、自然な日本語を潰す方向に働いていました。区切り記号に置き換えると、相手側にも同じ位置に区切りがあるときだけ一致します。
直した直後、該当が 0 → 16 に増えました。 区切り記号を一致文字数に数えていたためです。区切りは中身ではありません。
例外は「言い換えようがないもの」で切る
識別子(NEXT_PUBLIC_ / package.json)や、実データそのもの(ログ行)は言い換えようがありません。
長さの計算からも本文照合からも外します。 外さないと、直す必要の無いものまで該当し、直そうとして不自然な方へ倒れます。
「該当ゼロ」と「読めていない」は見分けが付かない
ここが一番危ないところです。
対象0本でも「該当ゼロ」と出ます。
実際、YAML のキー名を読み違えて対象0本になっていたことがありました。検査は緑でした。読めなかったら例外で止める必要があります。
同じ理由で、数える道具そのものを疑います。 最初の集計を正規表現で書いたら、YAML のブロックスカラーを拾えず、値が全部壊れていました。そのまま報告しかけました。
壊して落ちるところまで見る
見張りを書いたつもりで、変異テストが2回続けて通りました。
- 呼び出しの形で探したら、別経路の記録を見落とした。記録の仕方が複数あるものを形で絞ると取りこぼす
- 名前の一致だけにしたら、今度は定義ファイルそのものに一致して通った。「定義されている」を「使われている」と読んでしまう
どちらも、書いた時点では正しく見えました。壊して落ちるところまで見ないと、見張っていることになりません。
書いてあることと、動いていることを突き合わせる
規約・ポリシー・案内文は、実装を変えた日にずれます。ずれても画面は正常に動き、テストも通ります。気づくのは指摘されたときだけです。
アクセス解析を入れる直前、プライバシーポリシーに「ログイン状態の維持にのみ Cookie を使用します」と書いてありました。入れた瞬間に嘘になります。
見張り方は、どちらか一方だけを変えると落ちる形にすること。「計測するコードが入っているか」と「ポリシーがそう書いているか」を両方向で突き合わせます。片方向だけだと、消し忘れ/書き忘れのどちらかを見逃します。
HTML を grep して「出ていない」と判断しない
本番確認で ¥[0-9,]+ を grep し、「金額が出ていない」と読み違えました。
React は ¥ と数値を別ノードに出すので、HTML では ¥<!-- -->14,800 になり、連結では一致しません。日本語の組版で挿入されるゼロ幅スペースでも同じことが起きます。
描画後の文字列(innerText)で見ます。
動かして初めて出る不備がある
CSP の許可漏れのように、画面は普通に動くのに一部の通信だけが塞がれるものは、コードを読んでも出ません。
計測タグが画像ビーコンを別ドメインへ撃つことは、実際に ID を入れて開くまで分かりませんでした。
まとめ
- 直す前に検査を書く。 順序を逆にすると基準が結果に寄る
- 在庫は両方向でエラーにする。 減らない在庫は免罪符
- 足す機能を作らない。 逃がす道があると逃げる
- 作った本人には自分の道具の欠陥が見えない。 人に使わせる
- 「該当ゼロ」を信じない。 読めなかったら例外で止める
- 壊して落ちるところまで見る。 通ることは見張っている証拠にならない
- 文書と実装は両方向で突き合わせる。 片方向は見逃す