in Programming

映画『マトリックス』の仕組みについてエンジニア目線から再設計してみる:問題定義編


すろっくさんだよ。

今日は家の奥にあった「マトリックス」「マトリックス・リローデッド」「マトリックス・レボリューション」のDVDを引っ張りだしてしばらくぶりに観てみました。いろいろ突っ込みどころが多いところがあるのは100も承知なのですが、改めて観るといろいろ突っ込みどころありまくりですね。

今日はせっかくなので、マトリックスの世界で使われている電脳世界システム「マトリックス」を僕なりに再設計してみようと思います。

その前に今回は問題提起編です。まずは仮説を立てないと手を動かせませんからね。

気が向いたら修正編かきます。

あ、ネタバレ含むのでそういうの嫌な人は回れ右。

現状のマトリックスとその問題点

行きます。10個あげたけどもっとある気がする。

問題1:マトリックスの電源は栽培された人間なので、モーフィアスたちが人間を解放すればするほどマトリックスは運用するための電源が足りなくなる

モーフィアスたちは違法信号でマトリックスに侵入します。赤い薬と青い薬のくだりとかそうですね。エージェントたちをかいくぐってネオを探し出して、電源からひっぺがすあたりですね。

まあ機械からしたらその分人間を栽培すればいいので別にいいのかもしれませんが、この違法信号で侵入させちゃうあたり駄目です。まずはファイアーウォールきちんとつくらないと。この調子だと機械の電源生産ペースとモーフィアスたちの人間解放ペースが変わったとき、マトリックス終わります。電源供給元を再設計するところから考えないといけませんが、まあここはハードウェアの問題なんではぶきます。でもマトリックスのサーバエンジニアはサーバ増強したいのに電源がないもんだからかなり困るでしょうね。ハイ次。

問題2:マトリックスを構成しているプログラムを書いたプログラマーはメソッドの中にパスワードをいちいちコピーペーストしている

「リローデッド」ではセラフが最初にネオを鍵を使って秘密の廊下に案内します。これはプログラマーが使う『バックドア』っていうものだという説明が入ります。それをセラフが持っていて、預言者のもとに案内します。その後、預言者もセラフもプログラムのひとつという説明があります。これも問題。

単体で動くようなので彼らは一つの関数と考えてよいでしょう。引数に応じてきちんと他のプログラムに依存しない動作をしているようなので、プログラムの動きとしてはあってるんですが全体的にみたらあかん感じがします。そして彼らは結構自由にバックドアはいったり出たりしているようです。預言者だからーっていうならそれもいいんですが、重要か重要でないかに関わらずパスワードをメソッドの中にコピペして他のメソッドの動きコントロール配下に入れるようにしちゃうのはいただけないですね。

問題3:マトリックスにバックドアができちゃったからそれを管理するキーメーカーメソッドを作った

これもプログラマーの失敗ですね。キーメーカーメソッドを作る前にバックドアを防ぐべきでした。鍵さえ持っていれば自由に行ったり来たりできちゃったら駄目ですよね。 いつふせぐのかは 今でしょ。

しかもキーメーカーはいろんな鍵を作ったりできる or 各メソッド内部にベタがきされたパスワードを知り尽くしているようなので、多分アーキテクト本人はパスワード管理が結構ずさんな可能性高いです。

「あれ、このメソッドの中にコピペしたパスワードなんだっけ? 忘れたからとりあえずキーメーカーメソッド呼んどけ」

時間がなかったんでしょうか。最初にマトリックス構築したひととそのあときたプログラマーがマニュアル通りにキーメーカーメソッド呼んでますみたいな流れになってるようです。でも次の問題がそれを思い切り覆します。

問題4:キーメーカーの実行権限をメロビンジアンが握ってた

これはマトリックス最大のバグです。

作中では「捕まっている」という表現がありました。そのあとでてきたアーキテクトが『救世主はメインフレームのソースに戻って』みたいなことを言っていたので、多分メロビンジアンに捕まることなくキーメーカーつれてくるのが正常系だったんだと思います。預言者も「調べたら〜」みたいなこといってるので多分想定の範囲外だったんでしょう。

メロビンジアンを前に立てたのかどうかわかりませんが気づいたらキーメーカークラスがメロビンジアンクラスの中にいれたのはどうなんでしょうか。そういう大事なものは独立させた形にするか、逆に継承される側であるべきでした。

話によるとメロビンジアンは最初の方につくったものだったようなので、多分アーキテクトがやらかしたのでしょう。あのひげのおっさん……

問題5:何年か一度にリセットしないとうまく動作しない

ゴミデータがたまりすぎてデータベースリセットしないと行けなくなったようなものでしょうか。そもそもそれならスキーマ設計をちゃんとしないといけないと思うんですが、リセットするくらいならこまめなガベージコレクションしましょうか。

問題6:リファクタリングはメソッドまるまる消して、新しいメソッドを書き足すかしているが、たまに古いメソッドが消えないことがある

これはマトリックスを編集しているアーキテクトのツール上の問題かもしれません。

話の中ではアーキテクトはリファクタリングをしょっちゅうしているようです。ただメソッド書き足すことはできても古いメソッドの削除にたまに失敗するようです。ネオに殺されたはずのスミスが復活して、最後バックドアに現れたみたいに、メソッド内にコピペしたパスワードは持たせたまま削除に失敗しているみたいなので、かなり依存関係が強く削除できないものが多いようです。

『レボリューション』ではトレインマンが自動リファクタリングするプログラムをしていて、いらないクラスやメソッドを削除する役目をやっているみたいでしたが、たまに抵抗されているみたいなのであれはクビにしたほうがいいんじゃないでしょうか。しかもその雇い主はメロビンジアンです。

アーキテクトは最初に作ったメロビンジアンメソッドに依存したプログラムを一杯作ったのが間違いですね。最初にリファクタリングするべきはメロビンジアンだったんじゃないか。トレインマン弱みでも握られてたんでしょうか。

問題7:あまりに人間が入ってきてマトリックス荒らしていくのでそいつらぶっつぶすエージェントプログラムつくった

アーキテクトからすればシステムに侵入してくるウイルス同然なので、ワクチンソフトのつもりで作ったんでしょうね。ただ結構考え方は共通にされているわけではないようで、スミスが暴走しだして『ザイオンぶっつぶしてここを出たい』とか言ったあげくネオに殺されても削除処理に従わずにバグ同然の動きをしたりしているので、別々のメソッドがありそうですね。エージェントクラスの中にあるエージェントメソッドですね。スミスの死亡したところで異常系が初めてでたので、エージェント削除処理を走らせるところでバグがあり、システムに重大なエラーが発生したわけですね。テストコードなかったんでしょうか。スミスについては後述します。

問題8:あまりに人間が入ってきてマトリックス荒らしていくのでそいつらコントロールする預言者プログラムを作った

これは半分正解で半分失敗です。そのコントロールが人間の選択をせまり、彼らの行ったことに対して「私はそう思っていた」というだけのプログラムだったんです。それを繰り返しているうちに預言者メソッドの言っていることをマジで信じる人間ができました。

モーフィアスです。

あとは預言者に適当なこといわせて自分の思い通りに誘導するだけです。まあ、なんだろ。他者のプログラマーが雑に作ったプログラムの出力結果だけをみて経営判断するITよくわからない取締役ですね。

問題9:異常が発生すること前提にリファクタリングを進めてしまった(結果七回リセットした)

作中でネオは「アノマリィ」と呼ばれる異常系です。いわゆるバグと人間の融合みたいなものです。人間が侵入した結果そういうよくわからんバグが発生して人間が変なことしはじめたぞ! という感じです。多分アーキテクトは制御できてません。制御できないもんだから、他のプログラムに一定の動きをさせるように誘導し、なんとかそれで回ってる感じです。預言者も最後は「お前はソースにいけ」といっているので、マトリックス総力で制御しようとしているようでした。

このバグがなかなか厄介で、ある程度まで成長するとシステムにヤバい異常を出しはじめます。仕方ないのでマトリックスのソースに取り込んでマトリックスごとメモリフラッシュして全て再コンパイルの手段にアーキテクトはでるようです。

何度リファクタリングしてもアノマリィが発生するもんだから、今まで過去七回リセットしてます。それ前提にプログラムを組まざるを得なくなったというのが現状なのかもしれませんな。ただ再コンパイルする前にアノマリィの発生原因となるソースコードを見つけたほうがはやかったかもしれません。

問題10:スミスを完全削除できなかった

削除に失敗したプログラムが勝手に動き出して気づいたら大惨事でしたというパターンでしたね。あの戦いで倒れたスミスもネオのアノマリィとしてのプログラムをコピーし、エージェント+アノマリィの複合体としてマトリックスを自分のものにしようと動き始めます。異常系のテストをしていないアーキテクトは焦ります。外部侵入のネオはともかく、スミスはエージェントプログラムの正常系です。ソースコードみてもそんなのないのに気づいたらシステム荒らされているんだもの。気づいたら異常系の処理が暴走してがシステム食いつぶしてました。

ここでリセット&再コンパイルできればよかったんですが、ネオがシステムのリセットを突っぱねました。事態は悪化の一途を辿ります。

定期リセットの最終手段をなくしたアーキテクトは絶望します。最後預言者のもとに涼しい顔して現れましたが、あれ絶対「共倒れになってくれてよかった……安心した……こんなのもうやめる……つらかった……」と思ってたと思います。最後の一言が「電源に繋がってる人間? 解放するに決まってるじゃないか」って言ってるのでさすがに懲りたんだと思います。いいね。

まとめ

マトリックス面白いよ。