Hatena::ブログ(Diary)

カレーなる辛口Javaな転職日記 RSSフィード

2007年 08/25 初心者用オブジェクト指向の学習の手引き

オブジェクト指向プログラミングの学習法(初心者向け)

個人的な話をしますと、オブジェクト指向の入門書に出てくる、「クルマのたとえ話」とかは本当に意味わかりませんでした。こちとら、すっかり手続き脳なもので、そんなんでmainとかどうやって書くのよ?みたいな。<我ながらヒドイ

http://d.hatena.ne.jp/LazyCoder/20070806/1186417299

追記

PHPのオブジェクト指向を勉強してる。というか仕事での必要性を感じてやってるけど、正直オブジェクト指向の良さがさっぱりわからん。(中略)

よくあるオブジェクト指向の解説本には車がオブジェクトでタイヤがファンクションでみたいなんかいてるけど、実務で使うプログラムの設計の仕方がわからん。

http://anond.hatelabo.jp/20070427093912

こんな説明を読んで、なんだかわかったような気分になれる人は、どっちかというと思考力に欠ける人なんじゃないかと思います。「わけわからん」という反応のほうが技術屋としては正常でしょう。

いい加減、こういうわけのわからないたとえ話はやめたらどうかと。

あんなもん、わかったつもりの半可通と、理解できない挫折組を生み出すだけではないかと。

http://kmaebashi.com/programmer/object/naze.html

「パン屋さんの設計図がクラスで〜とか、cryってメッセージが送られると猫ならニャーニャー、犬ならワンワンって返ってくると考えると解りやすいですね」

とか言ってたけどむしろ解りづらいし…

上記のような例えで理解できる人は既に開発の経験がある人じゃないの?

なんて思ったものです。

現実世界は何でもオブジェクトとして考えられるとか言われてもピンとこなかったしね。

http://d.hatena.ne.jp/ysatou7250/20080501/1209652552

http://www.biwa.ne.jp/~mmura/SoftwareDevelopment/twentyfirstcentury3.html

http://d.hatena.ne.jp/JavaBlack/20070805/p2

これに関連して,改めて書くほどのことではないんだけど、初心者が学習する上で参考になるように一応まとめとく.特に初心者向け/入門レベルの話なので,ベテランには今更ほとんど参考にならないでしょう.

なんとなく書籍紹介っぽくなってしまったが,新しい技術を勉強する時に優れた書籍というものは圧倒的にコストパフォーマンスに優れるのだから仕方あるまい.*1


私の推奨する学習の順序*2は以下の通り.

  1. OOP言語を学ぶ.
  2. そのOOP言語のイディオムやコーディングテクニックを学ぶ.
  3. GoFデザインパターンを学ぶ.
  4. OOPの設計原理を具体例(ソースコード!)を交えながら学ぶ.
  5. リファクタリングを学ぶ.
  6. 第二OOP言語を学ぶ.
  7. オブジェクト指向プログラミングそのものを理論的に学ぶ.

このうち1,2,3までが必修科目.4,5は推奨.6,7は選択科目.

また言語,イディオムを学び終えたあたりから,実際にプログラムを書いたり,良いソースコードを読んだりするのも大切だ.フレームワークやライブラリのコードを読んで,設計や様々なテクニックを理解する必要もあるだろう.プログラミングを座学だけで体得するのは非常に難しいのだ.*3


毎度お馴染み参考書リスト: http://d.hatena.ne.jp/JavaBlack/20070522/p1

「オブジェクト指向を教えるとき、どの言語がよいか?」

  • ここ数年、オブジェクト指向を覚えるときには、Javaが使われてきました。(以下略)
  • 選択肢とは、RubyPythonのことです。両言語とも、動的型言語です。静的型言語と一緒に使えるようになってれば便利だと思います。
  • 私は、まずは言語を使って、何かできるようになるほうが断然いいと思いますね。私にとってソフトウェア設計とは、数学みたいなものなんです。読んだり聞いたりするだけでは、なかなか理解が深まりません。

http://capsctrl.que.jp/kdmsnr/wiki/bliki/?LanguageForLearningObjects


1,2,3:必修科目

まず最初にOOP言語を最低でも何か一つ学ぶべきだ.OOP言語にはOOPのエッセンスが詰め込まれており,言語を学び,それを使いこなすことはそのエッセンスを理解することに繋がる.また知っている言語がないと具体例を示すことができず,「犬がワン,猫がニャー」だの「部長が起立!」だのと言った理解しにくく実用性のないたとえ話に終始してしまう.*4 *5

学ぶべき言語としては,まともなOOP言語ならどれでもいい.特に現在の仕事で使っている/使う必要のある言語があれば,それで十分だ*6.誰かに教わることができるなら,その人の意見を聞こう.多くはその人が使っているのと同じ言語を学ぶことになるだろう.特に理由がない場合は,Java,Ruby,Pythonは有力な候補になる.

言語解説書もまともなものを選ぶこと.Javaならば「プログラミング言語Java」が最有力候補だ.

追記:ピアソン桐原が撤退により絶版.別会社から再出版されました.2014年現在でも最新版です.Java8も出たことだし,そろそろ5版が出てもいい頃合いなのだが.


プログラミングRuby 第2版 言語編

プログラミングRuby 第2版 言語編


文法などの基本だけでは,その言語の理解は不十分だ.ここは言語によって異なる.Javaだったら「Effective Java」*7,C++だったら「Effective C++」や「C++ Coding Standards」などだろうか.実はこの部分こそが,言語を学ぶ上で一番量が多い部分だと思う.*8

Effective Java (English Edition)

Effective Java (English Edition)

注:原書だと3版が登場している.

Effective Java 第2版 (The Java Series)

Effective Java 第2版 (The Java Series)

Effective Java (Java Series)

Effective Java (Java Series)

追記:ピアソン桐原撤退により絶版.別会社より再出版されました.

EFFECTIVE JAVA 第2版 (The Java Series)

EFFECTIVE JAVA 第2版 (The Java Series)


追記:ピアソン桐原撤退により絶版.別会社より再出版されました.

Effective C++ 第3版 (ADDISON-WESLEY PROFESSIONAL COMPUTI)

Effective C++ 第3版 (ADDISON-WESLEY PROFESSIONAL COMPUTI)


追記:ピアソン桐原撤退により絶版.再出版もなし.


GoFもそういう具体的なノウハウの一つだ.ただしプログラミング経験が少ないと理解できないかもしれない.


4,5:推奨科目

LSP*9のような設計原理やリファクタリングのようなテクニックについても,一応は知っておく方がいい.設計原理は「C++ Coding Standards―101のルール、ガイドライン、ベストプラクティス (C++ in‐depth series)」にも,一部含まれている.

http://www.morijp.com/masarl/homepage3.nifty.com/masarl/article/oo-principles.html

http://d.hatena.ne.jp/JavaBlack/20180617/p1

追記.基本的で王道のテクニックが説明されてる.入門者が手を出してもかまわないだろう.


追記:ピアソン桐原撤退により絶版.再出版もなし. 丸善より再出版された.


リファクタリングも重要ではあるが,ある意味で非常に地味な技術で全て丸暗記する必要はない.センスのある人ならば臨機応変に対応するだけで十分かもしれないが,センスのない人は一度一通り目を通しておこう.

追記:ピアソン桐原撤退により絶版.再出版もなし.

さらに追記:再出版された.


6,第二言語を学ぶ

一つの言語を学ぶだけでなく,他の言語を学ぶことはプログラミングを理解する上で重要だ.たとえ第一言語ほどには使いこなせなくても,異なる言語から得る物は多い.OOPの理解においてもこれは変わらない.

第二OOP言語を選ぶときは,似たような言語は可能な限り避けるべきだ.Java,C#,C++のように似た言語を複数学んでも時間の無駄だ.Javaのような静的型言語を学んだ人はRubyやPythonのような動的型言語を,動的型言語を学んだ人は逆に静的型言語に挑戦してみるのが良いだろう

関連

http://d.hatena.ne.jp/JavaBlack/20070726/p1

毎年1つは新しい言語を学べという『達人プログラマー』の教えが何よりの裏付けだ。この要点は、プログラミング言語はプログラミングについての考え方に影響を及ぼすもので、新しい言語を学ぶことは、問題を別のやり方で解くことを考える大きな手助けとなるだろうということだ。(この利益を得るためには大きく異なった言語を学ぶことが大事だ。JavaとC#では似すぎていて有効でない。)

http://capsctrl.que.jp/kdmsnr/wiki/bliki/?OneLanguage


最近Ruby MLで出ている,以下の件も興味深い。

ですから、将来ありえる組み合わせは

* 1.8のまま、順序は導入しない

* Hashに順序を導入する(ただし、インスタンス変数やシンボルテーブルなどにはない)

のいずれかではないかと。気持ち的には後者に傾いています。

http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/43930

この発想はJavaではあり得ないだろうな.RubyとJavaとでは単に言語仕様が異なるというだけでなく,ライブラリの設計思想まで異なるのだろう.

7,オブジェクト指向プログラミングそのものを学ぶ

ここで始めて「オブジェクト指向とは何ぞや?」みたな話になる.この順番を間違えると,まるで理解できずに消化不良になるのも当然だ.ただし消化不良になるのを覚悟の上でなら,もっと早い段階で読んでおいても構わない.むしろその方が好ましい側面もある.

カモノハシ本の方が初中級者向け*10.できれば原書第三版の方が良い.これも日本語訳が待ち遠しい良書の一つだな.

注:1990年〜2000年初頭くらいまでなら,とても有名でお勧めの良書だった.その時代にOOPやっててカモノハシ本を知らなかったらモグリなレベル.しかし今では出版から十年以上経過して基本はだいたい使えるものの内容も若干古くなり(特にGoF周り),且つ入手困難で中古市場でも価格が高騰しているためにお勧めできない本になった.

もしKindleで再版されて値段が三千円以下,できれば二千円くらいになれば,古いながらも若い人にもお勧めし易い良書となるのだが...


*1:念のため言っておくが,執筆も翻訳もアフィリエイトもほとんど儲からない.せいぜいバイト代程度だ.それでもROIという視点ではアフィリエイトが一番効率的かもしれない.

*2:要するにカリキュラムみたいなもんかな.

*3:そういう意味では水泳のようなもの.座学だけの「畳水練」は間違った学習法なのです.
とはいえOJTオンリーで座学無しという人は,さらに困りものなのだが.

*4:物理や数学の専門書で数式を使わないものがないのと同じ.ソースコードを読めない人は,プログラムの話ができないのだ.

*5:一口に「オブジェクト指向プログラミング」と言っても,細部においてはそれぞれ微妙に異なる漠然としたものなのだ.「JavaにおけるOOP」と「RubyにおけるOOP」と「C++におけるOOP」が全部違っていたりする.もちろん違いはそれほど大きな物ではないのだが初心者を混乱させるには十分すぎるだろう.複数の言語を全部まとめて「OOPとは何か」と始めるよりは,ただ一つの言語に軸足を置いて「その言語におけるOOPはどんなものか」を学習する方が初心者には理解しやすいと思う.一般論については,その後で学べば良い.

*6VBはまともなOOP言語じゃないし,変な癖が付くので止めた方がいい.C++は初心者が使うには複雑すぎるけど,今使う必要があるのなら許容範囲だ.

*7:Effective Javaは原書第二版(ISBN:0321356683)が予定されている.洋書が予定通りでも今年中,和書が出るのは早くても来年半ばくらいだろう.

*8http://d.hatena.ne.jp/JavaBlack/20150201

*9:"Liskov Substitution Principle".「リスコフの置換原則」などと呼ばれる.
http://en.wikipedia.org/wiki/Liskov_substitution_principle

*10:実はアフィリエイトを設定して以降,このサイトを通じて地味に売れ続けているヒット商品.「オブジェクト指向とは何ぞや」で悩んでいる人がいかに多いかということの現れかもね.