プログラミング的思考とは何か

2023年9月15日

2020年度からプログラミングが小学校の必須科目になる。
このことに関して以前のブログで私見を記した。その時に少し調べた結果、小学校で教えるのはプログラミングそのものではなく、「プログラミング的思考」であることを知った。しかし、この「プログラミング的思考」とはいかなるものか、いまひとつはっきりしない。
さらに、最近小学校のプログラミング教育に関連した書籍や教材(あるいはネット上の記事など)を目にする機会が増えてきたが、その内容はプログラミングそのものを扱っていることが多い。
すなわち、プログラミング的思考ではなく、プログラミングそのものが目的化しつつあるように見える。プログラム(ソフトウェア)は手段であって目的ではないから、この点にも少々違和感を感じる。

小学校のプログラミング教育を考えるとき、いくつかの論点(考慮点)があると思うので、その後の動向なども踏まえて考えていきたい。但し、私は教育の専門家ではないので、教育の観点(教育心理学などを含む)では考慮不足になると思う。この点はご承知おき頂きたい。
いまいま私の頭にあるのは以下の観点である(今後検討を進める中で増えていくかもしれない)。

①プログラミング的思考とは何か

②プログラミング教育の目的は何か
プログラミング的思考とは何か、その定義が明らかにならないと、教育目的もはっきりしない。いまは仮に、論理的思考能力や問題発見能力、問題解決能力としておく。

③いつ教育すべきか、どのように教育すべきか
子どもの発達の適時性やレディネスの観点である。プログラミング的思考が形式的操作であるとするならば、小学校のどの段階でどのように教えるか、という観点があるはずだ。また、発達段階には個人差があるだろうから、この点も考慮する必要があるだろう。

④学習形態
「どのように教育するか」に含まれるかもしれないが、個別学習や相互学習、一斉学習などの学習形態を考える必要がある。例えば、eラーニングは個別学習であり、個人の能力に応じて学習進度を調整できる利点があるが、単なる教育の効率化(教師のマンパワー不足を補う)という文脈で語られるケースもある。
また、児童の内発的動機付けを高められるのか、という観点もあるだろう。

⑤環境
教育目的、教育方法が明らかになったら、教育を行う環境が必要になる。学校のコンピュータやネットワークの環境、教材、そして教師や支援要員などが含まれる。コンピュータ・ネットワークの環境整備に関しては自治体間の格差の問題もある。


プログラミング的思考とは何か

プログラミングとはプログラムを作る行為(コーディング)である。従って、プログラミング的思考という表現は、コーディング的思考と言い換えることができる。これは明らかに日本語の表現としておかしい・・・・。
プログラム言語にはいくつかのカテゴリーがある。代表的なのは手続き型言語と呼ばれるものである。手続き型言語は処理をする順番(手順)に沿ってプログラムを記述する。
料理に例えるなら、材料を揃える、それぞれの材料の下ごしらえをする、その次に材料を炒める、そして調味料を加える、などの手順である。
手順を進める際には、判断(if-then-else)や、作業の繰り返し(loop)が必要になるときがある。
例えば、油の温度が180度に達したら、という判断(if-then-else)がある。180度に達したら(then)材料を入れ、180度未満の場合(else)は待たなけれなならない。
あく抜きをする場合、水を沸騰させて材料を入れて煮る、という作業を繰り返す(loop)。永遠に繰り返すわけではないから、loopを止める条件が必要になる。
このように目的を達成する(ある料理を作る)ための作業とその手順を考えることをプログラミング的思考と言うのだろうか?
新しい料理を開発する場合は、その最終目標を思い浮かべて作業手順を考えることになる。新しい料理だから失敗するときもあるだろう。その時は上手くいかなかった理由を考え、対処法を考え、そして作業手順を変えてやりなおす。このような試行錯誤を繰り返すこともあるだろう。
そこには創造力と論理的思考が必要になるかもしれない。

論理的思考とは必ずしも難しいものではない。簡単な因果律も論理的思考に含まれる。ボールを両手で挟んで持っているときに、手を離せばボールは地面に落ちる。手を離すという原因があって、ボールが落下するという結果につながる。
原因が先で結果が後である。この程度のことは小さな子どもでも経験的に(直観的に)理解している。子どもは発達のかなり早い時期から論理的に思考する能力を持っていると言われている。

創造力や論理的思考能力が要求されるのは、なにもプログラミングに限った話ではない。幼児期に積み木やレゴブロックで遊ぶことも創造力や論理的思考能力を育てることに貢献しているのかもしれない。
「幼児期は抽象的な知的技術の習得よりも身体的な技術の習得に重点を置いている。手先の器用さが考える力を育てる。手や指を使う活動の方法を学ぶことで、大人になって概念を用いて世界を把握できるようになる基礎が子どもの心の中に形成される」(シュタイナー教育より引用)

プログラム言語には手続き型言語のほかに、オブジェクト指向言語などがあり、最近では関数型言語が注目されている。関数型言語のルーツはLispという言語である。
Lispは1950年代に作られたそうだから、関数型言語は結構古くからある言語ということができる。私も昔Lispの解説書を読んだことがあるが、(実際に使用した経験がなく、記憶も曖昧ではあるが、)再起呼び出し(リカーシブ・コール)を使えることが特徴である。
再起呼び出しとは、関数の中で自分自身(関数)を呼び出すことで、Loop(繰り返し処理)の一種である。但し、手続き型言語の繰り返し処理とは表現形式が異なっており、最初はなかなか理解できないものである。

プログラミング的思考ではなくて、プログラムそのものを教育する場合、どのようなプログラム言語(およびその言語処理系)を選択するかは大きな問題である。
10年後、20年後にどのようなプログラム言語が使われているかを予測することは難しい。例えば1980年代に登場したAda(主に、米国国防総省で使われた言語)は、一時期日本でも話題になったが、結局のところ軍事関係以外では使われることはなかったようである。


その後の追記(補足)
言語:
小学校教育で使うことが想定されているプログラミング言語(候補)がいくつかあることが分かった。代表的なものが「Scratch」であり、文部科学省が公開するプ「プログラミン」という言語もある。いずれもビジュアル言語として紹介されているが、手続き型言語である。詳細はこちら。

プログラミング思考:
「先生のための 小学校プログラミング教育が良くわかる本」にプログラミング思考に関する解説がある。

プログラミング教育
「プログラミング教育」のINDEX