プログラミングに抱く期待 ー論理的思考力ー
プログラミングを学ぶことで、「論理的思考力」をつけることができる。
最近こんなことをよく耳にしませんか?
親が期待している、といわれていて、多くのプログラミング教育が推す「論理的思考力」の意味する所は、どのようなものなのでしょうか?
よくあるケースから、親が期待している「論理的思考」を見ていきましょう。
ケース1:「一つ一つ順に考えられるようになる」
例えば、小学校の算数の問題。「3要素2段階の問題」と言われるものです。例題を見てみましょう。
合計40個のみかんが8個ずつお皿にのっています。
テーブルには空のお皿が4枚おいてあります。
お皿は合計で何枚でしょうか?
この場合、答えは「9枚」になるはずです。
(8個ものるお皿は結構大きいですね)
問題を得ステップは2段階です。
① 40(個)÷8(個)=5(枚)
② 4(枚)+5(枚)=9(枚)
といった具合です。
多くの誤答としては、8+4=12で、12枚と答えてしまうでしょうか。
これは、「算数の問題は計算して答えを出すものだ」と、答えを求める姿勢から、
条件反射的に、もっともありそうな数字である8と4を足して「答え」としてしまうことがあります。
ここで期待されている「論理的思考」とは、
算数で必要とされる「問題をステップ分けして一歩一歩解いていく力」と言えるでしょう。
ケース2「説明力が高まる」
例えばディベート。よく聞くのは「なぜならば」という言葉です。
「小学生が携帯電話を学校に持っていく必要があるか否か」
という論題で考える時、「賛成側」と「反対側」にわかれます。
そうなったとき、定型的なものであれば、
「私は、携帯を持っていくことに賛成です。なぜならば、自分の位置を知らせたり、緊急時に保護者に連絡ができるからです。」
と、「理由付け」をすることが「論理的な説明力」とされます。
ここで期待されている「論理的思考」とは、
国語で必要とされる「自分の主張を根拠と理由を持って説明する力」と言えるでしょう。
それぞれのケースを、「プログラミング」に置き換えてみる
では、それぞれのケースは「プログラミング」を学ぶことで、
身につけることができるのでしょうか。
最初に結論を言うと、「できるが、簡単なことではない」と言えるでしょう。
ケース1をプログラミングで考える
「段階に気づいて問題を一歩一歩解いていく力」は、プログラミングの場面では必須です。
どういうことかというと、プログラミングをすることとは、
「目的の機能を最小の機能の組み合わせから生成する」
ということだからです。
いかにして小さい機能を組み合わせ、実現したい機能をつくりだすために、記述するかが大切です。
例えば、すごく簡単な例で考えるなら、
Swift Playgrounds、「コードを学ぼう1」のステージ1「コマンドを使う」
ここでは、バイトくんに「3ブロック先の宝石をとってもらう」ためには、4ステップを考えなければなりません。
少し離れたテーブルの上においてあるペットボトルをとってもらうなら、
「そこにあるペットボトルをとって」
といえば済むのですが、バイトくんはそうはいきません。
下のような指示が必要です。
moveForward()
moveForward()
moveForward()
collectGem()
もう宝石のマスまで行けばとってくれてもいいじゃないか!
と思うかもしれませんが、プログラミングは、すべてをプログラミング言語によって記述しなければならないのです。
ケース2をプログラミングで考える
「自分の主張を根拠と理由を持って説明する力」に関しては、
プログラムを書いていると必ず起こる「バグ」を解決するときに必要になります。
それは「原因を考え、突き止める力」とも言えるでしょう。
起きている不具合の原因を突き止めるために、探していくことは、
「なぜ」を問い続け、いろいろな理由を模索することになります。
プログラミングを学べば、これらの「論理的思考」は身につくのか?
ケース1の論理的思考も、ケース2の論理的思考も、いずれもプログラミングでのケースを考えれば、身につけられるような気になってしまいます。
では、「プログラミング学習」の実例から、それらの論理的思考が伸ばせるのかどうかを見ていきたいと思います。
プログラミングはどのように学ばれるのか?
プログラミングを学んでいく一般的な方法は大きく分けて2つあります。
一つは子どもの「やりたいこと」をやる、放任的な学習方法
そして、もう一つは「能力」を高める、定型的な学習方法です。
放任的な学習方法
よくあるのはScratchなど、「どんなものでもカンタンに開発できる環境」のなかで、自由に遊び続けることです。
もちろん好きという気持ちを尊重したり、いわゆる「創造的」なゲームを創り出すことは、否定しません。
しかし、自由な環境で遊んでいるだけの子たちの多くは、条件分岐や変数など、抽象的で高度な内容になると自分たちの力では到達することができていません。
「作りたいもの」から逆算して一歩一歩順に組み立てていくのではなく、
子どもたちは、絵を書いていたり、動かしていたら、できてしまったものをどんどん拡張していきます。
この放任的な学習方法で獲得されるのは、
いわば、「雪だるま式のプログラミング」と言えるでしょう。
定型的な学習方法
定型的な学習では、ProgateやCodemonkey、もちろんSwift Playgroundsもなのですが、教科書やドリルを一つ一つやっていくものが主流です。
「一人でも学習できる」ということをウリに、プログラミングの学習パスも指定された中で一歩一歩やっていきます。
この教科書やドリルを一つ一つやっていくことで、プログラミングの知識をつけ、スキルを確実につけることは可能です。
しかし、定型的な学習には「一歩一歩やっていくためのストレス耐性」がなければ、続けることができません。
さらに、実際に教科書に書いてあることが100%実践で使えるかというと、
教科書やドリルで学んだ上で、実践的な内容を学ぶ必要があります。
基礎知識を学び、プログラミングとはなにかを理解することには繋がるものの、実践的な知識には更に一歩必要となるでしょう。
この定型的な学習方法で獲得されるのは、
いわば、「写経式のプログラミング」と言えるでしょう。
「雪だるま式」と「写経式」で身につけられるもの
プログラミングをしていく中では、「一歩一歩順を追って記述する」ことや、「原因を何度も追究する」ことが、求められます。
しかし、ただそれらの行動が要求される環境に置かれるだけでは、他の分野で使える、それらの力を身につけることに繋がるわけではありません。
実例を思い出してみてください。
まずは「雪だるま式」。こちらは、「一歩一歩順を追って記述する」ために必要不可欠な「ゴールから逆算する」ことはは明らかに軽視されています。
ボトムアップに一歩一歩順を追ってプログラムをして「子どもにしてはすごいものができた!」と見えるかもしれませんが、それはあくまで結果であって、「できることの繰り返し」に過ぎない可能性を捨てきることができません。
つまり、一歩一歩順を追って、新しいことにチャレンジをするでもなく、ゴールに向かって戦略的に解決するでもなく、どっちつかずのノーチャレンジになってしまうかもしれないのです。
では、次に「写経式」。こちらは、もともと「論理的思考」が強い人は理解が早く、あっというまに進めることができます。そして、基本的なプログラミングのやりかたと知識をみにつけるには最短の方法です。
しかし、この「写経式」の問題は、「実践につなげるのが難しい」ことにあります。プログラミングにおいても「仮想的な環境」で実現されます。「写経式」のプログラミングは、実践に直結するかというとなかなかそうとも言えない部分があります。
特に難しいのが「原因を突き止める」ということ。実際に一つ一つのコードの意味と、それらのつながりと、実行イメージを頭の中に持つことができなければ、原因を突き止めることは難しくなります。
「写経式」のプログラミングだけでは不十分といえるでしょう。
(続く)
ただ続けることを目的に、毎日更新しております。日々の実践、研究をわかりやすくお伝えできるよう努力します。