メッセージ。 - Javaスクールの危険について
# Javaスクールの危険について
承前。
なんとなくだけど、「Javaを教えるな。C言語を教えろ」という意見には賛成できないなぁ。というのも、Javaというのは自動車みたいなものだ。昔はなかったけどいまは使える便利な道具としての自動車。現代において、自動車を運転するスキルというのは十分必要だと誰もが認めるだろう。実はJavaもそういう道具の1つなのではないか。
たとえば自転車。自転車があれば、身の回りをスイスイ素早く走り回って、日常の用事をこなすことができる。自転車で移動できる距離は、自動車には遠く及ばないけれども、身近な場所を走って路地裏を駆け回るなら、小回りをきかせられる自転車が有利だ。
たとえば徒歩。徒歩は自転車よりもスピードが出ない。遠くまで行くこともできない。だけど家の中を歩き回りたいなら、やっぱり自分の足で歩くのが一番だ。山を登ったり、川を渡ったり、自転車にも自動車にも踏破できない場所を、徒歩でなら進むことができる。スピードを気にしなければ、徒歩の有効性は高い。いざというときにも使えるし、「歩くのが下手」というのでは話にならない。
そう。いくら時代が進んでも、歩く技術の重要性は変わらない。それは基本としてすべての人がそなえておくべきスキルと言えるだろう。コンピュータで言うならばアーキテクチャといったところだろうか。しかし、だからといって自動車の運転技術を学ぶ必要がないとはいえない。
現代においては、多くの人が自動車の運転(あるいはJavaやLLやVBAでのプログラミング)技術を使って、仕事や遊びにいかしている。徒歩(あるいはアセンブラ)にはそれなりの良さがあるし、いざとなったらそういった方法論も必要だろう。しかし、もっぱらいま、フロンティアが存在するのは自動車やJavaプログラミングの領域なんじゃないだろうか。
現代では、自動車を運転し自動車で移動するからこそ、徒歩にはなかった新たな問題にぶつかることが予想される。自動車がこれだけ普及した現在において、自動車の運転技術をないがしろにすることは、運転する人にとっても社会にとっても幸福なこととは言えないはずだ。
せっかく自動車があって、それをうまく運転したり、自動車を改良したりすることで新たな土地に出かけられるのに、そこをないがしろにするわけにはいかない。もちろん、「自動車が壊れたらどうするんだ」、「目的地に近付いたら徒歩で移動するんだろう?」、「遠くに移動する必要はない」という意見があるのも分かる。しかし、どちらかを捨てることが唯一の答なんだろうか。きっと違うよね。
なんとなくだけど、「Javaを教えるな。C言語を教えろ」という意見には賛成できないなぁ。というのも、Javaというのは自動車みたいなものだ。昔はなかったけどいまは使える便利な道具としての自動車。現代において、自動車を運転するスキルというのは十分必要だと誰もが認めるだろう。実はJavaもそういう道具の1つなのではないか。
たとえば自転車。自転車があれば、身の回りをスイスイ素早く走り回って、日常の用事をこなすことができる。自転車で移動できる距離は、自動車には遠く及ばないけれども、身近な場所を走って路地裏を駆け回るなら、小回りをきかせられる自転車が有利だ。
たとえば徒歩。徒歩は自転車よりもスピードが出ない。遠くまで行くこともできない。だけど家の中を歩き回りたいなら、やっぱり自分の足で歩くのが一番だ。山を登ったり、川を渡ったり、自転車にも自動車にも踏破できない場所を、徒歩でなら進むことができる。スピードを気にしなければ、徒歩の有効性は高い。いざというときにも使えるし、「歩くのが下手」というのでは話にならない。
そう。いくら時代が進んでも、歩く技術の重要性は変わらない。それは基本としてすべての人がそなえておくべきスキルと言えるだろう。コンピュータで言うならばアーキテクチャといったところだろうか。しかし、だからといって自動車の運転技術を学ぶ必要がないとはいえない。
現代においては、多くの人が自動車の運転(あるいはJavaやLLやVBAでのプログラミング)技術を使って、仕事や遊びにいかしている。徒歩(あるいはアセンブラ)にはそれなりの良さがあるし、いざとなったらそういった方法論も必要だろう。しかし、もっぱらいま、フロンティアが存在するのは自動車やJavaプログラミングの領域なんじゃないだろうか。
現代では、自動車を運転し自動車で移動するからこそ、徒歩にはなかった新たな問題にぶつかることが予想される。自動車がこれだけ普及した現在において、自動車の運転技術をないがしろにすることは、運転する人にとっても社会にとっても幸福なこととは言えないはずだ。
せっかく自動車があって、それをうまく運転したり、自動車を改良したりすることで新たな土地に出かけられるのに、そこをないがしろにするわけにはいかない。もちろん、「自動車が壊れたらどうするんだ」、「目的地に近付いたら徒歩で移動するんだろう?」、「遠くに移動する必要はない」という意見があるのも分かる。しかし、どちらかを捨てることが唯一の答なんだろうか。きっと違うよね。
Comment
#
そのうち、作らなくて使うだけの人、が分離してきて、そちらが多くなった。
そのうち、作る人の中でも、道具から作る人と、人の作った道具を使って(プログラムを)作る人が分離してきた。今ここ。
さて、人の作った道具を使ってプログラムを作る人は、道具の使い方だけを知っていれば良いのか、ってのがここでの話のポイントだと思う。
自動車のたとえはプログラムを使うだけの人を対象にしているのでちょっと話がずれてる気がする。
もちろん、「プログラムを使うだけの人」もプログラムを道具として使って何か作ってる (文章書いたりとか、曲作ったりとか、仕事で何か生産したりとか) んだけど、ここで問題としてるのは道具を使ってプログラムを作る人 (そのプログラムは再び、使うだけの人に道具として使われる) ね。そういう人たちは道具としてのプログラムを生産しているけれど、自分達も道具としてのプログラムのユーザであると。後者の成り立ちを知らずに、はたして前者の意味で良いものが作れるのだろうかってことなんじゃないかと。
#
JoelはJava「しか」教えない学校を批判してるのであって、「Javaを教えるな。C言語を教えろ」とは言ってないように思います(見落としてたらご指摘ください)。
私が学校に通ってたときは、メインはc/c++でしたが、「c/c++をより理解するために」Common LispとZ80アセンブラもカリキュラムに含まれていました。今でもそういう学校はあると思うんですけど、Joelの言うように「Java 100%」に移行した学校も多いんですかねぇ。まぁ、それはそれでそういう人材を求める企業もあるんでしょうし、需要と供給のバランスがとれてればいいんじゃないかと思います。
# shiroさん、どう...
ぼくがJoelさんの文章から受けた印象では、shiroさんが問題とされているポイントよりもっと具体的で個別の問題点を意識しているように感じました。で、まぁ上記の文章になったと。
コンピュータサイエンスを学ぶ学生は、コンピュータを使うだけでなく、作る技術も身につけなくてはいけないというのはまったく同感です。コンピュータは、「道具を作る道具」という側面が強くて使いこなしも難しいので、特性をよく知っておいたほうがいいと痛感します。
ただ、Javaを学ぶことでも、コンピュータの特性を理解する入口にはなると思ったんですよね。実はここにいたった過程を端折ってしまったのですが、この考えは小飼さんのところで展開されていた議論を受けています。
JavaはVM上で動きますけど、VMであってもチューリング的なパラダイムを色濃く残しているので、リアルなハードウェアとの違いって本質的にはないと思いました。だったら、Javaを問題にしてCはOKと言う人は、どこを問題だと感じているのか、と。
この手の議論になったとき、JavaとCを対比させる人って多いと感じますが、「JavaとCの関係」は、「Cとアセンブラの関係」に似ていると思います。いまでこそ「Javaはだめだ。Cを学べ」という人がいるけど、40年前だったら、「Cはだめだ。アセンブラを学べ」と言われたんじゃないかなと。
JavaとCの違いは、この議論に関係しそうなものとして「ポインタがあるか」だと思うんですけど、それ以外にもコンピュータの特性を知るうえで、RISC/CISCの違いやレジスタ、キャッシュ、バス、CPUの命令セットの意味論など、知っておいたほうがいいポイントがあるはずです。そのへんまで含めて問題にするならいいと思うんですけど、CとJavaの間に線を引くのは妥当なのかなぁってのが、上記文章を書いたときの裏の趣旨です(笑)。
うまく書けそうになかったので、また、まだ考えがまとまっていないのでだいぶ端折ってしまったのでした。すんません。
#
についてなんですけど、たしかにこれはぼくが乱暴で、Joelさんの意見を明後日の方向に解釈しちゃってる可能性ありです。全体の論旨としては、そういうキーワードが読み取れるかなーと思ったもので。
ぼくが学校に通っていたときも、メインはC言語で、LispやZ80アセンブラを学びました(1992年ごろの話です)。いまは、どうなんでしょうねぇ? 案外基礎的なこともやっているかなと想像してるんですが。
dieさんは楽観的ですね(笑)。それはそれでありだと思います。コンピュータ自体が普及して、使われ方が広がったり変わったりしている部分もありますからね。なんらかの変化は、授業のカリキュラムにも反映されるものですよね。
#
Javaオンリーでもいいかもしれません。Javaで(GC等も含めた)VMそのものを作る講義があれば。もちろんその中では、ポインタも出てくるし、抽象的なメモリとプロセッサのモデルも出てくるから、パラメータを変えて性能評価も取れる。
ただそれをやるならCでLisp書いた方が早いだろうな、とは思いますが。
#
たとえばぼくのような、大学に入って(しかも三流大学に入って!)初めてコンピュータに触ったような人間の場合、なかなかコンピューティングのパラダイム自体に馴染めないです。まず、論理的思考ができないですし、「コンピュータで何ができるの?」とか、「コンピュータで何がしたいの?」とか、そういうところが見えていない。
そうすると、勉強する気自体が起きなくって。Hello Worldとか、ハッシュとかポインタとか、すごくじれったかったです。「こんなことして何の意味があるんだ?」って。そういった下積みのコストって、すごく大きいと思うんです。それを乗り越えられる頭脳をお持っていたり、やる気にさせてくれる師匠がいればなぁと思います。
「プログラミングを独習するには10年かかる」って言いますけど、まさしく自分は10年ぐらいかかりました。大学でそのコースを選んだとしても、よっぽどよい師匠に出会えなければ10年ぐらいはかかるんじゃないかな。その10年のコストを、4年とか6年でペイできる体制、たとえば良い先生であるとか、学校に入る前に基本ができた生徒が集まるとかがあればいいですが、少なくともいまはそうなっていないと考えます。
MITや東大でなら、そういった高度な教育が可能なんだと思います。でも、普通の大学で普通の学生に学ばせるのなら、Javaをメインにして、プラスアルファでSchemeを教えるぐらいでちょうどいいんじゃないかと思います(もちろん、アーキテクチャもひととおり紹介ぐらいはする感じで)。あとは、その学生次第じゃないかなぁ。幸い計算機って、大学の外に出ても学ぶことができるし(これはこれで賛否両論ありですね)。
Trackback