こんにちは、若林です。
この週末、NASA主催のハッカソンに、大阪会場のスタッフとして参加してきました。一日目の夜、宇宙つながりということで、一部のメンバーで映画「GRAVITY(邦題:ゼロ・グラビティ)」を観ることになり、観終わったあとに衛星に詳しい方から、内容の正確さについてうかがうことができました。
お話によると一部正確さに欠くところはあるものの、おおむね正しく一般の方にもわかりやすい描写になり、且つウソにならないような設定がされているとのことでした。
一方で、衛星そのものを開発されている方のお話としては「あんなに簡単には壊れない」というコメントもあり、興味深いものがありました。映画に100%真実を求めているわけではありませんが、こういう映画の楽しみ方も悪くないですね。
NASA Space Apps Challenge 2018
https://2018.spaceappschallenge.org/
Yahoo!映画P「GRAVITY(邦題:ゼロ・グラビティ)」
http://bit.ly/2yUaV5V
■プログラミング教育で論理的思考は身につく?
さて、本題です。プログラミング教育関係の記事や宣伝の文句を見ると「プログラミングをやると論理的思考が身につく」と言われています。しかし、私は「プログラミングをやっている人の思考が必ずしも論理的ではない」と考えています。
その理由は、実際に職業としてプログラムを作っている人(つまり、プログラマー)で、論理的思考が実践できていない人もいるからです。
世の中には「処理内容に矛盾がある、漏れがある」「正しく対処されないエラーケースがある」といった問題を含むプログラムがあり、これらは「論理的に考える」ことが抜けているために生まれています。
つまり、そういったプログラムを作る職業のプログラマーがいる以上「プログラミングをやっている人は論理的思考である」と考えられないのです。
■論理的思考とは?
そもそも、論理的思考とは何なのでしょう? プログラミング教育が語られる時には「論理的思考」を「ものごとを順序立てて考える思考」と位置付けられていることがよくあります。
それも確かに論理的思考のひとつではあるのですが、その前段階として「目標から手順を分解する思考」と合わせなければなりません。
プログラミングに限らず何か作業を進める時、いきなり「ものごとを順序立てて進める」ところに着手する人はいなくて、まず「自分がやりたいことを達成するには何が必要か、何をやらなければいけないか」を考えるはず。
これはプログラミングでいうところの「設計」にあたるわけですが、前記した「処理内容に矛盾がある、漏れがある」「正しく対処されないエラーケースがある」のも、設計が正しくできていないのが原因です。
■カレーを作るにはどうしたらいいか?
よくプログラミングは料理に似ていると言われます。プログラムが正しい手順で組み立てられていなければ、期待した動作にならないように、料理も正しい順序にしたがって作らなければ、食べられるものになりません。
一方、料理を作ろうと思った時に、いきなり作り始めるのではなく、目的のものを作るには何が必要か、どんな手順で作らなければいけないかを考えるはずです。
先日、子供達に「カレーを作ろうと思ったら何がいる?」と聞いてみたところ「肉」「じゃがいも」「ルー」といった答えが次々と返ってきました(思えばにんじんは出なかったような)。
材料がわかったら、次は何をする? と聞くと「煮る」「味付け」「買いに行く」とさまざまな答えが返ってきました。このように考えてまとめていってから、実際に料理を作るという手順に入っていくわけですから、前準備の段階はとても大切です。
日頃から色んな料理を作っている保護者の方にとっては、カレーを作るのにいちいちそこまで考えなくても作れてしまうでしょうけれど、子供達にはそういった手順も必要ですね。そういう意味では、子供達というのはコンピューターに近い存在なのかもしれません。
この話は「プログラミングって何?」と考えておられる保護者の方にもわかりやすい例えだと思いますが、子供達が「プログラミングしてる暇があったら、家の手伝いをしなさい」と言われないか少し心配です。
■論理的思考とは
エンジニアの方には「いやいや、お前は何を言ってるんだ。設計を含めてプログラミングだろ。設計抜きでプログラミングっていうのはおかしい」と言われるかもしれません、それは正しいと思います。
しかし、ここでは「プログラミング教育」というテーマの中ので論理的思考について述べています。「プログラミング教育」に関わる方の中には、職業プログラマーやエンジニアでない方もたくさんいらっしゃいます。
そういった方にとって「プログラミング」とは「プログラムを作る行為」であり、キーボードで文字を入力したり、ビジュアルプログラミングでブロックをつなぎ合わせる作業のことをイメージしている方もが多いので、あえて「設計」の部分を切り分けて伝えています。
論理的にものごとを考えるためには、手順の分解と組み立てだけできればいいわけではありません。
MECE(Mutually Exclusice and Collectively Exhaustive)と言われる「重複することなく、漏れることなく」考えることや、主観と客観の両方で考えることも必要です。
それらをまとめると「適切な軸を設定してそれぞれの軸に沿って多面的に考えること」なのかなと理解しています。ただ、それも抽象的すぎて伝わらない感じではありますが。
「MECE」な思考でロジカル・シンキングの効果を高めるhttps://www.ti.tohmatsu.co.jp/column_report/column/hrd_column_52_171121.html
■プログラミング教育で実践すべきこと
もちろん、きちんと準備から組み立てまでを実践すれば、プログラミングで論理的思考を身につけることは可能です。
しかし、実際にプログラムを作る時にはそこまで考えない子がたくさんいます(もちろん、仕様書のようなものを作ってからプログラミングを始める子もいます)。そんな子供達に「まずはきちんと設計してからやれ」というつもりが、私にはありません。とくに小学生ぐらいには。
まずは、自分が思いつくまま好きに作ったらいい、それでうまくいかなかったら何が悪いのかを考えてやり直したらいい「トライ&エラー」というやつです。これが何度でもできるのがプログラミングの良いところなんですから、とにかく作ってみて修正する、この繰り返しでいいのではないでしょうか。
カレー作りであれば、一度ぐらいは許してもらえても、何度も失敗したらお母さんに怒られますからね。
子供達とプログラミングの関係では「論理的に考えて実行」よりも「まずはやってみて失敗」の方がいい、それができる貴重な環境なのです。
CoderDojoでは、大人も子供も一緒に「やってみて失敗」してますよ、どうぞ参加してみてください。
【若林健一 / kwaka1208】
https://croads.jp/aboutme/
CoderDojo奈良・生駒・明日香・田原本
http://coderdojo-nara-ikoma.github.io/
http://coderdojo-asuka.github.io/
http://coderdojo-tawaramoto.github.io/
CoderDojo Japan公式ブック発売中!
Scratch(スクラッチ)でつくる! たのしむ! プログラミング道場
http://amzn.asia/7KsdVCQ