うなすけとあれこれ

2013年08月24日

プログラミングなんてできるわけがない

プログラミングを義務教育に

そんな意見を聞いたことがある。実際はどうかわからないし、調べる気も起きない。 たとえばenchant.jsはゲームプログラミングの敷居を下げようとしているし、文部科学省ではプログラミンなんていう子供にもプログラミングが体験できるようなwebページを公開している。ドットインストールには僕も助けられている。

プログラミングの入門書はいくつも出版され、勉強会や講習会も多く開催されている。プログラミング人口を増やそうという試みが、全国的に、というか世界的に広がっている。

プログラミングができない

それでも、例えばプログラミングを義務教育に導入したとして、プログラマが増えるとは僕には思えない。それはなにも「数学を学んだから大学で数学を専攻するようになる」とか、「国語を学んだから小説家になる」とか(飛躍し過ぎだとは思うが)いう、エキスパートになることができないということではなく、「数学を勉強したが二次方程式は解けない」とか「国語を学んだが助詞が未だに正しく使えない」とかいうレベルでできないものはできないのだ。当たり前といえば当たり前であるが。

プログラミングなんて言葉なんだ こんなものやれば誰だってできるようになる

なぜプログラミングができないのか。それはやはり世界が違うからだ。数学は数の世界に、言葉は言葉の世界に分かれている。言葉の世界は生まれた時から強制的に放り込まれているからこの世界には慣れたものだし、この世界でうまくやれないと何をするにも難しい。数の世界なんかもある程度うまくやっていけないと文明社会で生きるには辛いものがある。

ところがプログラミングの世界ときたら、そんな世界に順応する必要があるわけでもなく、そのうえにその世界の住人から、自分たちの慣れ親しんだ世界用の成果物が放っておいてもどんどん出てくる。頼んでもないのにだ。こんな状況でプログラミングの世界に無理して慣れる必要なんて無い。

プログラミングの世界のお作法

それに、プログラミングの世界には理解し難い、初見ではクリア不可能とも言える壁が存在する。 例えば数の世界の「ある数字の各桁の数の合計が3の倍数ならその数字は3の倍数である」というお作法(?)をプログラミングの世界の言葉で書くことを考える。

もう無理である。 数の世界でどうするか考え、それをプログラミングの世界の言葉にすることがまず難しい。各桁の数は一目瞭然だし、それぞれの数を足すのだって造作も無い。 しかしプログラミングの世界では、int型で数を覚えるのはわかっていても、

int num = 12345;

こっから「1」をどう取り出したらよいものか全くわからない。現実世界とのつながりが見えないのだ。だってプログラミングの世界だし。

#include<stdio.h>
int main(void){
  int num = 12345;
  int sum = 0;
  for( ; num != 0; num /= 10 )
    sum += num % 10;
  if( sum % 3 == 0 )
  printf("3で割り切れる");
  return 0;
}

と、書かれたら「ああそんなやり方があったのか」と納得し、これからはこの方法を使って3の倍数かどうか求められるだろう。

コンピュータは「あいまい」を許さない。理解できない。それはつまり、プログラミングの世界で生きるためには完璧を求められるということ。それもプログラミングの世界での生き辛さの原因である。「アレ」とか「そこの奥」とかで通じたものが、いきなり「~/Documents/myExcelDocuments/明細.xlsxのA3」だなんて、無理だ。

とかくにプログラミングの世は住みにくい。

今まで曖昧が許される世界にいただけあって、急にガチガチの間違えられない異世界に放り込まれると戸惑う。ただ、その世界が心地よい人もいる。人それぞれなのだ。プログラミングの世界に馴染むことのできない人は、数学の世界などのそれよりも多いだろう。プログラミングができないのは未経験だからではなく、その世界に住むことができないからだ。

何でお前急にそんなこと言い出したんキモイんだけど

僕もプログラミングの世界に住んではいる。いるが、その世界の中にもさらに世界がある。Cの世界だったり、Javaの世界だったり、その中でもandroidの世界がまたあったり……いま僕はiOSの世界に放り込まれて悪戦苦闘している。そんななかでふと思い浮かんだから書いてみただけである。プログラミングは難しい。今までのお作法が通じなかったりする。

とりあえず今作っているのが完成したら自分でまとめ直す。ので時間くれ。

2013年08月24日