互換性維持とリファクタリング

互換性とは

ソフトウェアは、広く使われれば使われる程、互換性が大事になってきます。ここでは、ソフトウェアライブラリ・フレームワーク等の互換性を考えてみまよう。互換性は以下の2つに分けて考えることができるようです。

  • 上位互換性:ライブラリのバージョンを新しくしても、このライブラリに依存したソフトウェア(クライアント)が正しく動くこと
  • 下位互換性:ライブラリのバージョンを古くしても、このライブラリに依存したソフトウェア(クライアント)が正しく動くこと

ライブラリ等のバージョンにおいては、古いバージョンに切り替える機会よりも、新しいものに切り替える機会(とモチベーション)の方が多いため、一般的に上位互換性の方が重要視されます。(ただ、Excel等のアプリケーションが吐き出すデータファイルは、下位互換性が求められることも多いです。つまり、Excel2000で作ったデータはExcel97でも読める、等)

互換性が重要なケース

広く一般に使われるライブラリ(API)は、なるべく上位互換性を維持しようと務める必要があります。例えば、commons-langが互換性を失ったら、バージョンアップした時に、かなり多くのクライアントが壊れるでしょう。

ちなみに、commons-httpclient は、v4系のリリースのタイミングで、互換性を捨てました。v3系を使って組んだアプリケーションはv4系にバージョンアップするのに大きなコストが掛かります。まぁ、互換性が重要とは言え、一定のタイミングで互換性を捨てる、という作戦もあるのです。これは「技術的負債の返済」とも言えるでしょう。

そして仮に、Java自体が互換性を失ったら、もっと大変なことになります。従って、Javaは「上位互換性を大事にしている」と言われています。Java1.0時代に書いたコードやコンパイルしたクラスが、Java6でも普通にコンパイルできる・実行できるのは、互換性が最大限に考慮されているからです。「バージョンを上げても壊れない」という実績の積み重ねが信用につながり、これがJavaの利用領域拡大に一役買っているのは間違いないでしょう。

互換性が重要ではないケース

しかし、互換性を維持する、というのはコストのかかる作業です。例えば、一度リリースしたライブラリについて「このクラス名、よくなかったなー。名前変更のリファクタリングを掛けよう」ということは、おいそれと出来なくなるのです。名前が変わったら、クライアントのコンパイルは通らなくなりますからね。

そんなわけで、個人的に使うようなライブラリや、特定の狭い範囲のみで使うことを想定したものであれば、互換性はそこまで重要視されません。というのも、バージョンを切り替えた結果、クライアントが正しく動かなくなったとしても、それに対応するようにクライアント側を修正すれば済むからです。また、範囲が狭ければ狭いほど、なぜ互換性を失ったのか、どのように直せばいいのか、というナレッジが共有しやすい為、という理由もあります。

このように「互換性の維持(=信用の積み重ね)」と「リファクタリング(=設計の改善)」はトレードオフです。そのソフトウェアの性格や、開発方針、リファクタリングの重要度等を検討して、互換性を維持するかどうかを決定しなければいけません。

Jiemamyはどっちだ?

いやー、Jiemamyでも長い間「互換性維持」を意識してきました。しかしまぁ、毎度のバージョンアップで「ごめんなさい、やっぱり互換性維持はできませんでした」ということになるのですが。最近は気持ちを切り替えています。Jiemamyの本質はバージョン互換(安定したAPI)ではなく、開発プロセスにあることを再確認しています。だから、互換性を意識しすぎて開発が進まないのは、ちょっと本末転倒だったな、と。こだわりすぎるのも良くない。

という気持ちで。現在新しいAPIを鋭意開発中です。

baseunitsはどっちだ?

逆に、baseunitsに関しては「互換性維持」は重要なことだと思っています。APIを広く使ってもらいた、と考えていますし、初期から「安心して広く使ってください」と喧伝しているプロダクトです。厳しく考えれば、「MavenのgroupIdを変更する」だけでも、見知らぬ誰かのプロダクトを壊すことができるんです。

というわけでbaseunitsでは、このようなことがないように、以下のポリシーに従います。

  • 一度リリースしたバージョンは、その内容を一切変更(修正)や削除(公開停止)しない。
  • なるべく互換性を失わないバージョンアップを心がける。
  • 互換性を失う場合は、@Deprecated等で事前に警告する。
  • 互換性を失うタイミングはメジャーバージョンアップのタイミングに限る。


つまり、こちらは名前の変更などよりも、互換性が大事なプロダクトです。余程のことがない限り、互換性の維持に努めます。安心してご利用ください。