0. init
メリー・クルシミマス。
世界中のカップルが愛を囁き合う聖なる夜、俺こと佐藤カケル(25歳・独身・彼女なし)は、薄暗いサーバールームで魂が抜けたような顔をしていた。
「カケル、手が止まってる。キーボードを叩く音は私の心拍数より早く、かつ正確に。言ったはずよ」
低い声が、冷たい室温の空気を切り裂く。
「西園寺先輩……。俺の予定では、千葉の山奥で『ソロプレイヤー集まれ!聖夜決戦サバゲー定例会』に参加して、BB弾をばら撒いていたはずだったんですが」
「甘えるな。BB弾の代わりにSQLを叩きなさい。……ほら、ログ見て」
モニターの青白い光に照らされたその女性は、西園寺レイ。
ボサボサの髪に、牛乳瓶の底のような分厚いメガネ。上はヨレヨレのパーカー、下はジャージ。これでも我が社が誇る最強のテックリードであり、俺の指導係だ。
現在時刻、12月24日 23時30分。
リリースしたばかりの基幹システムに致命的な不具合が発覚した。「特定の条件下でユーザーデータが消失する」という、エンジニアなら卒倒しかねないバグだ。
「先輩、これ……修復不可能です。バックアップからのリストアも、このデータ量じゃ数日かかります。ユーザーが目を覚ました頃には、阿鼻叫喚ですよ」
画面に並ぶ数字を見ているだけで、こっちの胃が消失しそうだ。
「諦めたらそこで試合終了よ。ってとある先生もそう言ってる」
「そのとある先生も、イブの夜にレガシーコードのデバッグはさせないと思います」
俺が深いため息をついた、その時だった。
この瞬間が、きっと俺の人生のタイムラインを分岐させるとは、まだ思いもしなかった。
1. git push -f
カタ、カタカタ、カタカタカタカタ――。
誰もいないはずのコンソール画面で、カーソルが勝手に動き出した。
「なっ……!?」
「外部からの侵入!? まさか、このタイミングでハッキング!?」
先輩が即座に反応する。メガネの奥の瞳が、さっきまでとは別物の鋭さを帯びた。
画面上のコードが、猛烈な勢いで書き換えられていく。その速度は人間のタイピング速度を遥かに超え、まるで初めからそこにコードが存在していたかのようにテキストが流れていく。
ふとログの片隅に、一瞬だけ見慣れないタイムスタンプがチラついた。
瞬きをした次の瞬間には消えていて、俺の見間違いなのかも分からない。
「カケル! 遮断するわよ! ナビゲーターお願い!」
「は、はい!」
先輩が自分の端末で防衛用のコマンドを打ち込み始める。俺はモニターに張り付き、敵の挙動を読み上げる。
「敵の侵入経路、特定できません! 踏み台サーバーのログも真っ白です! ログレベルいじられてるかも!」
「論理層で全遮断! とにかく全部止める! sudo ufw default deny...」
「ダメです先輩! 向こうのほうが速い! 先輩が打とうとしたコマンド、先回りして無効化されました!」
なんという反応速度。いや、反応ですらない。
まるで、俺たちが次に何をするかを知っているかのような動きだ。
「くっ……! 私の思考が筒抜けだって言うの!? なめないで!」
先輩の指が残像を生む。鬼の形相でエンターキーを叩く音は、もはや銃撃戦だ。
しかし、画面の支配率は徐々に敵へと傾いていく。
「やばい……CPU使用率が跳ね上がってます! 100%……いや、メトリクスの更新が追いついてません! 温度センサーもレッドゾーン!」
「止まりなさいよぉぉぉ!」
ブゥゥン……!
足元から、不穏な重低音が響き始めた。このサーバールームの老朽化した電源系統が、未知の過負荷に悲鳴を上げているのだ。
ラックのLEDが一斉に明滅し、まるでSOSをモールス信号で訴えているみたいだ。
焦げ臭い匂い。
サバゲーで培った俺の「危機察知センサー」が、脳内でけたたましく警報を鳴らす。
この音。この匂い。これは、グレネードが爆発する直前の気配だ。
違うのは、ここで吹き飛ぶのがペイント弾ではなく、会社の信頼と、俺たちのキャリアだということだけ。
「先輩、離れて!」
俺は反射的に床を蹴った。
椅子に座ったままの先輩に体当たりし、そのまま床へと押し倒す。
「ちょ、カケ――」
バヂィッ!!
直後、背後のサーバーラックから火花が散り、コンデンサの破裂する乾いた音が響いた。
舞い上がる粉塵。降り注ぐ火の粉。
俺はとっさに先輩の頭を抱え込み、背中でそれを受け止めた。
世界が一瞬、ホワイトノイズみたいに真っ白になる。
「……ッ、クリア!」
耳鳴りの中で、自分の声だけがやけに遠く聞こえた。
「カ、カケル……?」
数秒の静寂。
火災報知器は鳴っていない。小規模なショートで済んだようだ。
俺は恐る恐る顔を上げた。腕の中には、目を丸くして俺を見上げる先輩がいる。
至近距離。メガネがずれて、整った素顔が露わになっている。喉が、変な音を立てた。
――やっぱり、この人めちゃくちゃ美人なんだよな。
いつもはコードとログの向こう側にいる人間が、今は俺の腕の中にいる。
なんだこれ、現実味がない。さっきまでのコンソール画面よりSFじゃないか。
「怪我、ないですか?」
「え、ええ。あんたこそ……背中、大丈夫?」
一瞬だけ、先輩の指先が俺のスーツ越しの背中に触れる。
熱と、微妙な震えが伝わってきた。先輩もさっきのショートが、本気で怖かったのだろう。
「サバゲー装備なら無傷だったんですけどね。スーツだとちょっと熱いです」
わざと軽口を叩くと、先輩の肩の力がほんの少し抜けたように感じた。
俺たちは身体を起こし、まだ明滅を続けているモニターを見た。
システムはダウンしていない。それどころか、エラーログの奔流が止まり、静かな緑色の文字だけが表示されていた。
BUILD SUCCESS.
本来ならCIサーバーのダッシュボードでしか見ないはずの一行が、本番コンソールにぽつんと浮かんでいる。
2. git commit -m "[Hotfix] for our lives"
「……嘘でしょ。バグが、消えてる」
先輩が震える手でコードをスクロールする。
それは完璧な修正だった。スパゲッティのように絡まっていた依存関係が解消され、美しいアルゴリズムに置き換わっている。
だが、先輩はある一点で指を止めた。
「……何これ」
先輩が指差したのは、変数の定義部分だ。
// データの最大長を定義
const int maxLenght = 2048;
「Length じゃなくて、Lenght……?」
先輩が呆れたように、それでいてどこか安堵したように吹き出した。
「変数名のスペルミス。これ、あんたのいつもの手癖じゃない」
「あーっ! 本当だ! いやでも、俺あんな神速でコード書けませんよ!?」
否定しながらも、心のどこかで妙な納得があった。
完成度の高いロジックの中に、あまりに間抜けなミス。
このちぐはぐな組み合わせは、たぶん、俺という人間の縮図みたいなものだ。
「今のあんたには無理ね。……でも、『未来のあんた』なら?」
先輩が指差した先。コミットログのタイムスタンプ。
そこには信じられない数字が刻まれていた。
Date: 2035-12-24 23:59:59
「10年後……。まさか、未来からコードを送ってきたっていうんですか?」
Gitのコミット日時なんて、環境変数をいじればいくらでも偽装できる。それくらいのことは、さすがに俺でも知っている。
それでも、さっきの“ありえない侵入”と、見覚えのあるスペルミスを見てしまうと――笑い飛ばせない自分がいた。
そんなSFな話があるかよ、と言いかけて、俺はコードの末尾に追加されたコメントブロックの存在に気づいた。
そこには、実行コードとは関係のない、奇妙なTODOコメントが残されていた。
/*
* TODO: 過去の俺へ。
* 1. このバグ修正は、俺とレイさん(10年後の嫁)からのプレゼントだ。
* 感謝して受け取れ。
*
* 2. この日の障害がきっかけで、俺のいる世界線では
* 「時間越しコードレビュー・プロジェクト」が立ち上がった。
* この障害を機に死ぬ気で踏ん張ったお前(俺)に
* 未来のユーザーはだいぶ感謝することになるだろう。
*
* 3. レイさんは今、猛烈に腹が減っているはずだ。
* それと、「クリスマスの夜に二人きりで密着した」状況を、柄にもなく意識してしまっている。
* (顔を見ればわかる。耳まで真っ赤なはずだ)
*
* 4. 悪いことは言わない。
* 今すぐ自販機に走って「あったかいココア(砂糖多め)」を買ってこい。
* ここで渡さないと、10年後まで「気の利かない男」と言われ続けるぞ。
*
* P.S. サバゲーもいいが、プログラミングはもっと勉強しておけ。
* バグも人生も、今ちゃんと直しておくと未来が楽だ。
* あと、俺の変数名のスペルミス、直ってなくてごめんな。
*/
3. merge
「…………」
「…………」
沈黙。
サーバールームの冷却ファンの音だけが、ブォォォと虚しく響く。
俺は恐る恐る先輩の顔を盗み見た。
先輩は真っ赤になっていた。メガネを外し、手で顔を覆っているが、耳まで赤いのは隠せていない。
さっきまでのショートの恐怖と、コメントブロックに書かれた一文と、その両方が頭の中で感情のバッファをオーバーフローさせているのが、素人目にも分かる。
「……よ、嫁って」
「……そこ? 注目するのそこ?」
先輩の声が裏返っている。いつもの冷徹なテックリードの姿はどこにもない。
指の隙間から、ちらっとこちらをうかがう視線が覗く。その目には、困惑と、ほんの少しの期待と、自己ツッコミめいた諦めが混ざっていた。
「だって未来の俺がそう書いてるんで……。コメントは正直っていうか」
冗談めかして言ったつもりだったが、喉が妙に渇いている。
未来の自分が選んだ言葉に、今この瞬間の俺の選択肢が縛られていく。
――コミット一つで、過去の自分の人生をここまで方向付けできるなら、未来のGitはタイムマシンなのかもしれない。
「あー……その。とりあえず、買ってきます。ココア」
「……砂糖多めで」
「了解(ラジャー)」
俺は逃げるようにサーバールームを飛び出した。
廊下の自販機までの短い距離が、やけに長く感じる。
ポケットの小銭を探りながら、俺はニヤけそうになる口元を必死に抑えた。
未来からのリファクタリング。
どうやら俺たちの未来は、このバグだらけの現在(master)から、ハッピーエンドへと分岐(branch)することが確定したらしい。
戻ったら、カッコつけてココアを渡そう。
そして、いつか10年後の俺が困らないように、このスペルミスだらけのコードを、先輩と一緒にリファクタリングしていくんだ。
コードも関係も、技術負債は早めに返しておいた方がいい。
窓の外を見ると、雪が降り始めていた。
ホワイト・クリスマス、か。
サバゲー定例会には行けなかったけれど、まあ、これなら悪くない戦果だ。
俺は少し痛む背筋を伸ばして、彼女の待つサーバールームへと歩き出した。
(完)
あとがき:技術解説(という名の言い訳)
ここまで読んでくださった方へ。
技術的な学びのない記事で申し訳ございません。。
業務の合間の息抜きにでもなればと思い執筆させていただきました。
本記事で登場した「未来からのコード修正」ですが、当然ながら現在のGitの仕様では git push をしても時空を超えることはできません。
ただし、量子もつれを利用した時間的相関など、物理学の分野では興味深い研究が進められています。本作品は、そうした未来の技術が実現した世界線を想像して執筆しました。
もしかしたら、はるか未来のGitには git push --time-travel <date> オプションが実装されているかもしれませんね。
それでは、よいクリスマスを。