探究型プログラミング学習(探プロ)

プログラミングの考え方を学んで、未来を創る力を手に入れる

プログラミングの考え方を学んで未来を創る力を手に入れる

【コラム】プロ・テック倶楽部様の幼児向けプログラミング講座が盛況のようです

幼児向けプログラミング講座のカリキュラムを監修させて頂いているサイエンス倶楽部様にて先日、開講後の様子を伺ってきました。

protech-club.com

正式な開講は次年度ですが、11月から始まったお試しコースが既に大盛況のようです。

全く宣伝をしていないにも関わらず、既に会員は250名を突破したとか。

もともと、幼児向けプログラミング学習の潜在ニーズは非常に大きかったようで、口コミであっという間に枠が埋まってしまい、教室によってはクラスを増設して対応されています。

Edison

対象は年中、年長、小1、小2と少し幅がありますが、どの年代の子たちも夢中になって取り組んでいるようでとても嬉しいです。

 

年中さんは保護者と一緒に参加していますが、年長さんからは1人参加です。

小学生も混ざっているので、教室によっては年下の子を気遣って生徒同士で教え合う姿も見られるそうです。

とってもいいですね!

 

1回目の講座はEdisonをバーコードで動かすものですが、音や光に反応して動いたり、する様子を見るだけでも、子どもたちにとっては刺激的なようで

とっても盛り上がっているのだとか。

おかげで、他のサイエンス系講座を受講している会員の保護者からは怪訝な顔をされる...ようですが、楽しんでくれているのは何よりです。

 

第2回目の講座からは、いよいよPCを使ってのプログラミングを始めるわけですが、ここで初めてパソコンに触れ、マウスを使う子たちが大半です。

一昔前であれば、パソコンのあるご家庭もそれなりにあったと思うのですが、スマホタブレットが浸透したこの頃では、パソコンを見ずに育つ子どもも多いのではないかと思います。

 

小さな手で大人用のマウスを扱うのに苦戦しながらも頑張ってます

といったお話を聞くと、幼児の子たちの目には、パソコンやマウスというツールはどんな風に映っているのだろう?

と興味深いです。

 

パソコンを使って画面上のブロックを並べること=プログラミング

というのはプログラミング学習の一側面でしかありません。

プログラミングそのものを学ぶのではなく、あくまでもプログラミングの考え方を学んでいるのだ

というところを、12回の学習を通じて一つずつ、伝えていければと思っています。

 

例えば、探プロではプログラムのことを「命令」の集まりと定義していますが。

f:id:dig_learning:20171215223805p:plain

これだけで終わると、プログラミングというのはパソコンを使うこと、ロボットを動かすこと、画面上のブロックを組み合わせること、といった理解になってしまいます。

 

そこで、身近なところにあるプログラムを紹介します。

f:id:dig_learning:20171215224638p:plain

 

では、これはどうでしょうか?

f:id:dig_learning:20171215223842p:plain

「命令」の集まりと捉えれば、これもプログラムのはず。

でも、違うって分かりますよね。

 

何が違うと思いますか??

 

答えは、命令によって "いつも同じ動き" をするかどうか?

の違いです。

 

お母さん自身にとっては、子どもはロボットじゃない、ってことに気づくきっかけになったりして?(笑)

 

ちなみに、運動会や演奏会のプログラムも、立派なプログラムです。

1つ1つの項目が、必ずいつも同じ動きをするからです。

 

 

第3回目以降は、アルゴリズムやインタフェースといった学習に入っていきます。

年中で??

と思われるかもしれませんが、基本的なプログラミングの考え方というのは、年齢に関係なく理解できるものだと思っているので

幼児だろうか小学生だろうが、そして大人だろうが、伝えることは同じです。

ただその考え方の活用範囲が、少し違うだけだろうと思っています。

 

幼児向けのプログラムでは、自分自身と家庭、幼稚園・保育園や小学校、といった範囲を「社会」と捉えているので

その「社会」の中で、プログラミングの考え方がどう関係しているのか?

いかに自分ごととして捉えることができるか?

そこを最も重視してコンテンツを作っています。

Edisonで遊ぶだけじゃないんですよ!

 

もし、講座に通われている方でこのBlogを読んでくださっている方がいたら是非、感想を教えてください。

この講座を通じて何か1つでも、新しい気付きが生まれると良いなぁ、と願っています!

【コラム】探プロのコンセプトを再び見直しています

このところ、探プロのコンセプトをもう一度見直しています。

大学院を修了した時点の探プロがVol.01だとすると、今のものがVol.02。

そしてまもなく、Vol.03が出来上がりつつあります。

 

プログラミングの考え方を学ぶこと、21世紀型スキルの修得が目的であることは変わらないのですが、言葉で繋ぎきれていないところを頑張って繋げようとしているわけです。

 

一番の目的は、これまで当たり前のように使ってきた

「プログラミングの考え方」

とは何か?

それを理解し、使いこなせるようになるとどんな嬉しいことがあるのか?

そして、21世紀型スキルの修得とはどう関係するのか?

といったところです。

 

「プログラミングの考え方」として、これまで

・インタフェース

アルゴリズム

ポリモフィズム

・モジュール化

などを紹介してきましたが、他にも

・関数

・例外処理

・マルチスレッド

などがあります。

 

まだまだあります。でも、この中で一体、何を伝えるべきなのか?

ということにもう一度立ち返って考えてみました。

 

そもそも、プログラミングの考え方というのは何を目指しているのかというと

「モノゴトの効率化」

です。

他にもあるのではないか?といろいろ考えたのですが、どうやらこれに尽きると断言して良さそうです。

全ての「プログラミングの考え方」は、モノゴトを効率的に処理することを目的としている

 

前回、「プログラミング的思考」について自分なりに考えてみました。

そして、プログラミング的思考はあくまでも「効率的」であることを目指していると理解しました。

 

プログラミング的思考と探プロのいう「プログラミングの考え方」は全く別のものですが、「効率化」を意識している点では同じです。

 

あらためて言葉を定義しておくと...

 

プログラム=命令の集まり

アルゴリズム=命令を実行する順番とルール

プログラミング=アルゴリズムの通りに動くプログラムをつくること

 

そしてプログラミングの考え方とは

モノゴトを効率良く処理するためのアルゴリズムであり、最適解を導くために構造化する考え方

といえます。

 

私たち大人は日々、時間に追われているので常に効率化を求めています。

1つ1つの時間が短くすめば楽になる(はずだ)からです。

 

一方で子どもはどうでしょうか?

彼ら彼女らは効率化を求めることがあるのでしょうか?

 

こたえは否、です。

子どもには時間が膨大にあります。

もちろん24時間という物理的な時間は大人も子どもも共通なのですが実際に、膨大な時間があると勘違いするほど子どもたちの時間に対する概念は大人とは異なるようです。

 

そうなると、なぜ子どもたちは「効率化」を目的とする考え方を学ぶ必要があるのでしょうか??

 

それはきっと、人間はこれまで以上に"付加価値の高い"活動に専念しなければ生き残れないからです。

機械化、仕組み化できる仕事はコンピューターにお任せして、人間は人間にしかできない仕事をすべき。

ここ数年ずっとそんな話を聞かされている気がします。

 

モノゴトの効率化を進めると、空き時間が生じます。

そうしたらその空き時間を、付加価値の高い活動に振り向ければよいわけです。

 

こうやって考えていくと、以前から疑問だったことが1つ解決しました。

プログラミング的思考を身につけることやコンピューターリテラシーを身につけることの重要性を語る中では、コンピューターを使いこなす人材であることや論理的に問題解決できる人材であることが求められるのですが

私は、効率化を目指したり論理的に考えたりする点では、人間よりコンピューターの方が得意なはずだと思っています。

だから、そういった目的のためにプログラミングを学ぶことがどうにも納得できなかったのです。

ムダじゃないかと。

 

こうした矛盾は、人間がより付加価値の高い活動、創造的な活動に専念するために、効率化可能なところは徹底して効率化する、と捉えることで解決します。

 

実際に、家事なんかでもそうですよね。

洗濯機や食洗機を使うことで家事時間を大幅に減らすことができる。

その空いた時間は、趣味や子どもと遊ぶ時間として使える。

だから、効率化するんですよね。

逆に、時間を捻出しても使い道がないのなら効率化する必要がありません。

 

そんなわけで、子どもたちの余白時間をより増やすためにも、効率化するための考え方は知っておいた方が良い。

そう考えると、プログラミングを学ぶ意味が分かってくると思います。

 

ここまでは、主に問題解決の場面でプログラミングの考え方を活用することを想定して考えてきました。

次に、問題発見の場面でプログラミングの考え方を活用することや、その活用レベルが年齢と共にどのように変化するのかについて掘り下げてみます。

 

つづく。

【コラム】プログラミング的思考とは何か?再び。

2017年の春に公開された新学習指導要領解説の中で、プログラミング教育に関する内容を紹介したサイトがこちらです。

とても分かりやすくまとまっています。

いま、公立の小学校ではこうした教育を既存の教科へ取り込んでいくために、様々な取り組みを始めています。

 

例えば、柏市の小学校ではベネッセコーポレーションとの共同研究を開始しました。

 

普通の取り組みと違うのは、ここでの研究成果を

『小学校段階の資質・能力の評価規準』というものに反映しようとしていることです。

これは、次期学習指導要領に記載されている、育成すべき資質・能力

「知識・技能」

「思考力・判断力・表現力等」

「学びに向かう力・人間性等」

の3つの柱を軸にして、プログラミングで育成する資質・能力を学齢別に定めた評価規準です。

 

教育現場に取り入れるからには何らかの評価基準が必須となるので、こうした活動は業界全体で必要なのだと思います。

ただこれは、あくまでも教育指導要領に則って考えた場合の基準なので、学校という枠組みでは有意義だと思いますが、それ以外の場所でプログラミングの学びを提供する際には、また別の切り口があっても良いだろうと考えています。

 

個人的には、学習指導要領に則ることで一番大きな制約になると考えているのが

児童がプログラミングを体験しながら、コンピュータに意図した活動を行わせるために必要な論理的思考力を身に着けるための学習活動

と記載されているところです。

あくまでも、"コンピュータありき" なんですよね。

 

3つの柱のうち

「思考力・判断力・表現力等」

「学びに向かう力・人間性等」

の目標に記載されていることは、コンピュータがなくても出来ることばかりなので、この制約がなければもっと自由にいろんな学びスタイルを作れるのに、と残念に感じます。

 

ところで「思考力・判断力・表現力等」には、「プログラミング的思考を育成する」とあります。

プログラミング的思考って何でしょうか?

自分が意図する一連の活動を実現するために、どのような動きの組合せが必要であり、一つ一つの動きに対応した記号を、どのように組み合わせたらいいのか、記号の組合せをどのように改善していけば、より意図した活動に近づくのか、といったことを論理的に考えていく力

私はこれでも、プログラミング経験がありますし、今でもできます。

(だいぶ腕は錆びついていそうですが。。。)

だから、プログラミング的思考というものを恐らく持ち合わせていると信じているのですが、いわゆる論理的思考との違いがよく分からなかったんですよね。

 

それで以前、少し分かったような気になってこんな記事を書きました。

 

いま、読み返してみるとハテナがいっぱい浮かんでしまいますね(笑)

「プログラミング」という言葉に引きずられているのだなぁ、と感じます。

 

ここは、本質的に考えないといけないところです。

そもそもプログラミングによってコンピュータを動作させる、命令の集まりをコンピュータに送り込んで、自分の思い通りに動かす。

一体それは、何のために??というところです。

 

人がやってもできることを、なぜコンピュータにやらせるのか?

最も大きな理由の1つが「コンピュータを使えば人間よりも効率的に動かすことができるから」

だと思っています。

 

酷いアルゴリズムによって人間以下の動きをするコンピュータを作ることも可能なので、効率的かどうかはコンピュータ自体の話ではなく、あくまでもコンピュータを動かす人間側の話です。

 

つまり、コンピュータを効率的に動かすプログラムを作れば、人間がやるよりも大きな成果を生み出せる。

 

但し、論理的であっても、それが効率的であるとは限りません。

コンピュータを使う意図は先の通りなので、効率的でないプログラムを作るのであれば、作る意味がありません。

 

 

プログラミング的思考の定義には謎のキーワードがもう1つあります。

「記号」とは何でしょうか?

 

ずっと理解できなかったのですが、先の『プログラミングで育成する資質・能力の評価規準』には、"いわゆる抽象化" という説明を読んで、ようやく分かってきました。

 

例えば、ボタンを押すと挨拶してくれるロボットがあるとします。

このロボットは、日本語、英語、フランス語、スペイン語、ロシア語、中国語のマルチリンガルだとします。

f:id:dig_learning:20171129162030p:plain

日本語ボタンを押したら、日本語で挨拶。

英語ボタンを押したら、英語で挨拶。

フランス語ボタンを押したら・・・

 

こんな感じで6個のプログラムを作ったとしましょうか。

 

さて問題です。

あなたがエンジニアだとして、このロボットを販売している会社からこんなオーダーがあったとしましょう。

・ボタンを2回押したら、歌う機能もつけたい。

・イタリア語も話せるようにしたい。

 

どうしますか?

・日本語ボタンを2回押したら、日本語で歌う

・英語ボタンを2回押したら、英語で・・・

・イタリア語ボタンを1回押したら・・・

・イタリア語ボタンを2回押したら・・・

こんな感じでプログラムを増やしていけば、要望に応えられそうですね。

 

でもなんだか嫌な予感がしませんか??

次は、3回押したら・・って言われそうだけど、それはそのときに考えますか?

 

そもそも、エンジニアにお願いする人たちだって、伝えるのがだんだん面倒になりそうです。

 

ではここで、「記号化」「抽象化」という考え方ができると、どうなるでしょう?

 

「XボタンをY回押されたら、Zをする」

 

Xには言語が、Yにはボタンを押す回数が、Zにはロボットの動作が入ります。

XやYを使った方程式って、中学校の数学で習ったと思います。

それと同じです。

 

複雑に思えたロボットの機能は、記号化、抽象化することができればこんなにもシンプルに表現することができるのです。

しかも、未来の要求にも応えられる。(たぶん)

 

もちろん、英語で挨拶したり、歌ったりするプログラムを作るところは変わらないのですが、煩雑さからは間違いなく解放されますよね。

 

日常の中でいうと、例えばお母さんが息子さんに

「今日もお手伝い、お願いね」

と伝えると

・洗濯物を取り込む

・洗濯物を畳んでしまう

・ご飯に水をはる

・お風呂を入れる

までが完了するとしましょう。

f:id:dig_learning:20171129165100p:plain

毎回、4つの仕事を息子さんに伝えるよりも、「お手伝い」という言葉一つで伝えた方が早いですよね?

「お手伝い」は4つの仕事を抽象的に表現したものであり、記号化したものです。

 

記号化するメリットというのは、そういうことです。

つまりここでも、記号を使うことによって「効率化」が望めるわけです。

 

ちなみにこうした話は、プログラミングの世界では「パラメータ」や「モデル」という用語で表現しているので、プログラミングが分かる人にとっては、だから「プログラミング的思考」なのか、と合点がいくと思いますが、分からなくても、そういうことなのだ、と捉えておけば全く問題ないと思います。

 

というわけで、長々と書きましたが・・・

プログラミングというのがアルゴリズム(命令を実行する順番とルール)の通りに動くプログラムを作ること、であることを踏まえ

プログラミング的思考を以下のように捉えます。

自分が意図する一連の活動によって効率的な成果を生み出すために、対象を抽象的に捉えることで汎用化し、命令の組み合わせ方とルールを論理的に考えること

 

プログラミング的思考ではあくまでも、「効率的」であることを目指します。

だから、万能なスキルではありません。

だって、効率的であることが絶対的に良い、とは言えないことはご存知の通りだからです。

 

探プロでは、必ずしも「効率的」であることだけを目指しているわけではないので、やっぱりプログラミング的思考を身につける学習手法、と定義するのは間違いなのだ、ということをあらためて確認することができました。

@tanpro-lab