はじめに
「なぜバグがあるんだ!」と理不尽に詰められたり、
SNSで色々言われた経験のある方居られるのではないでしょうか。
幼少期に「大手企業のゲームは品質管理がしっかりしているからバグは無いんだよ。」と言われたことをよく覚えています。
バグ0は非現実的
以下のようなコードがあったとします。
#include <iostream>
int main() {
std::cout << "Hello, World!" << std::endl;
return 0;
}
ただのHello, World!なのでバグは絶対起きないと言えるでしょうか。
言えないはずです。
少なくとも#include <iostream>をしている時点で、
この部分を完全に理解していないとバグが起きないと言い切れないでしょう。
- このコードが動作する環境
- そのときの温度や電気信号
- 他プロセスの干渉
...等々を全て把握していなければ言い切れないわけで、ラプラスの言う「悪魔」すなわち、未来予知が必要になります。
ラプラスの悪魔とは
宇宙のすべての粒子の「今の位置」と「今の運動量」を完全に知っている存在のことで、過去と未来全てを把握出来ている悪魔のことです。
再現不可能なスーパマリオ64のRTAバグ
とあるゲームプレイヤーがスーパマリオ64のRTA(クリアまでのスピードを競うこと)を生配信していたところ「突然天井までジャンプするバグ」に遭遇してスピードを大幅に縮めました。
RTAで競っている他のプレイヤーもバグの再現を試みるものの全く出来ず。
原因は宇宙から降り注いだ宇宙線と仮説が立てられ、再現不可能という結論になりました。
結論的には「宇宙線がたまたまマリオのy軸を司るビットに衝突して反転し、突然飛び上がった。」というものです。
再現不可能なバグは他にも
ベルギーの選挙で「とある候補者に4096票の幻の票が入った」というものです。
4096という数字でピンと来るかと思いますが、これも宇宙線によるビット反転が原因とされています。
宇宙線によるバグは予測不可能なためインフラ、EVなどにも起こり得えます。
https://group.ntt/jp/newsrelease/2023/03/16/230316a.html
結論:バグ0 = 未来予知
このように結論付けましたが、バグがあっても良いとは言っていないです。
「バグは仕方ないので故障は仕方ないです。」
「宇宙線のせいで人が事故に巻き込まれましたが仕方ないです。」
上記のようなことはダメなわけです。
パリティチェックで1ビットの反転は検知して自動修正が可能です。
バグがあって壊れても安全側に倒すフェールセーフや、
誤った使い方を防ぐフールプルーフという安全設計があります。
フェールセーフは「壊れても安全な状態で止まるようにする」というものです。
例:信号機が壊れたら「赤」で固定して事故を防ぐ
フールプルーフは「間違った使い方を防ぐ」というものです。
例:蓋を閉めていないと洗濯できない
バグ0は非現実的だけど、バグが起きても許容できる優しい世界がもっと広がると良いですね。
おまけ
以下のYoutubeを見ると、宇宙線による影響や紹介したお話が分かりやすいです。