プロローグ 最後の障害対応
午前四時十二分。
オフィスで起きている人間は、もう俺ひとりだった。
いや、正確には、俺がまだ人間の状態を保っているかどうかも怪しい。
机の端には、空になったエナジードリンクの缶が四本。いつ淹れたのか覚えていないコーヒーは、とっくに冷めて表面に薄い膜を張っている。モニターの白い光が目に刺さり、こめかみの奥では小さな太鼓が鳴り続けていた。
最後にまともに寝たのは、いつだったか。
たしか二日前――いや、三日前?
「神谷なら直せるだろ。朝までに頼むよ」
そう言い残した部長の顔だけは、嫌になるほど鮮明に覚えている。
神谷湊、二十九歳。中小IT企業勤務。
肩書きはプログラマ。実態は、仕様書の消えた業務システムを延命し続ける保守担当だった。
今回の障害は、翌朝に控えた大規模リリースの最終試験で見つかった。特定の条件で売上データの集計が二重に加算される。数字が少しずれるなどという可愛い話ではない。このまま出せば、複数の取引先へ間違った請求が飛ぶ。
元担当者は半年前に退職。設計書は三年前の状態で止まっている。コメントには、こう書かれていた。
# 暫定対応。あとで直す
書かれた日付は、七年前だった。
「あとで、ねえ……」
誰も来なかったらしい。その“あと”は。
問題の処理は、請求対象を抽出する関数の奥深くに埋まっていた。似たような条件分岐が何重にも続き、同じ名前の変数が途中で別の意味に使い回されている。すでに廃止されたキャンペーンの判定、存在しない支店向けの例外処理、何のためにあるのか分からないフラグ。
消したい。
全部選択して、きれいさっぱり消してしまいたい。
だが、動いている処理には、たいてい動いている理由がある。たとえ、その理由が誰にも分からなくなっていたとしても。
「分からない処理を本番直前に消すな。明日の俺が死ぬぞ……」
もう今日の俺が死にそうだが、それとこれとは別問題だ。
俺はログを一件ずつ追った。
正常なデータと異常なデータを並べ、どこで処理経路が分かれるかを調べる。条件を変えて再現させ、変数の中身を確認する。目についた怪しい箇所を片っ端から直すのではない。原因を特定して、影響範囲を絞り、必要なところだけを変える。
新しいものをゼロから作るのは、俺より得意な人間がいくらでもいる。
だが、誰が書いたか分からないコードを読み解くことなら、少し自信があった。
一時間ほど前、ようやく二重加算が始まる地点を見つけた。
通常の集計処理を通ったあと、七年前のキャンペーン用処理が同じデータを拾っている。キャンペーン終了時に無効化されたはずのフラグが、今回追加された新しい区分と偶然同じ値になっていたのだ。
しかも、その判定は三か所にコピーされ、二か所だけ修正されている。
「誰だよ……こんなクソコード書いたの……」
乾いた声が、無人のオフィスへ落ちた。
履歴を調べる。
七年前のコミット。その作成者欄に表示された名前を見て、俺は黙った。
KAMIYA_MINATO。
「俺かよ……」
新人だった頃の俺である。
当時は、動かすだけで精いっぱいだった。締め切りに追われ、既存処理をコピーし、意味を理解しきれないまま条件を足したのだろう。その後、何人もの担当者が継ぎ足し、今の迷宮が完成した。
犯人を見つけたところで、責任追及に使えるのは鏡くらいだ。
「七年越しのセルフ障害対応とか、聞いてないぞ……」
妙に笑えてきた。
だからといって、古い処理を丸ごと削除するわけにはいかない。別の取引先が、まだその分岐に依存している可能性がある。
俺は問題の条件を切り分け、新しい区分がキャンペーン処理へ入らないよう修正した。周辺のテストを追加し、対象外のデータまで一通り流す。
一回目。
失敗。
見落としていた別のフラグが立っていた。
二回目。
集計値は合ったが、古い取引先のデータが欠けた。
「はいはい。そう簡単には帰してくれないよな」
指先の感覚が鈍い。キーボードを打っているのに、厚い手袋越しに触れているようだった。
条件をもう一段だけ狭める。差分を確認する。余計な変更が混ざっていないことを確かめる。
三回目。
黒い画面を、白い文字列が流れていく。
単体テスト。正常。
結合テスト。正常。
問題が起きたデータ。集計値一致。
既存取引先の回帰テスト。一致。
最後の一行が表示された。
SUCCESS
しばらく、その文字の意味が理解できなかった。
終わった。
本当に、終わったのだ。
変更を保存し、手順書へ結果を記録する。念のため差分をもう一度見る。問題ない。今すぐリリースできる状態ではあるが、本番反映は朝の担当者に引き継ぐ。疲労でまともな判断ができない人間が、ひとりで本番を直接いじるべきではない。
送信ボタンを押すと、肩から力が抜けた。
「……やっと帰れる」
椅子から立とうとした。
その瞬間、床が大きく傾いた。
違う。傾いたのは俺だ。
机へ手を伸ばしたはずなのに、指は何にも触れなかった。モニターの光が細い線になり、遠ざかっていく。
痛みは、なかった。
ただ、ひどく眠かった。
せめて家に帰ってから寝たかったな、と。
そんな、どうでもいいことを最後に考えた。
暗闇の中で、不意に文字が浮かんだ。
EXTERNAL MAINTAINER DETECTED
COMPATIBILITY : 99.97%
IMPORTING...




