プログラミングを学習する上で押さえておきたい、13の目的と3つの分類
唐突ですが、プログラミングをなぜ学ぶのでしょうか、自分に問い返してみると以下のような答が出てこないでしょうか。
「なんとなく」
「流行っているから」
このような理由では少し寂しい気がします。どうせ学習するなら目的を持って学習したいでしょう。それに、目的を持って学習することで、学習のモチベーションも上がり、継続して学習に取り組めます。では、どのような目的が考えられるでしょうか。今回はプログラミングを学習する目的をまとめてみました。
能力を身につける・高めるため
問題解決能力
問題解決能力とは「ある問題に対して一定のプロセスを通して、解決まで導く能力」のことです。日常生活や社会生活においては様々な問題や課題があります。それらの問題を試行錯誤して、解決まで導き、ある程度の成果をあげることが重要です。
プログラミングにおいては、ある問題を解決する際、何かコンテンツを作ることがひとつの解決法としてあります。例えば、SNSはなぜできたのか、といったことを考えてみましょう。この時の問題と解決策は以下のことが考えられます。
問題:「友人とのコミュニケーションをより円滑にするためにはどうすればいいか?」
解決策:「SNSを作成する」
SNSの誕生によって、様々なコミュニケーションが生まれてきたことは知っての通りです。そして、SNSができたことで新たな問題も出てきています。重要なことは、その問題を解決するためにアイディア等を出していく、という流れを続けていくことでしょう。
では、具体的な問題解決とはどのようなものでしょうか。プログラミングにおける問題解決のプロセスを以下に示します。これは、システム開発工程と問題解決学習プロセスを組み合わせたものです。
図1.プログラミングにおける問題解決プロセス
このプロセスをふまえて、プログラミングして何かを開発・制作することで、問題解決能力を高められるでしょう。ここで重要なことは、このプロセスを意識しながら開発を進めることです。プロセスを意識せずに開発することもできますが、問題解決能力はそれほど高めることができないでしょう。また、設定する問題を社会全体、個人的なものにするか、といった視点によって高められるレベルが変わってくると考えられます。
問題解決プロセスについて
「数学の教材開発」とプログラミングの学習場面「自分の生活に役立つものの開発」における各プロセスにおける具体的な場面を想定しました。
数学の教材開発 | 学習(自分の生活に役立つもの) | |
1.問題の発見 | 数学で苦手としている部分を学習者からアンケートでとる。 | 一週間の自分の生活を見直す。うまくいっていない部分を出せるだけ出す。 |
2.問題の特定・分析 | 二次関数における、y=ax2+bx+cからy=a(x-p)2+qへの式変形がうまくいかないため、うまくいくようにしたい。 | 自由時間の時に、誘惑に負けて勉強をしないことがあるため、勉強の時間に当てたい。 |
3.アイディアを広げる・深める | ・動画で解説
・類似問題をどうするか ・aの値に対して奇数/偶数/分数の場合分けをする |
・自由時間の時にお知らせメールをくるようにする
・自分にプレッシャーをかける言葉をかけるようにする ・勉強をしていない場合、母親に連絡がいくようにする |
4.アイディアをまとめる | 偶数/奇数/分数のテストを行い、結果次第で学習内容を変える構造にする。 | ランダムで、自分を励ます言葉が出るようなシステムを作る。 |
5.設計 | Webベースなのか、スマホでやるのか。具体的な計画、スマホでの操作方法やデータの型などの設計を行う。 | 同左 |
6.開発・制作 | それぞれのプラットフォームで開発を進める。 | 同左 |
7.テスト・評価 | 開発したものを、対象者にテストや評価を行なって改善する。そして、プロセス1に戻る。 | 同左 |
表1.「数学の教材開発」とプログラミングの学習「自分の生活に役立つものの開発」における各プロセスにおける具体的な場面
見ての通り、2つの場面を比較すると、何かを開発する場合とプログラミングの学習をする場合も、プロセスは大きく変わりません。しかし、プログラミングの学習において、このプロセスを意識して進めなければ、実際のシステム開発には生かされないでしょう。そのような意味で、プロセスを意識することは非常に重要です。
問題の発見
自分が改善したいフィールド・場面・状況における問題や課題の洗い出しを行います。まだ漠然としたものとして、問題を出せるだけ出す段階です。とにかく想定できる問題を出すことを第一に考えます。
問題の特定・分析
漠然としていた問題を焦点化します。より効果的にアプローチをするために、ポイントを絞ります。ここでは、出し尽くした問題を分類したり、まとめあげたりして、問題を明確化します。
アイディアを広げる・深める
焦点化した問題に対する解決法やアプローチ法など様々なアイディアをとにかく広げます。絞り込まずに、自由な発想でアイディアを多面的に広げます。さらに、広げたアイディアを掘り下げて考えてみます。
アイディアをまとめる
広げたアイディアを分類分けしたり、順序立てたりしてまとめていきます。ある程度アイディアを絞って、作るものの方向性や具体的な形を作っていきます。この際、何の問題を解決するのかをしっかり意識しておく必要があります。それは、特定した問題に対する解決策のアイディアになっているかが重要なためです。
設計
日程やプラットフォームを踏まえて具体的に設計を行います。複数人で共同作業をする場合、役割分担も行います。フローチャートを書き出し、プログラミングできるような形にします。
開発・制作
設計した内容を踏まえて、各開発環境(Webブラウザ上なのか、スマートフォン上なのか、など)で制作していきます。
テスト・評価
開発したものを、できれば実際に使うと想定される対象者に使ってもらってテストを行います。テストをした結果を評価し、改善につなげます。
プロセス7まで行った後、プロセス1に戻り、再度プロセスを進めます。プロセスを何度も繰り返すことで、問題解決能力をより高められるでしょう。
次に、その他の能力を主にどのプロセスで高められるかということをまとめ、説明を加えます。
表.問題解決の各プロセスで主に高められる能力
想像力
主にプロセス1〜2で高めることができます。問題を想定し、どういうことありうるか考えます。プログラミングを学習する上で重要なことは「何かを作る」ことでしょう。そして、何かを作るときは「○○というものを作りたい」「●●をすると上手くいくのでは」という想像を膨らましつつ、作業を進めることになります。このような作業を進めることで、想像力を高められます。
図2.想像を膨らまして、どうなるかを考える
思考力(論理的思考力)
主にプロセス3〜4で高めることができます。プログラミングを学習し、何かを作ろうとすると、思考を働かせる必要があります。例えば、数学の二次関数を学習する教材ソフトを作ろうとします。その時に、「何秒間で」「どのタイミングで」「どんな数値を」といったことを考える必要が出てきます。このように、何かを作るためにプログラミングを活用すると、自然と様々なことを考える機会が出てくるでしょう。
ただし、重要なことは「何を作るのか」という目的意識を持つことです。プログラミングを学習する時に、言われたままに何も考えずコードを打つこともできます。この時は、思考はあまり働かせていないでしょう。「何を作りたいのか」「どうすればいいのか」ということをより具体的に考えることで、「様々な考えを巡らす」「深く考える」といった広い思考や深い思考を働かせることができるでしょう。
その次に行うことは「順序立てる」「構成する」ということでしょう。プログラミングによって、何かを作って過程では、考えた内容を順序立てて、論理的にアルゴリズムを構成していく必要があります。このような過程を進めることで、思考力を高めることができるでしょう。
図3.様々に思考を働かせつつ、論理的に構成もする
創造力
主にプロセス5〜6で高めることができます。様々に考えをめぐらした次には具体的な作業に入ります。まとめた考えを具体的な見えるものにするためには、しっかりとした設計と開発を行う必要があります。これらの作業を行うことで創造力を高めることができるでしょう。
図4.様々に考えて構成したものを、具体的な形にする
表現力
主にプロセス6〜7で高めることができます。プログラミングで何かを作る時、それらの表現はひとつではないでしょう。例えば、二次関数の教材を作るとします。二次関数で正答した場合、効果音や印象的な動画、文字を使う、などの表現は多種多様にあると思います。このような見た目の表現はもちろんのこと、どのようにコードを書くのかといった表現も様々にあります。
また、作り上げた後、作ったものを外に出す場合、相手への表現が最も大切です。テストや評価をする際には、誰かに協力してもらう必要があります。作ったものを相手に理解してもらうためには、内容や手順などを説明し、表現する必要があります。このような作業を行うことで、表現力を高めることができるでしょう。
コミュニケーション能力
この場合も「プログラミングで何かを作る」という条件があります。共同で何かを作る場合、お互いの協力が必要となります。協力するためには、問題解決プロセスの各段階での意思疎通を行うことが重要でしょう。
もちろん個人でプログラミングを通して何かを作ることもあるでしょう。そうだとしても、大抵はどこかでつまずき、誰かからアドバイスを貰わないと次に進むことができないことが多いと思います。そうなると、謙虚に教えを請わないと次の段階に行くことが難しいでしょう。
図5.より良いものを作るには、相談は必要不可欠
※分かりやすくするため、問題解決プロセスに対応させて、各能力を説明しました。細かな話をすると、もっと能力があるかもしれないし、視点の持ち方も違うかもしれません。しかし、現在よく聞く能力を取り上げ、問題解決プロセスに対応させることで、理解しやすいと考えました。
知識/喜び/知的好奇心を得る・高めるため
ICT機器の構造を理解する
プログラミングによってコンピュータへ命令をすることができます。つまり、プログラミングで実現できる部分は、コンピュータやシステム、ソフトウェアの根底に近い次元のところにあります。そのため、データの流れやコンピュータへの命令をどのようにするかが理解できるでしょう。そして、コンピュータは何ができるのか、逆に何ができないのか、といった理解も進むことができるでしょう。
学習・知識としての面白さ
何の学習においても内容を分かってくると面白くなってくるものです。例えば、数学は問題を解けてくると面白くなるだろうし、英語は外国の人とコミュニケーションがとれるようになってくると面白くなるでしょう。同じようにプログラミングでも同じような面白さがあります。プログラミングにおいては、実際に動くものを作ることができると、とても興奮するものだ。さらに、プログラミングを進めると、必ず壁にぶつかりますが、乗り越えることで見えてくる面白さもあります。以下の記事を参考にして下さい。
「プログラミングの授業をする前に必ず役に立つ3つの考えと、授業をする上での2つの技術」
人に喜んでもらう
プログラミングで何かを作る際、それは誰かに喜んでもらうためかもしれません。よりよく生活をしてもらうために、地図で詳細な情報を出すようなアプリを作成したり、沈んでいる気持ちを少しでも軽くしてもらうために、謎のキャラクターゲームを作成したりするかもしれません。利益追及のためではなく、単純に喜んでもらう、そういった理由もあるでしょう。
図6.誰かに喜んでもらうことこそ、真髄か!?
哲学としての学び
そもそも「プログラミング、プログラムとは?」といった学問、哲学として学ぶといった部分も考えられます。プログラミングの歴史的な背景や成り立ちであったり、プログラミングの美しさといったりするものもあるかもしれません。大きく言ってしまえば、人や生物は何らかの創造主によってプログラミングされたものかもしれないですしね!?
遊びとしての面白さ
学習、といった捉え方ではなく、「ゲーム感覚」という捉え方もあるかもしれません。何かを達成するために行う、といった使命感より「パズルやゲームを解くような意識でプログラミングする」ということもあると思います。みなさんは数学を解く時、どのような意識で解くでしょうか?「嫌だなぁ」「数字を見たくもない」と思う人もいるでしょう。しかし、数学好きな人には解くこと自体がパズルやゲームという認識の場合があります。そんな感じと似ているかもしれません。
外部報酬を得るため
収入を得る
一番単純な目的でしょう。現在は情報通信産業の発展に目を離せなくなっています。さらに、「小学生の65%が今は無い職業に就く」「人間が行う仕事の約半分が機械に奪われる」と言われており、情報通信技術を扱う能力やプログラミング能力は必須だと予測されます。ただし、安易と言えば安易でしょう。もちろん仕事を持つことは重要なことです。しかし、その職業において、どんなサービスを提供するのか、消費者に対して生活の質をどのように上げられるのか、といった観念が大切でしょう。
資格を得る
国や民間において、情報通信関係の資格は数多くあります。自分のキャリアアップに生かせると考える人は多いでしょう。
以上のように、プログラミングを学ぶ目的も様々にあり、分かりやすいように分類を行ないました。これらの目的を大きな指針として学習に生かしてほしいと考えています。
参考文献
・高等学校教科書「新・情報の科学」(2017)日本文教出版
・IT pro「開発プロセスの基本を学ぶ」(http://itpro.nikkeibp.co.jp/article/lecture/20061130/255501/)
・TED ミッチェル・レズニック 「子供達にプログラミングを教えよう」(https://www.ted.com/talks/mitch_resnick_let_s_teach_kids_to_code/transcript?language=ja)
・YOMIURI ONLINE「将来成功するためにプログラミングを学ぶことがなぜナンセンスなのか」http://www.yomiuri.co.jp/fukayomi/ichiran/20160408-OYT8T50062.html