ソフトウェアの品質を学びまくる

ソフトウェアの品質、ソフトウェアテストなどについて学んだことを記録するブログです。

五匹の猿と、テストの「意図」

 最近、「5匹の猿の実験」(the Five Monkeys Experiment)という話を知りました。有名な話なのかもしれませんが、全然知らなかったので紹介してみます*1
 本当の実験というよりは、寓話的なもののようですが、ともかく以下のような内容です*2

5匹の猿の実験

科学者グループが、5匹の猿をケージに入れた。ケージの真ん中にはハシゴがあり、それを昇るとバナナにありつける。
猿がハシゴを昇るたびに、科学者たちは残りの猿に、冷え切った水を浴びせた。
そのうち、猿がハシゴを昇ろうとするたびに、他の猿たちがその猿を殴るようになった。
しばらくすると、バナナの誘惑に負けてハシゴを昇ろうとする猿はいなくなった。

科学者たちは、猿を1匹入れ替えることにした。その猿ははじめ、ハシゴを昇ろうとしたが、すぐさま他の猿たちに殴られることになった。
何度か殴られるうちに、新しい猿はハシゴを昇ろうとするのをやめた。なぜ昇るべきでないかはわからないまま。

2匹目の猿が入れ替えられ、同じことが起こった。1匹目の猿も、2匹目の猿を殴るのに加わっている。
3匹目の猿の入れ替えでも同じことが繰り返された。
4匹目の猿が入れ替えられ、また殴られ、最後の5匹目の猿も入れ替えられた。

ケージに残る5匹の猿は誰も、冷水を浴びたことがないにもかかわらず、ハシゴを昇ろうとする猿を殴ることはやめない。
ハシゴを昇ろうとする猿をなぜ殴るのかと問うても、その答えは「わからない。ただ、それがここのやり方なんだ」となるだろう。

他にやり方があるのに、なぜ今していることを続けるのか。それを問う機会にしてもらいたい。
結論: 他の人のやり方に従うのではなく、従う前に考えよ

 「理由はよくわからないけれど、そう決まっているから、従う」という方法は、それほどハズレない処世術だとは思うのですが、一方で非効率の温床になりがちです。職印を傾けて押すとか!

 また、世の中のコンプライアンス事件って、こういう「現場はずっとそうやっていた」「誰も疑問を差し挟めなかった」に起因するものも多いんですよね。当事者は「悪いことをしてた」という意識もなく、むしろ「規則よりも現場の実践知に従って、正しくやっていた」という認識だったりします。
 だからこそ、「ずっとやってきたこと」=「正しい」ではないことは、折に触れて見つめ直すことが大切です。

2つの疑問

 さて、この話を読んで、「あれ?」と思ったことが2つあります。

会話すればよくない?

 「なぜ、そうなっているのか」を、猿同士は話せないとしても、人間同士は話せるんじゃない?人間だもの。と思ったのですが・・・、
 不特定多数に適用されている暗黙の社会規範みたいなものは、会話する「相手」がいないんですよね。

 たとえば、エスカレーター右側*3空けちゃう問題。
 これはもう一種のマナーになっていて、立ち止まる(これが本来の乗り方)人は左に寄る。「そうすることが望ましい」じゃなくて、「そうしないと悪」くらいになってる。たとえ、右側を昇っていく人がいなくても。なので輸送効率が常時、スペックの半分くらいになってしまう・・・。

 でも、たとえこのやり方を改善すべきと考えたところで、誰とそれを合意できるのか。
 たまたまエスカレーターに乗り合わせた人に言ったところで・・・ちょっとした不審者ですよね。
 「猿は言葉をつかえないけど、人間はそうじゃないから、改善できる」わけじゃないんだなと。会社組織も同じようなものかもしれません。

元の猿も「理由」をわかってなくない?

 この話、「なぜバナナを取ろうとしてはいけないか」、残った猿は誰も知らないという話なのですが、実は「最初にいた5匹」も、その理由は知らないんですよね。
 直接的には「他の猿に殴られるから」で、なぜ殴るかといえば「冷え切った水をかけられるから」なのですが、「誰かがハシゴを昇ろうとすると、水をかけられる」なんて論理不明の理不尽であって、理由にはなっていないという。

 猿がやるべきだったのは、「冷水をかけてくる科学者どもを殲滅する」だったのではないでしょうか。

テストでも同じことが起きていないか?

 さて、ここから無理やりテストの話にもっていきましょう。

 「なぜやっているかわからない」になりがちなものの一つに、リグレッションテストがあります。
 リグレッションテストは、作戦と意志がないと、ひたすらに増えていってしまいます。集約・剪定など、継続的・積極的な合理化が必要です。

 そんなときに一番困るのが、「なぜやっているのかわからないテスト」です。
 なんかすごく具体的な値や手順が指定されていて、その条件に特別な意味がありそう。でもその組み合わせが何を意味しているのか、過去どんな経緯でこのテストケースがリグレッションテストセットに組み込まれたかわからない。だから削除できない。削除して何か問題が起きたら、「冷たい水を浴びせられる」から

 なので、テストケースには、「なぜそれが必要なのか」という「意図」を残しておくことが大切です。「意図」を残しておくことで、後世の人は、「今もなおこのテストが必要なのか」をあらためて判断することができます。

 「意図」の重要性は、テストケースにとどまるものはありませんね。
 なぜ、そのテスト観点が必要なのか。なぜ、この値を同値クラスであるとしたのか。なぜ、このテストや他のテストより優先度が高いのか。

 「意図」は、成果物そのものとセットになる、重要な情報です
 ケージの猿のように、後の人が「よくわからんけど従う」ことにならないよう、しっかりと残していきたいものです。

LEGO Monkey

*1:ソフトウェアテストの小ネタ アドベントカレンダー はもう埋まっていた。

*2:以下のサイトを参考に、自分で翻訳しています。 www.throwcase.com

*3:はい、そうですね、関西では左側を空けるんでしたね、すみません。