2020年にプログラミング教育が小学校で必修化になりましたね。こども向けのプログラミング学習もオンラインだったり、スクールだったり、アプリだったりと急激に選択肢が増えてきました。
私は、中学校ぐらいからパソコンに興味を持ち、大学時代に独学でプログラミングを学びました。そのまま、エンジニアの道に進み、その後さまざまな言語を習得し、業務でも使ってきました。
その経験から言えることは、プログラミングとは、どれか一つの言語で学べば、他の言語でも言語の違いを意識するだけで同じように使うことができる技術だということです。
プログラミング言語はアルゴリズムを実現する手段でしかないので、言語は最低一つ経験があればよく、アルゴリズムの方が重要です。
プログラミング学習環境の現実
子供用のプログラミング学習環境として有名なのは、MITが開発したスクラッチがあります。スクラッチはGUIでプログラムを組んで、キャラクターに色んな動きをさせてプログラムの動画確認ができる環境です。
スクラッチ上でプログラムを組み、コンパイル、実行、動作を確認という一連の流れを行えるので、学習環境としてとても優れているように感じます。
プログラミング学習はゲームのように楽しみながら学べるような誤解がある
しかし、実際には、子供は新しいゲームのような感覚で最初は取り組むわけですが、自由度が高すぎるため何をしていいのかわからず、テキトウにマウスでポチポチ部品を並べて、プログラミングをした結果、キャラクターに変な動きをさせるだけで終わってしまいます。
せっかくの素晴らしいプログラミング環境も、子供たちにとってはつまらないゲームだという判定となり、離れて行ってしまいます。
子供のプログラミング学習には、良い指導者が必要です。
プログラミング学習とプログラム言語学習は違うモノ
プログラミングを行うには、プログラミング学習とプログラム言語学習の2つの学習が必要です。
私がプログラミングを学んだときは書籍に説明と基本的なコードの例があり、それを自分のPCでプログラムに写経する。それをベースに自分でコードを変更したりして、プログラミングの基本とプログラム言語を学んでいきました。
プログラミング環境は、プログラミングの動作確認するためのものです。本来であれば、プログラミングは紙と鉛筆があればできるもので、その自分の考えが正しいかどうかの確認に使うべきものです。何の考えも無く、プログラミング環境をいきなりいじってるだけでは、プログラミングは覚えられません。
ゲーム感覚で動かせるプログラミング環境は素晴らしいと思いますが、それはプログラミング言語学習のハードルを下げているだけです。もう一つのプログラミング学習のハードルは下がりません。プログラミング学習をしないでも、テキトウにやっていて何んとなく動いてしまうため、プログラミング学習とプログラム言語の学習が同じものだ勘違いしやすいですが、現実は別物です。
スクラッチの使い方を覚えるのは、あくまでもプログラミング言語や環境の理解です。プログラミング学習は別に行う必要があります。
プログラミングの楽しみはクイズやパズルを解く楽しみと同じ
私の感覚では、プログラミングはパズルやクイズを解く感覚に近い楽しさがあります。
実際のプログラミングには何らかの制約があり、その制約の中で最適な答えを探すクイズを解くことがプログラミングの技術(スキル)です。
今の子供の学習環境は自由度が高すぎて、どんなクイズなのかわからないまま、好き勝手にいじれるようになっています。何んとなく動くのでそれで満足してしまうのでは、何も身につきません。
勉強の段階で好き勝手にやっているだけでは何も身につかないのは、他の教科の勉強と同じです。プログラミング学習だけが特別なわけがありません。
私がプログラミングを教えるのであれば、オブジェクト指向の教科書のように現実世界を無理にプログラムで模擬した役に立たない例題よりも、実践的な例題をプログラミングした後に、現実世界と対応を取っていくように教えます。
本当に必要なプログラミングのスキルは『How』ではなく『What』
プログラムは学ぶ段階というものがあります。
- プログラムの構文を辞書的に学ぶ段階
- 小規模なプログラムを自分で実際に書いてみて学ぶ段階
- 人のプログラムを参考にしながら自分に不足しているスキルを補う段階
- 小規模なプログラムを組み合わせて大規模なプログラムを書く段階
プログラムの構文を辞書的に学ぶ段階
昔で言えば、書籍からプログラミング言語の構文とアルゴリズムを学びました。昔はCPUの処理が遅かったりするのでプログラムの書き方で実行速度や効率などが変わったため、どこで使うんだろう?という小難しいアルゴリズムを学ぶことが重要でした。
今思えば必要無いことまで事細かに書かれた辞書のような本ばかりで、どこまでやれば次の段階に移れるのかが、とても分かりにくかったのを覚えています。
また、昔はコンパイラなどが有料でしたから、簡単にプログラムを書いて実行するという環境があるわけではありません。そのようなことから書籍で机上で勉強することが多かったです。今ではWebでなんでもある程度調べられますので、この段階にあまり時間を割かなくても良いと思います。
小規模なプログラムを自分で実際に書いてみて学ぶ段階
本などに書かれているサンプルプログラムをコーディングすることで動作を確認しながら、実際のプログラムの書き方を学んでいきます。
プログラムの先頭にはこれが無いとダメ、最後はこれが無いとダメとか、ベースとなる部分も学び、自分なりのスタイルが出来上がります。
自分でプログラムを追加で書いて行ったりして、プログラム言語の文法エラーなどに悩まされるのもこのころです。
人のプログラムを参考にしながら自分に不足しているスキルを補う段階
ある程度自分で小規模なプログラムを書けるようになると、実用的なものに取り組もうと思うようになります。基本だけじゃなく応用的な発想が必要になりますので、他の人が書いたプログラムなどを参考に応用力を身に付けていきます。
小規模なプログラムを組み合わせて大規模なプログラムを書く段階
小規模なプログラムを作れるようになると、それら部品として組み合わせて大規模なプログラムを組めるようになります。こうなってくると、プログラムを思い通りにかけるようになりますので、どう書くか?よりも何を書くか?の方が重要になってきます。