「変数」がわからないんじゃなくて、きっと「代入」がわからないのだろう...
ずいぶん以前のことですが、サラリーマン時代、会社の情報システム部の同世代の優秀なプログラマーと飲んでいたときの話です。当時のわたしは単なるハシリのPCユーザーで、MS-DOSのconfig.sysがどうだとか、autoexec.batがどうしたとかのレベルで、その頃は全くプログラミングというものにはなじみがなく、VZエディタのマクロとかには全く触れていなかった頃のことです。(それくらい昔の話ですw)
そのとき、何となくプログラミングの話になって、「それはオレにもできそうか?」みたいな会話になったとき、そのプログラマ青年は、敢然とこう言ったのです。
a+1=a がわかんない人はプログラムなんて無理っすよ….
で、そのときわたしは全くその意味がわからずに撃沈したわけでして、今でも良く覚えてます。(一応名誉のためにつけ加えておくと、今はわかってますよ...w)
まあ要するに、変数のことを、彼は a+1=a と一般化したというか、まあ煙に巻いた感じだったんでしょうが、要するに変数が大事ということなんですよね。
で、今はわたしは小学生にScratchで変数を教えていたりするわけです。そのとき、いきなり a+1=a なんて言ってわかるわけないので、全く別のアプローチをしています。
ただ、これまで子どもたちに教えた印象として、「そんなに変数の概念がいつまでたってもわからない」子は多くないという印象なのです。
わたしが子どもたちに「変数」を説明するときにはたいてい、上のような「箱」のメタファーを用いています。(ついでに言うと、配列変数を教えるときは「棚」と言ってます)
今の子どもたちはゲームでの得点とか、HPとか、ゲーム内で刻々と変わっていく数字があるということなら、みんな知ってますので、改めてこういう説明すると、分かってくれることがほとんどです。ただ、こういう説明をして、何となく腑に落ちた感じであっても、いざ自分で使ってみると、引っかかってしまう子がいます。そういうとき、多くの子どもがひっかかっているのが、変数の数値をほかのブロックに代入する、下のような使い方であることに気づきました。
この使い方がわかっていないと、結果的に、一番よく使う下のようなプログラムになかなか結びつかないのです。
これは、要するに数学で言う「代入」の概念ですね。変数を苦手とする子どもをよく観察すると、どうもここが分かってない子が一番多いようなんです。なので、その辺もまた改めて説明したりすることが多いんです。
ただ、これさえ飲み込めてしまえば、たいていの子どもは、きちんと変数が使えるようになるのです。
ところが、ここまで説明してもどうしても変数がうまく使えない子もいます。たとえば、初期値のセットができないケースです。
最初に変数を扱うのは、だいたいかんたんなシューティングゲーム等ですので、得点や撃ち落とした敵の数を数えるには、まずそれらの変数をゲームスタートと同時に0にセットする必要があるわけです。ところが、このブロックを、自分のプログラムのどこに置けば良いかわからないケースです。この状況に陥る子どもは、まだ「逐次実行」が腑に落ちてないケースだと思います。つまりプログラムがスタートしたら、どういう順番にプログラムが実行されていくのかという部分がまだイメージできていないような気がするのです。 この「逐次実行」がどうしても腑に落ちないという子は、たまにいるので要注意だと思います。