プログラミングのハードルの高いところは「英語」ではない。「人に教える能力」である。

中学校の教科書で日本語プログラミング言語「なでしこ」が採用されるとの記事を見てから、どこかでずっとモヤモヤしていた。

中学校の教科書に採用された日本語プログラミング言語「なでしこ」。母国語でプログラミングができることの「意味」

プログラミング教育というかそもそもプログラミングのハードルが高くなっている一理由として「英語」を使わなければいけない、というのを目にする。主観丸出しの感想ではあるが、

本当に?

もちろん、 「英語だから」と難しいと感じる人も一定数いることは理解できる。しかし、だからといって少なくとも現在、世の中で広く使われている **英語での** プログラミングを捨ててまで日本語プログラミング言語を利用することにどこまで意味があるのか。

プログラミングはPCに教える作業

プログラミングの入門書にはよく「PCは教えられたことしかできない」というフレーズが出てくる。最近の人工知能によっては必ずしもそうではないが、少なくとも通常のPCの利用では概ね正しい。

プログラミングは「PCに行わせたい処理を明確にし、それを記述する行為」である。柔らかい言い方をすると「PCにやり方を教えてあげる作業」である。

一般的なことで考えてみよう。教える方と教わる方、どちらが知識が必要だろうか。よほどの状況でない限りは「少なくとも教わる方よりは教える方が知識が必要」である。(理想ではあるが)先生は生徒の学力だけではなく、普段の生活状況や親からの情報によって生徒がどのような生徒でどういった教え方が効率よく教えることができるかを知ることが求められる。

プログラミングも同様で、プログラムを書く人はPCにどういった操作をさせたいかを考え、それをPCがわかるように伝える。この「PCにわかるようにやるプロセス」というものがプログラミングにとって一番難しい部分である。なぜかというと、人に対しても物事を教えるというのは難しいにも関わらず、それを人以外のものに教える必要があるからである。

確かに、「なでしこ」などの日本語プログラミング言語を利用することでいくばくかの負担の軽減はあるかもしれない。しかし、プログラミングも苦労する本質はそこではない。本質は「作業を整理して分割し、それをわかりやすく伝えて実行してもらう」というプロセスなのである。これは別にプログラミングに限ったことではない。集団で行動するときに必ずぶつかる問題である。

だから、「なでしこ」を利用するということには消極的な考えを持っている。それよりもプログラミングを通じて問題意識を持つ練習をしてほしい。もし(これは考えたくないことではあるが)教育を考えている人たちが単純にプログラムを書けるロボットを量産したいのであれば、現場で使われているプログラミング言語を使うべきである。そのほうがギャップが少なくてよい。

おまけ: プログラミングの難しいのは独特の考え方

プログラミングの難しいと感じたところを、自身の経験やプログラミングを教えたときのことを振り返って思い出してみた。すると、なんとなく思い浮かんだのは、それまでに「学んだこととのギャップ」だった。

例えば、次のようにかかれていたとする。

a = 3

プログラミングを学んだ人であればわかるとは思うが、学んでいない人からすれば「aと3は同じ」と思うはずである。しかし、これは「aに3を代入している」という意味である。

それ、ギャップか?

と思うかもしれない。そう考えたあなたはもう手練である。もちろん、これは大したことではない。しかし、こういうことが積み重なっていく。もう少し例を見ていこう。

#include <stdio.h>
int f(int);

int main() {
    int y = f(3);
    printf("\d", f);
}

int f(x) {
    return (x * x) + (2 * x) + 3;
}

顕著な例を出すようにC言語で書いているため、すでに複雑かもしれない(Javaのほうがもっとややこしいとは思う)。これは、 f(x) = x^2 + 2x +3 を定義して、xに3を代入した結果を表示するためのものである。それだけのことなのに、これだけの内容を書く必要がある。数学が苦手な人にとってはこの時点で嫌かもしれないが、実のところプログラミングと数学はほとんど関係ない。ここで難しいのは「宣言し、定義し、実行する」というプロセスを自分で書く必要がある、ということである。これは日常では無意識的にやっていることではあるのだが、明確に意識してやる機会はそれほどない。もちろん、C言語以外の言語ではいくばくか略したりそもそも行う必要のないことも出てくるが、少なからず行わなくてはいけないプロセスである。これに順応することはとても難しい。

また、プログラミングは一般的に「車輪の再発明」は嫌われる。車輪の再発明とは「すでに作られているものを再度一から作ること」を意味する。すでに作られているものは再利用すべき、ということである。ここで新たに「他人の作ったものを理解する」というプロセスが生まれる。プログラミングに慣れている人はもちろん、「完全に理解してなくても使える」ことや「どの部分を理解していれば良い」ことや「何かあったら理解すれば良い」ことを知っている。しかしそれすらも理解していない入門者にとっての「車輪」は「なんだかよくわからないもの」なのである。初心者に教えるときに使う、いわゆる「おまじない」である。「おまじない」は基本的に使うべきではない。おまじないは「なんだかよくわからないもの」をより「わからないもの」にする第一歩である。そして、理解するにはある程度自力で学ぶという必要が出てくる。少なくとも、「これがわからない」という認識は必要である。それすらもままならない状態でプログラミングを行っても身につくものではない。