今日のバグ。マルチスレッドとシングルトンと冗長構成。

このプロジェクトに参加できてよかったとか書きましたが、あまりにもバグが多い(正確には、バグを修正する時の影響範囲が大きすぎて工数を見積もるのが博打に近い)のでもうすぐ離れる方向で上層部は動いています。離れた後に誰がソースコードを読んであげるのか全く不明です。とか偉そうですが、自分で書いたら同じバグを仕込みそうで怖いです。
今日のバグはマルチスレッドとシングルトンです。
「シングルトン=同時に単一のスレッドからしか実行されない」ではありません。何だかこの作者はシングルトンなオブジェクトが出来上がったことで安心しきってしまったようです。結果から言うと状態を保つ変数を持っているあたりが既に臭いんですが、状態を保つ変数を持ちたいからこそシングルトンなんですよね。でも私もそこに潜んだバグにまでは気がつきませんでした。
「この行と、次の行の間で、この変数の値が変わったらどうなる?」
もうすべて同期をとって実行するようなメソッドだけにしてしまってほしかった。もうね、Javaなんだから(?)、シングルトンなオブジェクトを作る専用の構文を用意しておいて、出来上がったオブジェクトのメソッドの呼び出しはすべて同期化されるなんてくらいにしてくれないと、取り扱いが難しくて困る。実際要員を追加すればいいんじゃないかという話になった時にマネージャから『どんなスキルがあればいいんだ、Javaのスキルか?』と聞かれて「いいえ、マルチスレッドとかサーブレットとかの経験者です」と返すことがある。そうするとたいていマネージャは黙ってしまう。

このバグが悪さをするのは年に1回、あるかどうかです。変数の値が変わること自体、緊急な事象のために何かをした瞬間です。その何かをした瞬間に、別々のスレッドが複数その変数を参照するメソッドを起動すると発症します。つまり、ほとんど起こらないということです。でも、発症してしまった場合にたとえばそれがシステム全体を停止したことで社会に影響を及ぼしてしまったら。。。?

冗長な構成はなにもハードウェア故障のためだけの対策ではありません。ソフトウェアが極めてまれなタイミングのバグを踏んだ時に切り離して再起動するためにも必要です。業務アプリケーション構築者は冗長化に敬意を払わないといけません。