【コラム】プログラミング的思考とは何か?再び。
2017年の春に公開された新学習指導要領解説の中で、プログラミング教育に関する内容を紹介したサイトがこちらです。
とても分かりやすくまとまっています。
いま、公立の小学校ではこうした教育を既存の教科へ取り込んでいくために、様々な取り組みを始めています。
例えば、柏市の小学校ではベネッセコーポレーションとの共同研究を開始しました。
普通の取り組みと違うのは、ここでの研究成果を
『小学校段階の資質・能力の評価規準』というものに反映しようとしていることです。
これは、次期学習指導要領に記載されている、育成すべき資質・能力
「知識・技能」
「思考力・判断力・表現力等」
「学びに向かう力・人間性等」
の3つの柱を軸にして、プログラミングで育成する資質・能力を学齢別に定めた評価規準です。
教育現場に取り入れるからには何らかの評価基準が必須となるので、こうした活動は業界全体で必要なのだと思います。
ただこれは、あくまでも教育指導要領に則って考えた場合の基準なので、学校という枠組みでは有意義だと思いますが、それ以外の場所でプログラミングの学びを提供する際には、また別の切り口があっても良いだろうと考えています。
個人的には、学習指導要領に則ることで一番大きな制約になると考えているのが
児童がプログラミングを体験しながら、コンピュータに意図した活動を行わせるために必要な論理的思考力を身に着けるための学習活動
と記載されているところです。
あくまでも、"コンピュータありき" なんですよね。
3つの柱のうち
「思考力・判断力・表現力等」
や
「学びに向かう力・人間性等」
の目標に記載されていることは、コンピュータがなくても出来ることばかりなので、この制約がなければもっと自由にいろんな学びスタイルを作れるのに、と残念に感じます。
ところで「思考力・判断力・表現力等」には、「プログラミング的思考を育成する」とあります。
プログラミング的思考って何でしょうか?
自分が意図する一連の活動を実現するために、どのような動きの組合せが必要であり、一つ一つの動きに対応した記号を、どのように組み合わせたらいいのか、記号の組合せをどのように改善していけば、より意図した活動に近づくのか、といったことを論理的に考えていく力
私はこれでも、プログラミング経験がありますし、今でもできます。
(だいぶ腕は錆びついていそうですが。。。)
だから、プログラミング的思考というものを恐らく持ち合わせていると信じているのですが、いわゆる論理的思考との違いがよく分からなかったんですよね。
それで以前、少し分かったような気になってこんな記事を書きました。
いま、読み返してみるとハテナがいっぱい浮かんでしまいますね(笑)
「プログラミング」という言葉に引きずられているのだなぁ、と感じます。
ここは、本質的に考えないといけないところです。
そもそもプログラミングによってコンピュータを動作させる、命令の集まりをコンピュータに送り込んで、自分の思い通りに動かす。
一体それは、何のために??というところです。
人がやってもできることを、なぜコンピュータにやらせるのか?
最も大きな理由の1つが「コンピュータを使えば人間よりも効率的に動かすことができるから」
だと思っています。
酷いアルゴリズムによって人間以下の動きをするコンピュータを作ることも可能なので、効率的かどうかはコンピュータ自体の話ではなく、あくまでもコンピュータを動かす人間側の話です。
つまり、コンピュータを効率的に動かすプログラムを作れば、人間がやるよりも大きな成果を生み出せる。
但し、論理的であっても、それが効率的であるとは限りません。
コンピュータを使う意図は先の通りなので、効率的でないプログラムを作るのであれば、作る意味がありません。
プログラミング的思考の定義には謎のキーワードがもう1つあります。
「記号」とは何でしょうか?
ずっと理解できなかったのですが、先の『プログラミングで育成する資質・能力の評価規準』には、"いわゆる抽象化" という説明を読んで、ようやく分かってきました。
例えば、ボタンを押すと挨拶してくれるロボットがあるとします。
このロボットは、日本語、英語、フランス語、スペイン語、ロシア語、中国語のマルチリンガルだとします。
日本語ボタンを押したら、日本語で挨拶。
英語ボタンを押したら、英語で挨拶。
フランス語ボタンを押したら・・・
こんな感じで6個のプログラムを作ったとしましょうか。
さて問題です。
あなたがエンジニアだとして、このロボットを販売している会社からこんなオーダーがあったとしましょう。
・ボタンを2回押したら、歌う機能もつけたい。
・イタリア語も話せるようにしたい。
どうしますか?
・日本語ボタンを2回押したら、日本語で歌う
・英語ボタンを2回押したら、英語で・・・
・イタリア語ボタンを1回押したら・・・
・イタリア語ボタンを2回押したら・・・
こんな感じでプログラムを増やしていけば、要望に応えられそうですね。
でもなんだか嫌な予感がしませんか??
次は、3回押したら・・って言われそうだけど、それはそのときに考えますか?
そもそも、エンジニアにお願いする人たちだって、伝えるのがだんだん面倒になりそうです。
ではここで、「記号化」「抽象化」という考え方ができると、どうなるでしょう?
「XボタンをY回押されたら、Zをする」
Xには言語が、Yにはボタンを押す回数が、Zにはロボットの動作が入ります。
XやYを使った方程式って、中学校の数学で習ったと思います。
それと同じです。
複雑に思えたロボットの機能は、記号化、抽象化することができればこんなにもシンプルに表現することができるのです。
しかも、未来の要求にも応えられる。(たぶん)
もちろん、英語で挨拶したり、歌ったりするプログラムを作るところは変わらないのですが、煩雑さからは間違いなく解放されますよね。
日常の中でいうと、例えばお母さんが息子さんに
「今日もお手伝い、お願いね」
と伝えると
・洗濯物を取り込む
・洗濯物を畳んでしまう
・ご飯に水をはる
・お風呂を入れる
までが完了するとしましょう。
毎回、4つの仕事を息子さんに伝えるよりも、「お手伝い」という言葉一つで伝えた方が早いですよね?
「お手伝い」は4つの仕事を抽象的に表現したものであり、記号化したものです。
記号化するメリットというのは、そういうことです。
つまりここでも、記号を使うことによって「効率化」が望めるわけです。
ちなみにこうした話は、プログラミングの世界では「パラメータ」や「モデル」という用語で表現しているので、プログラミングが分かる人にとっては、だから「プログラミング的思考」なのか、と合点がいくと思いますが、分からなくても、そういうことなのだ、と捉えておけば全く問題ないと思います。
というわけで、長々と書きましたが・・・
プログラミングというのがアルゴリズム(命令を実行する順番とルール)の通りに動くプログラムを作ること、であることを踏まえ
プログラミング的思考を以下のように捉えます。
自分が意図する一連の活動によって効率的な成果を生み出すために、対象を抽象的に捉えることで汎用化し、命令の組み合わせ方とルールを論理的に考えること
プログラミング的思考ではあくまでも、「効率的」であることを目指します。
だから、万能なスキルではありません。
だって、効率的であることが絶対的に良い、とは言えないことはご存知の通りだからです。
探プロでは、必ずしも「効率的」であることだけを目指しているわけではないので、やっぱりプログラミング的思考を身につける学習手法、と定義するのは間違いなのだ、ということをあらためて確認することができました。