retireSakiの日記

たぶん引退した?ソフトウエアエンジニアのブログ

「青春ブタ野郎はバニーガール先輩の夢を見ない」を観てからのマルチスレッドを考える

 今回は、アニメ「青春ブタ野郎はバニーガール先輩の夢を見ない」とマルチスレッドを取り上げてみたいと思います。
まぁ、ある意味無理矢理感な話なので、ツッコミはなしで!(笑)


 「青春ブタ野郎はバニーガール先輩の夢を見ない」第1話〜第3話までの主題であった「シュレーディンガーの猫」ですが、誰でも"ある意味果てしなく残酷な話だったなぁ〜"ぐらいの記憶はあると思います。

f:id:retireSaki:20181019220429p:plain

  〜wikiから抜粋〜

 まず、蓋のある箱を用意して、この中に猫を一匹入れる。箱の中には猫の他に、放射性物質ラジウムを一定量ガイガーカウンターを1台、青酸ガスの発生装置を1台入れておく。もし、箱の中にあるラジウムがアルファ粒子を出すと、これをガイガーカウンターが感知して、その先についた青酸ガスの発生装置が作動し、青酸ガスを吸った猫は死ぬ。
しかし、ラジウムからアルファ粒子が出なければ、青酸ガスの発生装置は作動せず、猫は生き残る。一定時間経過後、果たして猫は生きているか死んでいるか。

  出典:シュレーディンガーの猫 - Wikipedia より

 

 この猫が生きているのか死んでいるのかフタを開けて観るまでは、確率的に生きている猫と死んでいる猫がフィフティ:フィフティで重ね合わせで存在している。つまりフタを開けて観測するまでは、生きてもいないし死んでもいないことになるということ。しかし観測することで、生きているか死んでいるかどちらか一方の状態い収束するということにもなります。... よく量子力学などで使われる話ですね。

 ぶっちゃけ、この確率解釈を極論的に考えると、ある現象において不確定な状態のものは、観測することである状態に変化することを意味しているとも言えます。
と考えた場合、ソフトウエア開発時にも同様の現象が起こるケースがあります。


 現在主流OSである Windows, MAC, Linux などの大半のプログラムの多くは、マルチスレッドで動作します。
このマルチスレッドがケースによっては、マルチスレッド化処理(猫)は開発者(観測者)が予期しえない振る舞いをし、ユーザー(別の観測者)が何らかのイベントによって、別のある結果を表示(収束)するのです。

 簡単な要件のプログラムでは、複雑なマルチスレッドを意図せずにコーディングしていてもほとんど支障が生じません。
しかし、イベント処理内でイベントを発生させた場合、結果は複雑でかつ机上で判断できない、それこそ「フタを開けてみないと判らない!」という状態に落ちいります。
ちょっと無理やり感がありますが、まるで「シュレーディンガーの猫」の話のようです。

f:id:retireSaki:20181019221241p:plain

 

 シュレーディンガーの猫では、ある時点においてラジウムから50%の確率で放射線が発生するとしたとき、発生する青酸ガスによって、生きているのか死んでいるのかどうかは、箱を開けてみるまでわからない状態です。
開けてみるまでは、生きているとも言えますし、死んでいるとも言えます。
これは実験結果そのものには意味がなく、検証のしようがないということでもあります。

 例えば、以下のようなプログラム (実際のプログラムをベースに少しでも判りやすくしたつもりですが、ちょっと複雑で無理やり感があります) があったとします。

 動作仕様:
  ・開始ボタン、ディレクトリーツリーとテキスト表示するエリアを扱うものとします。
  ・開始ボタンをクリックすると、ディスク内のディレクトリー扱うクラスを呼び出し、ツリーの表示・展開・情報の表示を行います。
  ・キャンセルボタンをクリックすることで、各スレッドを中止し最後の情報を表示したままとします。


 詳細条件:
  (1) ボタンクリック内でルートディレクトリーを選択し、ルートのツリー展開。
  (2) ツリーが表示されるタイミングで、ルートとは別のディレクトリーを自動選択し展開。
  (3) ツリーの選択イベントの発生で、現在選択されたディレクトリー以下のディレクトリーも含めた総ファイル数を総ファイル数取得処理で取得。
  (4) 総ファイル数取得処理はマルチスレッドにて行い、取得しながらテキストエリアに取得数を表示。と同時にキャンセルイベントを受ける。

 要求結果
  (1) 自動選択されたディレクトリー以下のディレクトリーも含めた総ファイル数を表示。


 このようなプログラムでは、一般的に自動選択されたディレクトリーの総ファイルが表示されると思われがちがちです。
しかし、
 (1) ルートディレクトリー以下の総ファイルが非常に多かったら?
 (2) ディスクの情報がキャッシュされてなかったら?
などとなる場合放射線の確率)、途中でユーザーがキャンセルボタンをクリックしたら、なんのファイル数を表示しているのか?(猫が生きているのか死んでいるのか)誰にもわかりません。
ユーザーがキャンセルボタンをクリックして初めて結果が収束するのです。
それこそ「シュレーディンガーの猫」のように"フタを開けてみるまで判らない"ということになります。
机上で判断できず、テストしても意味がない。ということになります。


 これがもし、総ファイル数取得処理がマルチスレッドでなければ予想はつきます。しかし、長時間カレントタスクを保持する処理は、GUI(Graphical User Interface)を主とした現代のOSにはそぐわないでしょう。
であれば、条件を変えていくことで、やるべきことを実現させるしかないのです。

 これは「シュレーディンガーの猫」でいうところの放射性物質ラジウムプルトニウムにするとか、ガイガーカウンターの感度を極端に変えるなどの前提条件の変更すると、猫の生存確率か変わるのと近いです。
 意外に思われるかもしれませんが、極論を言えば、システム開発やソフトウエア開発に絶対はありません。不要な可能性を可能な限りZEROに近づける作業が多々あるのです。だからこそ、超大手IT企業でもバグは出る!とも言えるのです。


 開発者は"作ったときには正確な数だったのに、わけのわからない数が表示されている"となるのです。
私が現役だった頃は、「つもり開発」と言っていました。考えたつもりちゃんと作ったつもりということですね。
 ほとんどの場合、開発時のバグの洗い出しで発覚します。が、中に"困ったちゃん"がいた場合、洗い出し自体も"つもり"でやられて納品後発覚なんてこともありえます。(というかあります)怖いですね〜(汗)


 ちょっと無理筋感がありましたが...かなり近い話かなぁと思います。
最近見たアニメ「青春ブタ野郎はバニーガール先輩の夢を見ない」1〜3話を見て、こんなことを思ってしまいました。

www.youtube.com

 ちょっとイッテル?!感を覚えるタイトルですが、真面目な学園青春モノです。
青春のエピソードにシュレーディンガーの猫」や次回の題材ラプラスの悪魔などを取り入れ、上手く表現しているので面白いなぁ〜と感じてます。(少々拡大解釈感があるような...ないような)
正直、大人が観ても楽しめると思います。
アニメのランキングサイトで上位にあるのも納得できますね。

 コンピューターシステムに携わる技術者に科学好きが多いので、このアニメを取り上げてみました。


青春ブタ野郎はバニーガール先輩の夢を見ない アニメ公式サイト

ao-buta.com

青春ブタ野郎はバニーガール先輩の夢を見ない 書籍公式サイト

dengekibunko.jp

 

 

注目記事

「Amazon.co.jpアソシエイト」または「[乙の名称を挿入]は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイトプログラムである、Amazonアソシエイト・プログラムの参加者です。