私が個人的に「ソフトウェア開発におけるマーフィーの法則」と呼んでいるものがある。

マーフィーの法則というのは「失敗する可能性のあるものは失敗する」というもので、一般的にはある種のジョークというか皮肉として解釈されていると思う。まあ「フラグ」というか、これは絶対大丈夫でしょと思ってたものがいきなり壊れるというような。

でもソフトウェア開発をしていると、そういう不運とかフラグとかとは全然別な意味で、マーフィーの法則ってよく成り立つなと思うことがしばしばあるのだ。

ソフトウェア開発において書かれたコードというのは実際にリリースされると極めて高頻度に、何度も何度も実行される。実行条件は毎回少しずつ違う。また、ユーザ環境にインストールされるアプリやOS、フレームワークといったものの場合は、インストール環境が多種多様で微妙な違いというものが多数存在しうる。そんなとき、どんな僅かな確率であっても失敗する可能性があるのであれば、その失敗が発生するということはかなり確実に起こるのである。

例えばアンドロイド携帯の総出荷数は30億台だそうである。仮に100万回に1回しか起きないようなごくごく稀な事象であっても、単純な計算で全部のデバイスで1回ずつ実行するだけで3000台のデバイスに問題が生じる可能性があるということになる。何度も行うような操作の場合には問題の発生件数はもっと大きくなるだろう。

ソフトウェア開発をしていて、特に分散処理とかのややこしいレースコンディションや論理的な整合性に関する部分が微妙におかしかったりする。正しく直すのはかなり難しい、またはめんどくさい、しかしどのみち、現実的には到底起こりえないようなごくごく微妙な話でしかない、みたいなことはある。でもそのまま放置すると実際にはその問題が起こって問題を引き起こす、みたいなことが起こる。あるいは、バグレポートから調査をしていた結果、まさかそんなところで、みたいなところで問題が起きていたりする。こういうのは不運でもジョークでもなく、単に何度も何度も実行されるから。どんなに現実的に到底起こりえないような現象であっても、失敗する可能性のあるところで失敗するという事象は絶対に発生すると思っている。

なのでソフトウェア技術者としてマーフィーの法則ってよくあるよな、と思ってる。でもこれ自分だけが思ってることで人にあんまり話したことないんだけど、どうなんだろ。案外常識だろと思わない人もいそうである。

ところで関連する話として、スタニスワフ・レムに「枯草熱」というかっこいいタイトルの中編小説がある(タイトルの字面はかっこいいが、このタイトルは英語で言うと hey fever つまり花粉症のことだと知って大層がっかりしたものである)。中身はなんだかしょうもない結末でうーん面白くないな、と思ったものだが、この作品内に(記憶で書いているので細部は違っているかもしれないが)次のような話があって印象に残っている。

「テーブルがあって、そのテーブルを組み立てるのに使った釘がテーブルの面に見えているとする。水を一滴垂らしてこの釘を狙うのは到底できないことのように思える。でも雨が降ればその釘の上に雨粒が落ちないと言うことはありえない」

同様に、そんなこと狙ってもできないでしょ、と思うような、針の目を縫うような微細な条件でだけ発生する問題であったとしても、何度も何度も実行すればいつかはそういうことが起こる。多数の人に使ってもらうと言うのは雨が降るようなものだ。この例えはなんだかかっこいいなと思っていていつか使えたらいいなと思ってるのだけど、いまだに使えた局面というものがない。みんなレムの「枯草熱」なんて読んだことないだろうしな。ていうか読んでも総合的にはそんなに面白くもないしな。

(ところで余談だが、冷静になって考え直してみると、これは自分がソフトウェア開発者だからソフトウェアについてこう思うのであって、一般的に大量生産品の設計や製造というのはこういうものであるのかもしれない)