2007-07-17

プログラマの方のための第3回: オブジェクト指向のコツ

 これまでに、たくさんの新人プログラマの方々と触れ合う機会がありました。
また、実際教育に携わった経験も幾度もあります。
さらに、自分自身の経験も考え合わせ、私はオブジェクト指向を学ぶコツがあることに気づきました。

そこここで折に触れて書いたことと、かぶってる部分も多いかと思いますが、ここでちゃんとまとめてお話ししておきたいと思います。

コンテンツ

  1. 大きな誤解
  2. オブジェクト指向のホント
  3. 言語があなたを制限する
  4. 克服しましょう
  5. でも最後には結びつけないと



大きな誤解

多くのプログラマの方が、オブジェクト指向について大きな誤解をしたまま、オブジェクト指向を学びはじめるようです。
その誤解とは、オブジェクト指向はオブジェクト指向言語に含まれるものだというものです。
本の誤解
実際、書店に行ってみると「~言語で学ぶオブジェクト指向」だとか「よくわかる ~言語オブジェクト指向」みたいな本が多いですね。
本の内容を見ても、やはりプログラマ向けの本ですので、サンプルコードがいたるところに書いてあります。
プログラマは、ほとんどの知識を本とWebから得るものです。
先輩に聞くってこともありますけど、その先輩だって、やっぱり元ネタは本かWebです。
ですから、本が偏っていればプログラマも偏りやすいのは、当然です。
どうしたって、多かれ少なかれ世の中に出回ってる本ってモノは「売れセン」というものによってゆがめられているものです。
そこは、覚えておいて下さい。
それによって、あなたの知識までゆがめられないように。
新人研修の誤解
会社の技術者新人研修では、最初に勉強するのは何ですか?
Javaか、Cか、VBあたりですか?
オブジェクト指向ってことは、まずないんじゃないでしょうか。
普通、会社がしたいのは、人材をできる限り早く実戦に投入することです。
長い目で見て、あなたがどれだけ優れた技術者になるのかというのは、その次の問題なんです。
そして、その次の機会というのはたいてい来ないことになってます。
プログラマの誤解
そもそも自分自身が、プログラミングがやりたくてプログラマになるわけですから、入ってくる情報の全てをプログラミング言語と直接結びつけて考えたがるのも、当然ですよね。
これは、プログラマをはじめる際には、宿命的なものかもしれませんね。
そんなわけで、オブジェクト指向がオブジェクト指向言語に含まれるなんて誤解してしまうのは、実に自然なことです。

オブジェクト指向のホント

でも、事実はそうではありません。
オブジェクト指向は、プログラミング言語とは直接関係のない考え方、あるいは物事の捉え方です。
プログラミング言語の方が、それぞれにその考え方を取り入れているんです。
プログラミング言語とオブジェクト指向は、もともと関係のないものとして存在していました。
そのうち、プログラミング言語のうち、あるものがオブジェクト指向を取り入れました。
それで、オブジェクト指向言語ができた。
実際の歴史とは違いますが、そういうふうに思っていただければ、それぞれの立場がわかるのではないでしょうか。
それぞれのオブジェクト指向言語は、オブジェクト指向の全てをまったく同じように取り入れているわけではありません。
それぞれの言語設計者は、オブジェクト指向について独自の見解をもっています。
ですので、それぞれの「こうあるべき」という思想に従って、独自の解釈で取り入れられているのです。
その解釈にとって都合がいいところは生かされ、よくないところは殺されています。
また、多くの言語はオブジェクト指向を取り入れる以前にも広く使われていた歴史を持っています。
オブジェクト指向でない時代にその言語で作られた、多くのアプリケーションがあるのです。
それらのプログラミング言語は、そういうレガシーな資産の動作を保証せざるをえませんでした。
「もう、古いアプリケーションは全く動作しませんよ」
なんて言ったら、誰も使ってくれませんから。
それに、オブジェクト指向導入前の技術者をそのまま移行させることで、使い手の数を確保したいという戦略もあったでしょう。
そういうわけで、オブジェクト指向言語なんだけど、オブジェクト指向でない特徴が色濃く残る言語もあります。
  • オブジェクト指向言語がオブジェクト指向の全てを同じように実装しているわけではない
  • オブジェクト指向でない特徴を持ったオブジェクト指向言語も多い
ことから、オブジェクト指向言語を勉強しても、オブジェクト指向自体を学ぶことは難しいわけです。
逆に、オブジェクト指向自体を知らなければ、あなたが使用するオブジェクト指向言語が、なぜそういうふうな設計になっているのか理解することは難しいでしょう。
もう一度言いますが、オブジェクト指向言語には、言語設計者のオブジェクト指向に対する解釈が反映されているからです。

言語があなたを制限する

あなたが既に何かのプログラミング言語を経験済みであるなら、あなたの思考はそのプログラミング言語によって制限されています。
言語と文化
私たち日本人は、モノを考えるときには日本語で考えます。
英語がネイティブの人は、英語でモノを考えるはずです。
ということは、私たちにとって母国語のボキャブラリにない概念を考えることは、難しいということになります。
また、日本語で表現することが難しいニュアンスは、また考えることも難しいのです。
このようなことは、その言語を使う人々の文化と深く関連しあています。
文化が言葉を作り、言葉が文化を作るのです。
プログラミング言語も同じです。
私たちは、プログラムについて考える際、自分が最も得意とする言語のボキャブラリと文化で考えます。
オブジェクト指向の困難
あなたがもし、非オブジェクト指向言語が一番得意であるなら、オブジェクト指向を学ぶことには、それなりの困難が伴うでしょう。
なぜなら、あなたの得意とするプログラミング言語には、オブジェクト指向に関するボキャブラリもニュアンスもないからです。
あなたは、その言語で考えている限り、オブジェクト指向を理解することができません。
また、もしあなたがオブジェクト指向言語の一つを得意としていても、やはり他のオブジェクト指向言語を学ぶには、それなりの困難が伴います。
あなたの言語では殺されていたオブジェクト指向の特徴が、新たな言語では生かされているかもしれないからです。
そうすると、そこに関するボキャブラリは、やはりあなたの言語にはないのです。
また、その逆もあるでしょう。
そういう場合、この困難さは「この言語では、なんでこれがないんだよ!」という不満となって現れます。
そういう言葉、よく聞きませんか?
では、こういった困難はどうやったら克服、あるいは回避できるのでしょうか?

克服しましょう

まず第一に、プログラミング言語とオブジェクト指向は別物だということを念頭に置いて下さい。
とすると、プログラミング言語とは別にオブジェクト指向を学ぶ必要があるということになりますよね。
次に私がオススメしたいのは、プログラミング言語より先にオブジェクト指向を学ぶことです。
なんといっても、ソフトウェア開発者がオブジェクト指向を学ぶのは、分析や設計、プログラミングなど、結局ソフトウェア開発のため以外の何ものでもありません。
だからこそ、プログラミング言語とオブジェクト指向を結びつけてしまうわけです。
先にプログラミング言語を学べば、あなたはオブジェクト指向を学ぶ際に、プログラミングのことにアタマを奪われずにはいられなくなるでしょう。
何か新しいことを聞くたびに、いちいち「これはどうプログラミングすればいいのだ?」と考えてしまうのです。
まだ全て理解したわけでもないのに、いちいちこんなことを考えていても、まったくのムダです。
でも、そうせずにはいられないのです。
だから、できればぜひ、プログラミング言語の前にオブジェクト指向を学んで下さい。
会社の研修でどうしてもプログラミング言語から先に学ぶことになってしまうというのであれば、その前にご自分でオブジェクト指向を学ばれることをオススメします。
どうしてもそれができないのであれば、もうできる限り早いうちにオブジェクト指向を学ばれることをオススメします。
あなたのプログラミング言語への執着が、できるだけ弱いうちに。
もしあなたが、何かのプログラミング言語について、既にけっこうな経験を積んでいる場合、そういうわけにもいきませんよね。
そういう場合どうするか?
とにかく、オブジェクト指向とプログラミング言語を切り離して考えて下さい。
全く別物として勉強すること、それが秘訣です。
そして、功を焦らないで下さい。
小さいことを一つ学ぶたびに、いちいち効果が出るなんて考えないで下さい。
オブジェクト指向は、銀の弾丸ではありません。
あなたがしかるべき知識を身につければ、効果は必ず出てきます
このサイトでは、技術者でない方にも理解していただけるように、できる限りプログラミングに触れずにオブジェクト指向を解説することを目標としています。
プログラミングがはじめての方は、基礎編からじっくり読んでみて下さい。
経験がおありのかたは、基礎編をざっと読んだ上で発展編原則デザインパターンあたりを読んでみてはいかがでしょうか。
発展編原則デザインパターンなどは、これからどんどん内容を充実させていくつもりです。
今ある記事を全て読み終わった後も、ときどき覗いてみて下さい。
また、過去の記事についても、よりわかりやすくするために、ときどき内容を書き換えていたりします。
気が向いたときには、そちらも覗いてみて下さい。

でも最後には結びつけないと

その上で、最終的には、もちろん実際のソフトウェア開発に結びつけていかなければ意味がないですよね。
サンプルコードなどを使って、より実践的な解説をされているサイトなら、Web上にたくさんありますし、本もたくさん出ています。
このブログでオブジェクト指向がある程度理解できたなら、次はそういったところで、実践への結びつけかたを学ぶといいかもしれません。
たとえば
とか。
他にも「オブジェクト指向」とかのキーワードで検索すれば、いろいろ出てくるのではないでしょうか。
本に関しては、このブログのカテゴリ
にいろいろあります。
本関係のカテゴリは、今後も増やしていくつもりですので、そちらにもご期待ください。

0 件のコメント:

コメントを投稿

Related Posts Plugin for WordPress, Blogger...