あるプログラマと話していて、ソフトウェアの設計について学ぶモチベーションについての話になった。僕は設計を良くする目的は「変更時の影響範囲を最小限かつ予測可能にする」だと考えている。これは今でも間違えていないと思うが、自分自身について考えてみると、もう少し深いというか、むかし話から始まる何かがあるような気がした。
僕が初めてプログラミングに触れたのは小学6年生のころだった。BASICで、ごく簡単なプログラムを作ったのが始まりだった。高校生になってからMacと出会った。MacのかっこいいGUIに触れ、Mac用のGUIアプリケーションを開発することに興味を持つようになった。
だけど、CやPascalを使ったGUIプログラミングは膨大なライブラリ関数の知識が必要で「こりゃ大変そうだ」と思っていた。そんな時、「オブジェクト指向」という概念について知った。それはソフトウェアを再利用可能な部品の組み合わせとして実現しようという考え方だと当時理解した。ウィンドウやボタンがオブジェクトになっていて、それを組み合わせて作る。それなら自分にもできそうな気がした。
さっそくCのオブジェクト指向拡張であるC++でGUIアプリを作るフレームワークについても学んでみたものの、やっぱり難しいと感じてしまった。一方でMacに付属していたHyperCard/HyperTalkを使ったアプリ(正確には「スタック」)作りはとても楽しく、自分でゲームやツールを作って遊んでいた。受験用に英語構文の暗記スタックを作ったりもした。
大学生の頃には研究用のプログラムをC++で書こうとしたんだけど、記述量の多さに辛さを感じていた。その頃にRubyと出会うことになる。Rubyは少ない記述で高度なことができたし、オブジェクト指向プログラミングも可能だったから、オブジェクト指向の良さを再認識するきっかけとなった。
社会人になり、複数人で開発するそれなりの規模のソフトウェア開発に取り組むようになった。ただオブジェクト指向言語を使っているにも関わらず、なんとなく「部品の集合(後に知ることになる疎結合・高凝集)」にはなっているようには思えず、「こんなはずじゃない」と感じていた。
なぜ僕らのプログラムはオブジェクト指向の良さをいかした設計にできないのか、もっとシンプルでわかりやすい設計にできるはずだ。その答えを探すために、本を読んだり、様々なフレームワークを試したりした。
そして、2005年ごろ、DIコンテナとPresentation Modelパターン(いまでいうMVVM的なもの)に出会った。それぞれが当時抱えていたモヤモヤの大部分を解消してくれて、デスクトップのGUIプログラミングに関しては、ようやく1つの答えを見つけたような気がした。でも言語やフレームワーク、環境が違えば新たな手法を使う必要があり、いまでも設計についての興味は尽きない。
そんなことを思い出しながら考えたのは、僕がソフトウェア設計に強い関心を持ったのは「自分には難しいプログラミングはできないけど、うまく設計された良いソフトウェアを作りたい」という夢みたいなものを追っていたからなんじゃないかということ。結果、設計についていろいろと学んで、時には他人に講釈を垂れるくらいになってしまったというわけ。
こういう観点からプログラマ人生を振り返ったのは初めてだったので、ここに書いておく。