まちがいだらけのオブジェクト指向

http://itpro.nikkeibp.co.jp/article/COLUMN/20060329/233754/

オブジェクト指向は分かりにくい」…。

そりゃ,こんな間違った説明をしていれば理解できなくて当然。

カギは「人間にとって自然な考えであること」の認識だ。

それは初心者向け入門書に良くある間違いの一つ.*1

同社がシステム開発に使うプログラミング言語は,Visual BasicCOBOLが中心。昨年ごろからJavaの開発案件を意図的に増やし始めた。

いくらなんでもCOBOL/VBプログラマーに,Javaをいきなり使わせるのは無謀では?

COBOLはもちろんのこと,VBも非オブジェクト指向言語.特にVBは一種特殊な設計思想を持つ言語だから,あの設計思想にドップリと浸った人はそれ以外の言語への敷居が高い.図2なんてのは,過去の失敗経験から抜けられない者が陥りやすいパターンの一つだ.

VBを使い慣れたSEやプログラマオブジェクト指向を理解して,Javaを使いこなせるようになるのは,けっこうハードルが高いと感じている

さもありなん.「VBに慣れている」というのが,「理屈も分からずにVBを使っています」と同義という場合もあるからな.

なお,オブジェクト指向言語同士,非オブジェクト指向言語同士でも異なる言語への移行は必ずしも楽ではない.例えば手続き型しか使ったことがない人が関数型言語にを使いこなすのはかなり難しく,発想を一から変える必要がある*2.CとJavaも素人目には一見見た目は似ているかも知れないが,CからJavaJavaからCというのもかなり難しい.例えばメモリ管理や静的/動的な型の取り扱い,メモリアクセス,ライブラリなどの方式や設計思想が全く異なる.Cの常識はJavaの非常識だし,その逆も同じ.

Javaオブジェクト指向だから」というのは,VB/COBOL(しか使えない)プログラマーJavaが使えないことの言い訳としては弱い.

JavaC++をはじめとするプログラミング言語は言うに及ばず。パソコンのユーザー・インタフェースは,1つひとつのプログラムをアイコンで表し,直感的な操作を可能にするGUI(グラフィカル・ユーザー・インタフェース)が主流である。GUIは言うまでもなくオブジェクト指向の考え方で作られたものだ。

それらはオブジェクト指向違いね.*3

「分かっているようでいて,人によってオブジェクト指向の理解度に大きな差がある」

この記事のように,堂々と間違ったことを教えていることも多い.教える側が理解していないのだから,教えられる側が理解できるはずもない.

「そもそもオブジェクト指向という言葉自体がよく分からないという声をよく聞く」と話す。(中略)
オブジェクト指向には「継承」や「抽象化」,「メッセージ」,「振る舞い」など,“ITらしくない”言葉が数多く登場する。これらの言葉が災いして,「慣れていない人からすれば,なんでそんな言い回しをするのかと,不思議に思えてくるようだ」(同)。

専門用語だから聞き慣れてなくて当然.そんなのが言い訳になるか.

異なる機能を持つ異なる概念なのだから,用語が聞き慣れているか否かは問題ではない.むしろ聞き慣れた用語のように見えるのが問題なくらいだ.*4

「ITらしくない」に関してはどういう意味だ?まさかカタカナ語とアルファベット以外はIT用語でないとでも?不勉強だね.*5

オブジェクト指向Javaに関する参考書から,オブジェクト指向の定義を抜き出したものだ。

Object-Oriented Software Construction (Book/CD-ROM) (Prentice-hall International Series in Computer Science)オブジェクト指向プログラミング入門あたりが入ってないのは意図的かね.

無理もない面もあるが,どの解説文も微妙に表現が異なっているのが分かるだろう。

表現が異なるというだけでなく,そもそも異なるものを混同しているのが混乱の原因の一つ.

ちなみに定義が微妙に異なるのは普通のことだ.同じ単語について複数の辞書を比較してみれば良く分かる.たとえばオペレーティングシステムについて調べてみると,その違いは微妙なんてものじゃない.*6

  • 広辞苑:「コンピューターで利用者とハードウエアの間にあって,利用者がコンピューターシステムをできるだけ容易に使うことができるようにするための基本的なソフトウエア」
  • パーソナルカタカナ語辞典:「基本ソフトウエア,コンピューター全体の効率的運用のための手順や手法を集めた基本的プログラム」
  • LDOCE:"a system in a computer that helps all the programs in it to work together"
  • OALD:"a set of programs that controls the way a computer works and runs other programs"
  • NODE:" the low-level software that supports a computer's basic functions, such as scheduling tasks and controlling peripherals."
  • Collins COBUILD:"The Operating System of computer is its most basic program,which it needs in order to function and run other programs."
  • wikipedia:"An operating system is a special computer program that manages the relationship between application software, the wide variety of hardware that makes up a computer system, and the user of the system."以下略*7

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

*2:私も毎回ほとんど玉砕している.関数型言語を使いこなすのはJavaを使いこなすよりも敷居が高いくらいだ.

*3:http://d.hatena.ne.jp/sumim/20040525#p1

*4:ちなみに「抽象化」と「振る舞い」はJavaでも使うには使うけど,どちらかというとUMLモデラーっぽい用語.ほとんど無視して良し.

*5:構造体,再帰呼び出し,巡回セールスマン問題,NP完全,有限要素法,線形計画法なんかは,ITらしくないのかな.カタカナ語や英語を使うと理解しにくいと文句を言われ,漢字やひらがなを使うとITらしくないと文句を言われる.

*6:日本の辞書の質が悪いというのも良く分かる.特に技術系の用語は悲惨なものが多い.広辞苑などその最たるものだ.

*7:http://en.wikipedia.org/wiki/Operating_system