憂鬱本は死なぬよ。何度でもよみがえる

なんか定期的に JavaBlack さんからわたしの憂鬱本のエントリトラックバックが飛んできます。本当に「憂鬱本は死なぬよ、何度でもよみがえる...」なのかしら。

というわけで、JavaBlack さんのエントリの元のエントリを拝見させて頂きました。

今回はいつもと違って不思議な光景が浮かんでいて新鮮でした。だって、憂鬱本と Head First デザインパターンが軒を並べているのです。

憂鬱なプログラマのためのオブジェクト指向開発講座―C++による実践的ソフトウェア構築入門 (DDJ Selection)

C++ によるオブジェクト指向への本。
シューティングゲーム等を例に挙げて、その処理の責務を持つのはどっちのクラス?がわかりやすく書かれてます。
超良書、有名だよね。

Head Firstデザインパターン ―頭とからだで覚えるデザインパターンの基本

本屋で必ず目に入る本(笑)
パラパラめくった事ある人は写真だらけで、読まず嫌いしてる人もいると思います。
が、絶対読むべき。
デザパタ丸暗記じゃなくて、各パターンがどんな感じの仕組みになってるか、すげーわかりやすいです。

http://blog.usagee.co.jp/2010/11/23/level-up-programmer

方や ポリモーフィズムやhas-a を「大したことない」的に否定しちゃう本、かたやポリモーフィズムや has-a を重視して分析設計しちゃう本。・・・この二冊って水と油っぽいと思えるのだけれど、実際にプログラミングするとき「で、結局どっちなのさ」と混乱してしまわないかしら。


* * *


憂鬱本はOOを、概念を現実模写的に階層構造化して分類すること(=「モデリング」)と定義しているのですが、このアプローチって プログラムの設計としてよいものになるとは限らない・・最悪プログラムにそのまま落とせなかったりすることが多い「モデリング」だったりするのですよね。90年代後半のOOブームで(C++界隈で)コレをやってみて、結局「この生き方はダメですっ!(byちよちゃん」と実感した人は大変多いと思います。

このような「ダメですっ...orz」を痛感したプログラマにとって魅惑なのが、GoFデザインパターン。その序文

一度デザインパターンを理解し、「ん?」ではなく「あっ、そうか!」という経験をすれば、今までと同じ方法でオブジェクト指向設計をしようとは思わなくなるだろう。そして設計プロダクトの柔軟性、モジュール性、再利用性、および理解のしやすさをより高めるためにはどうすればよいかがわかるだろう。そしてまさしくこれらのことこそ、読者の皆さんがそもそもオブジェクト指向技術に興味を持った理由ではないだろうか

にも、「これ、これですよ!私たちが求めていた OOはっ!」とウンウンうなずいたモノでした。

また憂鬱本は、OO に対して「現実を模すもの」と拘りまくっている故に大変おかしなことになっているところもあって、具体的には、オブジェクトをコピーすること、クラスの属性にクラスを持つこと、一機能をオブジェクトに切りだして委譲すること、「状態」ではなく「振る舞い」を主体として抽象化したクラスやオブジェクトを作ること、を「現実にはそんなモノないでしょ」と切って捨てていて、それゆえ多態性を不当に軽視しています。

というわけで、今のご時世で憂鬱本に習うことは、結局 デザインパターン的な設計に まったく繋がらない(=プログラムの設計と分断された)分析モデルを作ることにしか成らないと思います。

憂鬱本自体がその分断を肯定していることが、また今となってはイけてないのですけどね*1。(今時は Domain-Driven Design 的に、モデルとコードの相互フィードバックを得られることが OO のメリットの一つと考えられてたり)

わたしは後知恵で「当時としてもおかしいでしょ?」と思うのですけど*2、当時としてはあれが良い本だった・・という意見も結構見ます。それは棚上げしても、今となっては良くない本だというのは、動かないかな、と思います。


* * *


初心者の感じる「わかりやすい」って、実のところ単に「読みやすい」でしかなかったりします*3。だから「読みやすい」は「役に立つ情報」と関係ないし、初心者が読んだ印象だけではそれが良書か悪書かを判断できません。

憂鬱本が多くの技術者に「有害」と言われつつも、いまだに高い評価をする人が絶えないのは「わかりやすい」本だから。

さらに厄介なのは、正しくなさをどんなに誰かが主張しても、初心者にはそれが正しいか否かを、主張している人が信じられそうか、とか、多くの人が言っている、とか、そんなことでしか判断できません。

Head First デザインパターンをおすすめだとわたしが考えるのは、本当に右も左もわからない「OO初心者」が「わかりやすい」と思ってくれることだと思ってます。「解りやすさ」じゃ憂鬱本に負けてないのが Good!

そう言う意味で、この本が憂鬱本と「並び立った」のはうれしいことかな?と思ったり。

*1:上手く実装に落とせないという実践上の実感と、そこは割り切るという結論は論理的には正しい

*2:Smalltalkへの言及があるのですが、絶対ちゃんとさわってないでしょ!・・という内容なのです。なのに 「言語を問わず OOP 全般にこの本は当てはまるよ」と言い切ってるのをみると、なんだかなー、と思わざるを得ない/多分Simulaもちゃんと弄ってないと思う

*3:http://d.hatena.ne.jp/kilrey/20090426