嘘をつく依存エッジ
本番システムについて誰かが描いたどんな図も、それを更新せずに誰かがデプロイした瞬間から陳腐化します。私たちはそれをこう検出しています。
2026年7月1日 · 7分で読了
プラットフォームチームにアーキテクチャ図を求めると、2つのうちどちらかが返ってきます: 「最終更新14か月前」というスタンプが押された Confluenceのページか、あるいは肩をすくめられて、決済サービスが今もinventoryを直接呼んでいるのか、 それとも誰も文書化し終えなかったQ3の移行でイベントバス経由に変わったのかを3人が議論するSlackスレッドです。 どちらの答えも正しい、という意味では正しいのです — ある程度の規模を超えたほとんどのチームで実際に起きていることだからです。
図が間違っているのは、誰かが怠けたからではありません。図とは、誰かがそれを描いた瞬間のシステムについての主張が凍結されたものであり、 システムはその後も前進し続けたから間違っているのです。取り除かなかった依存関係のひとつひとつ、 締切のプレッシャーの下で「後で片付けるつもり」で追加された新しい呼び出しのひとつひとつ、本番環境でしか発火しないフォールバックパスのひとつひとつ — 誰かが戻ってきて描き直さない限り、箱と矢印の図には何ひとつ現れません。誰も描き直しません。 文書化されたシステムと実際に動いているシステムの間のこのギャップを、私たちはアーキテクチャドリフトと呼んでいます。 これは仮説ではありません — 複数のエンジニアが手を入れるほど古いシステムなら、それがデフォルトの状態です。
2つの真実の源、どちらか一方だけでは足りない
静的解析はあなたが書いたものを読みます: ソースコードを解析し、importを解決し、HTTPクライアントとKafkaのリスナーを追跡すれば、 コードがどのサービスがどのサービスを呼んでいるべきかを語るグラフが得られます。計算は正確で安価ですが、 ソースに存在するパスしか知りません — 8か月前から100%オンになっていて古いブランチが一度も削除されていないフィーチャーフラグは、 純粋に静的な読み取りでは「使われている」ように見えますし、リフレクション経由や動的に構築されたURLでしか発生しない呼び出しは まったく現れないことがあります。
ランタイムの観測はその正反対の鏡像です。実際のトラフィック — どのポートがどのコンテナと、どれくらいの頻度で、どれくらいの速さで 話しているか — を見れば、解釈の必要なく今まさに起きていることが正確にわかります。しかしランタイムのデータには意図の記憶がありません。 ある呼び出しが意図的に設計されたものなのか、誰も取り除いていない残骸なのかを教えてはくれませんし、 もしトラフィックのサンプリングが1日1回だけ動くナイトリーバッチジョブを取り逃せば、その依存関係はランタイムからは見えないままです。
どちらも正確には嘘をついていません。両方とも、それぞれ異なる問いに対する真実を語っているだけです。
各エッジにラベルを付けることで本当に得られるもの
有効な手立ては、一方の情報源をもう一方より優先することではありません — 両方を保持し、それらをラベルなしのひとつの事実に 統合することを拒否することです。Archyntのグラフにあるすべての依存エッジは、どこから来たかを保持しています: static(ソースコードで見つかったが、ライブで観測されたことはない)、runtime (トラフィックで観測されたが、どこにも書かれていない)、またはbothです。この3番目の状態、confirmed_by: bothだけが、実際に自信を持って行動できる状態です — コードと配線が一致していることを意味します。
残りの2つこそ、興味深い発見が眠っている場所です。何週間もランタイムトラフィックのないstaticのみのエッジは、 デッドコードの候補です — おそらく削除できる依存関係であり、今や推測ではなく証拠を手にしています。runtimeのみのエッジは その逆であり、私たちの経験では最も緊急性の高いものです: 誰も記録していない生きている依存関係、つまり誰もそれを所有しておらず、 誰もそれに対するアラートを設定しておらず、その呼び出しを行うサービスに次に触るエンジニアは、それを壊すまでそれが重要だと気づきません。
これはドキュメントの問題ではなく、リスクの問題である理由
ドリフトを「ドキュメントを最新に保つ」というカテゴリーに分類したくなりますが、それこそがほとんどのチームが永遠に修正しない理由です — ドキュメント負債は、チケットと締切のあるものにはどんな優先順位付け会議でも必ず負けます。より正直な言い方をすれば、 所有者のいないランタイム依存関係は、監視されていない攻撃対象領域であり、同時に計画されていない単一障害点でもある、ということです。 存在すら知らない接続についてオンコール対応する人はいません。それが今私たちが最初に持ち出す論点です。 なぜなら、それはロードマップ会議との接触に耐えて生き残る論点だからです。
