Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

第4章 完成したはずなのに、まだテストを書く

あなたが書いたコードは、動いている。

レビューに出す。返ってきたのは、こんな言葉だ。

「ここは、触らないほうがいいですね」

意味が、最初はわからない。動いているのに。直したい場所が、目の前にあるのに。なぜ、触ってはいけないのか。

実はこの章には、ひとりの主人公がいる。人ではない。**「動いているのに、誰も触れないコード」**だ。これから話すことは全部、その一点の恐怖をめぐっている。

──

プログラマーは、ずっとこの恐怖と暮らしてきた。

かつて、ソフトウェアをリリースするということは、半分、祈ることだった。手元では動いた。だから出す。あとは、壊れていませんように、と願う。実際、よく壊れた。しかも厄介なのは、直した場所ではなく、まったく関係のない遠くが壊れることだった。一行直すと、半年前に書いた別の機能が、静かに死ぬ。誰も全体を確かめられない。

ある時期、技術者たちは、ある言葉を口にしはじめる。ソフトウェア危機。 ハードウェアは年々速く、安くなっていくのに、それを動かすソフトだけが、大きくなるほど手に負えなくなっていく。作れるはずのものが、作れない。直せるはずのものが、直せない。業界全体が、「自分たちはソフトの作り方をまだ知らない」と認めた瞬間だった。

恐怖が現実になった例には、事欠かない。

あるロケットは、前の機体で何年も正しく動いていたプログラムを、ほぼそのまま新しい機体に積んだ。古い機体では決して起こらなかった計算上のあふれが、より速く飛ぶ新しい機体では起きた。誰も、そこを確かめていなかった。例外は誰にも受け止められず、装置は自ら停止し、機体は打ち上げから一分足らずで、自分を破壊した。

動いていたコードは、文脈が変わった瞬間に牙をむく。 これが、恐怖の正体だ。

──

最初の答えは、素朴だった。人間が、頑張って確かめる。

リリースの前に、手で一通り動かす。専門の担当者を立てて、画面を端から端まで叩いてもらう。徹夜の総点検。問題があれば、見つかる。たぶん。

けれど、これは規模に負ける。機能が二つなら、組み合わせは数えられる。十、二十と増えていけば、確かめるべき道筋は、人間の手に負えない数に膨れ上がる。どれだけ丁寧に総点検しても、確かめきれない一点が必ず残る。

そして恐怖は、こうして悪化する。怖いから、触らない。触らないから、古びる。古びるから、もっと怖くなる。

怖い→触らない→古びる→もっと怖い、と一周してさらに怖くなる恐怖の悪循環の図

図 4-2 怖いから触らない。触らないから古びる。古びるから、もっと怖くなる。恐怖は一周するたびに濃くなる。

──

ここで、その答えを先取りしていた人たちがいる。

月へ向かう着陸船の中。降下の最中、画面に数字が灯った。1202。 機械が、抱えきれない量の仕事を一度に背負わされた、という悲鳴だった。普通なら、固まる。だが、そのソフトは固まらなかった。優先度の低い仕事を自分から投げ捨て、着陸という一点だけを、生かし続けた。

設計したのは、マーガレット・ハミルトンたちのチームだ。ハミルトンは、ソフトウェアを書く仕事を、まだ誰もそう呼ばなかった時代に「工学」と呼んだ人である。彼らは、起こりうる最悪を先に数え上げ、「そのとき機械がどう自分を守るか」まで作り込んでいた。だから 1202 は、故障ではなかった。設計どおりに、自分を守っているという報告だったのだ。

その数字は、月面着陸を止めなかった。

そして半世紀後。別の数字が、あなたの画面に、毎日のように灯る。

FAIL。

よく似ている。どちらも、機械が「ここが危ない」と先に教えてくれている。違うのは、1202 が一度きりの本番だったのに対し、FAIL のほうは、あなたが安心して何度でもやり直すために、自分で、わざと鳴らしているということだ。

一度きりの本番の 1202 と、何度でもわざと鳴らす FAIL の対比

図 4-1 同じ警告。違うのは、鳴らす回数だ。

──

信頼は、祈りではなく、設計できる。

ハミルトンたちが月の上で示したことを、地上のありふれた開発に持ち込んだ人たちがいる。

ケント・ベック。エクストリーム・プログラミングを提唱した一人である。彼は、書いたコードのとなりに「これはこう動くはずだ」という小さな検査を一緒に置いておく、という作法を広めた。変更するたび、機械がその検査を全部やり直す。壊れたら、その場で、赤く知らせる。

ここが、この章のいちばん大事なところだ。

自動テストの本当の値打ちは、品質を保証することではない。

よくある誤解を、ひとつ解いておきたい。テストは、「バグがないことの証明」ではない。エドガー・ダイクストラ――構造化プログラミングを唱えた計算機科学者の一人だ――は、こう指摘した。テストはバグがあることは示せても、バグがないことは、決して示せない。どれだけ検査を足しても、「これでもう完璧です」とは言えない。カバレッジが 100 パーセントでも、それは安全の証明書ではない。

では、テストは、何を守っているのか。

最初の恐怖に戻れば、わかる。「動いているのに、誰も触れない」。テストは、その呪いを解く。検査がすべて緑なら、あなたは安心してコードに手を入れられる。何か壊せば、機械がすぐ、赤く教えてくれるからだ。

変更するたびに検査が走り、通れば手を入れられ、壊せばその場で気づける安全網の図

図 4-3 変更のたびに検査が走る。通れば安心して手を入れられ、壊せばその場で気づける。

テストを書くという方向そのものは、もう決着がついている。いまさら、手作業の総点検だけに戻ろうという人はいない。まだ開いているのは、その先だ。先に書くか、後に書くか。どこまで書けば十分か。そこには、いまも本物のトレードオフが残っている。

けれど、入口の問いには、もう答えられる。

完成しているのに、なぜ、まだテストを書くのか。

テストが守っているのは、品質ではない。

テストとは、明日も、来年も、このコードに触れ続けられる――という自由だ。

──

明日も触れる自由を、あなたは手に入れた。

だが、コードはもう、一人で抱えるには大きすぎる。その自由を、大勢で、どう信頼し合うのか。

その話は、次の章で。