0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

「該当ゼロ」と「読めていない」は見分けが付かない(検査を自分で緩めない作り)

0
Posted at

設問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 を入れて開くまで分かりませんでした。

まとめ

  • 直す前に検査を書く。 順序を逆にすると基準が結果に寄る
  • 在庫は両方向でエラーにする。 減らない在庫は免罪符
  • 足す機能を作らない。 逃がす道があると逃げる
  • 作った本人には自分の道具の欠陥が見えない。 人に使わせる
  • 「該当ゼロ」を信じない。 読めなかったら例外で止める
  • 壊して落ちるところまで見る。 通ることは見張っている証拠にならない
  • 文書と実装は両方向で突き合わせる。 片方向は見逃す
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?