プログラミングの授業をする前に必ず役に立つ3つの考えと、授業をする上での2つの技術

2017年7月17日

 

早速ですが、こんな話を聞いたことがありませんか。

「小学生の65%が今にない職業に就く」

「人間が行う仕事の約半分が機械に奪われる」

「10〜20年後に50%の仕事が自動化される」

これらの話は数年前から出ているものです。また、学校ではプログラミングの授業が学校教育の早い段階から実施していくことが予想されます。つまり、プログラミングは特定の人たちのものじゃないもの、という認識が社会全体で出てきています。そうすると、今後プログラミングを学校の授業で扱ったり、パソコン教室で扱ったりすることも増えてくるでしょう。

現在、プログラミングを学ぶための優秀なサイトやツールも様々に開発され、情報も増えてきています。そのため、個別の学習を進められる学習者は教師や講師が用意する環境や授業は必要ないでしょう。しかし、「プログラミング」という未知なものを学習しようとする人にとっては、なかなか手をつけられないものと考えられます。その時、重要な役割として教師や講師がいます。しかし、プログラミングを教えることに重要な役割があることは分かりますが、以下のような不安や心配がないでしょうか。

「これからプログラミングの授業を行うけど、どのように考えていけばいいのか」

「今プログラミングの授業をしているが、どのように授業を組み立てればいいのか」

そのような方たちに必ず役に立つ考えや技術を紹介します。

 

プログラミングの授業をする

皆さんはプログラミングを誰から教わったことがありますか。プログラミングの知識や技術が一般化していく中で、誰かから教わっていく機会は多くなるでしょう。

 

「プログラミングができる」と「プログラミングの授業ができる」の違い

まず、「プログラミングができる」と「プログラミングの授業ができる」とは必ずしもイコールではない、ということです。

「名選手、名監督にあらず」

よく聞く言葉でしょう。もちろん、名選手で名監督になる方もいます。しかし、絶対条件ではない、ということです。

何かの授業をする場合、「教える内容の専門性をとにかく高める必要があるのでは」「専門的な内容が分からないからダメだ」と思いすぎる傾向があります。もちろん、日々できる限りの研鑽を行い、授業をする上で必要なプログラミングの知識と技術を持つことは重要です。しかし、イチロー選手のような世界トッププレーヤーを目指す必要はありません。

授業をしようと考えている方は、自分の能力に悲観しすぎず、学習者のために新しいチャレンジをしていく気持ちと行動力が大事ではないでしょうか。

 

プログラミング授業で考えるべきこと

まずは、そもそもプログラミングって何か、といったことは記事が参考になると思うので、紹介しておきます。

侍エンジニア塾「今更聞けない!プログラミングとは何か?〜基礎の基礎を学ぼう〜」

さらに、プログラミングだけでなく、何かの授業をする場合に必要なものがあります。それは、「学習目的」や「学習目標」です。

※ここでは

「学習目的」:「学習する上での大まかな指標」

「学習目標」:「学習する上での細かく、明確な指標」

として話を進めます。

プログラミングの学習者が学習目的や目標についてあいまいだったり、持っていなかったりする場合は、授業者が学習者に目的や目標しっかり持たせる必要があります。そこで、具体的な学習目的について、以下の記事にまとめておいたので参考にして下さい。

「プログラミングを学習する3つの分類と13の目的」

このように、学習目的は学習者によってバラバラな部分があります。また、学校で授業を行う場合の目的や目標は、学習や教育の根本を押さえたものである必要があります。そのため、示した目的の中でも能力を高めたり、知識や好奇心を高めたりする部分に注目すべきでしょう。プログラミングはスキル教育に見られがちになりますが、それ以上の重要な目的や目標があることも見逃してはならないでしょう。

 

プログラミングを学ぶ楽しさとは

とはいえ、プログラミングを単純に難しいものとして捉えるのではなく、楽しいと思って欲しいです。プログラミングを学習することは(プログラミングだけではなく学習全般に言えることではありますが)、娯楽番組を見たり、ゲームで遊んだりするようなエンターテイメント的な楽しさとは違うものです。つまり、学習目的にある知的好奇心の部分に当たるところです。この部分は、他の学習ではなかなか得られない、「プログラミングを学習する」特有の楽しさがあると思います。

 

試行錯誤の楽しさ

プログラミングを進めていくと、やり方はひとつではなく、いくつかのやり方があります。それを「こっちのほうがスムーズに動くか。」「いやいや、こっちのほうが分かりやすい表現だろう。」といった試行錯誤をして、学習を進めていきます。

 

乗り越えた時の楽しさ

これは、他の学習ではなかなか実感できないものだと思います。プログラミングには実際に動くソフトウェアやシステムがあるため、より実感が湧くためでしょう。

プログラミングをしていると試行錯誤があり、そして必ず壁にぶつかります。単純な文法エラーから、データ型の問題など様々にあります。その壁を乗り越えるために、数分から数時間、あるいは数日を要することもあります。しかし、それを乗り越えた時の達成感は何にも代えがたいものです。そして、誰もが思う「自分って天才かもしれない!?」と。だが、また壁にぶつかるのではありますが・・・。ただし、このような繰り返しがプログラミングの魅力のひとつだと思われます。

試行錯誤による達成感

図1.試行錯誤を超えてこその楽しさがそこにはある!

 

考えて、作る楽しさ

ゲームや何らかのソフトやアプリを見て「こんなアイディアはどうだろうか。」「こういう風なものを作ってみたい。」といった思いが出る時があるでしょう。プログラミングの面白さのひとつは、何かの目的達成だけではない部分もあります。とにかくアイディアが出てきて、設計や開発を行うような、「考えて」「作る」という作業をやり続ける楽しさがあります。勝手な想像ですが、iPhoneを制作したスティーブ・ジョブズあたりもそうだったのではないのかなぁ、なんて。そして、実際にできあがった動くものは我が子と同然のようなものとも言えるでしょう。

授業者は、以上のような楽しさを学習者と分かち合って欲しいです。すぐに答えを教えるのではなく、長い目で見て、学習を支援して欲しいです。

 

プログラミングの授業の技術

プログラミングに限らず、何かの授業をするための方法や技術というのは様々に研究されてきました。「授業をする」ということは、誰か特有の個人技ではなく、しっかりとした知識と技術によって成り立っています。再度、以下のことを確認しましょう。

 「プログラミングができる」と「プログラミングの授業ができる」とは必ずしもイコールではない

最初にそのような話をしたのは、プログラミングの知識や技術だけでなく、授業の技術も重要なためです。おそらく、学生の頃以下のような気持ちを持ったことはないでしょうか。

「あの先生は知識はあるけど、教え方がイマイチだよなぁ。」

「あの先生はとても教え方がうまく、やる気になるなぁ。」

知識と授業技術

図2.知識のひけらかしほど嫌なものは無い!?

前者のような先生がいることは困りますが、事実でしょう。つまり、学習内容の知識や技術と授業の知識や技術は別ものです。

 

プログラミングを教える、教わるとどうなるかという視点

まず教える上で最も大切なことを言います。

学習者主体の視点を持つ

当たり前のことでですが、この意識を持ち続けて授業をすることは結構難しいものです。そして、学習者主体の視点とは、「学習者はこの学習を通して、どのように変わるか」といったものです。「教える」というものは授業者が「上手く教えられたなぁ」と思って成立するのではありません。学習者が「教わることで何かが変わった」ことで成立します。そして、授業者は学習者がどのように変わったかをしっかりと検証する必要があります(これを「学習者検証の原理」という)。

授業前から後にかけて

図3.授業は学習者の成長こそに本質がある!

次に考えることは、学習目標を検証することです。先述した学習目的で大きな方向性を押さえつつ、学習目標を作る必要があります。学習目標を詳細で明確にするには「行動目標」「評価条件」「合格基準」という3つをしっかりと捉える必要があります。

 

行動目標

学習者が学んだものは何か、誰の目で見ても分かる形で表すことが重要です。例えば、プログラミングの意味を学ぶ場合の目標を考えてみましょう。

 1.プログラミングという言葉の意味を理解する

 2.プログラミングという言葉の意味を書くことができる

どうでしょうか。1の方は「理解する」という意味が様々に捉えられるため、学んだかどうかを確かめることが難しく、目標としては不適切です。しかし、2の方は「書く」という行動で学んだかどうかを確かめることができ、2の方が適切です。

つまり、目標は確かめられる行動で書くことが重要です。

 

評価条件

次に考えることは、評価をする上でどのような条件や制約をつけるか、というものです。上記に続いて、以下の目標を考えてみましょう。

 1.プログラミングの意味を書くことができる

 2.プログラミングの意味をWebサイトで調べて、書くことができる

 3.プログラミングの意味を何も見ずに、書くことができる

いかがでしょうか。1よりも2や3の方が具体的にどのように評価をすればいいか、分かりやすく、目標をより具体化し、検証することができます。では、2と3を比較してみましょう。両方とも具体的ではあるが、学習の難易度が変わってきます。そして、2より3の方が難しいことが分かるでしょう。評価条件をしっかりと押さえることで、どのレベルを求めるのか、どういった学習をさせるのかを決めることができます。

 

合格基準

最後に、学習した内容を確かめつつ、次の学習へ進めてもいいかどうかを確かめる基準を設けることをします。今までと同じような目標だと分かりづらいので、少し変えてみます。

 1.プログラミング言語の種類を何も見ずに、書くことができる

 2.プログラミング言語の種類を何も見ずに、5個以上書くことができる

学習で何を求めているのか、2の方が明確でしょう。どの程度の学習をすればいいか分かることで、学習者のモチベーションも上がるものです。例えば、先生から以下の2つの言い方をされる場合を考えてみましょう。

「今回のテスト範囲は15〜45ページだから、やっとけよー。」

「テスト範囲は15〜45ページで、今回は用語中心で50個中30出すからなー。特に20〜25ページの用語はしっかり覚えておくように。」

前者においては、「えー30ページもあるのかよ・・・。何から手をつければいいのかなぁ。」という気持ちになってしまうでしょう。しかし、後者においては「よし、まずは20〜25ページから手をつけて、それから用語を中心に学習しよう。」と思い、実行に移すことができます。

 

以上の3つを押さえることで、学習目標は明確化され、学習を検証する視点を持つことができます。

 

授業をどのように組み立てるか

目標が決まり、次はどのように授業構成をするか、という問題です。授業の枠組みについても研究されており、そのひとつに「ガニェの9教授事象」があります。以下の9つの働きかけによって整理されています。

9つの働きかけ 例:プログラミング授業の場面
1.学習者の注意を獲得する NHKのEテレで放送されている番組のアルゴリズム体操を音楽付きでやってみる。
2.授業の目標を知らせる この授業を受けて「アルゴリズムの意味を書くことができる」「単純なフローチャートを書くことができる」ということができるようになるように知らせる。
3.前提条件を思い出させる 前回学習したプログラムやプログラミングの意味と例を説明できるか、確認をする。
4.新しい事項を提示する 身近にあるもののアルゴリズムやフローチャートの例を示す。
5.学習の指針を与える 例で出したアルゴリズムやフローチャートがどのような仕組みになっているか考え、自分で作れるようにする。
6.練習の機会をつくる 例で出さなかった身近なアルゴリズムを考え、フローチャートで作ってみる。
7.フィードバックを与える 作成したアルゴリズムやフローチャートを確認しつつ、良い部分を取り上げる。
8.学習の成果を評価する アルゴリズムの意味と、3つの条件を踏まえたフローチャートを書くテストを行う。
9.保持と転移を高める 2週間後に、違う例でアルゴリズムを考えさせ、フローチャートを作る。

表1.鈴木(1995)の図Ⅱ−1を元にしてプログラミング授業の場面例を挿入した

この9教授事象はとても有効な働きかけです。私自身も授業をする際、常に意識の中に実践を進めてきました。授業がうまくいかない場合は、このどれかの視点が抜けていることがありました。今回はプログラミングの授業を例として上げましたが、違う学習内容の授業でも共通して利用できるものです。

 

どうだったでしょうか。プログラミングを学習する人たちが一人でも増えつつ、その面白さを広げることが少しでもできれば幸いです。

 

3.参考文献

市川尚・根本淳子編著、鈴木克明監修「インストラクショナルデザインの道具箱101」(2016)北大路書房

鈴木克明(2002)「教材設計マニュアル」北大路書房

鈴木克明(1995)『放送利用からの授業デザイナー入門〜若い先生へのメッセージ〜』財団法人 日本放送教育協会