Featured image of post コードドクター【Singleton】多重人格症候群〜唯一の真実〜

コードドクター【Singleton】多重人格症候群〜唯一の真実〜

雑居ビルの2階。 少し古びているが、よく磨かれたリノリウムの床が蛍光灯の光を鈍く反射している。 清潔だがどこか静まり返った廊下の一室に、その「コード診療所」はあった。

重厚な鉄製の扉には、白地に黒文字で『コード診療所』とだけ印字されたプレートが掲げられている。 まるで役所の倉庫のような素っ気なさだ。

僕は深呼吸を一つして、ノックをしたのち、重い鉄扉を手前(廊下側)に引いた。

コード診療所のドアをノックする

「どうぞ」

中から聞こえたのは、聞き覚えのある穏やかな女性の声だった。予約の電話で対応してくれた、あの声だ。

来院

ドアを開け放つと、視界に飛び込んできたのは「壁」だった。 いや、よく見るとそれは、天井近くまで積み上げられたO’Reillyの技術書と、乱雑に積まれた古いマザーボードの山だ。 外開きのドアでなければ、入室することすら叶わなかっただろう。 清潔な廊下から一転、そこはカオスエンジニアリングの実践現場のような様相を呈していた。

しかし、そのカオスの隙間から見える奥の受付カウンターだけは、ミリ単位で整頓されていた。

「お待ちしておりました。インフラチームのリーダーの方ですね?」

白衣を着た女性が、にこやかに立ち上がる。助手のナナコさんだ。 ナナコさんの背後の診察室には、トリプルディスプレイに向かう男の背中が見える。 HHKBの乾いた打鍵音だけが、部屋に響き渡っていた。 弘法筆を選ばずと言うが、あの背中は徹底的に道具を選ぶタイプのエンジニアだ。

ナナコが出迎え、奥でドクターが作業中

「あの、ドクター?」 僕が声をかけるが、男は振り返りもしない。

「……」

「すみません、今は集中モードですので」 ナナコさんが申し訳なさそうに微笑む。 「患部……いえ、該当のコードを先に見せていただけますか?」

僕は頷き、持参したラップトップを開いた。

診断

僕が持ち込んだのは、チーム内で問題になっている設定管理モジュールだ。 あらゆる箇所でこのモジュールがインスタンス化され、そのたびに重い初期化処理が走っている。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
package Bad::Config;
use v5.36;

sub new ($class) {

    # シミュレーション: 設定ファイル読み込み(重い処理)
    my $config_data = {
        database  => 'mysql://localhost:3306/app',
        timeout   => 30,
        debug     => 1,
        loaded_at => time(),
    };

    return bless $config_data, $class;
}

1;

画面を覗き込んだドクターの手が、ピタリと止まった。 スクロール速度が異常に速い。彼は一瞬でコードの構造を把握したようだ。 そして、画面上の二箇所――メイン機能とバッチ処理の呼び出し部分――を指で弾いた。

「……多重人格。」

「えっ?」 思わず聞き返す。

「システムがアイデンティティ・クライシスを起こしていますね」 ナナコさんがすぐに解説を加える。 「設定という『記憶』が乖離し、現場が混乱しています。あっちの私とこっちの私で、言っていることが違う……そんな状態です」

「確かに……バッチとアプリで挙動が微妙に違って……まさかこれが原因で?」 設定ファイルを読むタイミングがずれることで、情報の不整合が起きていたのか。

ドクターは無言でキーボードを構えた。

「執刀する。」

処置

ドクターの指がショートカットキーを叩く。無駄のない動きだ。 彼は Bad::Config を開き、あっという間に修正を加えていく。

ドクターがコードを執刀中、ナナコが画面を指差す

「ここです」 ナナコさんが指差す先、sub new の中身が書き換わっていく。

1. 魂の器を用意する

1
2
    # state変数: 一度だけ初期化され、値を保持し続ける(Perl 5.10+)
    state $instance;

state……? クロージャも使わずに?」 僕が驚くと、ナナコさんが頷いた。

「Perl 5.10からの秘儀、そしてv5.36で標準装備された『魂の器』です。これで記憶は一つに統合されます」

2. 記憶の有無を確認する

1
2
    # すでにインスタンスがあればそれを返す
    return $instance if defined $instance;

「人格が存在しているかを確認し、存在すれば即座にその人格を呼び出します」

3. 人格を形成する

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
    # 初回のみ生成
    my $config_data = {
        database  => 'mysql://prod-db:3306/app',
        timeout   => 60,
        debug     => 0,
        loaded_at => time(),
    };

    $instance = bless $config_data, $class;
    return $instance;

ドクターがEnterキーを「ッターン!」と叩く。 テストランナーが走り、オールグリーンのバーが表示された。

予後

治療完了だ。 システムは安定し、頻発していたIO負荷のアラートも嘘のように静まり返った。 まさに、多重人格が統合され、唯一の真実を手に入れた瞬間だった。

「なんというか……魔法みたいだ」 僕は感無量で立ち上がった。

すると、ドクターが無言で近づいてきた。 そして僕の手に、小さな黄色い紙片を握らせた。

見ると、それはポストイットだった。走り書きで、こう記されている。

1
if ($future_me) { return $future_me; }

「これは……?」 僕が聞き返す前に、ドクターはもうディスプレイに向き直っていた。

「お大事に」 ナナコさんの声に送られ、僕は首を傾げながら診療所を後にした。

   ***

半年後——。

僕は新しいプロジェクトで、またしても似たような問題に直面していた。 あちこちで生成されるロガー。バラバラの設定。増殖するインスタンス。

デスクの引き出しを整理していたとき、ふと目に留まったのはあの黄色い紙片だった。

1
if ($future_me) { return $future_me; }

その瞬間、僕は悟った。

(そうか……これは未来の自分への問いかけだ)

過去の自分がちゃんと設計を残していれば、未来の自分は迷わない。 ドキュメントも、コードも、設定も——記憶を一つに保つことで、未来の自分を救えるのだ。

Singletonは単なるデザインパターンではなかった。 自分自身を一つに保つ、生き方の哲学だったのだ

僕はポストイットをそっとモニターの端に貼り直した。 いつか自分が後輩に伝える日が来るかもしれない——あの無口なドクターのように。


処方箋

症状適用すべき経過観察
設定情報が至る所で生成されている
ログ出力など、単一のリソースを共有したい
グローバル変数を隠したいだけ

治療のステップ

  1. v5.36の採用: use v5.36; でモダンなPerl機能を有効化する。
  2. State変数の宣言: コンストラクタ内に state $instance; を宣言し、インスタンスを保持させる。
  3. ガード節の追加: return $instance if defined $instance; で、既存インスタンスがある場合は即座に返す。
  4. 初回初期化: インスタンスが存在しない場合のみ初期化処理を行い、state変数に代入する。

ナナコより

かつてのSingleton実装はクロージャを使ったりと複雑でしたが、現代のPerlでは驚くほどシンプルに書けます。 「唯一のインスタンス」が必要な場面では、ぜひこのパターンを思い出してくださいね。 システムが混乱しないよう、記憶は一つに保ちましょう。お大事に。

comments powered by Disqus
Hugo で構築されています。
テーマ StackJimmy によって設計されています。