プログラミング的思考2

プログラミング的思考ってなに?

こんにちは。K研究員です。

「小学生がプログラミングを学ぶ理由はプログラミング言語の習得ではなくプログラミング的思考の醸成である」という話は、このブログでもたびたび話題にしてきました。

実際に授業が始まる2020年が近づくにつれて、よく話題になるので、改めてプログラミング的思考について書いてみようと思います。

もちろん文部科学省のページに載っているので原点をあたっていただくのが一番いいとは思います。

さて、文部科学省の資料を見るとプログラミング的思考が図示されています。

うーん、すごくいっぱい要素がありますね。くるくるしている図も見慣れない人にはわからないかもしれません。定義は下記のようにされています。

自分が意図する一連の活動を実現するために、どのような動きの組合せが
必要であり、一つ一つの動きに対応した記号を、どのように組み合わせたら
いいのか、記号の組合せをどのように改善していけば、より意図した活動に
近づくのか、といったことを論理的に考えていく力

また、これを箇条書きにしてわかりやすく例示したものがこちらの図です。

独断と偏見でもう少しかみ砕くと、

1.コンピューターはふわっとした指示、例えば「かっこいい感じ」というような指示はできないので、コンピューターにさせたいことを誰でもわかるものにする
2.コンピューターにさせたいことが複雑なら、簡単になるまで分解して、順番にやっていけば終わるようにする
3.簡単にした手順をコンピューターが分かる形に表現(=プログラム)にする
4.プログラムを動かしてみて、思っていたのと違う部分があれば、なぜ違ったのかを考えて、どうすれば近くなるのかを推測して修正する

こういうことなんだろうなと思います。

もともとプログラミング的思考は論理的思考とコンピューテーショナルシンキングを整合性をとったものといわれています。

参考


でも、プログラミング的思考はプログラミング以外でも使えるの?

文部科学省はプログラミング的思考を普遍的なスキルと位置付けています。確かに、誰かに仕事をお願いするときも、問題が大きければ小さな問題に分け、誰でもわかるような手順にして、手順書を作り、改善していくということは重要でしょう。プログラミングを通じてこのような思考法ができるようになればいいですね。

じゃあ何が問題なの?

一つ目はわかりにくいことです。いろいろな要素があるのであの図を見ただけでうへーってなってしまいます。

もう一つの分かりにくい点として、どの詳細さのレベルでプログラミング的思考の定義を受け取るかというのがあります。

例えば以前レビューした「プログラミング教育が変える子供の未来」によると句読点ごとにかなり詳細にプログラミングと対応付けて説明があります。

「自分が意図する一連の活動」とは、問題を解決するための、システム全体の機能や振る舞いのことになります。次の「どのような動きの組み合わせが必要か」を考えるには、サブシステムの機能や振る舞いの組み合わせで
実現できるかを分解できる能力といえます。これは、システム工学的な視点から言うと、アルゴリズムを考える(構築する)能力です
翔泳社「プログラミング教育が変える子どもの未来」p128より

ここまで詳細に、これはシステムのこと、これはアルゴリズムのことと解釈する人もいれば、アルゴリズムやシステムのことは置いておいて、難しい問題を定義して分解して、誰でもわかるような手順にできる能力と考える向きもあるようです。


プログラミング的思考について実はまだよくわかっていないこと

私が知らないだけかもしれませんが、プログラミングをしたらプログラミング的思考が身につく(可能性が高い)という話はエビデンスを見たことがありません。実際、私の通っていた大学の情報系の学部ではプログラミングを習ってもできるようにならない人が半数だったように思いますし、仕事でプログラムをしている人の中にもプログラミング的思考ができない人はいます。

また、プログラミング的思考には多数の要素がありますが、どれが優先なのか、またある要素が身につかなかった子供がいたとしたらそれを身に着けてもらうための方法は何なのかもわかりません。例えば複雑な問題を分解して考えられない子供がいた時にどう対処するのかなどの教育論についても未整備な気がしています(知らないだけだったら申し訳ありません)。

プログラミング的思考は汎用的なスキルと書きましたが、プログラミングでそれができるようになることと料理やほかの人とのコミュニケーションなどでそれができるようになることが同じことなのかもわかりません。プログラマーの中にも適当にやっておいてというような大雑把な指示しか出せない上司は多いものです。

まとめると

プログラミング的思考自体はやや実験的なものなのかもしれません。これからエビデンスが出て、解釈も一般的に認知される形に収束してくるのかもしれません。それまではどうせプログラミングをするならあまりとらわれすぎない、足を引っ張りすぎないのが個人的にはいいように思います。

・感覚的な言葉じゃなくて誰でもわかるような手順にする
・難しいものは分解する
・あてずっぽうだけでやらず、なんでそうなるのか考える

これらのことが将来のリーダーとして重要な考え方なのは間違いないですし、それが完全にできなくてもこれができないんだなと把握しておくのは有意義であると感じます。


無料のプログラミングクラブCoderDojoを運営するにあたり寄付を受け付けています。お金は会場費・Wifiの費用・教科書に使用します。