golden-luckyの日記

ツイッターより長くなるやつ

プログラミングとは ― 最強のカレーレシピ ―

「うちの学校でもついにプログラミングの授業が始まったよ」

「それは興味深いね。どんなふうに教えてるの? やっぱりScratchとか?」

「Scratch? ああ、プログラミング言語のことか。プログラミング言語は使わなくていいんだよ」

「え?」

「小学校で学ぶプログラミングっていうのは、プログラミング言語を覚えさせることが目的じゃないからね。システム思考力とかロジカルシンキングって聞いたことあるだろ?」

「あるかないかでいったら、あるよ」

プログラミング言語みたいなのは、単なる技術だ。それは仕事で必要な人だけが覚えればいい。子どもたちに教えるべきことは、プログラミング言語みたいな技術じゃなくて、システム思考やロジカルシンキングの延長といえるプログラミング的思考なんだよ」

「プログラミング的思考っていうのが、システム思考やロジカルシンキングとどう違うのか、いまいちよくわからないんだけど…」

「同じさ。何か問題があるとする。その問題を分析し、分解して、手順や繰り返しとして構成する。コンピューターに向かってプログラミング言語で何かするのは、その先の話さ」

「でも、プログラミングというからには、コンピューターで問題を解くことが前提なんだろ? コンピューター抜きでそれが学べるのかい?」

「もちろんさ。たとえばカレーを作るっていう問題を考えてみよう。まず、材料を過不足なく用意する。それから、調理の手順の明文化だ。プログラミングでいえば、さしずめ、フローチャートを書くってところかな」

「ふむふむ。それで、君のとこのプログラミングの授業ではカレーのレシピを説明してるのかい?」

「そういうわけではない。この例で言えば、プログラミング言語っていうのは『レシピを見てカレーを作る方法』に相当するので、それは授業でやらなくてもいいっていう話だよ」

「うーん、じゃあ、君が言うプログラミング的思考っていうのは、カレーのレシピを考えることに相当するの?」

「だいたいそうだね。ただし、これからはIT社会だ。そこで、コンピューターで解けるように問題を捉えられる力として、プログラミング的思考を教えようということになってる」

「コンピューターで解けるように問題を捉える力っていうのは、確かにとても重要だね」

「だろ。でも、そういう力を培うためにプログラミング言語やコンピューターを子どもに教える必要は、ない」

「そこが引っかかるんだ」

「カレーのレシピを見てカレーを作る方法は、あくまでも料理に必要なスキルだ。プログラミング言語やコンピューターの仕組みを覚えることは、職業プログラマーになりたければ必要だが、あいにく小学校というのは職業プログラマーを養成するところじゃない」

「だが、プログラミング言語やコンピューターの仕組みを知らずに、プログラミング的思考を身につけられるのかな」

「コンピューターっていうのは、単純な作業を繰り返したり、指定された手順を忠実に実行したりするのが得意なんだ。そこに与える手順、つまりレシピを考えることこそが、人間のすることさ。もちろん、レシピをコンピューターに与えるときはコンピューターが理解できるようにプログラミング言語を使う必要があるけれど、それはプログラマーがやればいい」

「なるほどね。前半には同意するよ。だが、そのレシピを考えるにしても、コンピューターやプログラミング言語の知識はかなり必要であるように思えるんだが…」

「多少はあったほうがいいだろうねえ。カレーのレシピを考えるにしても、野菜の名前を知らないわけにはいかないし」

「そういうことじゃないよ。じゃあ、君が好きなカレーのレシピの比喩でこう尋ねよう。これはカレーのレシピだと思うかい?」

タンパク質やアミロースを飽和脂肪酸と共に加熱し、クルクミン、塩化ナトリウムなどを添加する

「このレシピでは、ふつうの人にはカレーを作れないと思うぞ」

「なぜ、そう思う?」

「ふつうの台所で使えるのは、野菜や肉、それにカレールーなんかだ」

「それはつまり、レシピの作者は、ふつうの台所の事情くらいは理解する必要があるということだよね」

「ああ、つまり君は、プログラミング的思考にもコンピューターの理解が必要と言いたいわけか」

「そんなところだ」

「さっきも言ったように、ある程度の知識は必要になるだろう。もっとも、そういう、いわば常識の範囲でのコンピューターの知識については、もう何年も前から小学校で教えているけどね」

「常識の範囲、ねえ。じゃあ、もう一つ。これはカレーのレシピだと思うかい?」

* カレー屋さんにいって好きなカレーを注文する

「これじゃあ、カレーを作ることにならないから、レシピとはいえないよ」

「だが、得られる効能は同一だ。つまり、カレーが必要であるという問題は、これで完全に解決される」

「効能が同一ならいいわけじゃないだろ」

「それでもいいと考える力がプログラミング的思考なのかと思ってたんだが、そうじゃないのかい?」

「ふざけるのもいい加減にしろ」

「ふざけているわけじゃない。それなら、最後にもう一つ質問をしよう。これはカレーのレシピだと思うかい?」

* カレーには野菜と肉が入っている
* カレーはご飯にかけると辛くておいしい
* カレーはうどんにかけても辛くておいしい

「なんだいこれは。これは単にカレーの説明じゃないか。こんなのはカレーの作り方ではないよ」

「そう、これはカレーの作り方ではない。だけど、もしカレーをプログラミングするとしたら、こういうふうに書けるかもしれない

「言っていることがよくわからないよ」

「わからないだろうね。コンピューターを使うことを前提に問題をプログラミングで解決するという行為には、たぶん君が思っている以上に、プログラミング言語とコンピューターそのものに対する勉強が必要なんだ…」

✧✧✧

この先は『プログラミングHaskell 第2版』でお楽しみください。