ふつーのプログラマです。主に企業内Webシステムの要件定義から保守まで何でもやってる、ふつーのプログラマです。

ハローサマー、グッドバイ(16) デグレード

»

 「なんだ?」胡桃沢さんが睨んだ。

 「何かのメソッドが未実装になっていますが」

 「何だと」胡桃沢さんはぼくを押しのけるようにモニタを覗き込んだ。「おい、これは何のファイルだ」

 ぼくが横から手を伸ばして、該当メソッドをクリックした。jar ファイル内にあるクラスで、ソースは添付されていなかったが、ファイルのプロパティを開くとバージョン情報が表示された。

 「おかしいな」胡桃沢さんは持っていたタブレットに表示させていた一覧表と見比べた。「バージョンが2 つばかり古い」

 「どういうことですか?」

 「昨日の夜、確認したときは、全ソースが最新バージョンになっていたんだが」険しい表情だ。「それ以後は触ってないはずだ」

 「出発前にリビジョンアップされてますけど」ぼくは思い出させた。

 「......あれか」胡桃沢さんは振り向いた。「おい、ボリスさんよ。どういうことだ。古いバージョンになってるじゃないか」

 「別に不思議はないでしょう」ボリスはしれっと答えた。「古いバージョンと言っても、不良品というわけじゃない。先にできたというだけで、正規のモジュールであることには変わりない。組み合わせによっては、古いバージョンのものを使うことだってありますよ」

 「デグレしてるじゃないか」

 「よくあることですよ。別にバグじゃない。そういう仕様になったというだけのことです」

 胡桃沢さんは、ベッドの上にGで始まる害虫を発見したような嫌悪感で顔を歪めた。

 「最新に置き換えていいんだな?」

 「ご自由にどうぞ」

 ボリスはそう言うと、それ以上の追及をシャットアウトするように背を向けてしまった。胡桃沢さんはその背中を睨んだが、諦めたようにぼくを見た。

 「リビジョンアップ前のモジュールがバックアップしてある。ちょっと待ってろ。念のため、今のモジュールを、どこかにコピーしておけ」

 佐分利の胡桃沢さんにとって、ハウンドのボリスは元請け会社の社員にあたるはずだが、そういう遠慮はないようだ。今朝からの不具合の連続が、よほど腹に据えかねているのだろう。

 ただ、ぼくは少し疑問を感じていた。いくらなんでも、ここまで不具合が残っているシステムを納品するものだろうか。実地テスト、ということは、受入テストということで、限りなく完成品に近い状態であるはずなのに。ひょっとすると、ソリストは半分ぐらいしか完成していないのだが、ハウンドとしては些細なバグがいくつか残っている程度だ、と見せかけようとしているのか?。

 いや、待てよ、とぼくは考え直した。それなら、オペレーションMM自体を延期させた方がいいのではないだろうか。以前、納期のきつい仕事で苦しんだとき、データセンターに隕石でも落ちろとか、サーバの納入予定が大幅に遅れてくれないかと真剣に願ったことがある。開発の遅れはプログラマの責任だが、外的要因なら大手を振ってスケジュールを延ばすことができるからだ。

 この場合、そこまで破壊的でなくても、単純だが致命的な不具合――LAN がつながらないとか――を、もっと早い段階――出発直後とか――に発覚させて、このオペレーションを延期させれば、充分に時間を稼ぐことができる。ソリストの稼働時間が長ければ長いほど、発覚するバグの数も増加していくだろうから。ボリスの態度は傲慢で不遜だが、オペレーション自体の中止をもくろんでいるようには見えない。中止を望んでいるなら、先ほど、菊名駅で臼井大尉が撤退を提案したとき、真っ先に賛成したはずだから。

 モジュールのコピーを終えて、そんなことを考えている間に胡桃沢さんが戻ってきた。

 「バックアップからモジュールを戻した」そう言って、リポジトリ名を教えてくれた。「ただし、ソースはない。ここにはGit もSubVersion もないからな。何とかモジュールだけで、最適解を見つけろ」

 「......やってみます」

 ざっと見たところ、ドローンのコントロール関連は、119 個のクラスで構成されていた。胡桃沢さんが戻してくれたモジュールと、コピーしておいたモジュールで、それぞれのバージョンを比較してみると、確かに全てが異なるバージョンになっている。変更前が、0.98.33.0.74。変更後が、0.98.34.1.0 だ。ファイルサイズが全く変わっていないモジュールもあるから、単にコンパイルし直したためにバージョンが変わってしまっただけ、というモジュールも含まれているに違いないが、バイナリレベルで比較しなければ、その区別はつかない。

 まずはリビジョン前の状態でシミュレータを再起動し、飛行モードの変更を試してみる。途端にシミュレータがハングアップし、大量のエラーログが生成されてしまった。これは組み合わせの問題だろうと見当がつく。ドローンコントロール関連クラス群の中では、整合性が取れているが、他のサブシステムとのインターフェースに差違が生じているのだろう。つまり、全てをリビジョン前に戻すのではなく、必要な部分だけを戻さなければならない。問題は、その組み合わせに関する情報が全くないことだ。

 「どんな具合?」島崎さんが心配そうに訊いてきた。

 「順番に組み合わせテストをするしかないですね」ぼくは少し苛立ちながら答えた。「正しく動作する組み合わせがあるはずですから」

 「そうか。邪魔してごめん」

 島崎さんは謝罪して引っ込んだが、ぼくはすでに画面に集中していた。組み合わせテストを実行するにしても、モジュールの組み合わせを変えるたびに、いちいち手動でシミュレータを実行していては時間がかかりすぎるし、洩れも出るだろう。自動テストを組み上げようと考えていたのだ。

 まず、シミュレータのモジュールを探した。これは管理メニュー関連のリソースの中に、呼び出しクラスを定義したxml ファイルがあるのですぐに見つかった。クラス名からソースを探し、パラメータを調べる。ソースのバージョンとクラスのそれが違っていたが、幸いなことに引数は変わっていないようだ。

 『第1 分隊』谷少尉が報告した。『2 体のDZを四肢拘束。残りの2 体はすぐ後ろから追ってきます。CCV まで3 分』

 「グレイベア。交差攻撃準備。タイミングを合わせろ」

 『了解』

 「くそ」サンキストが呻いた。「RZの群れを11 時方向、40 メートル先に発見。20 体から25 体。分隊長、そちらの進路と交差します」

 「アックス、12.7mm に換装、制圧射撃」臼井大尉が命じた。「ビーンたちの移動を援護しろ」

 「了解」

 「DZが接近中」サンキストが告げた。「1 体が先行して距離20 メートル。さらに接近中」

 ぼくは思わず外部モニタを見上げた。全身ボロボロになった衣服をまとったZが、世の中全てに対する強烈な怒りで顔を歪め、大きく開いた口から唾液をまき散らしながら、両手を振り回して疾走してくる映像が映っていた。疾走といっても、効率的なフォームではないので、普通に走れば小学生低学年の女子でも引き離せるぐらいのスピードなのだが、D 型のZがもたらす恐怖は理屈では排除できない。大抵の一般市民は相対すれば足がすくんでしまうだろう。

 『すいません』柿本少尉の冷静な声が届いた。『ちょっとそっちの左側でドタバタします』

 ドタバタというのは控えめな表現だった。次の瞬間、車体がぐらっと揺れるほどの勢いで、何かが指揮車両の左側に衝突した。おそらく突進してきたD 型に第2 分隊のバンド隊員が追いつき、何かをしているのだろう。ぼくは膝に載せていたノートPC を床に落としそうになり、危ないところでキャッチした。

 『今、四肢拘束しているところです。お騒がせして申しわけない。すぐに終わりますから』

 思わず頬が緩んだが、目下の状況を思い出して気を引き締めた。とにかく、ドローンが正しくコントロールできるようにしなければ。D 型はまだ1 体残っている。

 ドローンの発進とか、飛行モードの切り替えなどは、それぞれのリスナーによって呼び出されるメソッドで実行されているようだ。これらのリスナーを直接キックしてやれば、手動で操作しなくてもドローンの操作ができる。テストクラスを作って試してみたが、リスナーを直接キックしても動作しないことがわかった。セキュリティ上の制限なのか、オペレータインターフェース経由によってしかリスナーはキックされないのだ。

 「仕方ないか......」

 ぼくはいくつかのソースから切り貼りして、新しいクラスを作成した。DummyFlyBoy と名付けたそのクラスは、インスタンスが作成されると同時に、哨戒モードで発進→1 秒後に自動追尾モードに変更という処理を行うようになっている。xml の定義をDummyFlyBoy に書き換え、試しに単体で実行してみた。ドローンが飛び立つCGが表示され、すぐに消える。ログを確認してみると、意図した通りに、1秒後に飛行モード切替が実行されていた。Method not yet implemented の例外も再現されている。

 指揮車両の屋根の上からは、パパパパパと先ほどよりも大きな発砲音が聞こえていた。この作戦で使用する銃器は、全てサプレッサーが装備されているそうだが、減音効果がやや低いところを見ると、かなり大口径の弾を使用しているのだろう。

 「アックス、射撃中止」臼井大尉がモニタを見ながら鋭く命じた。「ビーン、通常走行で道路を渡れ。第2 分隊、3時方向から第1 分隊が接近するから撃つなよ」

 『第2 分隊、了解』

 「第2 分隊、そのまま残りのDZを引き連れて、7 時方向へ抜けていけ。第1 分隊はCCV を逆時計回りに迂回して、DZを側面から攻撃」

 『了解』『了解』

 2 人の分隊長からの応答は、ほぼ同時で即時だった。臼井大尉からの命令を予測していたかのように。いや、きっと予測していたのだろう。少しばかりうらやましい。一度でいいから、こんな風に息のあった開発チームと仕事をしてみたかった。

 自動テストの第2 段階は、テストプログラムの作成だ。異なるバージョンになっている119 個のクラスについて、前バージョン、最新バージョンを順に切り替えて実行していくだけだ。例外が出ずに、飛行モードが正常に変更された組み合わせがビンゴだ。

 「アックス」臼井大尉が短く命じている。「3 時方向、5 時方向を掃射しろ」

 島崎さんが何か言いたそうに立ち上がったが、胡桃沢さんがその肩をつかんで引き戻した。ぼくに進捗を確認したかったのだろう。

 キーを叩いてテストプログラムを走らせた。CG のドローンが飛び立ってはすぐに消失する、その表示ウィンドウが連続して開いては消えていく。全ての組み合わせの実行が完了したとき、ウィンドウが1 つだけ残っていた。ぼくはすぐにドローンのステータスを確認した。自動追尾モードに変更されていた。追尾すべき目標を設定していないから、円形の飛行ルートのままだが、モードは確かに切り替わっている。

 「突き止めました」ぼくは胡桃沢さんに言った。「xml の書き換えだけでいけると思います。このxml は起動時読み込みではないので」

 「そうか、よし」胡桃沢さんはすぐにコンソールに向き直った。「xml ファイルを、/var の直下にコピーしろ。こっちから取りに行く」

 「修正できたのか?」臼井大尉が振り向いた。

 「あと1 分、待ってください」胡桃沢さんは顔も上げずに答えた。「設定、変えます。ドローンのコントロールを、マニュアルに戻しておいてください」

 「わかった」サンキストが答えた。

 「......よし、いいですよ。トラッキングモードに変えてから、オートに切り替えてください」

 10 秒ほどの沈黙の後、サンキストは嬉しそうな声を上げた。

 「オーライ、切り替わった。DZにセットする」

 ドローンからの空撮映像が切り替わった。第2 分隊を追いかけていくD 型を後方上空から追尾している。それを確認した臼井大尉が、分隊長たちに呼びかけた。

 「そっちでも見えてるか?」

 『はい、確認できました』

 『こちらも同様です』

 「よし、後は分隊長の判断でDZを排除しろ」臼井大尉はそう命令すると、一息ついてぼくを見た。「ありがとう。助かった」

 島崎さんが、わざわざ席を立って来ると、親しみのこもった笑顔でぼくの腕をポンと叩いて自分の席に戻っていった。胡桃沢さんも小さく頷いてモニタに向き直る。小清水大佐と朝松監視官も、それぞれ安堵の表情を見せていた。

 ボリスはフンと鼻を鳴らすと、何も言わずに自席に座った。その面白くなさそうな横顔を見て、ぼくは先ほど感じた疑念を思い出した。島崎さんに話してみようか、と思ったが、指揮車両の中では内緒話などできるスペースがない。

 「引き続き、Z探知の方を頼む」臼井大尉はそう言うと、前に向き直った。「よし、前進しろ。ここを離れる。アックス、降りてきて分隊に戻れ。サンキスト、DZが片付いたら、ドローンを哨戒モードに戻せ。両分隊から連絡があったら適切な合流地点をピックアップして......」

 ぼくがモニタに視線を戻したとき、誰かが横に立った。島崎さんか、と思って顔を上げると、ボリスが立って見下ろしていた。

 「今の修正内容について報告書を書いておけ。書式はそのノートに入ってる。書けたら胡桃沢さんの承認をもらっておけ」

 報告書を書くべきなのは、あんたの方じゃないのか、と言いたくなったが、ぼくは黙って頷いた。すると胡桃沢さんが声を上げた。

 「おい、ボリスさん。訊きたいことがある」

 「何ですか?」

 「今朝のリビジョンアップは何のために行ったんだ?」

 「決まってるじゃないですか。最新バージョンの更新ですよ」

 「現実的にはデグレしたわけだな」胡桃沢さんは低い声で言った。「他に問題はないのか?」

 「ないと思いますよ」

 「本当にリビジョンアップのためだけか?」

 「どういう意味でしょう?」

 「意図的にこういう問題を起こしてるんじゃないのか」

 ボリスはハハハとわざとらしい笑いを上げた。

 「何のためにそんなことをする必要があるんですか」

 「うちのプログラマ班の間で、ずっと囁かれているウワサがある。ソリストは実は完成などしていない、というウワサだ。すでに3 回も納期を延長してもらっているが、それでもなお、完成までほど遠い」

 「バカバカしい」

 「だから」胡桃沢さんはぼくの方を見て続けた。「わざと問題を発生させて、唯一のプログラマである彼に修正させる。次に問題が発覚したとき、彼の修正がまずかったからだ、と主張して責任を回避するためだ。違うか?」

 「バカバカしい」ボリスは繰り返した。「考えてみてください。うちは、プログラマの同行に反対したんですよ」

 確かに、ボリスが、ぼくの同行など不要だ、と主張していたことを思い出した。だが胡桃沢さんは納得しなかった。

 「それだって計画の一部なのかもしれない。おたくが反対したにもかかわらず、JSPKF が強引にプログラマを同行させた、と言うために」

 ボリスは無表情に胡桃沢さんを見返した。

 「妄想もいい加減にしてもらえないですかね。うちがプログラマの同行に反対したのは、その必要がないと考えたからですよ」

 「胡桃沢さん」島崎さんが胡桃沢さんの腕を掴んだ。「言い過ぎだと思いますよ」

 「実際には」胡桃沢さんは構わず続けた。「彼のサポートが必要になったわけだな。おたくの判断は間違っていたということになる。なのに、これ以上、問題がないという言葉を信じろと言われても納得はできん」

 気がつくと、サンキストを除く全員が2 人のやり取りに注目していた。ボリスの額に汗が流れたのは、暑さのせいではないだろう。すまし顔は崩さなかったが、少し血の気が引いたようだ。

 「......じゃあ、言い直しましょう」努めて冷静な口調でボリスは、胡桃沢さんにというより、全員に向かって言った。「確かに、いくつかの問題が発生し、その解決にそこのプログラマくんが寄与したのは事実です。私がプログラマの同行が不要だと判断したのは、間違いだったのかもしれません」

 「しかし?」胡桃沢さんが揶揄するように言った。

 「しかし」ボリスは構わず続けた。「その責を我が社のみに負わせるのはどうでしょうか?ソリスト・システムを受注したのは我が社ですが、実際の作業を行ったのは佐分利さんですよ。品質を担保すべきなのは、そちらだと言えるんじゃないですか」

 「ミスター・ボリス」臼井大尉が口を挟んだ。「その言葉が、書類上でしか意味を持たないことは、ここにいる全員が知っている。形式的には佐分利さんが実作業を行ったことになっているが、実際にはハウンドの指示に従っただけだ。JSPKF としては、納入されるシステムのクオリティさえ保たれていれば、そのような些事に拘泥するつもりはない。だが、初日からこの有様では、場合によっては問題にしなければならなくなるぞ」

 「では、法廷で」意外にもボリスはニヤリと笑った。「そういうことでしょうか?ここで引き返しますか?」

 「いやいや、待て待て」慌てて介入したのは小清水大佐だった。「そう、事を荒立てるものではない。幸い、まだ重大な不具合は発生していない。これで打ち止めになるかもしれないから、もう少し様子を見てはどうかね。マーカーもまだテストしておらんしな」

 「通信途絶やZ判定ができない、というのは充分に重大な不具合だと思いますが」

 「そう言わずに、せめてみなとみらいまで行こうじゃないか」小清水大佐は懇願するように言った。「ベースキャンプで落ち着いたら、ゆっくり対策を相談すればいい」

 臼井大尉は固そうな顎を太い指でつまんで考えていたが、やがてゆっくり頷いた。

 「そうですな。胡桃沢さん、どうです?」

 「さっき言ったような」胡桃沢さんは親指でボリスを指した。「ソリストが、実は未完成である、というウワサを、ボリスさんが明確に否定してくれるなら同意します」

 「ミスター・ボリス?」

 「もちろん否定します。神かけて。聖書があれば片手を載せて宣誓してもいいですよ」

 胡桃沢さんは、まだ疑わしそうな顔をしていたが、渋々同意した。ボリスは、フンと鼻を鳴らすと、自分の席に戻っていった。

 表面上は平和が戻ってきたが、微かな不協和音は残った。開閉するたびに小さくきしむドアのように。忘れることはできないが、無視することはできる程度の不快感だ。普段の生活であれば日々の雑事や、慣習や礼儀といった社会的ルールに埋もれていってしまうのだろうが、今は小さなミスが生死を左右しかねない危険な環境にいる。対立を曖昧なままにしておくべきではなかったのではないか。これが、いつか、新たな問題の引き金になるのではないだろうか。そんな不安は、ぼくの頭から離れようとしなかった。

(続)

Comment(12)

コメント

typo

>島崎さんが、わざわざ席を立って来ると、親しみのこもっと笑顔で

>島崎さんが、わざわざ席を立って来ると、親しみのこもった笑顔で

Nos

>自動テストの第2 段階は、テストプログラムの作成だ。異なるバージョンになっている119 個のクラスについて、前バージョン、最新バージョンを順に切り替えて実行していくだけだ。

これって最悪O(2^n)かかりますよね。試す価値はあったのかもしれないですけど、よくうまくいきましたね。博打だったのか、それとも「たかだか一クラスのバージョンを切り替えれば良い」みたいな事前情報があったのでしょうか。

キラ

>データセンターに隕石

なんど同じことを思ったことか...

> 「それだって計画の一部なのかもしれない。おたくの反対したにもかかわらず、

> 「それだって計画の一部なのかもしれない。おたくが反対したにもかかわらず、

あーやだやだ。
Zがすぐそばにいるのに、よくこんな政治的なやりとりができるもんだ。

tako

タイプミス発見です > それを確認したた臼井大尉


結局ソリストの完成とはどんな状態なのか、まだまだ蛇も虎も出そうですね。

Foo

>さ さん

だがしかし、Zとのバトルシーンより、
こういう政治的抗争の方が見ていて面白いと感じてしまうあたりは、
この作者さんの面目躍如。

今回のストーリーだと、リアルに生命の危機が起こりうる設定だから、
この辺で生まれた軋轢を機に、
土壇場で嫌いな相手を「全力で見逃す」か否かの葛藤なんかも起こりそうな予感。

Y

先週「高慢と偏見」から読み始めて、ようやく追いつきました。
 次の月曜8時が待ち遠しいです。

 これまでのお話は主人公の主張はそれほど強くなく、他の登場人物が意見発信や解決策を提示することが多いように感じ(主人公の立場や家庭環境上、捨て鉢な意見を出しにくい背景が設定されているため)、
「(主義主張を含めた)立場」全体に共感や理解を深め(疑問や反発も感じて)、プロジェクトマネジメントやエンジニアを取り巻く問題点について考えさせられていました。

 今回のお話は、主人公が主体的となって意見したり問題解決に向かったりしていて、キャラクターに感情移入していきやすいですね。
 もちろん、主人公が、東海林さんのように無双してしまうと読み物としては興醒めしてしまうのですが、今回は舞台が舞台なので、対Z戦闘、ハウンド・JSPKF間の駆け引きなど主人公の範疇外のフィールドが絡まり合うと、主人公だけにスポットが当たらず、良いバランスになりそうで楽しみです。

typoさん、ささん、takoさん、ご指摘ありがとうございます。
今回はミス多めですいません。

おっさん

原文
 「もちろん否定します。神かけて。聖書があれば片手を載せて宣誓してもいいですよ」

上記の部分について
 「もちろん否定します。神にかけて。

のtypoと愚考します。

精霊

>>おっさんさん
ボリスさんはヒスパニックだし、そこまで気にしなくてもいいのでは?

おっさんさん、どうも。
正確には「神にかけて」とか「神に誓って」なんでしょうが、
「神かけて」という言い方も間違いではないようなので、このままにしておきます。

1話
>ぼくのポケットの中でスマートフォンがブブッと振動したので驚いた。出してみるとWi-Fiチェッカーが反応している。近くのWi-Fiスポットを検知すると知らせてくれるアプリだ。

3話
>これは公表されていないことなんですが、ごくたまに、みなとみらい地区からと思われるアクセスが、YahooやGoogle にあるようなんです。

9話
>言っただろ、お守りみたいなのものだって

>あたしが預かっておく

14話
>隊員たちは外で凝固する。炎天下の中で1 時間。誰か1人がZに発見されても、場合によっては見殺しにしなければならん。

16話
>そう言わずに、せめてみなとみらいまで行こうじゃないか

ブラウンアイズが、Zに囲まれた状態で、Wi-Fiチェッカーが反応したら、、どう責任を取るつもりなのでしょう>主人公
※最近、現場ルールを破られ、対応に追われた者より

コメントを投稿する