作者: 機械伯爵
日時: 2008/2/4(13:49)
 初心者向けの記事というより、初心者という対象のお話。

 Matzにっき
 http://www.rubyist.net/~matz/20080204.html

 例に出た言語(BASIC, HSP, PHP)の共通項については色々考えるところがある
のだけど、それを言い出すと話題がズレるので、それはスルーして、内容の本質
である以下に注目します。

> ここから「初心者向け言語が避けていること」言い替えれば「初心者が苦手な
> こと」が何であるかだいたいわかる。彼らは「抽象化」が苦手なのだ。

 コレ、私には実によく納得できます。

 なんせ私は、BASICの「配列」が理解できなかった(泣)

 「配列」なんか抽象化のうちにはいらんじゃないか、という意見はご尤もです
が、それでも、「1つの箱に複数の数値が番号札をつけて入っている」という概
念が、どうしても理解できなかったんです。

 だから、配列をナメるような処理は全滅。

 一応言っておきますが、学生時代の話でなく、まがいなりにも大学の理系を卒
業し、技術職に就いてた頃の話です。

 ポケコンをポチポチ打ちながら、入れたプログラムは全て普通の変数の計算の
み。

 ループも、主に対話プログラムを実現するためのみに使用してました。

 今から考えれば、学校で習う「関数」の意味すら、全然理解できてませんでし
た。

 写像とかナニ? だったし。

 多分、独学でCを学んだ時も、そんな理解できてなかった筈です。

 ……アセンブリ言語もいじってたけど、そんな知識、無くても使えるし……

 私がそのテのことにようやく目を向けだしたのは、多分Pascalを弄り始めた頃
からだと思います。

 まぁ、私の醜態はさておき、抽象化って本質的にはそんなに難しいモンじゃな
いと思います。

 そりゃぁ、本質的に苦手な人っているとは思いますが、パズルが解ける人なら、
簡単な抽象化だって理解できるでしょう。

 問題は、2点あると思います。

・学校教育で本来理解してしかるべき抽象化の概念を、なぜか「手続き的」に習
 得(教授)してしまっていること

・プログラミング入門段階で、手続き的なパラダイムから入り、それにある程度
 深入りしてしまうこと

 最初の点は、我々教師にとっては由々しき問題です。

 小中高の教育での数学や理科は、「理解できること」でなく「問題が解ける」
ことが目標であるかのように設定され、その結果「ノウハウ」だけがつめこまれ
た挙句「理解できなくても問題は解ける」という気持ちの悪い状態にしてしまう
のです。

 「ノウハウ」とは、公式や解法の丸暗記、です。

 本来、ある程度の抽象化の概念なくして、数学だの理科だのは語れない筈なの
に、なぜかそこがスルーされてしまう。

 その代わりに「こうやれば解ける」という「手続き」を叩き込まれるのです。

 だから、手続き式は得意、と。

 二点目は、プログラミングの入門は普通、手続き型から始まる、ということで
す。

 これは伝統もありますが、とかく手続きなら一つ一つをたどっていけば(間違
えなければ)必ずゴールに届きます。

 基本的には、三構造+サブルーチンコールで、全て解決できますから。

 では、オブジェクト指向から入ればいいのかといえば、これも疑問です。

 Squeakが教育的というのは耳タコですが、ではプログラミング言語としての
Smalltalkがよく使われているかといえば、あまり聞きません(確か、Smalltalk
言語自体も、理解しやすいように設計された筈だと思ったのですが)

 まぁ、関数型が無謀なのは、言うまでも無いでしょう。

 では、どうすればいいのか?

 プロの卵は勿論、アマチュアであってもプログラミングに幅を持たせたい人な
ら、入門時に手続き型を含む複数のパラダイムをサポートする言語を選ぶべきで
しょう。

 手続き型ではじめて、深入りする前に、様々なパラダイムに慣れていきます。

 手続き型しかサポートしていない言語ならば、様々な問題を手続き的にしか解
けないのですから、その言語になじめばなじむほど、他の考えが難しくなります。

※まぁ、だからといってソコから後に転向できないわけでは、決してないのです
 が……

 「初心者用」として名前を挙げられた上記の言語は、入門を済ませた上で改め
て「ライトツール」として利用すれば十二分に真価を発揮するはずです。

※今でもたまにHSPとか弄りますし……

 思うに、HSPやPHP、それに私はJavaScriptやVBA(Visal Basic for 
Applications)を加えたいと思いますが、これら「初心者用言語」に共通するの
は全て「すぐ結果を見たい」だと思います(BASICは除く)

 つまり「プログラミング」を学ぶ/楽しむのではなく、「アプリケーション/
ツールを作りたい」がメインなのではないでしょうか。

 これは、「理解しなくてもいいから問題を解きたい」と、なんだか似ています
が、まぁ、プログラミングについては手段であっても一向に構わないので、そう
いうのもありでしょう。

 ただ、プロの方々は色々と支障が出るでしょうから、やはり教養としてのプロ
グラミングは勉強して欲しいと思います(オタクになる必要は無いけど)

 私を含めアマチュアの方も、プログラミング自身に興味を持ったなら、マルチ
パラダイム言語で再入門してみても良いのではないでしょうか。

     /機械伯爵/

<蛇足>
 私が書いているので、当然上記の「マルチパラダイム言語」とはPythonをイメ
ージしているわけだが、別にそれに限らない。しっかりと方向性を持って使うな
ら、Visual BasicでもDelphi(Object Pascal)でも、なんなら
「Web上のJavaScript」以外のECMAScript系でも一向に構わない。