夜の翼 (23) 青いまま枯れてゆく
私は彼らが死んでいくのを聞いていた。
『リドリー、チェンを援護しろ』
『おい、誰か、マガジン残ってないか』
『タンゴ3 からシックスへ、応答願います』
『魚面が10 時の方向に8、いや9 ......』
『バカ、そっちは行き止まりだ、戻れ』
『4 時方向、4 時方向だ』
『ランチャーよこせ。フレシェット弾、どうなってる』
『第3 分隊、合流しろ』
『リローディング』
『くそ、今日はカレーだったのに』
『いかん、26 と47 の応答が途絶えた』
『目だ、目を......』
『正面から見るとやられるぞ』
『......そうだ、そっちから投げろ』
『第2 分隊、おい、誰かいないのか、誰もいないのかよ』
『いーあ、いーあ、ふんぐる......(銃声)』
『コントロール、周辺情報が入ってこないぞ』
『構わないから撃て、撃てったら』
『ちくしょう、ちくしょう』
『立て』
『まずい一人だ、オレは一人にはならないって決めてたのに、ホラー映画でも単独行動を取ってる奴から死んでいく、誰かいないか、死ぬときは女に抱かれてベッドの中って決めてるんだ、おい、誰かいないのか、一人にしないでくれ』
『弾薬が切れた』
『ダン、てめえ、勝手に死ぬんじゃねえ、ぶっ殺すぞ』
『頭が......割れそうに痛い』
『増援はまだか、まだ来ないのか』
『援護しろ、助けに行く』
『フレシェット弾って、手投げしたらダメか』
『誰か、誰か分隊長を見なかったか』
『射界切れてる、2 歩右にずれろ』
『結局誰が犯人だったんだ』
『深海の大いなる支配者がオレを呼んでやがる』
ソード・フォース隊員たちは、持てる戦闘力を惜しみなく吐き出して死闘を続けていたが、通常兵器の効かないディープワンズによって分断され、少しずつ沈黙していった。ソード・フォースの戦術は、ロジックで奉仕種族に対抗することを主眼にしている。その手段を奪われた今、彼らは、その能力を完全に発揮することができないまま、無念のリタイアを余儀なくされていた。インスマウス人に対しては互角以上の戦いをしていたが、武器弾薬の補給を受けられない状態が続いているため、制圧射撃など効果的な攻撃に踏み切れないでいる。ソード・フォース横浜分室と、ATP 横浜ディレクトレートからの補給部隊は至近距離まで到着しているのだが、戦闘が激しすぎて接近できないのだ。それに、戦闘部隊と合流できたとしても、あまり意味がない。補給部隊が運んできた装備の大半は、ランチャーとフレシェット弾だ。今、各小隊が喉から手が出るぐらい欲しがっているのは、100 丁のランチャーより、人数分のアサルトライフルと銃弾だ。
私たちも手をこまねいていたわけではない。横浜ディレクトレートの分析部は、そのリソースの大部分を費やして、ディープワンズがやっている「プログラミング」の実行ルートを突き止めていた。予想通り、それは、ATP の防壁構築と同じインフラを通っていた。分析部の推測では、ディープワンズたちが待っていたのは、今夜の月の位置だった。地球と月との重力関係が重要な要素になっているらしい。スターウィズ教信者たちの合唱は、最適な時間になるまで、ATP の防壁構築や奉仕種族対応をストップさせておくためだ。どうやら一種のデータ容量のような制限が存在し、ディープワンズたちが組み上げた忌まわしいプログラムをデプロイする際、ATP のロジックによって帯域が占有されないようにするためではないか、という話だ。
「その敵のデプロイチャネルはわかっているのか」
『解析できた、と思います』サナエは答えた。『ただし、厳重なプロテクトがかかっています。プロテクトというより、暗号化のようなものですが』
「https か。それを遮断してしまえばいいのか?」
『そういうわけにはいきません。そのチャネルはVPN のようなもので、ATP が使うチャネルと混在しているんです。遮断してしまえば、防壁がまた落ちてしまいます』
「じゃあ、どうするんだ」
『言ったでしょう。プログラミングで対抗するしかありません』
「美しいプログラムか。意味がよくわからないんだが」
『時間がないから簡単に説明します。敵がランチャーやドローンを使用不能にしてるのは、RR(現実度)の高いプログラムによって現実を否定しているわけです』
たとえばランチャーのトリガー部分は、大小合わせて11 個のクロムモリブデン鋼パーツで構成されており、その強度や硬度、腐食耐性は、突き詰めていけば分子構造で決まる。クロムモリブデン鋼は優れた合金素材であり、通常の温度や湿度、気圧の元で使用するのであれば、長期間にわたって腐食するようなことはない。
『あえて擬人化するなら』サナエは早口で続けた。『パーツの分子構造くんが、この世界の物理法則に対して、これぐらいの湿度なら強度と硬度を維持する、と決めているようなものです。それがすなわち、ランチャーのトリガーパーツにとっての現実ですね』
ディープワンズは、もう一つの現実をプログラミングし、トリガーパーツに対して提示している。それは、恐ろしいまでに精緻を極めたロジックだ。そのため、トリガーパーツは、ディープワンズが差し出した現実に飛びついてしまった。その結果、現在の重力、気圧、気温、湿度が腐食耐性値を超えている、と判断しているのだ。
従って、我々が対抗するには、それを上回るプログラムによって、再度、トリガーパーツにとっての現実を上書きしてやるしかない。ディープワンズが実行しているプログラムを阻害するのだ。幸いなことに、ここは我々のホームグラウンドなので、ディープワンズがおそらく何年もかけてきた構築作業を真似る必要はない。使えるライブラリもある。
「そんなライブラリは見たことがないぞ」
『普段のオペレーションでは使ったことがないでしょうが、防壁構築のベースライブラリ群に含まれているんです。かなり低レベルのロジックなので、おそらくほとんどのPO は意識したこともないはずです』
「まあいい」私はため息をついた。「じゃあ、PO 課の全セクションのPO を動員して......」
『ダメです』サナエは遮った。『こっちのPO は使えません』
「は?」
『ほとんどのPO は防壁の構築とチェックでフル稼働しています。防壁が一時的に機能停止していたことで、関東圏だけで43 カ所で、早速、侵入の試みが検知されているんです。それに、この作業にはPO の目視観測が必須です。今、うちのドローンは全滅で、映像も画像も得られないんです。横浜ディレクトレートに、そっちの映像は来ていません』
「ソード・フォースの個人カメラから入ってくるだろう」
『彼らに目視観測情報が得られるまで、ディープワンズにカメラを向けていろと命令するつもりですか。こんな状況で? ディープワンズが素直にポーズを取ってくれるとでも? いっそ、インスマウス人に自撮り棒でもプレゼントして、親玉と一緒の撮影を依頼した方が、まだ現実的な......』
「わかったわかった」私は慌てて手を振った。「学校のセキュリティシステムの防犯カメラはどうだ? これなら、そっちからアクセスできるだろう。カズトが侵入したんだからな」
『もう試してみました。カメラは全滅です。インスマウス人たちが銃撃したんです』
「じゃあ、うちの、セクションD のPO しかないのか。でも、プログラミングするためには、ディープワンズを目視しなければならんとなると状況は同じだ。まさか、子供たちに校門から出て、ディープワンズを見てこい、とは言えない」
『校門から出る必要はないじゃないですか。ディープワンズは、なぜか校内に入ってこようとしていません。校門やブロック塀、フェンス部分など、必要なら簡単に突破できるにもかかわらずです。フェンス越しに目視観測を行えばいいんです。セキュリティサービスのおかげで、その学校の周囲は夜でも照明が点いています。足りなければ、オペ車には、照明弾も積んであるでしょう。それにカメラを通してではなく、PO が肉眼で目視観測すれば、より正確な情報が得られます。時間がないので、オペレーションを開始してください。必要なライブラリ情報は送信済みです』
「......わかった」
意志を確認すべく、話を聞いていたPO たちを振り向いたが、質問を発する前に全員が親指を立てて頷いた。私は第1 分隊を呼び出し、オペレーション車両に来るように命じたが、ホレイショーは難色を示した。
『いつディープワンズやインスマウス人が攻撃してくるかもしれないのに、子供を最前線に連れていくのか』
「もともと、サクラギ8A はPO が同行するオペレーションだったはずだ。あんたは、危険はないと言ったじゃないか」
『ちゃんと訓練を終えていたらの話だ』ホレイショーは指摘した。『そこの坊やは、やるはずだった訓練をすっぽかした。まあ、だからこんな事態になってるわけだが。まあいい、誰を連れて行くんだ』
「ぼくが行きます」シュンが申し出た。「ホレイショーさんの言った通り、こんなことになってるのは、ぼくのせいだから」
その勇気には感服したが、私は首を横に振った。
「これはもう、誰のせいとか、そんな問題じゃない。それに通常のオペレーションと違って、ゆっくり目視観測を行っている時間はない。君はまだ経験が浅い」
シュンはうなだれた。気持ちはわかるが、シュンを行かせるつもりはなかった。輝くトラペゾヘドロンの起動パラメータであるシュンを、敵に近づけて無用に刺激したくはない。アーカムのインフラが再起動したことで、オペレーション車両で結界ロジックも再稼働している。ディープワンズたちが、校内に侵入してこないのは、そのためかもしれないのだ。
「ぼくが行くよ、チーフ」ハルが手を挙げた。「目視観測スキルは一番上だから。それに、中学までは陸上部だったから、いざってときには逃げ帰ってくる」
その申し出は、私の思惑と一致していた。
「ハルを行かせる」私はホレイショーに言った。「5 分後にオペ車の外でピックアップしてくれ」
『了解だ。走ってもらうことになる。軽く準備運動をしておいてくれよ』
ハルはヘッドセットを外して立ち上がると、下半身の筋肉をほぐすように、軽い柔軟体操を開始した。他のPO はモニタに向き直ったが、リンだけはハルに呼びかけた。
「ハル、絶対無事に戻ってくんのよ」
「おい、やめてくれよ」ハルはアキレス腱を伸ばしながら苦笑した。「そういうのフラグだ」
リンは、そっか、と笑って、舌をペロリと出した。他のPO たちもクスクス笑っている。
私は内心の思いを隠してPO たちと一緒になって笑った。ハルの身の安全は心配してもできることはないし、ソード・フォースに任せておけば、たとえ自分たちの命に替えてもハルを守ってくれるだろうと信じている。私の心中に蠢いているのは別の懸念だった。
◇ ◇ ◇ ◇ ◇
第1 小隊(の生き残り)に護衛され、ハルは正門から100 メートルほど離れた場所に到着した。アウトドアチェアに腰を落ち着け、膝の上にオペレーション端末を乗せている。目の前はフェンスだが、外周部には目隠し用の植栽が並んでいて、外部から目視することは難しいだろう。
ハルはソード・フォースの装備から暗視ゴーグルを借り、植栽の隙間からディープワンズを目視し、パラメータを端末に入力していった。光量が豊かではないことと、ハル自身の緊張もあってか、最初の数分は、意味をなさないパラメータばかりだったが、やがて有効なデータが入ってくるようになっていた。
だが、問題は「美しいプログラム」にあった。通常のオペレーションでPO が使うライブラリは、長い時間をかけて洗練されているが、低レベルのライブラリとなると、そうはいかない。高レベルのロジックで隠蔽されていないライブラリは、構造こそ単純になっているものの、冗長なコーディングになっているし、変数名も意味不明だ。コメントも多いとは言えない。
私がプログラマとしてのキャリアをJava でスタートした頃、適切なオープンソースライブラリがなかったり、使用が許されていなかった場合などは、java.io パッケージのInputStream や、Socket などのクラスを直接使用したビジネスロジックを書いたものだ。車輪の再発明をせざるを得なかった場合も多いが、その分、深い言語構造を知ることができたように思える。ATP のPO たちは、そんな苦労とは無縁だ。オペレーションの性質上、既存の部品を最適な形で組み合わせるスキルが要求されるからだ。
シュンとリンのペアが、最初に組み上げたロジックは、規約違反が多すぎてデプロイ時点で弾かれてしまった。少し遅れてカズトとマイカが構築したロジックも同じ結果だった。
「焦らなくていい」私は自分自身の焦燥を隠して言った。「まずは正確に、それからコードを磨き上げるんだ」
次に完成したロジックは、デプロイは無事に完了したが、効果が出なかった。その次も同様だ。規約の成立条件は満たしていたが、ディープンワンズが展開した局地的な現実を中和するだけの説得力を持たなかったためだ。
やはりこうなったか。私は自分の懸念が的中したことを呪った。セクションD のPO たちは、みな優秀で、飲み込みも早い。私が過去に関わった、大抵のプログラマたちと比べても遜色ないだろう。ただ、どんなスキルでも、習熟するための時間は必要だ。PO たちは、オペレーションでなら「美しいプログラム」を書いているだろうが、低レベルのライブラリを使ったロジックを一からコーディングする訓練は受けていない。
私が切歯扼腕している間にも、ソード・フォース隊員たちは学校の外で戦い続けていた。分断されていた小隊のいくつかが、数人の犠牲を払いながらも何とか合流し、少ない火力を結集させることで校門へ到達しようとしている。何人かは使用不能になったランチャーから、対抗ロジックロード済みのフレシェット弾を取り出し、素手でディープワンズに投擲していたが、やはり効果はなかった。対抗ロジックは個体ごとに差違が生じる。1 個のフレシェット弾にロードされているロジックは、学校の外をうろつき回っているディープワンズの、どれか一体にのみ効果を発揮するのだ。
「やっぱり防衛本部からベテランのPO を連れてくるわけにはいかないですかね」サチが囁いた。「でなければ、コーディングだけでもアドバイスをもらうとか」
「今からでは時間がかかり過ぎるし、そもそも手が空いてないだろうな」私は囁き返した。「それに、ベテランといっても、コーディングレベルでの差は、この子たちと大差ないよ。普段、使うことがないライブラリだからな。どちらかといえば、今、必要なのはコードレビューのスキルなんだが、それはレビュー側が充分な知識を持っていなきゃならんから」
「そうですね」サチは頷いた。「質問するだけでも、こっちの考えが整理されて、案外、自己解決したりすることもあるので、もしかしたら、と思ったんですが、質問する相手がいませんよね。すみません」
「いや、確かにそれは......」
私は言葉を切った。質問するだけでも、自己解決することがある......質問する相手がいない......
「そうか」私は呟いた。「誰かに教えてもらえばいいのか」
「え?」
驚くサチには答えず、私はパンと手を叩いた。
「全員、手を止めろ」
PO たちは驚いて私の顔を見た。
「何?」リンが怪訝そうに言った。
「リン、マイカ、シュン」私は指示した。「今、やってるロジックから、ATP のライブラリに特化した部分を除外して、一般レベルのコーディングに落とし込んだソースを作ってくれ」
PO たちは顔を見合わせた。
「えーと」マイカが心配そうな顔を向けてきた。「一般レベルって?」
「普通のシステム開発でやってそうなコーディングだ。そうだな、経理システムを作ってるって設定にでもするか。ATP のライブラリに依存する部分は、適当な名前のライブラリに変えよう。引数と返値が一致してればいい」
「意味がよくわからないんですけど」
「カズト」私は構わず続けた。「IT 系のQA サイトで、コーディングスタイルを議論してるスレッドを探せ。今現在で、議論が続いてるところだ」
「えー、なんでそんなこと......」
そう言いかけたカズトの言葉を、シュンが遮った。
「あ、わかったかも。プロに添削してもらうってことですか」
「そうだ」私は頷いた。「ネット上には、そういう親切な人がたくさんいる。皮肉な意味じゃなくてな。こんなコーディングをしたら、先輩にきれいじゃないとダメ出しされた、どうすればいいでしょうか? こんな感じの質問をすれば、誰かがコーディングをチューニングしてくれる」
「おもしろそう」リンがニヤッと笑った。「よし、やるよ」
「うまくそういうスレがあるかなあ」カズトがネットに繋がるノートPC を引き寄せながら言った。
「なければ、新しくスレッドを作ればいい。あまりたくさんのサイトに書き込んでもフォローが大変だから、teratail.com とstackoverflow.com ぐらいでいい。Python3 系だぞ」
PO たちは相談しながら忙しく指を動かし始めた。その間、サチが投稿する文面をでっち上げた。これは意外に難しい。未熟さをアピールしすぎると「ググれカス」で終わってしまう。一方で経験がありすぎるように思われると、宗教戦争を仕掛けているのかと受け取られ、誰の得にもならない方向に進んでしまう可能性がある。私たちが望んでいるのは、コーディングスタイルで議論がヒートアップすることなのだ。
「経理システム作成プロジェクトに参加している入社2 年目のプログラマです」サチは入力した文章を読み上げた。「基幹システムとの連携ロジックを書いたところ、先輩から美しくない、と突っ返されました。どのように修正すればいいのか、ご教示願えればと思います」
「悪くないんだが」私は腕を組んだ。「このままだと、教える方も、どこがポイントなのかわからないな。あと、もう少し、緊急性を訴えた方がいいな」
「なるほど」
「チーフ」カズトがノートPC を見せた。「teratail の方は適当なのがいくつかあったけど、stackoverflow は動いてるのが見当たらなかった」
「そうか、じゃあstackoverflow の方は諦めて......いや、待て」私はカズトの顔を見た。「Java だったらどうだ」
「投稿するサンプルできた」リンが言った。「単純なストリームの入出力にまとめてみたんだけど」
「どれ......うん、いいな。だけどもう少し素人感が欲しいな。with ブロック使うのをやめよう」
「チーフ、Java ならいくつかあるよ」
「ありがとう。オペレータ」私はヘッドセットに呼びかけた。「セクションM を呼んでくれ」
諸見里はすぐに応答した。
『何ですか』
「協力してもらいたい」
私は依頼内容を簡潔に説明した。現在の状況は全てのセクションに共有されているので、面倒な背景説明を省略できるのは助かる。
『つまり私たちにJava のサンプルソースを書けと言ってるんですね』諸見里はまとめた。『そっちの子たちが書いたPython のソースを元に』
「そういうことです」
『ふん、まあいいでしょう。幸い、手が空いているPO がいます』
「助かります。サンプルソースはすぐに送ります」
通信を切った私は、リンに訊いた。
「できたか」
「だいたい」
「セクションM に送ってくれ。もしかしたら、向こうのPO が質問してくるかもしれん。そのときは対応してくれ」
「あのバ......オバさんね。あたしたちのこと、頭からバカにしてる人よね」
「いいから協力しろ」私はサチに向き直った。「stackoverflow 用に、内容をちょっと変えた文面を作ってくれ。そっちは英語で」
「英語ですか」サチは頷くとキーを叩き始めた。「スワヒリ語の方が得意なんですけどね」
「じゃ、今度、教えてよ、先生」カズトがニヤニヤしながら言った。「stackoverflow で、かなりアクティブに動いてるスレを見つけた。なんかstream 文がどうとか、かなりやり合ってる」
「よし、そこで行こう。Java 版のサンプルと投稿文ができたら、すぐに投稿しろ。Python の方、いくぞ。ドライバの2 人は、良さそうな構文が投稿されたら、片っ端から対抗ロジックに適応するんだ」
カズトがteratail に投稿した。
・横から失礼します。経理システム作成プロジェクトに参加している入社2 年目のプログラマです。基幹システムとの連携ロジックを書いたところ、先輩から美しくない、と突っ返されました。自分では充分、きれいな書き方だと思うのですが。先輩は社内でも完璧主義で通っている人です。明日の朝、コードレビューが開かれ、それまでに修正しなければなりません。どのように修正すればいいのか、ご教授願えればと思います。ソースは以下の通りです......
最初の反応は3 分後に現れた。
> そういうときは「ご教授」ではなく「ご教示」ではないでしょうか。それはともかく、確かに少し冗長な部分があるようです。たとえば12 行めからのエンコードチェック部分ですが、open 文でencoding 引数をつけるべきではないかと......
続いて、コメントがいくつか連続してついた。
> with 使いましょうよ。それだけでグッとプロっぽくなります。
> きっとその先輩は、あなたを鍛えるために、突っ返したのではないかと思います。こういうところで安易に回答を求めることは、その信頼を裏切ることになるのでは。
>> そういう駄レスは時間のムダだからやめましょうよ。
> 個人的にはfor をrange 文で回すのは好きくない。
> None 判定を14 行めでしてるのに、そのすぐ下でまたやっていますね。
> ブール型を返すメソッドなら、isHoge() とかにした方がいいですね。
>> うちの会社だと、is何とかはダメって人がいます。
>>> え、なんで? 宗教的な理由か何かあんの?
> if 文が複雑すぎると思います。or とand をカッコでつなげて、びっくりマークも入れたりして一行で書けると、オレってすげえ、とか思うかもしれないけど、後から読む人のことを考えてないですよね。
> 変数を使い回すのやめようよ。
>> なんでいけないんですかね?
>>> ソース追っていくとき、今、何の値が入ってるのか混乱するからです。
> わざわざgetFloatValue() からの値をfa1 に入れてるのに、それを3 行後に計算で使ってるだけ。これなら、計算式の中に、直接getFloatValue() を入れた方がいいのでは。
>> 読みにくくなりませんか? 適度に変数を使った方が、デバッグのとき値を参照しやすくなります。
>> function を直接式の中で使用していいのは、それが適切な名前になっている場合だけですよ。
> 21 行で、ループを二重にしてるけど、インデントが広がりすぎて見づらいから、ここは別メソッドに切り出すことをお勧めします。
>> そうすると、continue とか使わなくてすみますね。
「思ったより反応が少ないな」私は呟いた。「どうだ、参考になりそうなのはあったか?」
「いくつか試してますけど」シュンが首を振った。「今ひとつ効果が薄いですね」
stackoverflow の方も、数分遅れて投稿されたが、こちらはさらに反応が鈍い。私は時計を見た。21 時10 分。日本では、まだ残業中のプログラマが大勢いる時間帯だが、たとえばロサンゼルスだと午前4 時だ。
「stackoverflow は放置しよう」私は決めた。「せっかく英文やJava 版のサンプルを作ってもらったが、あまり成果が見込めない」
「teratail の方も、もう少しコメント欲しいです」マイカが残念そうに言った。「やっぱり他人事だから?」
「そうだろうな。急ぎだって言っても、それはこっちの事情でしかないからな」
「あ、ちょっと」サチが指を鳴らした。「いいこと思いついた。カズトくん、ちょっとそのノート貸して」
サチはカズトからノートPC を受け取ると、少し考えてからキーを叩いた。
・みなさん、いろいろありがとうございます。今、もう一度、先輩に見てもらったんですが、まだまだこれではダメだと言われました。うちは女子社員は22 時過ぎると退社しないといけないので、もうすぐタイムリミットです。持ち帰りも厳禁されてるので。諦めて、明日のレビューで叱られることにします。
この投稿に対する反応は強烈だった。たちまち、大量のコメントが殺到することになったのだ。
(続)
この物語はフィクションです。実在する団体名、個人とは一切関係ありません。また、特定の技術や製品の優位性などを主張するものではありません。本文中に登場する技術や製品は実在しないことがあります。
コメント
匿名
女子には異様に優しくなるおっさんエンジニア達の脆弱性が...
YellowKnife
ディープワンズはエピシアーク並みに優秀ですね
ななし
タイミリミット→タイムリミット
匿名
サチがが指を→サチが指を
先輩が女性社員ということもあるよね
リーベルG
ななしさん、匿名さん、ご指摘ありがとうございます。
匿名D
懐かしい話ですねえ。
Javaの場合、Strutsのようなフレームワークが登場するまでは、
マルチバイトコードをやり取りするにあたっては、
エンコード&デコードは自前でやっていたものでした。
Tomcatなど、マイナーバージョン一つ違うだけで扱いが変わってしまったり。
Windows登場以前のBASICでは、ランダム値を返す関数なんか、
「0以上1未満」の数を返すだけでした。
それを必要な範囲にシフティング&スケーリングするのは
自分でコードを書かなきゃならなかったんですよねえ。
paraesta
銀の弾丸はあった
ウェルザ
客先に美人エンジニアを連れてった時の
相手担当者の態度が全然違って笑ったの思い出した
それまで出てた変な要求仕様が1回の打ち合わせでこっちが
やり易い様になって効果が凄かった
彼美人だけど男性なのに