2020年に、文部科学省の「学習指導要領」が改定されました。
最大の特徴は小学校中学年から「プログラミング教育」が必修になったことです。
小学生からプログラミングを学ぶ時代が始まったということですが、これはエンジニアを育てたいのではなく、「プログラミング的思考」を身につけさせるというのが狙いです。
これからの時代に必須になるプログラミング的思考とはどのようなものでしょうか。
また、社会人が身につけるべきプログラミング的思考とはどのようなものなのか紹介します。
1.「プログラミング的思考」とは
文部科学省が定義している「プログラミング的思考」とは、以下のようなものです(図1)。

図1 プログラミング的思考の定義(出所「新学習指導要領のポイント」文部科学省) p5(https://www.mext.go.jp/component/a_menu/education/micro_detail/__icsFiles/afieldfile/2019/05/21/1416331_001.pdf )
確かにプログラミングとは、自分の意図する何かの機能を実現するために、コマンドの組み合わせと順序を考え、書き、動かしてみてデバッグをする、といった作業です(図2)。

図2 プログラミングの手順の例(出所「教育の情報化の手引き」文部科学省)(https://www.mext.go.jp/content/20200608-mxt_jogai01-000003284_004.pdf)p66
このように物事をプログラミング言語に置き換え、適切なコマンドを選び、順序立てて配置し、実行し、デバッグするといった思考回路を身につけ、その後の学習や実生活に応用できるようにするのが目的です。
「論理的思考」に似ている部分もあるかもしれません。
とはいえ、これはあくまで小学校中学校の勉強の話です。
社会人が身に着けるべきプログラミング的思考について、もう少し掘り下げていきます。
2.うどんを作るための「コンピュテーショナル・シンキング」
プログラミング的思考は、「コンピュテーショナル・シンキング(computational thinking)」の考えに基づいたものです。
コンピュテーショナル・シンキングの一部を取り出したものとも言えます。
実際のコンピュテーショナル・シンキングはこのような概念で構成されています(図3)。

図3 コンピュテーショナル・シンキングの構成要素
(出所「H28第2次補正 総務省プログラミング教育実証事業 実証モデル視察事前説明」総務省資料) p26(https://www.soumu.go.jp/programming/data/010/010_03_01.pdf )
わかりやすく言えば、「抽象化」「分解」「順序立て」「分析」「一般化」です。
そしてコンピュテーショナル・シンキングは、よく料理の手順に例えられます。
その一つとして「月見うどん」を作ることを考えてみましょう。以下の手順に分解されます(図4、5)。
図4、5 月見うどんとコンピュテーショナル・シンキング(出所「H28第2次補正 総務省プログラミング教育実証事業 実証モデル視察事前説明」総務省資料) p27(https://www.soumu.go.jp/programming/data/010/010_03_01.pdf)
「月見うどんを作る」という自分の意図を実現するためには、コンピューテショナル・シンキングの5つの要素が必要です。
見たことや作ったことのない人、あるいは料理が苦手な人の場合はとても大変な作業と感じるかもしれませんが、こうした「大きな課題」に向かうためのプロセスでもあります。
①抽象化
まず、月見うどんは「うどんである」と気づくことです。「月見うどん」という個別の事象を、「つまり、うどんの一種である」「そこに卵を落としたものが月見うどんである」と、概念の広さのレベルを引き上げて考えるスキルとも言えます。
②分解
抽象化できると、必要な材料がわかります。月見うどんという事象を分解するステップに進むことができるのです。
うどんである、つまり「麺」と「出汁」と「ねぎ」が必要、そして月見うどんなので、卵がプラスアルファで必要だと理解できます。
③順序立て
「ねぎを刻み」「出汁をとって」「うどんをゆでて」「ねぎと卵を乗せる」というように、調理手順を順序立てて考えるスキルです。
この場合は、筆者のように「ねぎは後から刻む」という人もいるかもしれませんが、うどんよりも先に卵をどんぶりに入れてしまっては失敗する、といった意味合いで。それを事前予測するということでもあります。
逆算の思考といっても良いかもしれません。
④分析
そのようにして出来上がった月見うどんを食べたのち、「より美味しくするためにはどうしたら良いか」「関東風で作ったけれど関西の人の好みに合わせるには何を工夫すれば良いか」を分析するスキルです。
⑤一般化
これが苦手な人が多いかもしれません。
自分が行った手順を振り返り、他人にもわかるように頭の中で整理し、人に伝えるスキルです。
「微分・積分」というと多くの人にとって嫌な響きかもしれませんし今からそれを勉強しなければならないとは思いませんが、実は、受験勉強としての微積分は「抽象化」のスキルを学ぶのに最適だったと今筆者は感じています。
というのは、何か難しい問題にぶつかった時「まず、数式をグラフで示してみる」「図形に置き換えてみる」といった習慣が身についたからです。
「つまり、こういう形を描く数式の話をしているのか」という、「つまり」を思いつくことは非常に大切です。
3.まとめ〜コンピューテショナル・シンキングがもたらすもの
コンピューテショナル・シンキングの提唱者であるジャネット・ウィング氏は、コンピューテショナル・シンキングについて
「巨大で複雑なタスクに挑戦したり、巨大で複雑なシステムをデザインしたりするときに、抽象化と分割統治を用いることである。それは問題点の分割である。それは問題の適切な表現法を選ぶことであり、問題を解きやすくするために問題の適切な側面だけをモデル化することである」
と述べています*1。
未知の大きな課題に直面したときに、細部にとらわれることなく「これはつまり何なのか」と抽象化し、その上で問題を分割し、それぞれに最適な解決方法を導いていくという考え方です。
仕事をする上で大きな課題が現れた時に思考停止しないための方法と言えます。
同時に、
「多くの人がコンピュータ科学をコンピュータのプログラミングのことだと思っている。コンピュータ科学を専門とする子供たちの就職先の可能性を狭く捉える親がいる。またコンピュータ科学の基礎的研究は完了していて技術的問題だけが残っていると、多くの人が考えている。計算論的思考は,この分野に対する社会通念を変えようとする」
とも述べています*2。
「コンピュータの技術的問題」はこれからAi技術の進歩などによって改善されていくでしょう。
ただ、大枠をデザインする人がいなければ、どんな計算機も目的をかなえる道具にはなりません。
単純作業、単純計算は機械が担う時代になっていきますが、その中で必要とされる人材は、何をどのように使えば問題を解決できるのかという大枠を描けるスキルの持ち主です。これは機械には取って代わることのできない領域です。
日常生活のちょっとした場面で、こうした思考回路を少し働かせてみることから始めましょう。
https://www.cs.cmu.edu/afs/cs/usr/wing/www/ct-japanese.pdf p585、587