プログラマの視点から「プログラム教育」騒ぎを見てみる

2年目のプログラミング教室 | Moonmile Solutions Blog を書いたときに思ったことを少し補足。

「プログラミングを何処で学びましたか?」と問われたとき、ほぼ100%「独学です」と答えるしかない世代(大学にはまだ情報科がなかったし、科目としてはIEEEの実数計算を学ぶ位なものだったから)から見れば、「とあるプログラム言語を学び、将来に備える」という発想で、プログラミング教育をしようとするならばナンセンスだろう。小学生時代に学んだプログラム言語そのものが就職する頃にも有利に働く、訳がない。いや、COBOL とか Fortran とかは長く続いている言語だし、そういう意味では Javascript だって C++ だって、将来的にレガシーな「古典言語」として読むことは必要になるかもしれないが、それは古典でしかなく、現代文ではない。

だから、プログラミング教室を請け負うときに考えたのは、将来的に役に立つあれこれの話ではなくて、

  • 今、情報が取り入れやすいプログラム言語を扱う
  • 今、何か実現しやすいプログラム言語を扱う

という同時代性に重きを置いて、Scratch、Python、C言語(Python はまだ取り込んでいないし、C 言語 + Arduino の組み合わせはまだなんだけど)という柱を考えた。ぼちぼちと始まるであろう学校の「プログラミング教育」は、教育要領としてプログラム言語に負うわけではなく「論理思考」に重きがあるので、実際にキーボードをぽちぽちと打つ時間は1,2時間程度でしかない。むしろ、とあるキーワードを Google を使って検索して何かの調べ物をするとか(既に、小中学生レベルでやっている)、マウスを使ってポチポチと学習ソフトを動かすとか(マウスは、4年生ぐらいだと動かせない子が多い)のほうが大切だったりする。スマホでゲームをダウンロード&遊んだり、任天堂DSで妖怪ウォッチのRPGを進めたりすることは、小学2年生でも軽くできることなのだが、「能動的に」パソコンやスマホを使って「調べる」ことはなかなか難しい。Youtube でマリオの動画を見たいときに「マリオ」で検索するとか、攻略で詰まってしまった Wii の毛糸のカービィを調べるために、スマホで「カービィ」と動画を見ていって、ちょっとずつ解いていくとか、そういう間接的な使い方は難しい。そう、昔小学校の頃に「辞書の引き方」という授業があったのだが(今は、何故か学校の辞書を使ってちょっとしかやらない。自分の辞書を買わない)、とある目的を達成するのには少しだけ回り道をして道具を揃えないといけない&道具を使いこなさないといけない、というのが重要になってくる。そう、RPG でいう道具集めみたいなものだ。

そういう「道具」としての「プログラム言語」の場合は、今昔に置いて古くなったりするものだから直接的に扱っても仕方がない。しかし、何かを実現しようとするときに、道具としてのプログラム言語を扱う(あるいは検索サイトを使う、将来的には音声を通じてAIに尋ねる)ための「組み合わせ」としての論理能力は重要である。いや、そもそもが、プログラム言語というものはロジックの合わせであり、とあることを実現するために引数を与えると、何らかの処理が行われて結果を返すという「関数」的な使い方に終始することになる。

なので、プログラム言語自体の選定にあれこれするのは無意味である。無意味ではあるもし、特殊過ぎる性能(とある手段をクリアするために作られた道具)を扱うためにプログラム言語を選定しようとするのも間違いである。直前(2年後に就職とか)ならば別なんだけど。

だから、教える側が馴染みに深いプログラム言語を扱って(この場合は「教師」となる)、生徒や児童のサポートができればよい。たとえば、プログラム言語の学習書のように「int x;」とは何かとか、宣言とは何かとか、for文とは何か、とかみたいな文法的なものはいらない。そのあたりは道具立てでしかない。同じことは Scratch の様々なブロックを扱うときにも言える。

それよりも、もっと目的となること、例えば「猫を端から端まで動かしてみよう」みたいなことが必要で、Scratch で言えば、繰り返しのブロックを使って端に触れたかどうかを判定するとか、C 言語で言えば width を設定しておいてfor文で最大値に達するまで繰り返すとか、Unity ならどうするとか、Python を使うとどうなるとか、というのが問いとして適切になる。つまり、教える側としては「繰り返しのブロックを使ってみましょう」というようなプログラム言語の文法から入るのではなく、「地球を太陽の周りを回らせてみましょう」という何かを達成させるために、道具としてのプログラムを使うというスタイルをとるのがベターであるし、それがプログラミング教育の本質であろうと私は思う。

ちょうど、数学の問題を解くのと同じなんだけど、異なるのは答え(正確には試行過程なんだけど)はひとつは限らない。例えば、Scratch で、

  • 猫がマウスカーソルを追うようにしてみよう

としたとき、正解ははひとつではなく、実際に3種類ぐらい皆(小学3-6年生)が作ってくる。ああ、なるほど、そういう方法もあるのかと感心するぐらい様々な方法がある。といういことを覚えておいて欲しい。だから、教科書通りの解き方をしてないからといって「×」にするのは、それこそ「×」だ。これを実施するためには、

  • 目的(達成条件、クリア条件)が明確になっていること
  • 道具立てを縛らないこと
  • でも、わからない場合は、ヒント(補助線のようなもの)を出しても良い

を教える側が念頭に置く必要がある。逆に言えば、児童/生徒の「何をすれば正解なの?」の意識を壊す必要があるということ。何をやっても、正解に至る≒目的を達成することは可能であるということに気付かせる必要がある。

カテゴリー: 雑談 パーマリンク