プログラミング教育の文脈で「プログラミングをやると論理的思考が身につく」と言われますが、私は「プログラミングをやっている人の思考が必ずしも論理的な人ではない」と考えています。それがどういうことか?論理的思考とはどういうことか?について、自分の中で整理したことを書き留めておきます。

プログラマー≒論理的思考

私が「プログラミングをやっている人の思考が必ずしも論理的な人ではない」と考える大きな理由は、実際に職業としてプログラムを作っている人(つまり、プログラマー)で論理的思考が実践できていない人もいるからです。

世の中には「処理内容に矛盾がある、漏れがある」「正しく対処されないエラーケースがある」といった問題を含むプログラムがあり、これらは「論理的に考える」ことが抜けているために生まれています。つまり、そういったプログラムを作る職業のプログラマーがいる以上「プログラミングをやっている人は論理的思考である」と考えられないのです。

論理的思考力とは?

そもそも、論理的思考とは何なのでしょう? プログラミング教育の文脈では「論理的思考」を「ものごとを順序立てて考える思考」と位置付けられています。それも確かに論理的思考のひとつではあるとですが、その前段階として「目標から手順を分解する思考」と合わせなければなりません。

プログラミングに限らず何か作業を進める時、いきなり「ものごとを順序立てて進める」ところに着手する人はいなくて、まず「自分がやりたいことを達成するには、何が必要か何をやらなければいけないか」を考えますよね。

これはプログラミングでいうところの「設計」にあたるわけですが、先ほど申し上げた「処理内容に矛盾がある、漏れがある」「正しく対処されないエラーケースがある」のも、設計が正しくできていないから発生するものなのです。

カレーを作るにはどうしたらいいか?

話が少し変わりますが、先日企画・開催したプログラミング教育に関する座談会で「論理的思考を身に着けるにはどうしたらいいか?」という質問を受けた時に以下のように答えました。

よくプログラミングは料理に似ていると言われます。
プログラムが正しい手順で組み立てられてないければ期待した動作にならないように、料理も正しい順序にしたがって作らなければ、食べられるものになりません。
一方、料理を作ろうと思った時にいきなり作り始めるのではなく、目的のものを作るには何が必要か、どんな手順で作らなければいけないかを考えるはずです。
このように目標から必要な手順に分解していくことも、論理的思考のひとつであり、ここが大切です。

ここで会場の子供達に「カレーを作ろうと思ったら何がいる?」と聞いてみたところ「肉」「じゃがいも」「ルー」といった答えが次々と返ってきました(思えばにんじんは出なかったような)。

次に材料がわかったら次は何をする?と聞くと「煮る」「味付け」「買いに行く」とさまざまな答えが返ってきました。 このように考えてまとめていってから、実際に料理を作るという手順に入っていくわけですから前準備の段階はとても大切です。

日頃から色んな料理を作っている保護者の方にとっては、カレーを作るのにいちいちそこまで考えなくても作れてしまうのでしょうけれど、子供達にはそういった手順が必要ですね。そういう意味では子供達というのはコンピューターに近い存在なのかもしれません。

この話は参加された保護者の方にもわかりやすい例だと思いますが、子供達が「プログラミングしてる暇があったら、家の手伝いをしなさい」と言われないか少し心配です。 :)

論理的思考とは

ここまでの話でエンジニアの方には「いやいや、お前は何を言ってるんだ設計を含めてプログラミングだろ。設計抜きでプログラミングっていうのはおかしい」と言われるかもしれません、それは正しいと思います。

しかし、ここでは「プログラミング教育」という文脈における論理的思考について述べています。「プログラミング教育」に関わる方の中には、職業プログラマーやエンジニアでない方もたくさんいらっしゃいます。 そういった方にとって「プログラミング」とは「プログラムを作る行為」であり、キーボードで文字を入力したり、ビジュアルプログラミングでブロックをつなぎ合わせる作業のことをイメージしている方もが多いので、あえて「設計」の部分を切り分けて伝えています。

論理的にものごとを考えるためには手順の分解と組み立てだけできればいいわけではありません。 MECE(Mutually Exclusice and Collectively Exhaustive)と言われる「重複することなく、漏れることなく」考えることや、主観と客観の両方で考えることも必要です。

それらをまとめると「適切な軸を設定してそれぞれの軸に沿って多面的に考えること」なのかなと理解しています。 ただ、それも抽象的すぎて伝わらない感じではありますが。

「MECE」な思考でロジカル・シンキングの効果を高める

プログラミング教育で実践すべきこと

もちろん、きちんと準備から組み立てまでを実践すればプログラミングで論理的思考を身につけることは可能です。

しかし、実際にプログラムを作る時にはそこまで考えない子がたくさんいます(もちろん仕様書のようなものを作ってからプログラミングを始める子もいます)。 そんな子供達に「まずはきちんと設計してからやれ」というつもりが、私にはありません。とくに小学生ぐらいには。

まずは自分が思いつくまま好きに作ったらいい、それでうまくいかなかったら何が悪いのかを考えてやり直したらいい「トライ&エラー」というやつです。 これが何度でもできるのがプログラミングの良いところなんですから、とにかく作ってみて修正する、この繰り替えしでいいんじゃないでしょうか。

カレー作りであれば、一度ぐらいは許してもらえても何度も失敗したらお母さんに怒られますからね。 子供達とプログラミングの関係では「論理的に考えて実行」よりも「まずはやってみて失敗」の方がいい、それができる貴重な環境なのです。