日々常々

ふつうのプログラマがあたりまえにしたいこと。

オブジェクト指向が浸透していない現状

オブジェクト指向プログラミング言語を使っているにも拘らず、OOPオブジェクト指向プログラミング)が出来ていない例は枚挙に暇がありません。趣味や仕事に関わらず、使われている言語の多くはOOPが出来ますが、このOOPってのが厄介なものというイメージを持たれているためか、積極的に用いられていなかったりもします。積極的でないだけならともかく、消極的であったり、忌避しているところすらあります。

先日、SIer の友人が新人研修の講師として Java を教えるというお話を聞きました。会社側からは「Java を教えるのではなく、"プログラミング" を教えてほしい。オブジェクト指向は教えないでください。」との指示を受けたそうです。

http://d.hatena.ne.jp/t2y-1979/20090510/1241958803

こういったのが現実としてあったとしても(流石に遭遇したことは無いので)すんなり納得できてしまうくらい、少なくとも私の周囲の開発現場においてOOPは浸透していません。

原因としてはいくらか挙げられます。
ひとつは従来の手法を踏襲したほうが上手くいくという、経験則から逃れることが出来なかったからです。多くの現場は未だウォーターフォールです。ウォーターフォールにもいいところはあるけれども、形にとらわれ過ぎるあまり欠点ばかりが目立ちます。たとえば製造工程は設計工程の後、設計工程は要件定義工程の後となっていて、順番通り進むことが義務付けられています。手戻りなんて発生すると大量の書類を書く破目に陥るため、それを極端に嫌い、前工程での誤りはありえないこととしてお茶を濁しつつ誤魔化し誤魔化しプロジェクトは進んでいきます。*1この何がいけないのかというと、要件定義や設計が上流工程と呼ばれ、スキルのあるとされる勤続年数の長い人にこれらの工程が割り当てられるということ。OOP言語に触れた事も無く、OOD(オブジェクト指向設計)の勉強をしているわけでもない方々が、従来と同じ手法で、従来と同じ書式で設計書というものを作り上げます。それらは手続き型プログラミングでの実績であり、その設計に従う限りOOPは困難になります。設計書を紐解いて頭の中で設計しなおして実装しなければなりません。そして製造工程は下流工程と呼ばれ、あまり技術力も無く、経験も浅い新人に近い方々の仕事になることが多いです。手続き型プログラミングではそれでも問題はなかったかもしれませんが、OOPでは問題だらけなのが現状です。
ふたつめとして、OOPに関するネガティブなイメージがあるからです。先にも書きましたが、製造は下流工程となっているため、それほど重要視されていない現状があります。言ってしまうと「動けばいい」という考えで管理されます。実装がどうなっているかまで突っ込まれる事は殆ど有りません。なぜなら突っ込む人が見ても判らないから。OOPはぱっと見複雑にはなります。手続き型プログラミングと同じ観点で見ると、内容の理解は厳しくなります。多少勉強しないと、実装の詳細を読む事は出来ません。そしてOOP言語の弱点がここに隠れています。同じような書き方で、全く方向性の違う、トンデモな実装が可能なことです。誤った理解のもとで、思いつきの実装がされたコードは最悪です。たとえばオーバーロードの誤用とか。これらは読み解くに困難で、挙動も怪しく、容易にバグが潜み、またバグの温床になります。こういったことを経験した方々は、OOPを避けるようになることでしょう。
みっつめに、OOPの勉強が難しいことにあります。はっきり言って難しいです。書店に行けば「オブジェクト指向なんちゃら」と言ったタイトルの本は溢れかえっていますが、その殆どが役に立ちません。役に立たない理由は、その本に書かれていることは、著者による実装であり、さらには日本語による実装になってしまっているからです。そのものの解説ではなく、ひとつの実装の解説になっているので、本に書いていることは数ある側面のひとつに過ぎません。一冊や二冊程度で全てを説明しきることは不可能だと思います。複数の本にあわせ、他の知識による別の側面を組み立てることでやっと理解出来るようなものです。入門書の類では、概要の理解ですら厳しいかもしれません。と言うか概要の理解が出来れば十分かもしれません。


私の周囲では、Javaを使っているにも拘らず、手続き型に近い記述だったり、トンデモOOPだったりで実装されたシステムが溢れています。それらは危ういバランスの上に奇跡的に成り立って今日も動き続けています。これらを奇跡のシステムと呼んでいます。奇跡はいつまでも続かないと思います。でもそれらは既存様なので、手を入れることが出来ません。非常に悶々としています。いい加減致命的なあのバグが表面化して、丸ごと作り直しとかにならないものか、とか思っているのですが、そこはさすが奇跡のシステムと言うことで全く問題なく今日に至っています。どうしたら打破できるんだろうか。

*1:そしてデスマーチへ。