プログラミング学習はアルゴリズムとフローチャートの理解とのセットで
~車型ロボット「ビュートローバー」の走行プログラムを作る
大阪府立東百舌鳥高等学校
プログラミングを情報の授業で教える時、何を素材に、どのように活動を組み立てるのか。時間的な制約だけでなく、予算や学校のICT環境という大きな壁が立ちはだかります。
今回取材したのは、大阪府立東百舌鳥高等学校。ICT環境の整備に力を入れる同校は、今年2015年10月に日本教育工学協会から「学校情報化優良校」に認定されています。
プログラミングの授業では、車型ロボット「ビュートローバー(Beauto Rover)」(※)を使ってアルゴリズム→フローチャート→プログラミングの一連の流れを学ぶとともに、シミュレータや実機を動かしたり、同じ動きをC言語で制御したり、と中学校の技術・家庭科よりさらに踏み込んだ流れの学習を行っています。
※http://www.vstone.co.jp/products/beauto_rover/
今回の活動は、文部科学省委託平成27年度情報教育指導力向上支援事業「プログラミング教育に関する実証」の研究授業で、1年生の全クラスで、車型ロボット20台を用いてプログラミングの授業を行っています。取材当日は、コンピュータルームで行われた、稲川先生と勝田先生、新子先生の3クラスの授業を見学しました。 (2015年11月18日取材)
見学した授業は、いずれもこの単元の3時間目の授業にあたります。ここまでの2回の授業で、アルゴリズムとは何か、フローチャートはどのように書いたらよいか、あるいはこのフローチャートはどのような動きを示すのかを学んできている状態で、車型ロボットを動かすプログラムを書く活動に入ります。ここでは、ソフトウエア「ビュートビルダーR(Beauto BuilderR)」を立ち上げて、ブロック型プログラミングの要領でパーツをつなぎ合わせ、シミュレータ上で指定されたコース通りに動かすプログラムを作ります。
「実習1 コース1」の「まっすぐ進んで曲がる」は、順次型処理の学習教材で、前に進む時間(秒)と曲がる時間(秒)をどの程度にしたらよいかを考えて、数字を入れていきます。スタートボタンを押すと画面上でシミュレータが動き、成功すると「コースクリア!」の表示とチャイムが、失敗すると「コースに着いていません」の表示とブザーが鳴ります。失敗した生徒はすぐにプログラムに戻って修正し、再びトライします。
「実習2 コース2」では、四角形のコースを1周する動きを繰り返し処理を使って書きます。ここまでは比較的スムーズに進めることができていました。また、2時間目までにこの活動まで終了していたクラスもありました。
「実習3 センサーによる計測・制御」で車型ロボットを白いエリアと黒いエリアに動かした際のセンサーの値を読み取ります。
そして、実習4で上記のセンサーの値を使って「条件分岐を使って黒い線の上で止まる」アルゴリズムを考え、プログラムを作成しました。
この後が、いよいよライントレースのプログラミングです。最初に左回りのライントレースの原理をワークシートの「実習5」に記入して確認した後、画面上でフローチャートのパーツを組み合わせてシミュレータが黒い周回コースを走るプログラムを作っていきます。条件分岐を正しく考えないとコースアウトしてしまうので、最初は警告ブザーがあちこちで鳴っていますが、次第にクリアできる生徒が増えてきます。
課題が完成した生徒は、プリントにフローチャートを記入して右回り(実習6)に進みます。大部分の生徒が左回りをクリアした時点で、生徒2人に1台設置された提示用のPCに正解を提示して全員が動作を確認し、次に右回りのコース作成に入っていきました。
周回コースができた生徒は、「実習7 S字ライントレース(右と左の両方を使う)」、「実習8 8の字ライントレース」と進みます。
条件分岐や繰り返しの組み合わせになるので、周回コースは問題なくクリアできた生徒もかなり手こずっている様子で、周りの生徒と相談したり、実機を動かして左右を確かめたりしながら進めていました。また、シミュレータはきちんと動くものの、プログラミングのパーツを組み合わせる線が錯綜したフローチャートになっている生徒もいますが、線の整理についてはこの段階では細かくチェックされません。うまく動かない場合は、フローチャートが正しく動いているかを実際に線をたどって確認していました。
S字コースをほぼクリアした時点で、まとめの活動として実機を動かしてみたクラスと、ビデオで自動運転車の自動ブレーキが作動する仕組みを見たクラスがありました。次回は、床に置いたコース上で実機を動かす活動を行うことになります。
稲川孝司先生 インタビュー
――今日の車型ロボットのシミュレータはとてもおもしろい教材でしたが、プログラミングの内容はすべてこの教材を使った活動に盛り込んでいらっしゃいますか。それとも、他にもプログラミングに触れる活動や教材はあるのでしょうか。
稲川先生:この教材を使う前に、ドリトルで4時間ほどかけて音を鳴らすという活動をしました。
プログラミングと言うと、本来は英語でやるべきなのでしょうが、やはり最初は日本語で「こういうものだ」ということを知っておいた方がいいですよね。そして、生徒が一番興味あるのはやはり音楽なので、好きな楽譜を用意させて、それをドリトルで入力するという活動をしています。
その中で、自分が入力したものを正しく動かすためには、どこをどう直したらいいかというデバッグの作業を経験させます。生徒は皆夢中になりますよ。授業後残って仕上げる生徒もかなりいます。音楽はドレミファソラシドという音階がありシーケンシャル(sequential)なので基本的に順次処理だけですが、ドリトルでは伴奏や和音も可能です。その中で、音楽というのは音の高さと長さとリズムなどいろいろなもので構成されているということに気付くとともに、実は楽譜がコンピューターと非常に親和性があることを理解できるようにしています。実際、生徒はプログラミングをしているという意識はあまりないのですが、この段階ではそれでいいと思っています。
さらにこの音楽作りは、校内のポータルサイト上にWikiで作成したマニュアルがあって、それを読みながら学習する仕組みにしています。そういった手順に慣れることも目的にしました。
――今回の授業の、各回の目標を教えてください。
稲川先生:今回は文部科学省委託事業でプログラミング教育の研究授業ということになっていますが、以前からこういった形の授業は行っていました。要するに、「情報の科学」の中で、アルゴリズム・フローチャート・プログラミングの3つの関係を明らかにすることを目標としています。
つまり、アルゴリズムを考えて、それをフローチャートで表すとこうなる、そして最終的にプログラミングで表すとこうなる、というところを理解してもらおうというのがこの授業の大きな目的です。そして、実際に車型ロボットをプログラムで動かすことで目に見える物が動き、その動作からプログラムが正しいかどうかがわかるのです。実際に自分の思い通りに車が動くと楽しくなります。なお、今回の授業でのアルゴリズム、フローチャートの教材については、東京都立立川高等学校の佐藤義弘先生より提供していただきました。
今日の授業は3回目ですが、1回目の授業でアルゴリズムとフローチャートの話をした時は、インスタントラーメンを作る時どうするか、という手順を考えさせました。「ラーメンの作り方は、袋の裏に書いてあるようなレシピがあるが、そのままをコンピューターにやらせてもダメだよね」と。まず水を鍋に入れて火にかけて、麺を入れる前に沸騰したかどうかどうかを判断して、沸騰していなかったら沸騰するまで待たなければいけないよね、というものです。人間であれば順次型のフローチャートでわかるけど、機械はそういうわけにはいかないんだ、ということで「条件分岐」を教えます。そうやって、順次型・繰り返し型・条件分岐型というフローチャートの3つの基本形を理解させます。
次に、一辺が100の四角形を描くにはどうしたらよいか、というフローチャートを考えさせます。それができたら、「実はドリトルは、フローチャートと1対1に対応している。『ループ』というのはカギカッコ(「 」)で、このループで閉じた中を4回繰り返す、というのと同じなんだよ」と説明します。
ドリトルではタートルオブジェクトを作り、オブジェクトに命令を送る形で、
名前! 100 歩く。
名前! 90 右回り。
と入力します。これで、フローチャートとプログラムが一致していることが理解できます。では、一辺が100の三角形を描くにはどうしたらよいか、ということになると、3回回るということと、曲がる角度も問題になりますね。このあたりまでできたら、「じゃあ今度は自分でやってごらん」ということにします。
――フローチャートとプログラミングをどのように結び付けていくのでしょうか。
稲川先生:2回目の授業では、まず何か自分で好きなフローチャートを書いてみる、という活動を行いました。ある生徒は、いちばん右のパターンで、朝起きてから学校に出かけるまでの流れをフローチャートで書きました。「起きる」→「間に合う時間か」→間に合う時間だったら着替える、間に合う時間でなければ諦めて寝る(!)というものです。こうやって、条件分岐の部分を自分で考えさせます。
その次は、他の人が書いたフローチャートを読んで理解するという授業を行いました。例えば、左の図のようなフローチャートを示して、これはいったい何をしているんだろう、ということを考えます。aを入力し、次にbを入力してc=a+bとする。加算はこうやって表現できることを示すとともに、ここで「変数」「代入」という概念を説明しました。
次の大小比較のフローチャートは、条件文でaとbを比べて大きい方の数を出すというものですが、aとbに具体的な数字をいくつか入れて、条件によってどちらを回るかということを書かせた上で、このフローチャートは何を意味するかを考えさせます。
さらに次は、自分がコンピューターになってフローチャートを読み込む、という活動をしました。このフローチャートでは、特に代入のところで、初めての生徒は「Kに1を足したものをKとする」というのがなんでや?ということになります。右辺の値を左辺に代入することであって、等しいという意味ではないということを理解させるのがなかなか難しいです。
次に、1から100までの総和を求めるドリトルのプログラムを書かせます。フローチャートでは図に示したようになりますが、プログラムではK=K+1、とS=S+Kと書きます。その意味をここで理解させないといけないのです。ここで先にドリトルを先にやっておいたことが意味を持ちます。ドリトルは、このフローチャートと1対1で対応させることができます。音楽作りでドリトルの書き方自体はわかっているので、プログラムで書いていることの意味がフローチャートのどの部分に対応するかが理解できるのです。
そして、プログラムが書けたらドリトルに入力して、コンピューターで実行してみます。さらに、1から1000だったらどうなるか、進んだ子には10000とか100000ぐらいまでやらせてみます。そうすると、ドリトルがインタープリター型なので、計算に時間かかります。そのことで、「実はコンピューターは一生懸命計算しているんだ、もっと大きな数だったら、もっと時間がかかるかもしれない」ということもここで説明することができます。「社会と情報」でも、アルゴリズムとフローチャートのところまでは十分扱えると思います。
――今回の授業は、ビジュアルプログラミングとシミュレータを使って車型ロボットを動かすプログラミングでしたが、前回までとどのようにつながっていくのでしょうか。
稲川先生:今回、3回目の授業では、シミュレータやロボットを動かすプログラムが、ここまで学んできたフローチャートの3つの基本形(順次型・繰り返し型・選択型)の組み合わせで表すことができるのだ、というところを体験します。
今日の授業は、ビジュアルプログラミングのパーツを組み合わせてフローチャートを書き、それに従ってシミュレータ上で車を動かす、というものです。コース1は真っすぐ行って曲がるという順次型の学習です。コース2は四角形のコースを1周回るというもので、「前進する、曲がる」を4回並べてもできますが、ここではあえて「ループというものを使いなさい」と指示し、繰返し型を学習します。ループの特徴は、「こういうふうに書いていた人がいたね」「でもこっちの方が簡単だよね」を後で見せ合って理解させることができることです。
次にセンサーの数値がある値より多いか少ないかで条件分岐をする、ということを行います。最初に、まっすぐ進んで黒い線の上に止まるという動きを作ります。これができたら、次にライントレースで周回コースの上を走る、ということを行います。ここでは順次型と繰り返し型と選択型という3つの組み合わせになります。本当は自分で書ければよいのですが、生徒達には相当難しいので、しばらく自分達でやらせてみてから解答を見せ、さらに「じゃあ逆回りはどうなるか考えてみよう」という手順になります。さらにできる子は、右と左の両方を使うS字や、8の字のライントレースに進みます。
次回、第4回の授業では、車型ロボットの実機を使って、実際のコースを走らせる予定です。
さらに5回目ではビジュアルプログラミングで作ったものをC言語で書く、ということを行います。この部分が一番重要なところになります。
――ドリトルの音楽作りと今回の活動と合わせて9回の授業ということになりますね。「情報の科学」を選択する学校でも、ここまで比重が大きい学校はなかなかないと思いますが。
稲川先生:要は、どこに主眼を置いた授業をするかというところだろうと思います。今回の5回分の授業については、先ほど言ったように、アルゴリズム、フローチャート、プログラミングという一連の流れと関係を理解させることです。生徒にアルゴリズムを考えさせても、条件分岐のあるものはなかなか出てこないですが、「コンピューターがやるとしたら、ここにif文が要るよね」ということをわからせたい。おそらくそこがたぶん一番大切なことだと思います。たとえプログラミングまでは行かなくても、ものの考え方を養うのに使えます。だから、フローチャートを書かせること・読ませることが大事だと思うのです。
今、イギリスあたりで5才からプログラミング教育を、と言っているのは、幼稚園の頃からこういった流れを考えさせることを始めているのでしょうね。日本でプログラミング教育のハードルが高いのは、母国語が日本語の私達には、英語のプログラミング言語は、単語のスペルや文法を間違えても気づくのがたいへんで、本質的ではない部分のデバッグにものすごく時間がかかるということもあります。でもドリトルのような日本語のプログラミングで、じゅうぶん論理的思考力を養うツールになると思っています。
――フローチャートを書くだけではなく、読むことも大事なのですね。
稲川先生:そうです。人にはそれぞれ考え方や方法がありますよね。フローチャートは考え方の流れですので、自分と違う考え方を理解する能力も要るだろうと思います。一人よがりで書いて、それでも動けばいいかもしれませんが、授業では生徒に「君の方法で動いた。それも正解だ。でもこういうのもあるよね」と話すことで、いろいろな方法があるんだ、ということがわかると良いと思っています。
今日のビジュアルプログラミングでも、生徒が好きなように書いていけば、線がグチャグチャになってしまいますが、初めはそれでもよいことにします。ただし、例を見せる時はきちんと整理して「こういうふうに書いたらわかりやすくなるよね」というものを提示します。外国語の学習で、人がしゃべっているのを見たり聞いたりして「こんなふうにしゃべればいい」ということを学びますが、プログラミングも同様だと思います。
かつてプログラミングが数学に入っていた時、センター試験の選択問題を数学の先生が教えていらっしゃった、ということがありました。ただ、僕の考えでは、アルゴリズムの手順の例としてよく情報の教科書にあるバブルソートや二分木は、アイディアやテクニックとしてはすごいと思いますが、理解することや考えつくことは難しい。それよりは、やはり自分でプログラムが書ける、そして他の人が書いたプログラムが読めるということが、今の情報化社会で多くの人にとって必要なことであり、だからこそ高校でやっておかなければならないと思います。
――今後プログラミングを必修にする、という動きが出て来て、小中学校でもプログラミングを学んできた子が高校に上がってくるようになった時、高校ではどんなことを目指したらよいと思いますか。
稲川先生:プログラミングというと、どうしても言語は何を使うか、という話になります。例えば、Cは大学でよく使われていますが、最初からいきなりCでプログラムを書くという授業をやると、大学でも落ちこぼれてしまう人が続出します。それはたぶん、文法や論理構造がきちんとわかっていないからではないかと思います。先ほども言いましたが、アルゴリズム→フローチャートと進んでからプログラミングという、この流れが重要だと思います。いきなりプログラミングだけやってしまうので、そのもとになる考え方がよくわからず、ついて行けなくなってしまうという気はしますね。
そして、小中学校でプログラミングの基礎をきちんと学ぶのであれば、高校では機械語まで行き着きたいです。今回使っているビュートローバーは、はじめはビジュアルプログラミングでプログラムを書きますが、これはそのままでは機械が読めません。でも、Cの開発環境が準備されていて、フローチャートで書いたプログラムと1対1に対応づけることができるので、Cで書いたのをコンパイルして機械語まで落とし、実機がちゃんと動くというところまで経験させたい。そこまでやって、プログラミングによってコンピューターがどんな命令によってどのように動くのか、ということが初めて実感できるのだと思います。
【取材を終えて】
諸外国で小学校以前からプログラミングを始めようとする動きが伝えられていますが、日本も平成27年5月の中教審教育課程企画部会の論点整理で、今後高校の「情報」を「情報と情報技術を問題の発見と解決に活用するための科学的な考え方等を育成する共通必履修科目」として、「情報の科学」を軸として再編する方向性が示され、高校での本格的なプログラミング教育がようやく現実味を帯びてきました。
そうなると、現在小中学校で盛んになりつつあるブロックプログラミングと、高校はどこで差別化するかということが課題になります。「問題の発見と解決に活用」することができるためには、言語を理解するだけでなく、そのもととなる考え方(=アルゴリズム→フローチャート→プログラミングの流れ)をきちんと身につけることが必要であることを、今回の見学で改めて感じました。そして、現在はその体系的な学習を高校の教科情報が一手に引き受ける形になっていますが、もっと低年次からアルゴリズムやフローチャートを思考の方法として反復しながら経験させていくことも必要であると思われました。
情報技術を「問題の発見と解決に活用」するためには、当然プログラミングの知識やスキルも必要ですが、日本語を母国語とする者にとっては、英語がベースのプログラム言語はそもそも敷居が高いイメージを持たれがちです。その点、今回東百舌鳥高校で使われたビュートローバーは、フローチャートをブロックプログラミングで書いたのと同じソフト上にCの開発環境が準備されているため、フローチャートで書いたプログラムと1対1に対応づけることができ、プログラミング言語の各部分がフローチャートのどの部分と対応するかを理解しながら書くことができる、という点が非常に優れていると感じました。
ライントレースの走行は、一見易しそうですが実際のプログラムに表すのはなかなか難しく、初めはコースアウトのブザーが鳴りっぱなしの状態でした。しかし、失敗した場合はすぐにプログラムに戻ってどこが間違っているかを見直し、再度挑戦するという文字通りのTry and Errorが実に手軽にでき、生徒達も集中を切らさず取り組むことができていました。