
2025/12/12 0:52
Deprecate like you mean it
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
(欠落している要素を取り入れた)**
要約
セス・ラッサンは、通常の非推奨警告が開発者に無視されやすく、その結果後でコストのかかる失敗につながると主張しています。彼は「バギーな非推奨(buggy deprecation)」という新しいアプローチを提案します。これは、非推奨関数が削除に近づくにつれて徐々に誤った結果を返すようにする方法です。最初は百万回のうち1回、次に千分の1回、1年後には千分の1回、そして最終カットオフ直前ではほぼ全ての呼び出しが間違えるといった段階的なエスカレーションです。この段階的な増加は、開発者に問題を早期に認識させ、リファクタリングを促すことで、通常は目立たない警告をコードベースの更新が必要であるという明確なシグナルへと変えます。
ラッサンは実際の例として、Python の
urllib.getheader を挙げています。これは 2023 年に非推奨となりましたが、修正されずに残り続けたため、最終的に機能停止(ダウンタイム)やセキュリティリスクにつながったケースを示しています。このような静かな警告が大きな損害をもたらすことから、非推奨を目立つ形で有害化することで、企業は保守コストを削減し、業界全体でより規律ある API 進化を促進できると述べています。
著者は皮肉なトーンでこのアイデアを提示し、警告だけでは不十分であり、可視的なリグレッションが変革を促す必要があることを強調しています。また、非推奨は「ワルツ(小さく意図的なバグ)」を残しておくべきだと主張し、これらの欠陥がタイムリーな対応を動機付けると述べています。
本文
セス・ラーソンは、開発者が非推奨警告に対して行動を起こさないことに気づきました。
urllib の response.getheader メソッドは 2023 年から非推奨になっており、代わりに使用すべきなのは response.headers 辞書です。このメソッドが最終的に削除されたとき、多くのコードが壊れました。
非推奨警告は、後方互換性を欠く API 変更に伴う「大きなステップ」問題を解決するために設計されており、人々がメンテナンス負担を一度に突如として押し付けられるのではなく、徐々にスケジュールできるようにしています。しかし、遅延の経済的コストは具体的に感じられません。非推奨警告を無視して API が変更されるまで待つことはできますが、その後さらに遅らせると非常に高い代償が発生します。
人々は突然起こる変化への計画があまり得意ではありません。
もし、非推奨関数が「時折」誤った結果を返すように意図的に設計したらどうでしょうか…毎回意図的に誤った結果を返すたびに非推奨警告をログに記録します。結果の正確性に敏感なユーザーは、誤った結果の代わりに人工的な遅延を挿入することも選択できるでしょう。
初期状態では決して誤った結果を返さないようにすべきです。しかし、非推奨になって数か月が経過したら、たとえば 100 万回の呼び出しごとに一度は誤った結果を返すようにします。これはおそらく誰も「深夜 Pager」を起動することはありませんが、非推奨機能への依存がコード内に潜むバグであることを明確に示します。
さらに数か月後には、10,000 回ごとに一度誤った結果を返すように増やします。こうするとメンテナンスの遅延は少し痛み始めます。1 年が経過したら 1,000 回ごとに誤ったものを返すように設定します。この段階では、ユーザーは重要でない補助的な使用に限ってメンテナンスを遅らせることしかできなくなります。そして最終的に期限が迫ると、ほぼ全ての呼び出しで誤った結果を返すようになります。そうすると、その機能は実質的に使えなくなり、削除された状態と同様です。
この手法により、API の非推奨部分は徐々にバグが増えていき、最終的に削除されるまで「経済的トレードオフ」をユーザーに即座に体感させます。
皮肉であることが分かりづらい場合は、むしろその欠点を残したほうがよいでしょう。しかし、システム変革を促す効果の観点から見ると、サインや警告は最も低位に位置付けられます。期待して失敗することに驚くべきではありません。