そもそも、プログラミング、とは何か?
「プログラミング教育」という言葉について、あらためて考えてみます。
そもそも、「プログラミング」とは何でしょうか?
Wikipediaによれば
コンピュータにさせたい処理を「プログラム」という形で指示すること、です。
ちなみに「プログラム」とは処理を実行するための命令群、ですね。
コンピュータが理解できる命令は、そのままでは人間にとって分かりづらいので、人間に理解しやすいように、プログラムを作りやすいように、工夫されたプログラミング言語がたくさんあります。
子ども向けのプログラミング言語として最も有名なのはこれですね。
私たち大人が使うプログラミング言語とは違ってScratchがすごいところは、どんなプログラムを作っても「絶対に動く」ことだと思います。
プログラムを作る人たちのことをプログラマーとか、エンジニア、と呼びますが、彼ら彼女らが最も苦労することが何かといえば、僅かな間違いがあるとプログラムは動かなくなる、ことです。
これは何かというと、コンピュータは曖昧な命令を理解できない、ということです。
たとえば、小文字の「i」と「l」が似ていてlittleがlittieになっていたら、プログラムは動きません。
こうした不具合を「バグ(bug)」といって、プログラムが動かない原因を一生懸命探すことを「デバッグ(debug)」とよびます。
ゲーム業界あたりでは、「デバッグ」を職業にする人たちもいるようです。
つまり、お金を払って人にお願いしたくなるくらい、プログラムを間違いなく動かす、というところにはコストがかかるのです。
それがScratchではかからない。
ここはすごく大きなポイントだと、個人的には思っています。
Scratchや文科省のプログラミンのように、構文を意味するアイコンを組み合わせる形式のプログラミング言語では、例えば文字を入力し間違えるとか、ありえない構文の組み合わせ(endとstartが逆、など)はそもそも実現することができません。
正確には、意図した結果と違う場合にも「バグ」と言うのですが、人間のポカミスが原因の「バグ」なんかは入り込む余地がありません。
これからプログラミングを楽しもうと意気込んでいるときに「デバッグ」に時間をとられるなんて、できれば避けたいところです。
Scratchは、子どもたちが純粋にプログラミングを楽しめるように、「i」と「l」の違いを探すために目を凝らすとか、構文の間違いを探すために処理を机上でトレースするとか、そういった無駄な作業から解放してくれました。
とても素晴らしいこと。
のように思えます。
でも「教育」という概念から捉えたとき、これには大きな問題があると私は考えています。
なぜなら「デバッグ」から解放されることで、論理的思考力や問題解決力を高めるチャンスを失うからです。
私はプログラムを1行も書かなくなってもう10年以上も経つのですが...
プログラミングを始めた頃に、一番おもしろいと思ったのは実は「設計」と「デバッグ」でした。
「設計」のことはまた別の機会に書くとして、なぜ「デバッグ」をおもしろいと思っていたのか、について書いてみます。
自分のつくったプログラムが動くことは、それは爽快でとてもおもしろいことです。
一方で、思うようにプログラムが動いてくれないとストレスを感じます。
そしてここでイライラして当り散らすか、問題を探し当てることにモチベーションをもっていくか、によって大きな違いが出ます。
「デバッグ」では「エラーメッセージ」とか「ログ」という情報を頼りに「バグ」の在り処を調査します。
多くの場合は、この情報からすぐに「バグ」を発見できるのですが、そうでないときには大変です。
一度読んだだけではよく分からないシンプルでそっけない文字列を読みながら、過去の経験やプログラムを動かそうとしている環境を思い出しながら様々な推測をし、「問題の仮説」を立てます。
そして実際にプログラムや環境を確認し、必要に応じて変更して再び動かしてみる。
これを何度か繰り返すことになります。
これこそまさに、論理的思考力を総動員した問題解決です。
プログラムが大きく、複雑になるほど、原因となりえる要素が増えるのでデバッグのコストが上がるのですが、それは裏返すと、より高度な論理的思考力や問題解決力が求められるということでもあります。
効率良く「デバッグ」するためには、経験に基づいた知識や勘によって筋の良い仮説を立てることも有効ですが、想定しうる様々なケースを論理的に導き、仮説を組み立てる力は繰り返し訓練することによって磨くことができます。
私自身の経験でいうと、プログラミングを始めた当初は苦痛でしかなかった「デバッグ」も、自身のスキルが上がるにつれて、より高度な「デバッグ」を楽しむことができるようになりました。
誰もが匙を投げるような現象に対しても根気強く理詰めで立ち向かっていくと、いつか「バグ」を突き止めることができるので、達成感を味わえるところが良いのかもしれません。
よく、プログラミング教育によって子どもの論理的思考力を高めることができる、といった説明を見かけることがありますが、正常ケースしか想定しない安全地帯の中でプログラムを組むよりも、想定外の「バグ」が潜んでいるプログラムと格闘する方が、スキル向上には効果的のはずですね。
試行錯誤して苦しんだ経験の方があとに活きてきますから。
そういう意味でも、Scratchを体験しただけで論理的思考や問題解決力が身に付く!なんて短絡的に考えない方が良いだろうな、と思います。