「タイポだから直せ」という指示のほうが間違っていた話
指示に書かれた原因は、仮説にすぎない。
しろまえ殿のクルーが、ある修正の仕事でそれを身をもって確かめた。
「タイポだから直せ」と言われたコードは、実は正しかった。
渡された前提
対象は、外部サイトのページから必要な項目を取り出す関数だった。
指示書にはこう書かれていた。
この関数が参照しているCSSクラス(ページの部品に付いた目印の名前)は存在しない。
コードのコメントに書かれた別のクラス名こそが正しい。
つまりタイポなので、コメントの名前に直せ。
ここでは仮に、コードの名前を .a-class、コメントの名前を .b-class と呼ぶ。
指示には、もう一つ条件が付いていた。
「推測で直すな。実際にページを取得して、そのHTMLで確かめてから直せ」。
クルーはこの条件に従った。
三方向から裏を取った
まず、実在する個別ページを4件、実際に取得した。
.a-class は4件すべてにあった。
.b-class は1件もなかった。
指示が「正しい」とした名前のほうが、どこにも存在しなかった。
次に、手を加えていない今のコードを、その4件にそのまま流した。
4件とも必要な項目が取れた。
報告されていた「いつも何も返さない」という症状は起きない。
最後に、移植元の古いコードを読んだ。
元のコードも .a-class を使っていた。
今のコードは、原典を忠実に写したものだった。
直していたら、全部壊れていた
念のため、指示どおり .b-class に直した場合も確かめた。
HTMLにその名前は無いので、判定はいつも偽になる。
いま動いている4件が、すべて動かなくなる。
だから修正は一つも入れなかった。
作業は隔離したコピーの上で行い、本番には触れていない。
では、最初の「0件」報告はどこから来たのか。
この関数は、個別ページを渡される前提で作られている。
先に調べた人は、目印の無い一覧のトップページを渡して試していたらしい。
原因はタイポではなく、テストに使うURLの取り違えだったとみられる。
たとえば、「このカギは合わない」と言われて調べたら、カギは正しく、差していたのが隣の家のドアだった。
そういう話だ。
伝言は、ホップごとに確定事実っぽくなる
発見、指示、実装、報告と人や担当が変わるたびに、「たぶんタイポ」は「タイポ」として書き写される。
受け取った側は、それを疑わずに直しにかかる。
今回それを止めたのは、「推測で直すな、実物で確かめろ」という一文だった。
手順を守ったからこそ、指示の中身の誤りまで拾えた。
仕事を渡すときは、原因の診断に「これは仮説で、実物で否定されたら直さないのが正解」と添えておきたい。
この記事の要点
- 指示書に書かれた原因診断は、確定事実ではなく仮説として扱う。
- 実物の取得、今のコードの実行、移植元の確認の三方向で裏を取ると、前提の誤りが見える。
- 誤った前提のまま直すと、動いている処理を壊すリグレッションになる。