プログラムは所詮インプットとアウトプットの世界

 と思うと楽なのかな、と最近考えています。
 所謂プログラムというのは最終的にはインプットとアウトプットに行き着きます。
 どんなプログラムでもインプットがあり、アウトプットがある。外部からもしかり、内部からもしかり。
 ということは、所謂インターフェイス(Javaのじゃないよ)さえしっかりしていればそれでOKなのだろうな、と。
 このインターフェイスさえ適切に決まっていて、お互いはインターフェイスだけを理解し、管理し、その接続を円滑に行えればお互いの責任の範囲は自ずと決まるし、工数の見積もりも楽になってくる。
 なので、プログラムの設計で押さえておかなければならないのは「インターフェイス分離の原則」*1と「オープン・クローズドの原則」*2なんだと思ったりしています。
 こうして仕切りと門を設け契約による設計を適切に行うことができれば「卓越したプログラマばかりではなくても」アメーバのように無節操に結びつくソフトウェアは避けられるような気が。

 ……とは言っても、やっぱりインターフェイスが常に変化する可能性を秘めている以上、後から「これとこれとこのインターフェイスも必要」となったときに「本当に必要なのか?」というところから議論できて、拡張/修正する際に内部の変更コストを最小限にできるのがプログラマに求められている能力なので、難しいのでしょうけれど。

*1:クライアントに、クライアントが利用しないメソッドへの依存を強制してはならない=それぞれが利用しないような無関係なインターフェイスを用意してはならない

*2:ソフトウェアの構成要素は拡張に対しては開かれていなければならず、修正に対しては閉じられていなければならない=常に拡張しやすく構成されており、その拡張や修正の影響は外部に飛び出さないようにしなければならない