互換性のない修正を安全に行うためのパターン
#執筆メモ
ソフトウェアのシステムは複数の部品の組み合わせからできている
互換性(Compatibility)とは何か
「交換しても良いという性質」
後方互換性 前方互換性
ライブラリについてだけ互換性が問題になるというわけではない
互換性というと、「プログラムとプログラムとの間の問題」というイメージを持っていないか
むしろ自分たちの管理下にプロダクトの方が明確な契約なしに部品同士を協調させているケースがある
それと知らずに、互換性に関わる問題で苦しんでいるということもありうる
外部から取得するデータとデータ処理プログラムの互換性
外部から、ID, Name, Preferenceという3フィールドを持つフォーマットのCSVデータを毎日0時に受信している
2024年4月1日から、ID, Preference, Fullnameというフォーマットに変わることがわかった
アプローチA
旧フォーマットに対応したプログラムから、新フォーマットに対応したプログラムへの更新を行う
2024年3月31日の実行終了後から2024年4月1日の実行予定時刻までの間に更新する
アプローチB
旧フォーマットと新フォーマットの両方に対応できるプログラムへ更新する
2024年4月1日が過ぎたら、旧フォーマットはサポートせず、新フォーマットにのみ対応するプログラムに更新する(optional)
解釈
これは互換性(Compatibility)の問題であるということを認識するところがスタートライン
外部データと処理プログラムを合わせたシステムにおいて、「外部データ」と「処理プログラム」との間の互換性
外部データが処理プログラムに対して後方互換性を持たない状態 = 処理プログラムが外部データに対して前方互換性を持たない状態
アプローチBでは?
外部データに対して後方互換性と前方互換性の両方を持つ処理プログラムV2をリリースした?
Goのビルドタグの事例
https://zenn.dev/team_soda/articles/golang-build-tags-history#既存のエコシステムを壊さないための移行ステップがちゃんと考えられてる