このBlogは移転しました。今後は aish.dev を御覧ください。

動的型言語の使いどころ - その2

先日、動的言語の使いどころ という記事を公開してしまった。公開して「しまった」というのは、じつはあの記事はもうしばらく寝かしてから公開するつもりで、まだ未完成だったためだ。なんで公開するつもりがないエントリが公開されてしまったかというと、エントリを更新してリポジトリにpushすると自動的にサイトが更新されるからくりを仕込んだのをすっかり忘れて、気軽に git push してしまったのだ。ということで、前のエントリで書いておきたかったことをもうちょっと書き足しておきたい。

私は Python を使ってはいるが、それでも、Python 使うやつとか馬鹿じゃねーの、と思うこともそれほど珍しくはない。特に、自分で Python を使うのと、他人が書いた Python アプリケーションを使うのはまったく別の話で、他人に対しては「Python 使うなよ」と言いたくなってしまう時もないではないのだ。

例えば、有名な Python製チケット管理アプリケーションの Trac というのがある。ここ数年は Trac を使っていないが、以前使っていた時には、Trac を管理するのがイヤでイヤで仕方がなかった。Trac は本体は比較的シンプルな機能しか持たず、いろんなプラグインで機能を拡張して便利に使えるタイプのアプリケーションだが、 本体のバージョンアップにプラグインがきちんと追随できていないことが多く、迂闊にバージョンアップしてしまうとあれが動くがこれが動かない、バージョンアップしなくてもこっちのプラグインが旧バージョンでは動かなくなってしまう等々の問題が頻出するのだ。

こういうのは、Javaなんかで書いてあるアプリケーションなら比較的対処しやすい。本体の仕様変更などはプラグインに配慮してそれほど大胆な変更はしないもので、非互換な点があってもとりあえずコンパイルしてエラーが出た部分をちょこっと直してやれば、大概はそれで済む。

しかし、これがPython製だとそうも行かない。動かしてみないことにはどこにエラーが有るかわからないし、テストしようにも、そもそもテストスクリプトがあるのか、あったとしてもどうやって起動するのか、環境をどうやって作るのかというのをいちいち調べなければならない。運良くテストを実行できて問題を検出できたとしても、これを直すのがまた一苦労だ。アプリケーションとプラグインのコードベースをよく知っているならともかく、そうでなければ、どこがどう変更されているのか、GrepやらVCSのログやらを頼りに探しまわらなければならない。これは Python/Tracに限った話ではなく、例えばFirefoxのアドオンがちょっとしたバージョンアップで無効化されてしまったり、VimEmacsの拡張が使えなくなってしまったりということはよくあることだろう。

では、TracJavaで書きなおすべきなのかというと、そうも言い切れない。ダックタイピングの手軽さで、JavaC++ だとプラグインの更新やリビルドが必要となってしまうようなケースでも、Pythonなら修正不要でそのまま使えたりするし、そもそも互換性が問題になるほどたくさんのプラグインが書かれているのは Python で気軽に書けるというのも大きな要因で、これが全部 Java で書かなきゃならんとなったら、こんなに人気が出たかどうかはわからないだろう。

きっと、Tracのようなアプリケーションでは、PyPIなどのリポジトリとの連携、Jenkinsまでは行かないまでも、単純なAPIのバージョンチェックにとどまらない、簡単なテスト実行方法の標準化といった、ソフトウエアのライフサイクル全体への配慮がもっと必要なんだろう。これは別に動的言語に限らず必要ではあるが、Pythonのように手軽に使えることを期待されてしまうプログラミング言語を使うのであれば、その特徴をもっと生かしたアプリケーション作りが要求されるのだと思う。