見出し画像

Retro-gaming and so on

何が自然かはプログラミングの熟練者だけが述べていい事なのか?

ちょっと気になる文章があった。

(プログラミングにとって)何が自然かは熟練者が述べていい事。右も左もわからない初心者は何が自然かを学ぶことからはじめましょう。 

一瞬納得しそうになったが、ちと待てよ、と。
むしろプログラミングに熟練する、って事は

「フツーに考えると不自然と考える事を自然と捉えるように訓練する事」

なんじゃないか。
要するにプログラマが自然、と考える事は一般にとって不自然だ、って事は良くあるのだ。
むしろ、事実上、プログラマの自然は一般人には不自然である。
従って、プログラマの初心者が感じる「自然」と言うのは一般にとっての当然の自然であって、その感覚自体は否定すべき事柄じゃないんじゃないか。
下手すれば、単なる初心者への根拠に乏しいマウンティングになってしまう。

何度か書いたけど、最初に(自覚的に)学んだプログラミング言語はCommon Lispだった。
ところで、Lispの教科書なんかには

Lispにはプログラムとデータの間には差がありません。

等と良く書かれてる。多分「え?ホント?」とか「すげぇ!」とか思われる為に書いてるんだろう。
でも僕の当時の反応は

「だから何?」

だったのだ。
ハッキリ言ってやろう。一般的には「プログラムとデータ」に差なんざないのだ。「プログラム」と「データ」に差なんざ無いのが一般的には「自然」であって「プログラム」と「データ」に差があるのは一般的には「不自然」なのである。
考えてみればそうだろ?例えば貴方があるゲームを買ってくるとする。今の時代だと例えばPlayStation 4だか5だかのゲームディスクを買ってくる。そういう「現実の」オブジェクトにプログラムとデータの差なんざあるだろうか?「無い」んだよ。一般人は特にプログラムとデータの「差」なんて感じてないの。プログラムとデータの間に垣根なんざ感じてないのが「自然」なのだ。
じゃあ、Common Lispのそのテの入門書は一体誰を驚かせようとしたんだろう?答えはプログラマ、なんだよな。プログラマは「プログラム」と「データ」には違いがある、と思うように、意図的に「訓練されて」来ている。つまり、プログラマの感じる「自然」と言うのは、訓練によって後天的に得たモノであって、それは既に一般的には「不自然」と感じる事を「自然」と感じるように歪められた「感覚」なのだ。

他に例を挙げると例えば「再帰」がある。一般的には再帰は自然、そしてforやwhile等の「繰り返し」は不自然なのだ。ウソって思うかもしれないけど、そう。何故なら、フツー我々は高校数学で再帰をやっている。再帰が不自然、難しい、なんつーヤツらは高校時代に数学をマジメにやってなかった輩だけ、なんだよ。
え?とか思うかもしれないけど、高校数学では再帰を扱ってる。名称は違うけどな。高校で習う数列に出てくる漸化式。漸化式とは再帰の事だ。従って、例えば数列の和を求める場合に漸化式をプログラミングすれば自然と数列の和になっている。そういう風に数学は出来ていて、不自然にforだのwhileだのを使って「わざわざ人間コンパイラになって数列を分解して」書く必要がないようになってるのだ。
じゃあ、どうして「再帰は難しい」って言われてるんだろうか?答えは単純、アメリカ人は日本人ほど一般的に数学が得意じゃないから、だ。それに殆どの大学へ進学するアメリカ人は数列だ漸化式だ、と言うのを大学で初めて学ぶ。つまり、再帰の前提知識になる筈の漸化式を知らんからそういう書き方になるわけだ。「再帰は難しい」と言うより「再帰が何だか」プログラミングを学ぶ際には単純に知らん、って事なのだ。
問題は、そういうアメリカの教育事情を知らんで、日本でプログラミングを教える際に「アメリカ人プログラマがそう言ってるからそうなんだろ」とそのまま無批判に教育システムを日本に持ってきたトンチンカン野郎達があまりにも多すぎた、ってだけの話なのである。多分こいつらは高校数学をマジメにやって来なかったんだろうし、明らかにデキが悪いヤツらである。マトモに思考をしてない、って事がバレバレなのだ(アメリカでは〜、とか言うのは明らかに思考放棄だろ?)。
こんなのが「熟練」で、「自然/不自然」を論じる基盤を作ったとすれば・・・あまりにもお粗末だろ、としか言いようがない。
とまぁ、「熟練」とか言う人間の「自然/不自然」の感覚はむしろ全然アテにならんぞ、と言う反例を2つ程挙げておく。まあ、プログラミングを学ぶ、と言う事は「フツーの感覚」を「異常な感覚」に変えるように訓練する事なんだ、とか言われれば確かにそうかもな、って思う事は多いけどね。

以下余談:

実はCommon Lispを学び始めた際に、「再帰は難しい」と語られていた為、案の定「再帰」を習得するのに苦労した。
しかしある時気づいたのだ。「あれ、これって実は単なる漸化式じゃ・・・」と。そう気づけば早かった、のだ。それまで再帰と漸化式が僕の中では全く結びついていなかった。
「余計な事ばっか書きやがって。"難しい"とか連呼してたからその気になってたじゃねーかよ!」
テキストを壁に叩きつけたのは言うまでもない。
ぶっちゃけ、再帰なんざ、高校数学の漸化式の問題を10問くらいプログラミングすれば難なく攻略出来るのだ。それで充分じゃないか。
いや、実際、再帰でも「難しい再帰」ってのはある。無いわけじゃない。ただし、再帰でプログラミングするのが難しい場合、繰り返し構文でそれを解題しようとすればもっと難しくなるのだ。つまり、抽象化で考えると再帰の枠組みの方が実際は簡単なのである。
そしてより重要なのは、高校数学みたいに「漸化式を解け」と言われてるわけではない。漸化式を単に書くだけである。解くのはプログラミング言語に任せておけば良いのだ。
加えると、繰り返しは構文である。したがって、場合によっては言語によって構文のスタイルが違う為、やはり「覚える事が」必要となる。しかし再帰は「考え方」である。故に、再帰をサポートしてる全てのプログラミング言語で共通で使える技法なのだ。どっちが一般的か、と言えば当然再帰に軍配が上がるだろう。
情けないのは、プログラミング入門書を書いてる連中自身も、「再帰が難しい」と思い込んでいて、誰も「これは高校数学で学んだ漸化式だ」とはまず書かない。恐らく彼らも知らんのだろう。
物理を学ぶ際に数学は利用されるもの、である。別に物理に限らず、科学と言うものは学んだ数学的技法を適用するモノである。数学を応用するのが科学の根幹なのだが、そういう意味で言うとプログラミングは科学の域に実は達してないのだ。殆どのケースでは、だ。
それが分かった時が、「プログラミングは科学とも数学とも理系とも全く関係ないんだな」と実感した瞬間である。現実的にプログラミングと数学は物理と数学ほど距離が近くないのである。
結局、プログラマは科学者でも数学者でもない、って事だ。
そして「コンピュータ科学」の"科学"の部分はホンモノの科学ではなく、疑似科学、つまり田嶋陽子なんかが闊歩してる「社会科学」の"科学"に実際は近いのである。
  • Xでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

最近の「プログラミング」カテゴリーもっと見る

最近の記事
バックナンバー
人気記事