Cは難しい? OOPは難しい?

この前のmanameさんのエントリで引き続き。

ごーざ氏のところがまとまってるので、そこにポイント。

プログラミング初心者はどのように学ぶべきか談義について

こーざ氏のエントリがどうこうってことはなくて、そこで引用されている「OOPは難しい」とか「OOPは重要なものを落とす」というあたりに、どうもひっかかりを感じる。

私はハード屋上がりなプログラマなんだけど、あまり低レベルな言語は得意じゃない。もちろんさっぱりわからないとかそんなことはないんだけど、バリバリ書くことは出来ない。必要だからしょうがなく書く程度。普段一番使う言語はCで、次がRubyか。まぁRuby書くと言っても、そんなに凄いコードが書けるわけでもないけど。

今はどうか知らないけど、昔は「アセンブラがわかるとCはわかりやすい」とか言われてた。昔のCってのは「高級アセンブラ」とか言われていたし、「ポインタ」なんてアドレスそのものだったというあたりで、そーゆー都市伝説が作られたらしい。でも、はっきり言ってポインタの理解にアセンブラが役立ったなんてことはまるっきりない。あれは都市伝説だと思う。

昔からCを書く人は「Cは高級アセンブラ」とか言うけど、私にとっては単に「いろいろ細かいことが効率良く書ける高級言語」だった。だから、

Cをいきなり学ぶというのは、算数をすっとばして数論から入るようなものではないか。

という感覚がどうも解せない。普段そんなことまで考えてCなんか書いてない。私にとってのCはあくまでも、高級言語に過ぎない。アセンブラのことまで考えて書くのは、OSの中に入れるためのコードとかハードをつつく時だとか、そういった直接アセンブラやハードウェアに近いコードを書く時だけだ。普段は単なる高級言語だ。昔はアセンブラまで考えて書くと速いとか言われたんだけど、最近のCはガンガンに最適化してくれるので、下手に人間が考えて書くよりもそっちの方が速い。

そういった解釈で適切な指導の下でCを学ぶのは、実は私はそう難しいことではないと思う。いろいろ自分でやらなきゃいけないから、面倒臭いというのはわかるし、本質的でないところで頑張らなきゃいけないとかってのはあるけれど、それは「面倒臭い」ということに集約されるだけのことであって、難しいと言う程のことではないと思う。もっとも、実際のCの教育の現場では、Cのことをよくわかっていない教師が教えていたり、標準ライブラリだけでいろいろやらせたりするので、本当は簡単なことを難しくやっているだけだ。

twitterである人が「Cでいきなり書かせるのは、書をやるために筆を作るようなもの」と言っていたけれど、それはCにも「筆」はいっぱいあるのにそのことを教えないからだと思う。まぁ「筆」が作れるのがCの醍醐味であることも確かなのだけど、初心者にそれを要求するのもどうかと思う。JavaだってRubyだってperlだって、いろんなライブラリを使って楽をするし、そのことを教えるわけだから、Cでそれをやっても悪いことじゃないと思う。glibを使ってプログラムすると、とっても楽よ。

それとは逆にOOPが難しいという論もある。でも、それは「初めに手続きありき」の教育を受けて、途中からOOPに移った人達が主にそう思うのではないか。最初からOOPを「そんなもんだ」と学んで来た人達は別にOOPが特殊なものだとは思ってないだろう。

とは言え、現実のOOPLには面倒臭いものがいっぱいある。たとえば例外だとか継承だとかというものが、まるでOOPの本質の一部であるかのような顔をしている。あるいはその辺でいろいろ効率を上げるための工夫とか、デザインパターンといったものが顔を出して来たり。あるいは実行環境に依存した諸々が顔を出したりする。Rubyだと正規表現まで顔を出す。そりゃ、いきなりそんなものをどんどん詰め込まれれば、OOPは難しいとか思っても不思議じゃない。

でも、「例外」にしても「継承」にしても、OOPの本質なんかじゃない。もちろんそういったものは「あれば便利」だし、たいていのOOPLにはあるから、現実のプログラム言語を学ぶ時には、どうしてもくっついて来てしまう。カプセル化されたモジュールの中身を「つまみ食い」するメカニズムとかあると便利なんだけど、やっぱりそれも本質じゃない。そういったものが無用に初心者を混乱させる。だから、ついOOPは難しいなんて思ってしまうわけだ。また、教える方は「手続き脳」なところにそういったものは苦労して学んで来てるもんだから、まるで

秘伝

であるかのように扱ってしまう。いや、そんなところに本質はないんだけど。ましてや「正規表現」なんかも本質じゃない。「ブラウザオブジェクト」も本質じゃないし、デザインパターンも本質じゃない。もちろんわかれば便利なんだけど。

本当に何もわかってない初心者であれば、手続きについて学ぶことも、オブジェクトについて学ぶことも、どっちも大した違いじゃない。そんなことよりは、プログラムを書くために不可避の「論理的な思考」を身につけることの方が、ずっと難しい。そういった訓練を受けて来てない人にプログラミングを教えるというのは、考えるだけで絶望してしまう。逆に、その辺が簡単に克服出来るのであれば、初心者が「学ぶ」という観点であれば、

どんな言語も大差ない

と思う。まぁもちろんお仕事向きな言語とそうでない言語とか、周囲に先生の多い言語とそうでない言語とか、メンテ性が良い言語悪い言語… みたいな実用面での違いはいっぱいあるのだけど。

だから、逆に言えば「これがプログラム初心者に向いた言語」なんてものは特にないと言える。そんなありもしないことであれこれ考えるよりは、

学ぶ価値と環境があるかどうか

という観点だけで選べばいい。もっと身も蓋もないことを言えば、「今、使えるようになる必要がある言語」を学べばいいわけだ。「botを作りたい」というのであれば、perlなりRubyなりがお手軽でいいからそれを学べばいい。もっと賢いbotだったらLisp系が良いかも知れない。あるいは大語彙なものを目指すならCが良いかも知れない。どの言語も、初学者から問題の方向を見れば大差ない程度の難しさではないかと思う。

とか書いた後に自分のエントリを見返したら、結構同じことを書いてるエントリが並んでる。プログラミングというカテゴリに結構書いているので、興味がある方はそちらでも。

繰り返しになるけど、初学者がプログラム言語を学ぶことの一番の障壁は「論理的な思考が身につくかどうか」だから、言語それ自体は障壁じゃない。大昔の人達は、初心者でも機械語でコーディングしたものだし、昔のパソコンのマトモな開発言語はCくらいなものだったし、メインフレームはCOBOLかPL/IかFORTRANと決まったものだった。webでcgi使うのが流行り出した頃は、中学生でもperlをいじっていた。結局みんな「必要なもの」を学んだに過ぎないし、どうしてもそれを使わなきゃいけない人達は、「初心者」であってもやって来たわけだ。

Cは難しい? OOPは難しい?” への6件のコメント

  1. うちの師匠に言わせれば、OOPが難しくて理解できないなんてほざいているのは江戸時代の人間が「民主主義は難しくて理解できない」と言っているのと変わらない、だそうで。

  2. 学ぶのが難しいというと、APLかなぁ。記号を覚えるまでに挫けそう。高校のころアンペールWS-1を買ってた友人がいたけど、その勇気は出なかった。

  3. あー、まぁ変態な言語はありますね。判じものみたいなのとか、イデオム要求するのとか。

    でも、最初からAPLやる人もいるんですよねー。

  4. 私もそう思うんで,なにか聞かれたときは「とりあえずなんでもいいからひとつ」と答えてます.

    最近,いきなりHaskellだけ教えたらどういうプログラムを書くようになるのかというのは興味あります.なんか感覚がだいぶ変わるんじゃないかと思っていて.

コメントは受け付けていません。