🏯

「これ?歴史的な経緯でこうなってます!」

に公開

こんにちは!アルダグラムの田中です。

さて、先日引き継ぎ資料を書いたときに、こんな言葉を書きました。

「※歴史的な経緯でxxx環境の名前は「YYY」となっています。」

私の経験だと過去所属した会社でも、同僚に質問した際に「歴史的な経緯があって・・・」とかよく耳にしたことがあります。

今回はこの「歴史的な経緯」とは何なのか?について書いていきたいと思います。


社内Slackの「歴史的な経緯」のメッセージの様子

歴史的な経緯とは?

あくまでも個人的な主観ですが、エンジニアが「歴史的な経緯があって...」と言うときは、ほとんどの場合以下のような意味が込められているのではないかと思います。

「現在のコードや設計は理想的ではないが、それなりの理由がある」

つまり、現状を正当化するための説明であり、同時に

「簡単には変更できない複雑な事情がある」

という警告でもあります。

技術的負債との違いですが、「将来的に解決すべき問題として認識されている」かどうかの違いがあると考えています。

よくある「歴史的な経緯」のパターン

1. 技術的制約によるもの

  • 当時の技術制約(古いブラウザ対応、ライブラリの制限など)
  • レガシーシステムとの互換性維持
  • 過去のフレームワークバージョンへの依存
  • 言語仕様レベルでの歴史的な制約
    などが該当します。

例えば、現在MySQL8系を使っていて、以下のようなテーブルがあったとします。

CREATE TABLE user_settings (
  user_id INT,
  settings_json TEXT
)

「名前がsettings_jsonだけど、なぜJSON型じゃなくてTEXT型?」

と思うかもしれません。

しかし、これは過去にMySQL5.6を使っていて、JSON型が使えなかったという歴史的な経緯があります。

他にも言語レベルで歴史的な経緯が存在する場合もあります。

例えば、JavaScriptでは、nullの型がobject型になります。

typeof null === "object";

JavaScript の最初の実装では、JavaScript の値は型タグと値で表現されていました。オブジェクトの型タグは 0 で、null は NULL ポインター (ほとんどのプラットフォームで 0x00) として表されていました。その結果、null はタグの型として 0 を持っていたため、typeof の返値は "object" です。

ECMAScript の修正案が (オプトインを使用して) 提案されましたが、却下されました。それは typeof null === "null" という結果になるものでした。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/typeof#typeof_null

2. 時間とリソースの制約

  • 厳しいリリース期限での妥協
  • 人手不足による設計の簡略化
  • 予算制約での一時的解決策の恒久化
    などが該当します。

例:

# TODO: 後で見直す
def process_data(data):
    result = []
    for item in data:
        # 複雑で非効率な処理
        pass
    return result

TODO: 後で見直すTODO: 後でやるというコメントを見たことがある方もいらっしゃるのではないでしょうか?

私もこのコメントを書いたことがあります。

こう書いておきながら、いつの間にか数年経過していた・・・というのがあるあるです。

3. 要件の変遷と積み重ね

  • 仕様変更の積み重ねによる継ぎ接ぎ
  • 異なるチーム・時期での開発による不統一
    などが該当します。

アルダグラムの例でいうと、

「AテーブルとBテーブルはhas_oneの関係だが、なぜかポリモーフィック関連で結びついている」

というのがあります。

「仕様変更の積み重ねによる継ぎ接ぎ」に分類されるものです。

事業がピボットした結果、過去にあったテーブルが削除されポリモーフィックだけが残ってしまっているという歴史的な経緯があります。

(※こちらは技術的負債となっています。)

4. 組織的・人的事情

  • 前任者の退職による知識の断絶
  • 他部署との調整による不要な複雑化
  • ドメイン知識の属人化
    などが該当します。

例:

# config.yml
# 注意:この設定値を変更する前に田中さん(退職済み)の
# 設計ドキュメントを確認すること(場所不明)
database:
  connection_pool: 42  # なぜ42なのかは不明
  timeout: 30000       # 本番環境でのみ必要(理由は口伝)

引き継ぎやコメントが不十分なことによるもので、「なんかわからんけど動いているからヨシ!」状態になります。

まとめ

「歴史的な経緯があって...」は、過去からの積み重ねによる現状の状態を表している言葉です。

重要なのは、この「歴史的な経緯」を理解し、受け入れながらも、より良いシステムに向けて継続的に改善していくことです。

新しく参加したプロジェクトで「歴史的な経緯」に遭遇したときは、それを批判するのではなく、その背景を理解し、未来に向けた改善のきっかけとして捉えるのがよいのではないでしょうか。

今作っているコードも、いつか誰かにとっての「歴史的な経緯」になるかもしれません。

アルダグラム Tech Blog

Discussion