見出し画像

予言:「プログラミング教育」政策は失敗する

どうにも得心がいかない。ごく簡単な話だと思うのだが。

 「情報」の授業でプログラミングを教えている。
「変数」の意味と,代入,四則演算,関数,繰り返しや条件判断の基本的な考え方を学んで,教科書のシミュレーションの問題やセンター試験の問題をやってみよう,という授業。
 プログラミング言語としては,教科書には JavaScript が載っているが,もっと簡単に使える言語を利用している。簡単に,とは,ライブラリの読み込みや変数の宣言などの「前段階」が不要で,すぐにコードを書けばよいということ。
 基本的な事柄について,一通り例を示しながら実際に入力して実行させた。この段階では生徒によって進度の違いはあるが一通りできた。あとの分析のために,これをA段階としておこう。
 想定より早くできたので,補充課題を用意した。これをB段階としよう。生徒によって進度が違うので,補充課題は全部はできなくてもよい前提。授業後,解答を配布した。

 次に,「待ち行列」のシミュレーションを行うための準備として,問題形式でプログラムを書かせたときのことである。
 次の問題の正答率が低いことに,「なぜ?」とおおいに疑問が生じた。

第1問
 randomint(m) は0以上 m 未満の整数の乱数を作る関数。
 「乱数」は「無作為に」とか,「ランダムに」という表現で作られる数。
たとえば,val=randomint(5) で 0,1,2,3,4 の値のいずれかがランダムに作られて,変数 val に代入される。
1,2,3,4,5,6 のいずれかの数をランダムに作りなさい。

どうだろう。randomint(6) にすれば,0,1,2,3,4,5 の値がランダムに作られるので,それに1を加えるだけのことだ。

    val=randomint(6)+1

ところが,これができない生徒が予想以上に多かったのだ。
間違いとして val=randomint(6) や val=randomint(7) が多いのは想定内である。しかし,「0から始まるのだから1を足せばよい」という発想はそんなに難しいことだろうか。

さらに,次の問題。

第2問
1〜6の乱数を1000個作って出た回数のリストを作る。つぎのプログラムを完成しなさい。
  kaisu=[0,0,0,0,0,0];
  repeat(1000,
   n= ;  // 1〜6の乱数を作って n に代入する
        // kaisu のn番目の要素に1を加える
  );

3行目と4行目を完成する。
第1問ができれば,3行目はそのまま n=randomint(6)+1 でよい。
しかし,第1問ができなくてもこちらができている生徒が何人もいた。
なぜか。
実習は相談しながらやってよいことになっている。
したがって,相談した結果,誰かからの情報を得て n=randomint(6)+1 にしたのだろう。ところが,第1問はできたつもりでいるから間違ったままなのだ。
つまり,理解したわけではなく,写しただけなのだ。

この演習も,授業後に正解を配布した。「確かめておきなさい」ということだ。

 次が待ち行列のシミュレーションの演習。教科書では表計算ソフトを使っているが,これをプログラミングでやる。表計算ソフトでは限界があるからだ。
 テキストにはプログラム全体とその説明を記述してあり,それを間違いなく打ち込んで動かし,結果について考察する。プログラムの打ち込みと動作確認で1コマ,レポート作りに1コマである。プログラムは全部で30行。
その中に,次の記述がある。rondomint() を使った箇所である。

12: interval=randomint(VtimeMax-VtimeMin+1)+VtimeMin;
12行目,randomint(m) は0以上 m 未満の整数の乱数を作る関数。
    ちょっと複雑なので,具体的に考えてみよう。
    VtimeMin が1,Vtimemax が6 とすると,VtimeMax-VtimeMin+1
は6なので,randomint(6) で 0,1,2,3,4,5 の値のいずれかが乱数で作られる。
    1を加えて,1,2,3,4,5,6 のいずれかの値になる。

VtimeMin,Vtimemax という2つの変数を使っているための説明文だ。
内容としては準備段階でやったものをもう一度説明したことになる。

 さて,冬休みを挟んで3学期の初め,予告した上でプログラミングのテストをやってみた。予告には,いくつかの項目の中に「整数の乱数を作る randomint( ) の使い方」も入っている。
 テストでは実際にコンピュータでプログラムを書いて実行する。それにあたって,相談は不可だが,テキストは見てよいことにした。つまり,命令の使い方などを暗記する必要はないということだ。また,わからない問題はパスして先に進んでよい。

テスト問題の第1問。

【1】乱数の発生
 randomint(m) は0以上 m 未満の整数の乱数を作る関数である。
 たとえば,val=randomint(5) で 0,1,2,3,4 の値のいずれかがランダムに作られて,変数 val に代入される。
 5以上10以下の整数の乱数を,変数val に代入するプログラムを2行目に書きなさい。

 前に説明した randomint(m) の意味をまた説明している。乱数なので実行するたびに表示結果は異なる。したがって,書いたプログラムが正しいかどうかはすぐには判断できない。そのまま第2問へ進むことになる。無答はわずか4名であった。しかし,正答率はどうかというと 50.5% だったのだ。半数しかできていない。前の授業で休んでいても,この問題だけ読めばできるはずであるにもかかわらず,である。

考えられることはいくつかある。
(1) 説明の意味がわからない
 「たとえば,val=randomint(5) で 0,1,2,3,4 の値のいずれかがランダムに作られて,変数 val に代入される。」という説明の意味がわからないのだ。しかも,何度読んでも,である。
 これは読解力の問題だろう。数学というほどの内容ではない。
(2) 答えを聞いて(見て)も理解できていない
 「待ち行列」のシミュレーションを行うための準備段階で,第2問を相談してやったのに,第1問を直していない,というのが,これに該当するだろう。
(3) 答え合わせをしていない
 今までにやった演習で2回出てきている。解答プリントを渡しても,答え合わせをしていないのではないか。
(4) 答え合わせが,「答えを合わせる」で終わっている
 これは,どんな科目でも言える。合っているかどうかを見るだけで,違っていた場合になぜ違ったのかをまったく考えていないのである。
 これについては,結構根深いものがある。たとえば,マークシート式のように,選択肢から記号で選ぶ問題。答え合わせをするときに,間違っていたら赤で記号を直すだけ,というものである。記述問題でも同じ。正解を赤で書き写すだけ。
(5) 応用が利かない
 「1,2,3,4,5,6 のいずれかの数をランダムに作る」には val=randomint(6)+1 とすればよいことはわかった。しかし,「5以上10以下の整数の乱数を,変数val に代入する」にはどうすればいいかがわからない。
 これを,普通「応用」という。
(6) テストをする,と予告してもちゃんと復習してこない
 「情報」は大学入試科目にはない。だからテストでちゃんと点を取ろうという気にならない。
 そんなばかな,と思われるかもしれないが,定期テストへの取り組みを見ればわかる。入試科目にないからちゃんと勉強しないというのは情報にはかぎらない。
 もちろん,それはわかっているから,そんなに身を入れて復習していなくても,その場で考えればわかるような問題を出しているのである。もう一度問題文を見て欲しい。「関数」の意味がわからないとできないだろうか。プログラミング用語の「代入する」がわかっていないとできないだろうか。

 本稿の前の方でA段階,B段階と書いた部分をもう一度見てもらいたい。
A段階:テキストの説明を読み,例をそのまま打ち込んで確かめながら進んでいく。
B段階:一通りやったあと,問題形式でプログラムを書く。
 A段階が想定より早く終わった。それで,B段階を用意したのだが,これがほとんど進まなかった。
 つまり,テキストに書いてあるプログラムを打ち込んだだけで,理解はしていなかったことになる。理解していないから応用ができない。
 たとえば,テキストに次の例がある

(例3) 1から10までの数のうち偶数だけの和を,繰り返し処理の repeat() を用いて計算する。
 偶数は2で割りきれるので,余りを求める組み込み関数 mod(n,m) を用いる。

これに,プログラムの例がついている。

   16: wa=0;
   17: repeat(10,a,
   18:   if(mod(a,2)==0,wa=wa+a);
   19: );
   
 ※ 18 行目は,「もし a を 2 で割った余りが0ならば wa に,wa + a を加える」

対して,補充課題の第1問

(1) 初項 1 , 公差 3 の等差数列の,初項から第20項までをリストにし,その和を求める。

 もちろん,「等差数列」の意味がわからなければ,つまり, 1,4,7,・・・ を作ることがわからなければできない。
1,4,7,・・ は3で割って1余る数だからと考えて上の例を応用できるかどうか。それがわかっても,繰り返しを何回(1からいくつまで調べればよいか)すればよいかがわからないかもしれない。そういう生徒が200人中数名いることは想定できる。(等差数列は数学で既習)
 しかし,この問題ができない生徒が予想より多かった。プログラミングの問題というより,数列の概念(数学)の理解の問題かもしれない。(いちおう,県下十指に入る進学校)

 そう。ここで,できる・できないは,「プログラミング」の問題だろうか。
書かれていることの意味を理解し,それを応用するという,読解力,応用力の問題ではないだろうか。たかが val=randomint(6)+1 ごときに「数学」もなにもないだろう。これを「プログラミング的思考ができるかどうかだ」とでもいうのだろうか。記述されていることが理解できたかどうかの問題だ。

小学校に「プログラミング教育」が導入されようとしている。スクラッチなどを用いてプログラミングとはどういうものかを学ぼうというわけだ。

ここではっきり断言・予言してしまおう。
読解力に焦点を当てて教育を改善しない限り,小中学校でプログラミングを必修にしても人材は育たない。15年後には「こんなはずではなかった」となるだろう。誤った「ゆとり教育」政策と同じ轍を踏むのだ。