後方互換性についてさいきん考えていることを書く

後方互換性を守るべきブロダクトと、そこまで気にしなくていいプロダクトがあると思っている。

後方互換性を守るべきもの

これはもうシンプルで、「依存関係の下のほうにあるプロダクト」。下のレイヤーを担うことを狙っているものについては後方互換性を守って行かないとみんなが困る。多くのライブラリがすでに依存してるライブラリとか、あとはまあデータフォーマットとかも変わるとそもそも溜め込んだデータとかが使えなくなったりするので困る。

Perl5 が後方互換性を保つことに熱心なのは、そもそも Perl がシステムツールによく使われていることと無関係ではないはずだ。system perlのversion上げたらシステム動かなくなりましたみたいなことになったら困るからかなり気を使ってる。その点、Python が 2 系から 3 系に移行するときにばっさりと後方互換を捨ててしまったのは失敗だったんじゃないかなと私は思っていて、というのも、Python はけっこう使われてる場所が Perl とかぶっているっていうか、システムツールにけっこう使われてる印象がある。そういう状況で後方互換を捨ててしまったのが Python がなかなか 3 に移行できない原因のひとつなんじゃないかな、という印象を私は持っているけどそうじゃないのかもしれないのでこのへんはPythonコミュニティの中のひとからの反論を待ちたい感じする。(2013-03-11:このへんはやっぱりそうじゃない感じっぽい。コメント参照。)

Perl だって 5 と 6 で別物じゃないかっていうのは FAQ で、Perl5 と 6 は「別の言語」として扱うんでよろしくって話にPerlコミュニティではなってる。だから6がリリース(いつされるんだろうか)されても5は5でずっとメンテや進化を続けて行きますよ、という話になってる。

で、後方互換を守る話に戻るんだけど、ライブラリの話で言うと、Net::TCP みたいな、依存関係でかなり深いところにいるようなライブラリとか。これも変わっちゃうといろんなところにクリティカルな影響出てくるので困る。

というわけで後方互換性は守ろうねって話になるんだけど、これはまあ諸刃の剣というか、Perl後方互換性を捨てないせいで言語仕様が醜いみたいなのその通りだと思うし、困る事がないなら腐った仕様とか API みたいなのは捨ててもっと洗練されたものに置き換えて行ったほうがいいに決まってる。なんだってそうだけど要はメリットとデメリットのバランスの問題だ。

後方互換性捨ててもいいじゃんって種類のもの

そうすると当然、じゃあどういうものなら後方互換捨るメリットのほうが大きくなるのって話になるんだけど、わたしはエンドユーザー向けのアプリケーションのレイヤーを担うものはどんどん後方互換捨てていったらいいんじゃないかなと思っている。たとえば WAF だとか。そういうの。

Rails とかががんがんいろいろ変えて行くの、まあついていくの大変なんだけど、Railsに依存してるのって個々の web サービスであって、どうせ web サービスは動いている限り手を入れ続けないといけないものなので、それでいいんじゃないかなと思う。そういうレイヤーなら腐ったものはどんどん捨てた方がいい。

でもまあそういうものにかんしても、後方互換捨てるなら移行期間みたいなのもうけてあげて、将来廃止されるAPIとか使ってたら「これはもうdeprecatedだよー」みたいな警告を出してあげるみたいなことするのが親切だよねって感じがする。

余談だけど PHP はあれだけ後方互換捨てまくってるのにあんなに醜い仕様になってるの本当にわけがわからなくてすごい感じがする。「とにかくなにも知らないやつらに使わせてもなんとなくそれなりにアレする感じにする!美しさなんて二の次だ!便利関数たくさん詰め込めばだれにでもなんかそれなりのアレができるだろ!」っていう強力な哲学を感じる。

要するに

多重に依存されてる(それに依存しているものも、他のなにかに依存されてるみたいな)ようなもの/データフォーマットについては後方互換保ったほうがいい。そうじゃないものについては気をつけながら後方互換捨てて行くと幸せになれる、って感じのことを考えている。

余談

なんでこの話してるかっていうと最近 Perl がなんかいろいろ話題だったときに「Perlって後方互換性保つのにすごい一生懸命だよねーでもそれって諸刃の剣だよねー」みたいなことをずっと考えていたのとちょうどリンクして、じゃあ書くか、みたいな感じで書いた。ので Perl のことについてもちょっと書いておきます。

わたしは最近アプリケーションはけっこう Ruby で書いてしまう(クラスが素直に書けるのと例外が素直に書けるから)んだけど、管理系のツールとかは Perl で書いてるのはこういうことを考えてるからです。あと、じゃあ Perl がアプリケーションのレイヤーに弱いかっていうとそんなことはなくて、そういうレイヤーに使うならそういうレイヤーに使うと割り切ってユーザー空間にエッヂなライブラリとか入れると Ruby くらい素直に書ける感じはする。でもそのときにどういうライブラリを使うの、みたいなのがあまり明文化されてなくて文化依存で、学習コストが高いってのはあると思いますハイ。でも Perl 入学式とか PerlCasual とか PerlBeginners とかあるし。あと Niigata.pm も初学者に優しいです。

そんな感じで(レイヤー的な意味でも学習的な意味でも)下から上まで面倒みてくれるとてもいい言語だなーって感じがします。