見出し画像

プログラミング的思考を考える

 E.V. ジュニアさんのこちらの記事を読んで触発されました。

 わたしは小学校にまで拡大されたこの「プログラミング的思考」に関する教育の現場からは遠いところにいるので実情をはっきり理解しているわけではありませんが、ピントのズレたことになりそうだなあという危惧はあり、こちらの記事には「やっぱりね」ということが書かれていました。

 これに触発されていろいろと思うところを書いてみたところ、大長編になってしまいました。いつになく固い話ではありますが、楽しんでもらえると幸いです。

プログラミング的思考と言われているものの正体

 子ども向けの教材を見てみると、プログラミング的思考と呼ばれているものの正体は「論理思考」のことのように思えます。いわゆるロジカル・シンキング。目的までの工程を論理的に分解して、複雑なものをシンプルなものの組み合わせに置き換える能力。

 例えば将棋の桂馬の動きを考えるとき、「左右の斜め前に進む」という雑な理解から、「左右に1マス進み、そこから前に2マス進む」という二つの動作に分ける。さらにこれを「左右に1マス進み、そこから前に1マス進む動作を2回繰り返す」という風に分解する。さらに、「右を向く→1マス進む→左を向く→1マス進む→1マス進む」に分ける。(左の場合は左右反転)

 すると、「その場で90度回転する」という動作と「1マス進む」という動作の二つを実装すれば、あらゆる駒の動きはすべて表現できるということがわかります。碁盤の目のような場所を移動する動作は、どこからどこへ移動するものであっても、この二つの動作の組み合わせで実現することができる、ということです。

 これがロジカル・シンキングです。結果を見てそれをごくシンプルな動作の組み合わせに分解するという操作。プログラミング教育が小学生に教えようとしているのはこれであると、わたしには見えます。

プログラミングという言葉が持っている幅

 さて、上記を踏まえて、「プログラミング的思考」ができるようになればプログラミングができるのか、という問題。これを考えるには、まず「プログラミング」というのが何を指しているのか、ということを明らかにする必要があると思います。

 プログラミングと言って何を想像するでしょう。これは人によってかなり大きな差があると思います。

 例えばわたしは今この文章をWebブラウザでnote.com にアクセスし、投稿画面を開いて直接そこに入力しています。

 使用しているのはWindows のEdge というブラウザで、これはGoogle のChromium というブラウザエンジンを使用してMicrosoft が開発したブラウザです。無数の小さなプログラムが組み合わさって動いています。

 ブラウザを起動するとブラウザを構成しているプログラムのインスタンスがメモリ上に展開され、HTTPSプロトコルでnote.com のサーバと通信します。サーバが返してくるのはページを表示するための情報で、一般にフロントエンドと呼ばれているものですが、このページは、わたしと皆さんでは異なります。ログインしているアカウントによって表示される内容が変化します。その個別の操作を行う部分は裏側、バックエンドとかサーバーサイドと呼ばれている部分にあり、そちら側にもプログラムがたくさん稼働しています。

 さあ、プログラマという人はこの中のどれを作るのでしょう。実は、全部異なるプログラマによる仕事です。ハードウェアを管理するBIOSやファームウェア、その上で動作するOS、OS上のデバイスドライバやAPI、それらを使用するアプリケーション、ネットワークを介して他のコンピュータと通信するためのプログラム、やり取りするデータを変換するプログラム、UIを返すフロントエンドとフロントエンド内で処理を行うプログラム、サーバサイドと通信するプログラム、サーバ内で動くプログラム、サーバのAPI、OS、ハードウェアと通信するプログラム…。

 気が遠くなるほどたくさんのプログラムが動いた結果、わたしが入力したこれを皆さんがご覧になっている。そのどのプログラムを作るのかによって、必要になる知識は大幅に異なるわけです。そして、そのどれを作る行為も「プログラミング」と呼ばれています。

 今やほとんどの機械にコンピュータが搭載されていて、コンピュータが搭載されているものはすべて、何らかのプログラムが動いています。それらを作るのも当然、プログラミングです。最近のものはもうデジタルサイネージみたいなものや自動販売機、券売機なども、Windowsで動いていたりします。そうなってくるとWindowsアプリケーションを作るのと似たようなノウハウで自動販売機のプログラムも書けるかもしれません。

 しかしもっと単機能なもの、電子レンジとか洗濯機、冷蔵庫、デジタルカメラやポータブルオーディオプレイヤー。そういったものたちはもっとはるかに小さなメモリ(ROM)を搭載していて、そこに書き込まれたプログラムで動いています。OSやAPI的な仕組みを介さずに、ハードウェアを直接操作するようなもの。そういうプログラムを書くのには、Windowsアプリケーションを作るのとは異なる能力が必要になります。(高機能なプロダクトではUNIX系のOSを搭載してその上にアプリケーションを載せて動いているものなどもあります)

 これらが全部、「プログラミング」という行為によって作られるものの中に含まれています。

プログラマという存在

 プログラミングに幅があるように、プログラマという存在にも幅があります。論理思考ができなくてもプログラマを名乗れてしまう領域もありますが、この部分は今後淘汰されるでしょう。

 最近はノン・コード・プログラミングというプログラムコードを一切書かずにプログラミングをするようなものも出てきており、こうなってくるとロジックの理解は浅いけれどコードだけは書ける、というタイプのプログラマは淘汰されていくと思います。

 これまで、プログラム言語を習得するということとプログラミングができるということはニア・イコールでした。言語を操れればプログラマ、という時代がたしかにありました。しかしより上級な言語が登場し、既に作られたものの組み合わせで目的を達することができるようになり、次第に他のプログラマの作ったものを使って何かを作る、という領域が広がってきています。複雑なことを自前で実装する必要はなくなり、言語の習得は(上級な言語であればあるほど)容易になっています。

 例えば前に、わたしは小説を書くのにプログラムを書いて使う、みたいなことを書きましたが、わたしが小説のために書いたプログラムは他の誰かが作ったプログラム言語を使い、他の誰かの作ったライブラリの機能を組み合わせたもので、他の誰かが作ったOSの上で動作します。つまり私は、既に機能を持って用意されている部品を組み立てただけです。このようなプログラミングは誰でも比較的短時間で習得できます。この程度のスキルの価値は今後どんどん下がります。

 現在、プログラマというのは、その部品そのものや、さらに部品を構成しているもっと小さな部品を作っている人も、その部品を組み立てるだけの人も、全部を指した言葉になっています。プログラミング教育に関する危惧や懸念のあれこれは、そもそも「プログラミング」という言葉の指している内容が曖昧過ぎることに起因しているような気がします。

論理思考を支えるもの

 さて、ではその核となる論理思考は、プログラミング的思考を育てようとする教育、今まさに始まったその教育で育てることができるのでしょうか。

 わたしが外側から見ている感覚としては、おそらく今のやり方では、極端な格差が生じると思います。一部の児童(あるいは生徒)はちゃんと理解し、それ以外の子はさっぱりわからない、という状況になるのではないかと思います。

 論理思考というのは雑に言えば抽象化する能力だと思います。あるなにか具体的な目的が目の前にあるとき、それの本質、言わば見かけの具象の裏側に潜んでいる構造をつかみ、それを解体して小さなプロセスの連鎖に置き換える、という操作です。これは「あめ玉が3個あり、1個食べたから2個残っている」というのと「車が3台あり、1台出て行ったので2台残っている」のがおなじ「3-1=2」であることを見出すのと似ています。

 このように具象を論理的に解体するというのは数学的抽象化の作業と近く、とくに圏の考え方に似通っています。背後に隠れている構造を見出し、同じ構造を持ったものを同じとみなす。すると一見かけ離れたものを同じとみなすことができる。こうした考え方になじむということが、論理思考を身につけるということです。(個人的には、この考え方は小説を書くときの文学的思考とも近いものだと思います)

 すると今行われているようなプログラミング教育では、このような数学的抽象の扱いを理解している人はちゃんと論理思考を習得することができ、数学を苦手とする人は置いていかれる。それはどんな科目だって同じだろうという見方もありますが、問題は、それをまだ数学を学ぶ前の子どもたちに対して行おうとしている点にあります。

 小学校の算数にももちろん抽象化の概念は出てきますが、裏に隠れている構造が同じであるということを見ようとはしません。小学校の算数では正解に辿り着くことが重視され、正解すれば「理解した」と判断されます。ところが小学校の算数レベルだと、理解していない状態でケーススタディだけでも解けてしまうため、きちんと抽象化できているのかどうかは外から見てもわかりません。

 例えば小学校3年生で習うあまりのある割り算。10÷3は3あまり1。ここまでは授業でやりますね。しかし、3で割るという行為が整数を三つのグループに分けることと同義であるということにはあまり踏み込まない。3で割ることを考えると、整数を3で割り切れるもの、1余るもの、2余るものの3つに分けることができる。この発想が、プログラミングを考える上ではとても重要ですが、小学校の算数はこれを掘り下げません。

 プログラミング教育によってこうしたこれまでの教育の穴が暴き出されはしますが、だからそれを是正せねばならぬ、という話は今のところ聞こえません。中学の数学でも公式への代入だけで正解できるテストでは理解度はわかりませんが、これまでのところそこはうやむやなままになっています。

結局どうしたいのか

 さて、国が「プログラミング教育」に力を入れることにしたのは、いったいどういう目的によるのでしょうか。プログラマを増やしたいのでしょうか。そのプログラマとはどういうプログラマでしょう。A.I.のプログラマでしょうか。あるいはロボティクス、自動運転、もしかするとApple のような企業を日本からも生み出したいということでしょうか。

 おそらく、その全部を底上げしたいのでしょう。

 だとすると、やるべきことはプログラミング教育という名目で論理思考の訓練をすることよりも、小学校の算数、中学、高校の数学の教え方を根本的に見直した方が効果があるでしょう。特に高校では物理、化学と数学の垣根を取り払い、物理をやりながら微積分を教える、というようなことをやったほうがいいような気がします。さらには、そこで学んだものをプログラムとして実装する。物理計算のプログラム、数論のプログラム。すると必然的に、コンピュータによる計算誤差の問題を避けられず、コンピュータサイエンスについても触れることになります。

 そのように横断的に、教科という形でカテゴライズせずに、柔軟に行き来しながら学ぶことが重要になりますが、当然そんなものを教えられる教員がほとんどいないという問題に直面することになるでしょう。

 現状は学校も、これに乗じて商売をしようとしているプログラミング教室やロボット教室みたいなものも、本質の部分を正しく理解できているようには見えません。本当にやるべきことは数学(算数)と国語の教え方を根本的に見直すことだと思うのですが。

画像1


いただいたサポートはお茶代にしたり、他の人のサポートに回したりします。