自分がC/C++で飯を食っていた 2001年ごろに某ゲーム機メーカでお手伝いすることなり、現場にいた外注メンバーもできる人ばかり。その同僚からデザインパターンとかって耳慣れない話を聞く。コンボジットとか、デコレータ作ってみましたとかいってるw 意味わかんねーよ的な迷い子w 帰宅後必死に調べる。そして、GoF本がしばらくバイブルとなり典型的なパターン厨となる。
新たな気づきとしては、オブジェクト指向言語の実装機能(カプセル化、継承、多態)を理解した程度では、複雑な要件を実装していくことは困難だと体感した。何が必要かというと、デザインパターンなどを加味した上でのオブジェクト指向設計の力。
設計と実装の両面での考え方が必要
実装力というのは、クラスのAPIをどのように使いこなすかであって、設計力というのはクラスの構造や関連をどのように構成するかを決める能力だと思っている。設計は戦略であり、実装は戦術。また、設計が理論であれば、実装は実践。何が言いたいかというと、盲目的に実装ばかりを鍛えていても、無戦略であり理がないということ。
上級のプログラマを目指すなら設計能力こそ磨くべき。開発プロセス全体から見ると不可欠であることは明白だが、エンジニア個人で考えた場合、設計軽視というのはありうる。
設計というのはある意味学問であって、参考本や教科書などを開きながら学ぶことになる。Kent BeckやMartin Fowler, Eric Evansなどの良書を読まないとたどり着かない境地もある。こればかりは実践から逆引きしにくいし、効率も悪い。(この手の書籍は、文体も硬く小難しいことが書かれているが、新人でもなければ自分で読み下して理解度あげる努力が必要)
逆説になるが、この理論を実用的に適用できる方法を模索することが重要になる。要するにどこで使えるかを常に考え、その実践が伴わなければその理論は意味がないし、決して身につかない。この時点で単なる知識が実用性のある智慧に変わる。
かなりハードルの高いことをいっているが、高度な技術者を目指すというのは、この両輪が回せるかどうかではないかと思う。
これは、プログラミングが好きで仕事が趣味な人でも、仕事だからプログラミングする人でも、平等に簡単な話ではない。でも、プロフェッショナルというのはそこを目指すのではないかと思う今日この頃。