オブジェクト指向言語が与えた開発手法への変化(補足)

前記事で「数学的に美しいコード」と書いたら

「数学的に美しいコードなんてみたことねー」とか
「数字表現(マシン語)から離れた時点で文学性は出てきたよね」とか
オブジェクト指向以前の世界で、答えが常に1つだったんなら、みんなこんなに苦労してないと思うんだけど」

という至極まっとうな意見を頂きました。

「確かにw」と思ったので、この記事は補足(言い訳)を書きます。その為オブジェクト指向を結構わかっている人向けの記事になっています。まあ、前記事はノリといきおいで書いたトンデモ文章だったりするんでそこらへんは割り引いていただけると幸いです。あとで書きなおすかもw

あの文章は「オブジェクト指向には文学的と数学的という二種類の側面がある」という二方向の観点を示すことで、その後の説明に入りやすくするために書いた文章です。その後の説明とは「メソッド」というものが持つ関数的性質を数学的、多態性(ポリモーフィズム) による文脈依存性質を文学的と対比することで、メソッドというものが持っている二重性を浮き彫りにしていく、という説明。そこに持っていくために、まずは「抽象度の調整=文学的」として説明を始め、多態性→述語性→文学性と融合させることで「ポリモーフィズムの価値を浮き彫りにしていく」という感じの流れを想定して書き始めました。その為「美しさ」という印象的な表現を使った所があります。

そこにつなげるために強調したかったことは「プログラミングが文学性を持ち始めた」という部分。そして、そこを強調したいがために単純に反対側にあるであろう「数学性」を持ってきただけだったりするので、結構適当に扱っていますw すいません。

その二重性を強調することで「オブジェクト指向を理解する際に重要な2つの視点がある」ということをあきらかにしたかったわけです。そしてその2つの視点からオブジェクト指向言語の特性や、その特性を最大限引き出すために生まれた開発プロセスを分析してみると面白い発見があるのではないか? という思考実験が一連のオブジェクト指向に関する文章のテーマです。

これら文章を書いた目的はいくつかあります。

一つはオブジェクト指向初学者に対して「犬猫Example」以外の視点の提供という、玉砕必死の無謀な挑戦。もっともそういう人向けとしては難しい部分があるような気もしますが、心に引っ掛けておくと、勉強を進めた後の気づきを促しやすく成るぐらいの効果はあるんじゃないかなー、と淡い期待をしながら書いてます。

もう一つは、プログラミング経験がCOBOLや手続き型(構造化)言語で終わってしまって、オブジェクト指向言語でのプログラミング経験がないまま、設計、プロジェクトマネジメントしなければならない上司たちのかたくなな思い込みを砕く為の糸口の模索、です。

こういう人向けにプログラミング言語オブジェクト指向化したという小さく見積もられやすい変化は、あなたたちが思っているよりもずっと大きな変化なので、開発手法とかを抜本的に変えないとあなた達が期待しているような費用対効果の最大化、みたいなことは達成できませんよ、そんな事を暗に伝えたいわけです。簡単にいうと「やり方変えろや、ばーかばーか」ですw

その為にはこれら人たちが拒否反応を示す「カプセル化、継承、ポリモーフィズム」等のよくわからないオブジェクト指向関連の技術用語を抜きにして伝える必要があるので、そんな文章を書いてみた、というところがホントのとこだったりします。

実はこの文章はXPが流行りかけてた2003-5年位の時に思いついた文章なのです。その時僕はCOBOLerが設計したとおぼしき、クラス名が連番だったりするJavaのプロジェクトに入っちゃって、すごくむかついていたんです。だから、そういう人達の考え方を変えさせるには「何に気づかせたら良いのだろうか?」を考える必要があり、その時に思いついた説明方法なんです。発想した時期を考えれば古くなってしかるべき内容なのですが、未だに必要とされているんじゃないかと思える感じがいろいろと残念な感じです orz

まあ、思いついた時にBLOGに書いとけよ! って話なんですが、その頃BLOGを書くってこと自体が「おしゃれピープルのもの(当社比)」と思っていたので、原宿駅にはいけても竹下通りには入れない程度のオシャレさんな僕としては、BLOGは高い壁でしたw 

あとは、オブジェクト指向をよく知る人に対してビーンボールまがいの変化球を投げたら、新たに面白い発見があるかもしれないし、面白がってくれるかもしれない、なんていう目的も多少ありますw

そろそろ話を戻しましょうw

かたくなな思い込みとは

「プログラミングは価値の低い作業」とか
「プログラミングなしに設計はできる」とか
「ウォータフォールが叩かれているけど、まだいけるはず。つーか、これからっしょ

などの事です。

しかし、従来型の開発手法と比較すると、オブジェクト指向言語での実装を前提にしたプログラム設計において「プログラミングと言う作業が決定的に重要になってきている」という大きな変化があります。開発においてテストやリファクタリング等のプラクティス(テクニック)が重要になってきているということ考えれば明らかです。

が、この変化はオブジェクト指向言語でのプログラミング経験なしにおそらく気が付かない、あるいは痛感しない。特にプログラミングをしている時にこそ「よりよい設計に気づく、思いつく」という事実に気が付かない。この事に気が付かない人は設計と実装(プログラミング)は分離できると考えるか、そんなに問題を起こさないだろうと甘く見積もる、そんな気がしています。

この「甘く見積もる」ことの原因はどこにあるのだろう、と考えていた時に気がついたことが上記の「メソッドが持っている数学性と文学性という二重性」

この事に気が付いたきっかけはまた別にあるのですが、長くなったので、そこらへんはまた来週。だいぶ予定とずれた感じですが、重要なことなのでまだ脱線は続きます。