初心者のためのプログラミング言語
2008年2月6日
どうやら最近、『初心者のためのプログラミング言語』に関する議論があちらこちらでなされている様子。意見を述べている人たちはみなそれぞれ一流のプログラマで、自分のプログラミングスタイルを持っている人たちのようだ。おそらく、みなプロなのだろう。私の立場は、彼らのようにプロでもないし、初心者とも言えない。おそらく、両方の立場が比較的良く分かる位置にいると思う。
私が最も気になったこと。それを一言で述べると、『真のプロは教育には向かない』になる。プロの人たちは、初心者に向いているとされるプログラミング言語を取り上げ、構造型だけで記述されるだの、抽象化の概念が無いだの、だからこんなものを最初に教えると変な癖がつくだの、そんな風に議論しているように見える。初心者にとって何が分からないかが、上級者には分からないのではないだろうか。
たとえて言うならば、小学生に微積分を教えようとするのと同じではないかという事。何にも分からないんですよ、初心者は。足し算・引き算から教えるのが、当たり前でしょう。
例えば、私なら、『Hello World!』の次に、以下のようなプログラムを教えたい。
まったくの素人でも、このプログラムと次のチャートが対応することぐらいは、比較的簡単に理解できるのではないだろうか。
これを、間違っても最初に次のように教えてはいけない。
『FOR』文は、高度なテクニックなのだ。これを教えるのは、まだ先の段階である。
ここまで読んで、次のように思う人がいるかもしれない。
『構造化チャートじゃないか!』
『GOTO文を教えるのか!』
でも、ちょっと待ってほしい。オブジェクト指向でバリバリとプログラミングしている人でも、実はGOTO文を使ってるんですよ。Javaでも、Smalltalkでも、Rubyでも、結局は1と0で制御しているCPUの中で動くわけで、マシン語レベルではGOTOだらけ。1か0かの話をしても分かりにくいから、それを一対一対応させたアセンブラのレベルで言うと、JEQとかJNEとかJAとか、条件分岐は全部ジャンプ命令。LOOP命令なんていうのもあるけれど、結局は条件にしたがってジャンプしているだけ。そこには、オブジェクトのオの字も無い。つまり、これがコンピューターの本質であり、昨今のプログラミング言語はそれをラップして別のものに見せかけているに過ぎない。
だから、BASICなどはそういったコンピューターの本質を残した言語であり、コンピューターがどういう原理で動いているかを理解するには非常に良いものだ。だから私はBASICが好きだし、Tata Nanoも好きだ。
ビル・ゲイツも、スティーブ・ウォズニアックも、プログラミングとコンピューターの基本原理が直結したような背景のもとで、活躍した人たちだ。ビル・ゲイツは8080用の、スティーブ・ウォズニアックは6502用のBASICを書いている。同世代のプログラマも多いはず。そういった人たちは、コンピューターの発展とともにプログラミング言語を会得してきた。だから、はじめのうちはごく基本的な機能しかない言語を使ってコンピューターの基本(例えれば、足し算・引き算)を理解し、時代とともにより複雑な言語(例えれば、方程式)に触れ、オブジェクト指向の言語(例えれば、微積分)に触れてきた。だから、無理なく理解できたのであろう。
なのに、新しい人には、コンピューターの基本原理など理解させずに、いきなり複雑なプログラミング作法だけを覚えろという。無茶でしょう、そりゃ。
PHPでプログラミングを覚えてもいい。初めのうちは、グローバルにガリガリとコードを書くことで、コンピューターとはどんな原理で動いているのか、プログラミングの基礎とはどんなものかに触れればよい。問題は、その次にどうするかだ。PHPでプログラミングを覚えたプロのプログラマが、そのまま脆弱性がてんこ盛りのスクリプトを書いて、それで給料をもらっているとすれば、それはその人の個人的な問題でしょう。足し算・引き算だけで計算しようとすれば、むちゃくちゃな計算になるのは当然のこと。
ちなみに、グローバル名前空間に関するあれこれをさしてPHPを批判する人がいるけれど、見当違いだと思う。一行のコードをグローバルに記述するだけで、何でもできる。鋏は使いようってだけのこと。strposだって、確かに引数の位置が逆だろうと私も思うけれど、それは車の運転と同じで慣れてしまえば何てことないし、それでも気になるなら例えばinstrなどの名前でラッパー関数を作ってしまえばよい。それらを取り上げて云々というのは、ただの悪口にしか思えない。
ここからは、少し補足を。
上で実行したBASICのコードは、スティーブ・ウォズニアックの開発したBASICをエミュレータで実行している。POM1 と言うツールで、これはアップル社の第一号コンピューター、Apple I (『 ][ 』では無い)のエミュレーター。
C++ でオブジェクト指向を学ぶというのは、あまりお勧めではないような気がする。元になったCという言語は、アセンブラにちょっと毛が生えたような物。そのCの色が丸々残っているC++は、スピードが求められるような処理には良いけれど、規模の大きいプログラムを書くには、今の時代としては向いていないのではないだろうか。
私が最も気になったこと。それを一言で述べると、『真のプロは教育には向かない』になる。プロの人たちは、初心者に向いているとされるプログラミング言語を取り上げ、構造型だけで記述されるだの、抽象化の概念が無いだの、だからこんなものを最初に教えると変な癖がつくだの、そんな風に議論しているように見える。初心者にとって何が分からないかが、上級者には分からないのではないだろうか。
たとえて言うならば、小学生に微積分を教えようとするのと同じではないかという事。何にも分からないんですよ、初心者は。足し算・引き算から教えるのが、当たり前でしょう。
例えば、私なら、『Hello World!』の次に、以下のようなプログラムを教えたい。
まったくの素人でも、このプログラムと次のチャートが対応することぐらいは、比較的簡単に理解できるのではないだろうか。
これを、間違っても最初に次のように教えてはいけない。
『FOR』文は、高度なテクニックなのだ。これを教えるのは、まだ先の段階である。
ここまで読んで、次のように思う人がいるかもしれない。
『構造化チャートじゃないか!』
『GOTO文を教えるのか!』
でも、ちょっと待ってほしい。オブジェクト指向でバリバリとプログラミングしている人でも、実はGOTO文を使ってるんですよ。Javaでも、Smalltalkでも、Rubyでも、結局は1と0で制御しているCPUの中で動くわけで、マシン語レベルではGOTOだらけ。1か0かの話をしても分かりにくいから、それを一対一対応させたアセンブラのレベルで言うと、JEQとかJNEとかJAとか、条件分岐は全部ジャンプ命令。LOOP命令なんていうのもあるけれど、結局は条件にしたがってジャンプしているだけ。そこには、オブジェクトのオの字も無い。つまり、これがコンピューターの本質であり、昨今のプログラミング言語はそれをラップして別のものに見せかけているに過ぎない。
だから、BASICなどはそういったコンピューターの本質を残した言語であり、コンピューターがどういう原理で動いているかを理解するには非常に良いものだ。だから私はBASICが好きだし、Tata Nanoも好きだ。
ビル・ゲイツも、スティーブ・ウォズニアックも、プログラミングとコンピューターの基本原理が直結したような背景のもとで、活躍した人たちだ。ビル・ゲイツは8080用の、スティーブ・ウォズニアックは6502用のBASICを書いている。同世代のプログラマも多いはず。そういった人たちは、コンピューターの発展とともにプログラミング言語を会得してきた。だから、はじめのうちはごく基本的な機能しかない言語を使ってコンピューターの基本(例えれば、足し算・引き算)を理解し、時代とともにより複雑な言語(例えれば、方程式)に触れ、オブジェクト指向の言語(例えれば、微積分)に触れてきた。だから、無理なく理解できたのであろう。
なのに、新しい人には、コンピューターの基本原理など理解させずに、いきなり複雑なプログラミング作法だけを覚えろという。無茶でしょう、そりゃ。
PHPでプログラミングを覚えてもいい。初めのうちは、グローバルにガリガリとコードを書くことで、コンピューターとはどんな原理で動いているのか、プログラミングの基礎とはどんなものかに触れればよい。問題は、その次にどうするかだ。PHPでプログラミングを覚えたプロのプログラマが、そのまま脆弱性がてんこ盛りのスクリプトを書いて、それで給料をもらっているとすれば、それはその人の個人的な問題でしょう。足し算・引き算だけで計算しようとすれば、むちゃくちゃな計算になるのは当然のこと。
ちなみに、グローバル名前空間に関するあれこれをさしてPHPを批判する人がいるけれど、見当違いだと思う。一行のコードをグローバルに記述するだけで、何でもできる。鋏は使いようってだけのこと。strposだって、確かに引数の位置が逆だろうと私も思うけれど、それは車の運転と同じで慣れてしまえば何てことないし、それでも気になるなら例えばinstrなどの名前でラッパー関数を作ってしまえばよい。それらを取り上げて云々というのは、ただの悪口にしか思えない。
ここからは、少し補足を。
上で実行したBASICのコードは、スティーブ・ウォズニアックの開発したBASICをエミュレータで実行している。POM1 と言うツールで、これはアップル社の第一号コンピューター、Apple I (『 ][ 』では無い)のエミュレーター。
C++ でオブジェクト指向を学ぶというのは、あまりお勧めではないような気がする。元になったCという言語は、アセンブラにちょっと毛が生えたような物。そのCの色が丸々残っているC++は、スピードが求められるような処理には良いけれど、規模の大きいプログラムを書くには、今の時代としては向いていないのではないだろうか。
コメント
Andy (2008年2月7日 00:26:19)
コンピュータの内部をある程度意識させる必要があるという点は同意です。僕はそのときにデータが一番大事だと感じており,自分のブログではそう書きました。
一時はデータ型を意識しない方向に世の中進んでいるのかと思っていましたが,DBなどを使うようになると,やっぱりそこをきちんと理解しているかしていないかが,いろいろな意味で分かれ道になるように感じています。
プロの方々の意見がぶっ飛びすぎだというのは同感です。
一時はデータ型を意識しない方向に世の中進んでいるのかと思っていましたが,DBなどを使うようになると,やっぱりそこをきちんと理解しているかしていないかが,いろいろな意味で分かれ道になるように感じています。
プロの方々の意見がぶっ飛びすぎだというのは同感です。
Kat (2008年2月7日 23:03:43)
たしかに、コンピューターの仕組みをある程度理解していれば、データ型の理解は容易になりますね。
みんなそれぞれ、どうにも先に進めないという所がありますよね。私の場合は、多分に漏れず、オブジェクトについてでした。実は、『なんだ、そんなことだったのか』と思えるきっかけになったのは、Nucleus の PLUGIN クラスだったんです。
私が一番最初にプログラミングしようかというときに、まずクラスとは何かを理解する必要があったのならば、プログラミングなんてやっていなかったと思います。
みんなそれぞれ、どうにも先に進めないという所がありますよね。私の場合は、多分に漏れず、オブジェクトについてでした。実は、『なんだ、そんなことだったのか』と思えるきっかけになったのは、Nucleus の PLUGIN クラスだったんです。
私が一番最初にプログラミングしようかというときに、まずクラスとは何かを理解する必要があったのならば、プログラミングなんてやっていなかったと思います。