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

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

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

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

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

大学院を修了した時点の探プロが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つの仕事を抽象的に表現したものであり、記号化したものです。

 

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

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

 

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

 

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

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

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

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

 

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

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

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

 

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

シニアが子ども向けのプログラミング本を読んでもピンとこないワケ

子ども向けのプログラミング教育って

・何の役に立つのか?(我が子をプログラマーにしたいわけではないのだが?)

・プログラミングをやっておくと、どんな良いことがあるのか?

・そもそも、教育の効果はどうやってはかるのか?

などなど。

 

面倒くさい話が多いんですよね。。。

教育、と言った途端にそんな話になってしまう。

 

わたしは本業でずっとIT業界にいるので、お金を得る手段としてプログラミングの技能を身につけている人たちが周りにたくさんいるわけですが

キャリアを重ねても個人的にプログラミングを嗜んでいる人たちもいて、そういう人たちは皆、「プログラミングを楽しんでいる」のですよね。

純粋に、楽しいからやっているし、続けている。

 

個人的には、子どもだって、やりたい子は思う存分やればいいし、やりたくない子はやらなければいい、と思っています。

興味のない子でもそのうち、関心をもつことがあるかもしれないのだから、お膳立てなんかしなくても放っておけばよいのに、とも。

 

とはいえリテラシーという観点からみると、ICT機器や技術に触れて、知っておくというのは今の時代に合っているので、学校教育の場では、リテラシーとして修得するところに特化すれば良いのに、と思っています。

 

そんな子ども向けのプログラミング教育をモヤモヤしながら見ていると、若宮さんのような事例はとても清々しくて良いなぁ、と思ってしまいます。

ないから作ろう!

と思えるモチベーションがまず素敵だと思うし、最後まで作りきるところもまた素敵。

 

世の中にある子ども向けプログラミングコンテンツの多くは、だいたい「作るもの」を大まかに決めておくことが多いようです。

そうしないと、教える側が大変ですしね。

 

だから、「自分はこれを作りたい!」というモチベーションというよりも、「ミッションをクリアしたい!」というモチベーションになるのだと思います。

それはそれで良いのですが、解決する問題を自分で発見する、というところが抜け落ちてしまうのは、とてももったいないことだなぁ、と感じます。

 

基礎的な学習を済ませた子どもたち向けには、ハッカソンとかコンテストの場を増やしてあげると良さそうですね。

 

プログラミングはどうしても最初の取っ付きにくさがあって、子ども向けに柔らかいタッチで内容を紹介をする本やTV番組などが増えているわけですが

若宮さん曰く、それは「小学生だからわかる」のだそう。

 

これはちょっと、分かる気がします。

子ども向けのプログラミング本を読んでいて感じるのは、大人向けの説明を言葉を変えて「わかりやすく」書いているものが多いなぁ、ということです。

極端に言えば、漢字を平仮名に置き換えている、くらいな印象もあります。

要するに、本質的には大人向けの説明と同じなので、難しいことが難しいまま書かれているんですよね。

あれほど評判になった『ルビィのぼうけん』ですら、私には「分かりやすい」とは思えませんでした。

 だから、この本で伝えたい本質は何か?を解説しようと超訳、を書き始めたわけですが...


若宮さんの「台所」や「料理」の例はその点、とても分かりやすいです。

本質を突いてる。

(料理経験の少ない高齢の男性向けには、あまりピンとこない説明かもしれませんが...)

 

大人は未知のものに出会ったとき、それは一体何か?とまず概念を捉えようとする。

だから、プログラミングとは何か?を真面目に説明するか、代わりに料理のような比喩を使って説明することが有効です。

 

でも子どもには今ひとつ伝わらない。

10歳くらいになってようやく、モノゴトを概念で捉えられるようになる、と聞いたことがあります。

そうなると、最初にいくら、身近な例を使って概念を説明してもピンとこないわけなので、まずはやってみましょうか、となります。

その上で、ループの考え方って洗濯物を干すときの考え方と同じですね

という話が伝わるようになる(はず?)。

子どもたちはプログラミングを難しいものではなく「遊びツール」の1つとして捉え、まずは使って試行錯誤しながら覚えていくのでしょうし

シニアの方々は、プログラミングとは料理のようなものである、といった全体像を捉えた上で、1つ1つの意味を、あぁ、あれと同じなのね、と納得しながら理解して覚えていくのでしょう。

 

大人向けと子ども向けのプログラミング教育って違うよなぁ、

と漠然と考えていたことが、少し整理できたような気がします。

 

やっぱり、大人向けのプログラミング教育の文脈で子ども向けのコンテンツを作ってはいけないのですよねぇ。

逆も然り。

 

いろいろ考えていたら、シニア向けの探プロもやってみたくなってきました。

@tanpro-lab