Semantic Versioningにおける破壊的な変更

io.jsがv1.3.0になり、ビルトインのURLモジュールでresolve('/foo/bar', '.')/foo/とスラッシュ付きで返されるようになった。今までは/fooとスラッシュなしで返っていたので、これは破壊的な変更であり、Semantic Versioningに従うならばメジャー・バージョンを上げるべきではないのかという議論がなされていたようだ。

仮にこういった実装ミスの修正が破壊的な変更だとすると、ほとんどすべてのバグ・フィックスは破壊的な変更になってしまう。バグ・フィックスは必ずどこかで何か(モンキーパッチとか)を破壊するし、破壊しないことを保証することは不可能だ。Semverにおいては変更の仕分けはユーザーの利用ではなく、仕様という観点での話になる。つまり仕様に変更があったかどうかが焦点になる。

このURLモジュールのケースでは、仕様が外部(ドキュメントのブラウザーの実装のように~という一文)にあり、それに従った結果になっていなかったということになる。この間違った実装に依存したコードにおいては破壊的な変更となるが、それはそのコードが悪いだけで、メジャー・バージョンを上げる理由にはならない。

概ねこう解釈したが、ユーザーに優しくはない。特にこのモジュールのこの挙動は長らく放置されていたバグで、こういうものだと思って利用していた人も多かったはずだ。stableと明記されていたこともその判断を後押ししたことだろう。そこを考慮するとメジャー・バージョンを上げてやり、ユーザーに周知する必要があったんじゃないだろうか。

Semverのこのあたりの微妙な判断を求められる点が、v1.0.0をリリースする気配がないパッケージでnpmリポジトリーが溢れかえっている原因なのかなと感じる。メジャー・バージョンを上げることの抵抗感をなくすか、Semverを諦めるかの二択になりそうだ。