
王様、何も着ていません!「裸の王様」に学ぶ、テストなしのシステムは危険です
王様は退屈だった。そこに現れた詐欺師は、「賢い人間にしか見えないシステム」を売り込んだ。しかし、そのコードはテスト皆無の杜撰さ!大臣の不安をよそに、開発は進む。パレード当日、子供の一言「王様は裸だ!」が、全てを暴く。テストなきシステムの崩壊、そして、リファクタリングとTDDへの道が開かれる! 目に見えない恐怖と、真実の叫び。あなたは、このバグだらけのシステムの結末を目撃できるか?
華麗なるバグ・プロジェクトの幕開け!
王様は退屈していた。豪華な宮殿、山盛りのご馳走、美しい音楽…何もかもがすでに飽きていた。そんな時、二人の詐欺師が謁見を求めてきた。
「王様!我々は最高のシステムアーキテクトです!特別な技術で、賢い人間にしか見えないシステムを構築できます!」と詐欺師Aが声を張り上げた。
「ほう…見えないシステムとは?どんなものじゃ?」王様は興味津々だった。
詐欺師Bが自信満々に答えた。「このシステムは、最新技術の塊です!目には見えませんが、高度なAIが王様のあらゆる要望を先読みし、自動で実行します!まさに王様にふさわしい、世界で唯一のシステムです!」
王様は、見えない高度な機能にすっかり魅了された。「素晴らしい!開発費用はいくらかかろうと構わん!すぐに開発を開始せよ!」
大臣は不安を覚えた。「王様、本当に大丈夫でしょうか?目に見えないシステムなんて…」
しかし、王様は聞く耳を持たない。「心配するな!わしは賢い王なのだから、このシステムの素晴らしさが理解できるはずだ!」
詐欺師たちは、早速開発に取り掛かった。しかし、彼らのコードは驚くほど杜撰だった。
def 王様の気まぐれ機能(要望):
# とりあえず適当に実装
if 要望 == "褒めて":
return "王様は素晴らしい!"
elif 要望 == "新しい服":
return "最高の布で仕立てましょう!"
else:
# エラー処理?なにそれ美味しいの?
return "バグ発生!"
def 大臣の忠告無視機能():
# 無視!無視!
pass
def 納期は気にしない機能():
# 締め切り?知らない子ですね…
while True:
# 無限ループで時間稼ぎ
pass
テストコードは一行も書かれていない。大臣は、その場当たり的な開発に危機感を募らせるも、王様に逆らう勇気はなかった。「どうか、うまくいきますように…」と大臣は祈るような気持ちで呟いた。

テストなきコードの増殖!
詐欺師たちは、薄暗い部屋でカタカタとキーボードを叩いていた。部屋には、インスタントラーメンの空容器と、使い捨てのコーヒーカップが散乱している。まるで魔法のように、コードが量産されていく。
def 王様の気分次第機能(天気):
# 天気が良いと褒める、悪いと叱る
if 天気 == "晴れ":
return "王様、今日は輝いていらっしゃいます!"
else:
return "大臣!なぜ天気を晴れにしないのだ!"
def 無駄な機能追加(キラキラ):
# キラキラ好きの王様のために無駄な機能を追加
キラキラ *= 100
return キラキラ
def 納期は無視機能():
# 納期?なにそれ?
from time import sleep
sleep(10000) # 一万秒寝る
「できた!これで完璧だ!」詐欺師Aは、ドヤ顔で宣言した。しかし、テストコードは一行も書かれていない。
「本当に大丈夫か?バグだらけじゃないのか?」大臣は不安げに尋ねた。
「心配ご無用!我々は天才アーキテクトですから!」詐欺師Bは自信満々に答えた。「このシステムは、賢い王様にしか見えないのです!大臣には理解できないでしょう。」
王様は、詐欺師たちの言葉にすっかり気を良くした。「うむ!わしには、このシステムの素晴らしさがよくわかる!早く完成させよ!」
数日後、詐欺師たちは王様に「見えない衣装」を納品した。それは、テストがないために、中身が全く見えない危険なシステムだった。
「素晴らしい!まさに王にふさわしい衣装だ!」王様は、何もない空間を指さして絶賛した。
子供は、王様の様子を不思議そうに見ていた。「王様、何も着ていないよ?」
王様は、子供の発言に耳を貸さなかった。「黙れ小童!これは賢い者にしか見えない特別な衣装なのだ!」

パレード開始!そして、真実の叫び!
晴れ渡る空の下、王様は街中をパレードすることにした。きらびやかな馬車に乗り、誇らしげに胸を張る王様。しかし、実際には、王様は「何も」身につけていない。詐欺師たちが作り上げた「見えない衣装」システムは、実際には何も機能していない、ただのハリボテだったのだ。
「王様、なんと素晴らしい衣装でしょう!この輝き、この気品、まさに王様にふさわしい!」大臣は、周りの家来たちに聞こえるように大声で言った。大臣は、自分が愚かだと思われたくなかった。システムの欠陥に気づいていたが、見て見ぬふりをしていたのだ。
「うむ、実に素晴らしい!このシステムの快適さ、まさに完璧だ!」王様も、大臣の言葉に気を良くして答えた。王様は、自分の虚栄心を満たすため、システムの不具合に気づかないふりをしていた。
家来たちも、大臣に倣って王様の衣装を褒め称えた。「この複雑なシステム、私には理解できませんが、きっと素晴らしいのでしょう!」「王様、この革新的な衣装、まさに未来の象徴です!」
def 家来の忖度機能(発言):
if 発言.startswith("王様"):
return 発言 + "!素晴らしいです!"
else:
return "聞こえません!"
def 大臣の保身機能(真実):
if 真実 == "システムは欠陥だらけ":
return "王様、完璧です!"
else:
return 真実
パレードは続き、沿道には多くの民衆が集まっていた。人々は、王様の「見えない衣装」に驚き、感嘆の声を上げていた…と思っていた。
その時、沿道にいた一人の子供が叫んだ。「王様は裸だ!」
def 子供の純粋機能(現実):
return 現実 # ありのままを返す
子供の純粋な叫びは、街中に響き渡った。人々は、子供の発言にハッとした。そして、大臣や家来たちの嘘、王様の虚栄心に気づき始めた。システムの不具合は、子供には隠せなかったのだ。
「バグを見つけるのは、子供のように純粋な目を持つテストだ!」大臣は、冷や汗をかきながら呟いた。テストの重要性を、身をもって痛感した瞬間だった。

リファクタリングとTDDへの道!
「王様は裸だ!」という子供の叫びは、宮廷全体に衝撃を与えた。大臣たちは顔面蒼白になり、家来たちはヒソヒソと囁き始めた。王様は、恥ずかしさと怒りで顔が真っ赤になった。「な、何だと…?」
騒ぎの中、子供は冷静に言った。「王様、そのシステム、バグだらけだよ。何も動いてないじゃん」
王様は、初めて自分の愚かさに気づいた。そして、子供に頭を下げた。「す、すまん。わしは騙されていたようだ。どうか、このシステムを直してくれ」
子供、すなわちベテランエンジニアは、王様と大臣にテスト駆動開発(TDD)の重要性を説き始めた。「まず、テストを書きます。テストは、システムの振る舞いを定義します。そして、そのテストが通るようにコードを書きます。最後に、コードを綺麗にするのです。」
def test_王様の気まぐれ機能_褒めて():
assert 王様の気まぐれ機能("褒めて") == "王様は素晴らしい!"
def test_王様の気まぐれ機能_新しい服():
assert 王様の気まぐれ機能("新しい服") == "最高の布で仕立てましょう!"
王様と大臣は、言われるがままテストコードを書き始めた。最初は戸惑っていたが、子供の指導のおかげで徐々に理解していく。「なるほど、こうやってテストを書くのか…」
子供は、システムをリファクタリングし始めた。無駄な機能は削除され、バグは修正されていく。システムは、徐々に安定し始めた。
def 王様の気まぐれ機能(要望):
# リファクタリング後!
要望_ハンドラ = {
"褒めて": lambda: "王様は素晴らしい!",
"新しい服": lambda: "最高の布で仕立てましょう!",
}
return 要望_ハンドラ.get(要望, lambda: "バグ発生!")()
数日後、システムは無事に完成した。王様は、新しいシステムに満足していた。「素晴らしい!このシステムは本当に素晴らしい!以前のシステムとは全く違う!」
子供は、王様に微笑みかけた。「システム開発は、テストが重要です。テストがあれば、バグを早期に発見できます。そして、バグを修正することで、システムの品質を向上させることができます。」
王様は、深く頷いた。「わかった。これからは、テストを重視したシステム開発を進めていく。わしは、もう騙されないぞ!」
大臣は、安堵の息を吐いた。「これで、ようやく安心して眠れます…」
その後、王様はTDD信者となり、あらゆる会議で「テストを書きましたか?」と連呼するようになった。大臣も家来も、テストコードを書くのに追われる日々が始まったのであった…。
