互換性

今までPS3上でLinuxが使えていたんだけど、Sonyがバージョンアップを行ってその機能を無効化した。その件について、アメリカで裁判沙汰になるらしい。Linuxが使えるのがPS3の1つのウリであって、それを理由に購入したのに無効化されるなんて、全くもって不可解だ!!訴えてやるってことなんだろうね。でも機能を削減したかったSony側の意向もなんとなくわかっちゃう。
ソフトウェアをバージョンアップする際、互換性問題を常に考える必要が出てくる。某iPod touchなんかはバージョンアップ時に機能をさらっと消しちゃったりするけど、前のバージョンで出来ていたことは次のバージョンでも出来るようにしておかなければならないってのが普通。機能を削減すると必ずどこからか苦情が出てくる。「こんな機能、だれも使ってねーだろ」と思っていても、ユーザはこちらの想定を超えた使い方をしているもんだ。既存ユーザを失なわないために、互換性は常に確保していかなければならない。
でも実際問題、機能が増えてくると保守対象のソースコードの絶対量が増え、ソフトウェアの複雑度が高くなるわけで、結果として保守コストがどんどん増大していく。テスト項目が増えるし、機能間の整合性が起因となり障害に発展するケースもある。新しく機能を追加する際のコストも増える(普通は)。
そうしてだんだんソフトが肥大化してきて、「あぁ、この機能がなければもっとすばらしいこの機能を簡単に追加できるに…」とか、「この機能はもっとこういう風に実装すれば良かったな」とかいう気持ちが湧き出てくる。要するにソフトをキレイにしたくなる。リファクタリングすれば確かに内部状態はきれいになるけど、一度機能としてユーザの目に触れてしまった外部仕様を簡単に変更するわけにはいかないわけで。そりゃ「既存のユーザが離れてしまっても構いません。一から新規ユーザを発掘します!!」とう意気込みなら止めないけど…。
結果として、互換性を保つために「機能削減できない」という前提がある以上、実装する機能の選定は非常に慎重に行わなければならない。「こんな機能があったら便利かもしれないから実装しよう。実装コストもそんなに掛からないし。あまり使われないかもしれないけど」っていう軽い気持ちで機能を追加し続けると、その場は良いかもしれないけど、長いソフトウェアのライフサイクル上では破綻する。「必要最低限の機能をいかに選定して実装するか」がソフトウェアを作る上で最も重要なファクターの1つだと思うわけ。機能が少なければ少ない方が良いといっているわけではなく、「本当に必要かどうか」をほんっ…とに真剣に考えることが必要だと。「いいじゃんいいじゃん、すぐ追加できるなら追加しちゃおうよ」じゃダメだと。
…って、なんかありきたりの結論だな…。ありきたりだけど、このことをちゃんと理解しないで機能をボコボコ追加しようとする人が多いのも確かなわけでね…。色んなご意見があるかもしれないけど、個人的にはこの考えはソフトウェアを開発する前提として常に心に刻んでおきたいな。