プログラマというお仕事

プログラマは職人だ!プロならもっと腕を磨け。
世の中ヘボいプログラマが多すぎる。
少々過激な意見でも言っちゃうよ。

オブジェクト指向

オブジェクト指向超入門

世の中のいわゆるプログラマ、システムエンジニアと呼ばれる人たちのうち、オブジェクト指向を本当に理解して実践できる人はほとんどいません。私のこれまでの経験では5%くらいがいいとこかな、という実感です。要するにプログラマをどっかから20人かき集めてきたら、その中に1人くらいわかってる奴がいればラッキーという事です。もちろんプロの世界での話ですよ。

プロのくせに勉強が足りない!と言ってしまえばそれまでで、実際問題それはその通りだと思います。思いますが、教える側にも問題はあります。きちんと他人に教えられる人があまりに少なすぎるんですよね。
考えてみれば当たり前で、本人がわかってるのと、それを他人にも伝えられるのとは別の話で、わかってる人が5%しかいないなら、その5%のうちの何%が他人にうまく説明できるかって考えれば、全体の1%にも満たないわけですね。

プログラミングの初級〜中級者レベルの人が初めてオブジェクト指向を勉強しようとする時に、大抵の場合まずは「オブジェクト指向入門」とかいうタイトルの本やサイトなどを探す訳ですが、このレベルの人に理解できるようにオブジェクト指向をやさしく解説している記事はほとんど見たことがありません。

オブジェクト指向とは、現実世界の物理的あるいは抽象的なモノや事象を、属性と操作の集合としてモデリングすることです。
オブジェクト指向ではオブジェクトの振る舞いをメソッドとして定義し、オブジェクト同士が相互にメッセージを交換する事によりシステム全体の振る舞いを決めていきます。

はぁ?
こういう文章を書く人は、入門レベルの人間がこれを読んで「なるほど!」と納得できると、本気で思ってるんでしょうか。

難しい事を難しく説明するのは、実はそれほど大変なことではありません。難しいことを如何に易しくわかりやすく説明するかの方が、よっぽど大変で頭を使います。さらに言うと、オブジェクト指向はここまで難解な日本語を使わないと説明できないほど難しい概念ではありません。
結局こういうのは簡単な事をわざわざ難しく説明しているだけで、こんな説明をいきなりされるもんだから、オブジェクト指向はきっと物凄く難しくて特殊な考え方なんだろう、と勘違いしてしまう人が多いのだと思います。そして中途半端にわかったようなわからないような(結局のところ本質は何もわかってない)状態にさせられるプログラマのなんと多いことか。

でそのまま実際のオブジェクト指向言語での開発現場に突っ込まれてソース修正とかやらされる訳ですよ。ところがソースを見てみると思ったよりどうって事もなく、それまでのプログラミング知識で別にどうにかなりそうだなって感じで、わかった気になってそのまま数年経ったら・・・はい、ヘボプログラマがまた一人生産されましたっていう結末です。
プロジェクトに放り込まれた時にあなたが見たそのソースは、今のあなたと同じようなヘボい先輩方が書いたもんだから、それをお手本にしちゃったあなたもヘボくなってしまい、そんなあなたの書いたソースをお手本にしている新人君は未来のヘボプログラマ候補で・・・というように、ヘボプログラマ量産スパイラルが出来上がってしまっているのが現状ではないでしょうか。

そこで普段初心者の方を相手にプログラミングを教えている経験から、『要するにこういうこと』っていうオブジェクト指向の考え方を、なるべくわかりやすい日本語で説明してみたいと思います。

オブジェクト指向設計をああだこうだと深く議論していくと、手段と目的がわかんなくなっちゃう人が時々います。
『こういう場合はAdapterパターンを使って、このクラスをこういう風に継承させて、コイツはこのインターフェースを使うようにして、そんでもってホレホレ・・・』と複雑怪奇なクラス図を描きだします。
どちらかというと勉強熱心でなおかつ自分はイケてるエンジニアだと思ってる人に多いですね。確かにある点では優れている部分もあるし全くダメダメではないんだけど、それにしても、ねぇ・・・ちょっと難しすぎんだよなぁ。そこまでこねくり回さなくても、もっとシンプルにできるじゃん。
というような事を言うと『お前はデザインパターンも知らんのか』などとバカにしてきたりして。
これってあんたの自己満足が8割だろ?て感じで、クラス設計そのものが目的になっちゃうパターンにはまる事があるんですよね。

オブジェクト指向の目的は、同じ処理を複数の箇所に分散させない、処理する範囲を明確に切り分ける、などにより結局のところバグや仕様変更に強い、メンテナンス性の高いシステムを作るためのものであって、オブジェクト指向そのものは単なる手段でしかありません。
そんなわけで基本中の基本となる概念の部分を中心に説明します。実はその部分こそがオブジェクト指向の超チョ〜大事なところで、そこがわかってないで、アクセス制御だとかインターフェースだとかの文法的な知識だけなもんだから、オブジェクト指向の本質がわからない人ばっかりなのだと思うのです。

JAVAってそんなにいい?

作ろうとしているシステムに一番いい言語は何かを決めるのはSEと呼ばれる人の仕事のひとつです。顧客の要件を分析し、開発工数やランニングコストなどを総合的に判断して最適なプラットフォームを決定します。が、そのSEがコードすら書けないようなダメ人間だと別の基準でプラットフォームを決めてしまい、その後の開発工程でやっかいな事になるケースが多々あります。別の基準とは『最近流行ってるみたいだから』という、その辺のコギャルと同程度の思考回路です。

最近は何にでもJAVAを使いたがるシステムを良く目にします。スタンドアロンで特定の端末でしか使用しない小さなプログラムなのにEXEにしないでJAVAアプレット。セキュリティが問われる情報を扱うでもなく、IT専門の部署がある訳でもないし、とにかく安価に拠点間を結んで情報共有したいというだけのニーズなのに、自前でサーバを立ててJAVAサーブレット。こんなソリューションを提案するSEの頭の中にあるのは『JAVAなら安心安全で生産性も高くて、なんだか知らんけど立派なシステムなんでしょ?』みたいな、どこで聞いたかわからないあやふやな知識だけです。
JAVAならみんな使ってるから、JAVAなら有名だから、JAVAならオブジェクト指向だから・・・だってJAVAなんだから・・・。

誤解の無いように言っておくと、私自身はJAVAは割と好きな言語なんですよ。特にオブジェクト指向は正しく使えばとても強力な考え方だと思います。しかし上記のようなヘボいシステムでは、まず間違いなくオブジェクト指向とは程遠いコードで書かれています。もっとはっきり言います。世の中の自称JAVAプログラマの95%はオブジェクト指向を知りません。かなり過激な意見だと思うでしょうが、私の経験上では決して大げさではなく実感です。

そのシステム、PHPとMySQLで良くない?
こう言うと訳知り顔の技術者(上記のヘボSEを含む)から一斉攻撃に合います。それを承知で、そんな攻撃を技術的に論破できるだけのスキルを持ち合わせた上であえて勇気を持って主張できる人って本物の技術者だと思います。
技術者はユーザーの満足の為にシステムを開発するべきです。ユーザーが良しとするならそれでいいんです。自身の知的欲求や自己満足の為であってはなりません。そういうのは趣味で好きなだけやって下さい。我々はプロなんですから。

やさしいJAVA?

ブログネタ
Javaの学習法 に参加中!

初心者がプログラムを独学で覚えるのは難しいと思います。失敗すると間違った方法で勉強を進めてしまい、スキルアップのベクトルを誤ってしまう危険がかなり高いと感じています。プログラミングを覚え始める最初の1年目で方向を誤るとその後の進歩に大きなマイナスになります。

独学で本を読んで勉強した経験のある初心者以上,中級者未満の人に対して、現在プログラミングスクールでJAVAを教えています。やはり勉強の方法を間違えてしまっていて、言語の文法の表面をなぞった程度の知識しかない人です。『まず本から得た知識はいったん全て忘れるように』と言うのが最初の講義でした。私の教え方は本に書いてある事とは違う方向からの説明なので変な先入観はかえって邪魔です。特にオブジェクト指向の考え方については、変な予備知識があるほど間違って理解されてしまいがちです。

実は現役のプロのプログラマの中でもオブジェクト指向を真に理解し実践できる人はほんのわずかです。その理由を考えてみると、オブジェクト指向以前の古いプログラミングスタイルの知識が邪魔をして、技術のパラダイムシフトに着いて行くのを難しくしているのではないかと思います。
このような古い考え方から抜け出せない技術者が寄ってたかって設計したシステムが旧態依然のひどいものである例を、私は今までいくつも見てきました。その話もいずれ書きたいと思います。

話を戻して、この受講生が独学に使ったという本を買ってきて参考までに読んでみました。割と有名な本らしく、ネット上などでも良い評判が多く見られました。まぁ、あまり期待はしていませんでしたが、これはひどい...
世の中のプログラミング初心者は本当にこの本を読んで『やさしい』と感じるんでしょうか。この本を読んで本当に実用的なプログラムを書ける人がいるとしたら、その人は最初からどんな本で勉強したって出来るくらい頭のいい一部の人間に違いないです。

だって、乗り物クラスを継承して車や飛行機を作ろうだの、動物クラスから犬クラスを継承して「吼える」メソッドを呼んだら画面に「ワン」と表示されますだの、いったい何の話をしてるのやら。『それがいったい何の役に立つんだ』という部分の説明が全くないんです。
上記の『オブジェクト指向を真に理解できていないプロ』の人達にも共通する点はここです。実際の業務システムのどの場面でどのように役に立つかの説明がないまま、単に文法の仕様書を『やさしいつもり』に書き直してるだけです。東大を卒業できるほど基本的に頭がいい人ならともかく、万人が理解できる説明ではないんじゃないでしょうか。

決して特定の固有名詞を出して筆者の方たちを悪く言うつもりはありませんが、私の個人的な見解では『○○言語入門』とか『やさしい○○言語』のようなタイトルの本は決して『優しく』ありませんでした。私ならそれをもっと『易しく』教える自信があります。採算を考えずに私がプログラミングスクールを続けている理由はその一点です。