見出し画像

プログラミングを教えて感じる記憶力と論理的思考について

「論理的思考」って、どうやって鍛えるものなんでしょう…

子どもたちにプログラミングを教えていると、本当に人間の能力というのは、人それぞれで、同じ人間など一人もいないのだと言うことを思い知らされます。ある子を見て、「ああ、こうなんだな…」と思っても、それが他の子にそのまま通用すると言うことはほとんどないと言ってもいいでしょう。

そんな中で、最近ちょっと考え始めたのが、「記憶力」と「論理的思考力」についてなんです。あんまり結論めいたものには正直まだ至ってないのですが、これまで感じたことをお話しします。


まず前提として、わたしはこの6年間小学生を中心にScratchのプログラミングを教えてきて、よく言われる「暗記型学習」を指向する子が、案外多いんだなあ、と感じていたんですね。たとえば、教室の体験のとき、Scratchをちょっとでも触ったことがあるという子には、たいてい「何か作ってみて」と聞くのですが、すると結構凝ったプログラムをちゃちゃっと作る子がいるんですよね。この段階でクローンを使う子はまだ少ないですが、座標を使った上下左右の移動とか、かんたんな当たり判定くらいは十分にこなしている子は案外いるものです。

これくらい出来てる子が、実際に教室に入ってきて、課題を出したりすると、とたんにワケが分からなくなるケースがあるんです。要するに、彼らはその部分のプログラムを「丸暗記」していただけなんですね。

つまり、プログラムの基本のキである、逐次実行とか、繰り返しとかの概念を特に理解してるわけではなく、ただ単に、「プログラムブロックをこうならべれば、こうなる」ということを覚えていただけなんですね。だから、ちょっとその延長線上のことをやらせようとすると、なかなか対応できない。要するに応用がきかないんです。

もちろん、「こういうときはこうする」式にプログラムを記憶していくことが絶対ダメだとは思わないですし、最初はそういう記憶の上に立たなければ、何も進まないと思います。ですが一方で「当たり判定」と言われるプログラムや、クローンを使ったビームの作り方とか、おそらくほとんどの子どもが「こうやればいいんだ」という感じで、プログラムブロックの組みあわせ方を覚えるだけで使っているような気がするのです。

わたしは、こういうプログラムについて、「なぜそうブロックを並べるとそうなるのか」という点を、敢えてくわしく説明するようにしています。これで、プログラムの論理的な考え方が分かってくると、次に「じゃあこういうときはこうすれば良いのかな?」という次の発想に応用が利くようになっていくだろうと思っているからです。そして、それが「論理的思考」を鍛えるというか、教えることに通じていると思うからなのです。

初期の頃にわたしがよくやる説明に、「当たり判定のプログラムに、なぜずっとが必要なのか」というのがあります。

初心者が必ずやるミスに、下記があります。「当たり判定」に「ずっと」を忘れるやつですね。

ところが、この状態でも、下記のようにスプライトを配置してスタートすれば、最初の1回だけ「色の効果を25ずつ変える」のブロックは動作するのですよね。

最初にネコがリンゴに触れている状態に配置してから、旗をクリックすると、ネコの色が1回だけ変わります。その後は、もう一度ネコがリンゴに触れても、もう色は変わりません。

ここで説明しているのは、次の2点です

  1. 旗を押したら、旗につながってるブロックは順番に実行されていく

  2. 「もし○なら」ブロックは条件にマッチしなければ何もしないで終了する

上のようにネコとリンゴを配置したら、旗を押した次の瞬間「もしAppleに触れたなら」のブロックは、当然動作するわけですから、ここでネコの色が1回変わるわけです。そして、1回しか変わらないのにもワケがあるわけです。それは、「もし○なら」ブロックは、1回実行したらそこで終わるわけですから、そこでプログラムの動作は終了なのですよね。もちろん、相手は子どもですから、しゃべるときはこんな用語をそのまま使うことはあまりないのですが、内容はこういうことです。

「当たり判定」のプログラムの正解です。

ここまで話をして、最後に「だからずっとブロックが必要になる」という話をするわけです。上の正しいプログラムを作った後、同じようにネコとリンゴを配置して旗を押してプログラムをスタートすると、今度はネコの色が何回も変わっていきます。これで、「ずっと」があるときと無いときのプログラムの動作の違いを実際に体験してもらうというわけなんです。

わたしは本当に教室の生徒全員に、この説明を何度となくしていると思います。ところが、それでも、なんかこのプログラムの動きが腑に落ちないまま先に行ってる子が結構いるというのがホントのところなのですね。

一種のパターン認識のように「もしのブロックには、ずっとが必ず必要」ということだけを理屈抜きで暗記すれば、けっこう使えるようにはなるんです。でも、そういう認知だけでプログラミングを進めると、やっぱり応用が利かないままになってしまうのではないかと思うのです。

こうやって入門して、クローンや乱数、変数など、いろいろ学んでから、あるときわたしは下記の課題をやらせます。これは、昔はやった「ブロック崩し」と言われるゲームの一部ですが、これを、「全部クローンで並べるようにして」という課題なんです。

スプライトのクローンを作ったら、右に移動。これを何回か(上の例では7回)繰り返してから、同じ動きを複数回(上の例では3回)繰り返してブロックを並べるという課題です。

最終的に、こういうプログラムになることを期待するわけです。

もちろんこれが絶対の正解ではありません。折り返して配置するようなロジックを自分で考える子は、わたし的には合格です。ただ、この場合はこれが一番コマンド数が少ないプログラムではないかということですね。

もちろんやり方の手順は教えますよ。だいたいこんな風に話します。

  1. まずスプライトをひとつ左上に置く

  2. クローンを作ったら右(X座標の+方向)に移動する

  3. これを何回か繰り返して右端まで並べる

  4. そうしたら、そのプログラムを丸ごと繰り返して2列目を作る

  5. 2列目までできたら、3列か4列好きな数だけ並べる

ところが、ここまで相当当たり判定やら変数、乱数、クローンを使ってゲームを作っていた子の中でも、この課題が全く出来ない子がいます。それも、ちょっとわからないというレベルではなくて、こういう手順を聞いても手も足も出ない感じになってしまうんですね。

当初わたしは、これはそんなに難しい課題では無いと思って出していたのですね。ところが、そこそこプログラムを作れる子の中にも「とんでもなく難しい」と感じる子がいるようでして、そういう子は、要するに「記憶」に頼ったプログラミングをやっていて、「論理的思考」の積み上げのようなことがまだあまり身についてないのではないかと思うのです。恐らく、記憶力が人よりかなり優れているという特性を持っていると、最初のうちはどんどんプログラミングができるし、先に進めるのですが、論理性が身についていないと、こういうところでつまずいてしまうんですよね。

そして、そういう子に「論理的思考」を根付かせるためには、一体何をすれば良いのかというのを、日々考えているわけですが、わたしもまだあまり明確な答えにはたどりついていません。とにかく、このような論理を積み重ねるような体験を続けていくしかないと思うのです。

教室では、わたしの用意したScratchのカリキュラムを終えた子は、次はどんどん自分で好きなゲームを作るような感じになります。このとき、Scratchのギャラリーでいろんなゲームを参考にして、「これはできそう?」「こういう動きはこうやったら作れるんじゃない?」などとアドバイスしながら、とにかく見た動きを自分でプログラムとして作っていくようなことをよくやってもらっています。こういう活動を通じて、「目で見て体験した画面上の動きをプログラムに置きかえる作業」が、「論理的思考」を鍛えるのに役に立つのではないかという考えからなのです。

でも、「論理的思考」をもっと鍛える必要があるであろう子どもほど、これをやると「ゲームで遊んで面白かった」だけで終わる傾向があるのも事実でして、こんどはそこから何か作らせるところにもっていくのも、結構苦労だったりするのですが(^^;)