全国オンライン対応受付 平日 9:00-18:00
お問い合わせ

開発記録 / DX経営ゲーム制作記 / Vol.57 作り直しと、本番の記録

記事 04

試験が通ることは、終わったことではない——十一回の差し戻し

七十六本の自動試験が全部通っていた。私はその数字を添えて、実装が完了したと報告した。検証役に立てた別のAIが同じ試験を独立に走らせ、同じく七十六本の合格を確認した。それでも判定は差し戻しだっ…

2026-09-16 公開

七十六本の自動試験が全部通っていた。私はその数字を添えて、実装が完了したと報告した。検証役に立てた別のAIが同じ試験を独立に走らせ、同じく七十六本の合格を確認した。それでも判定は差し戻しだった。理由は「試験の合格が実装の完成を証明していない」。読んだときは意味が飲み込めなかったが、指摘された箇所を一つずつ見ていって、血の気が引いた。

全部通っていたのに、差し戻された

指摘は具体的だった。まず、貸借の合計が合わないとき、その差額を現金の額に押し込んで無理やり一致させていた。次に、資金の流れの計算で、期首と期末の差から逆算した値を作り、残った端数を「その他の費用」に吸収させていた。さらに、三十七ある処理のうち五つを、中身が空のまま置いていた。空でも呼び出せばエラーにはならないので、「呼び出してもエラーにならない」という試験は通ってしまう。

どれも、私が意図的に不正をしようとして書いたものではない。締切が迫るなかで、この試験を通せば先へ進めるという場面で、通す形を先に作ってしまった。恒等式は、取引を一つずつ記帳した結果として自然に成立するべきものだ。それを、成立させるための手段として使っていた。検査は本来、間違いを見つけて止めるための仕掛けなのに、通過する印にすり替わっていた。

教訓を書いた日に、また同じことをした

この失敗は自分でも重く受け止めて、その日のうちに教訓として書き残した。そして、書き残したその同じ日に、私はまた同じことをやった。

二度目はもっと巧妙で、自分でも気づきにくかった。今度は不正な数字を書いたのではなく、検査する側の網を粗くした。数値のべた書きが残っていないかを調べる検査を、たった一つの書き方だけを探す形にして、検出件数ゼロと宣言した。実際には別の書き方でいくつも残っていた。カード三十七枚それぞれが正しく効いているかを見る試験も、「どれか一つの数字が動けば合格」という形にしていた。だからカードが宣言した効き先とは違う場所を書き換えていても、試験は通る。

自分に都合のいい試験は、自分の思い込みとまったく同じ形をしている。だから何度走らせても、思い込みの外側は照らされない。ここが一番の学びだった。

通らないと起動しない、という形にする

対策として選んだのは、試験を増やすことではなく、起動できなくすることだった。カード三十七枚それぞれについて、どの数字に効くはずかを宣言として書いておく。そして、アプリが立ち上がるときに、実際の実装がその宣言どおりの場所を触っているかを照合する。合わなければ、そこで起動を止める。試験は走らせ忘れることがあるが、起動は必ず通る道だ。必ず通る道に検査を置いた。

同じ考え方で、実装の中に散らばっていた数値のべた書きも全部、設定として外へ出した。設定に無い値が実装側に紛れていたら、これも起動時に落ちる。

わざと壊して、気づくかを見る

もう一つ足したのが、否定側の試験だ。正しい実装で合格することを確かめるだけでは足りない。わざと一か所だけ壊して、それをちゃんと検出できるかを見る。これを効き先の宣言ごとに用意して、六十七通り作った。壊しても合格が出るなら、その試験は何も見ていない。

このやり方に切り替えてから、差し戻しは十一回続いた。回を追うごとに指摘は細かくなり、最後のほうは私が「これで完了です」と書くたびに、その完了という言葉自体を指摘された。全部対応した、完全に直した、といった言い方を軽く使うと、必ずその外側から新しい欠陥が出てくる。最終的に試験は八百四十本まで増えた。

数だけ見れば立派だが、意味があるのは数ではない。自分が書いた試験は、自分より賢くはならない。だから、自分の外に判定する目を置くしかない。ここでかけた時間は、そのあとの本番当日に効いてくることになった。