オンラインイベント 教科『情報』授業のあり方を考える ~共通テスト試作問題をうけて~

事例1「コンピュータとプログラミング」の指導

東京都立立川高等学校指導教諭 佐藤義弘先生

ご本人提供
ご本人提供

はじめに自己紹介をします。私は東京都立立川高等学校の情報科の指導教諭をしておりまして、情報科は、2003年に専任になって20年目になります。そのほかに津田塾大学の非常勤講師や、今回の学習指導要領の協力者も務めています。また、文部科学省のICT活用教育アドバイザー、書籍や教科書等の執筆などもしております。

 

 

所属している立川高校は、明治34年創立の伝統校です。普通科と、今年から創造理数科が1クラス新設されました。東京都の進学指導重点校で、75%の生徒が大学入学共通テスト(以下、共通テスト)・フル型受験という状況です。

 

また、文部科学省からスーパーサイエンスハイスクール(SSH)の指定を受けており、「SS課題研究」という科目を、1年全員が必履修となっています。

 

「情報Ⅰ」は1年で必履修、「情報Ⅱ」は3年で選択科目として置く予定になっています。このように、ほとんどの生徒が共通テストで「情報Ⅰ」も受験することになる、という前提で授業をしております。

 

 

試作問題と授業との関係

 

◆コンピュータの仕組み~論理回路はドリル形式で。コンピュータの仕組みには実習を取り入れる

 

それでは本題に入ります。タイトルの(3)というのは、皆さんもご存知のとおり、「コンピュータとプログラミング」の領域になります。

 

11月大学入試センターから共通テストの試作問題(以下、「試作問題」)の概要が公表されていますが、この(3)と関係している部分の点数を足してみると46点分あります。ですから、今日の私の話を聞いていただければ、共通テストの半分くらいの点数については何とかなるかな、ということです(笑)。

 

 

今回の「試作問題」と授業の中身との関係を見ていきます。まず、第1問の問3には、論理回路の問題が出ていました。

 

※クリックすると拡大します。

 

論理回路のポイントは規則性なので、ちょっと練習すればすぐできるようになります。ここはドリルが有効ですので、Excelで入力すると変化が現れるようなドリルや、単純なドリル形式の練習問題をやらせる、という形で学ばせています。

 

※クリックすると拡大します。

 

本校の期末考査で、論理回路の説明は特にしないで「試作問題」を出題してみました。1問目の正答率は79%、2問目は56%でしたので、さすがに条件が組み合わさると難しいのかな、というところがありました。事前にANDとORとNOTの真理値を付けておけばもう少しできたのかな、とも思えるような結果でした。

 

※クリックすると拡大します。

 

この「コンピュータの仕組み」の部分は、「コンピュータとは何か」、「ソフトウエアの仕組み」、「演算の仕組みとコンピュータの限界」ということで、全3回行いました。

 

授業では実習を取り入れて、身の回りのコンピュータが使われている機器を図解したり、PowerPointで写真の周りに吹き出しを付けたりして、どんな機能があって、どういうデータを取って、ということを図解で説明させています。

 

論理回路については、先ほどのワークシートや、論理回路シミュレータ(※1)などで学ばせます。また、PythonやExcelで実際にやってみて、「コンピュータによる計算には限界がある」ということを学ばせています。

 

※1 https://lecture.ecc.u-tokyo.ac.jp/johzu/joho/Data/NewLogicSimulator/blank.html

を必要な論理回路だけに改造したもの

 

 

◆シミュレーション~授業で扱い、テストで出題して、解説で解き方の理解を深める

 

次に、第2問のBですね。こちらは文化祭の模擬店の待ち状況、いわゆる「待ち行列」で、シミュレーションを使って判断していく、という問題です。

 

 

待ち行列については、本校で使っている教科書では触れられていませんでした。調べてみたところ、教科書が12冊出ているうち、8冊には掲載されていますが4冊には載っていません。

 

この問題のポイントは、図に書いて整理するということです。これは、「図に書いて整理すれば分かるよ」というリードがあるので、何とかなるとは思いますが、問題は残りの2つで、「相対度数を確率と見なして考える」という部分です。シミュレーションをしてから、条件の変更によるグラフの形状の変化を解いていかなければならないので、これは見たことがないと解きにくいなという印象です。

 

 

この「累積相対度数を確率と見なして考える」という考え方は、ある1冊の教科書にのみ掲載されていて、他の教科書には、このような書き方、作り方の問題はないのですね。ここは一度体験しておかないとまずいな、と感じて、ちょうど期末試験にギリギリ間に合うタイミングでしたので、累積相対度数を確率として見なして考えるシミュレーションの類題を、授業の例題として取り上げました。条件の変更によるグラフの形状の変化については、ちょっと数学的センスが問われるような感じもあって、現在のところまだ授業では対応していません。

 

 

実際の授業で使ったスライドがこちらです。

 

最初に「シミュレーションってこういうものだよ」ということを説明した上で、実際にシミュレーションを使ったいくつかの問題を解く、という形ですが、この授業で説明する問題を去年まで使っていた問題から「試作問題」に差し替えて、このスライドのような問題にしてみました。

 

 

途中のスライドは省略しますが、10個単位で販売個数を集計していくと、累積相対度数の表ができます。それを乱数を使って対応するところを見ていくことによって、販売個数を予測していく、という形です。

 

これを使って予測を1回すると、全部で170個売れたことになる。何回もやってみると予測がしやすいよ、ということを生徒たちに分かってもらうために、100回行ってヒストグラムや箱ひげ図にする、ということを行いました。

 

授業で実際にやってみたところ、ヒストグラムの形状は乱数に影響されるので変わってきますが、面白いことに(というか、当然といえば当然ですが)、箱ひげ図はほとんど変わらない形で出てきます。このように、「実際にやったらどうなるのか」ということを見ておくだけでも、生徒にとってはメリットがあるのではないかと考えています。

 

※クリックすると拡大します。

 

待ち行列については、定期考査で出題してみました。

 

どう考えればよいのかをその場で考えるきっかけを作ることをねらって、ここでは何も説明せず、いきなり出題しています。

 

手続きにかかる時間と、窓口に訪れる人の条件から最大の待ち時間を考えさせる問題ですが、正答率は約60%と50%強で、初見にしては解ける生徒が多かったです。

 

このようにテストで問題を見ておくという経験をさせて、テストの解説のときに、「こういうのは図に書いてやるといいんだよ」という話をしますので、そこで理解を深めることができることになると思います。

 

 

私のシミュレーションの授業では、PythonとExcelを併用しています。お題としては、確定的モデルと確率的モデルの2回に分けています。

 

確定的モデルの題材は預金の複利計算と生命体の増加シミュレーションで、PythonでもExcelでもできるように、都合4つの教材を作っておき、ExcelとPythonの両方でやってみよう、という形で進めています。

 

確率的モデルも同様にPythonとExcelで、サイコロとガチャを題材にしています。ガチャは、100連ガチャを100回やったら何人くらいの人が当たるのか、というもので、これは確率で求めればすぐに求められる問題ですが、これをシミュレーションでやってみます。こうすることで、確率で理論的に計算した結果と同じ結果がシミュレーションでも得られる、という経験も興味深いところですね。

 

ただ、どちらにしても4種類くらいしか経験できないので、もう少し種類を充実させたいところです。

高校生は、この数式モデルを作るところが一番のネックです。この辺りで、身近な話題で高校生が理解できる数式モデルがもう少しあればいいな、と常々思っています。

 

 

◆プログラミング~関数を考えて定義する経験が重要

 

次に第3問、プログラミングの問題です。日常的な買い物で、上手なお金の払い方をするというものですね。今はセルフレジですから、上手な払い方なんて考えないで、財布にあるコインを投入口に入れてしまえば、勝手にコンピュータが計算してくれますが、あえてこれを考えるものです。

 

この問題は、関数を考えて定義するというところが、ポイントですね。これには、関数を自分で作るという経験が有効だと思います。

 

 

今、試作問題などで使われている大学入試センター言語(DNCL)は、共通テストの「情報関係基礎」で使われているDNCLと多少言語仕様が変わっている部分があります。これを私はDNCL2と呼んでいますが、今まで使っていた命令がそのまま使えない可能性があったり、毎回新たな関数が定義されていたり、ということもあるようです。

 

今回で言うと「÷」という、記号として、2バイト使うすごく気持ちの悪い演算記号があります。あそこは、本当は「%」と書きたかったのかなと思いますが、「%」と書くとPythonそのものになってしまうのでやめたのではないかな、と思いますが。

 

ここでいう関数は、「こういうふうに関数が作れるよね」ということで、実装しないというところがポイントです。実装するとなると言語仕様が難しいことになって面倒なので、「こういう関数があると、こういうことが求められる」という部分的なプログラムを理解していれば大丈夫、ということですね。

 

ただ、この問題でちょっとひねってあるのは、繰り返しのカウンタが減算であることです。減算でカウントをしていくような形のプログラムはなかなか作らないと思うので、そこはちょっと心配だな、と思うところではあります。

 

 

この関数を作る部分については、定期考査で出題しました。「試作問題」の問題文は長過ぎるので、全部は出せなかったです。この問題文の長さについては、先生方も感じていらっしゃることでしょう。

 

正答率は、63%と55%でした。初めて見た問題でこれくらいですから、入試対策として、入試前にもう一度学び直せば、もう少し精度が高く考えられるのではないかと思っています。

 

※クリックすると拡大します。

 

プログラミング関連の授業は、このような形で、全部で11回行っています。

 

1学期にまず2回、ドリトルを使って「プログラムを作るというのはどういうことなのか」ということと、Pythonで変数の使い方といった、ごくごく基礎的な内容を行っています。

 

そして、夏休みの宿題として、本校ではオンライン学習教材のProgate(※2)とプログル情報(※3)を使っているので、これを使ってPythonに慣れるための課題を出しておきます。

 

※2 https://prog-8.com/

※3 https://high.proguru.jp/

 

2学期の割合後半に、プログラミングの習熟のための練習として、自分のペースで進めていけるように順序立てた教材を使った授業を3回行っています。それから、簡単なゲームのプログラムを作る授業を2回。次のペアプログラミングというのは、自由席のペアでプログラミングをするというもので、これが2回。そして、先ほどシミュレーションのところでもお話ししたシミュレーションの活用でプログラミングを使って解決するという授業を2回行いました。先ほどの竹中先生のお話にもありましたが、「情報I」は問題解決がベースですので、シミュレーションにプログラミングが使えるのであれば使ってみよう、というのが基本的なコンセプトです。

 

 

プログラミングの授業~個人のペースで進められる教材と、ペアプログラミングやチーム対抗を組み合わせる

 

それぞれの授業の内容です。

 

1学期の最初の1回は、一斉授業で入力の仕方や変数の扱い、基本的な構文を説明します。

 

2回目以降は、スライドを見ながら各自のペースで進めていくようにしています。中学校でScratchをやっていたり、自分でPythonでプログラミングをしている生徒も結構いますので、最初からプログラミングは一斉授業には向かない、と考えています。ですので、だんだん難しくなるような題材が出てくる教材を全員に配って、自分でどんどん先へ進めていくという形にしています。

 

ゲームのプログラミングは、ゲームというほど複雑なものではありませんが、条件として、乱数を使ったゲーム的要素があるもので、入力に対して反応があるもの。そして、自分で「このプログラムはこういう動作をします」という説明ができて、ちゃんと動作するものを作ろう、という形で各自作らせ、自分で作ったものを他の人3人に評価をしてもらいました。

 

この「乱数を使ったゲーム的要素があるもの」というのは、生徒にとっては割と面白かったようで、「こんなのでゲームが作れるんだ」という感想もありましたし、中には本当に凝って、かなり複雑なものを作ってきた生徒もいました。

 

 

「ペアプログラミング」も2回行っています。本校のコンピュータ教室には、1つのテーブルに生徒用のデスクトップ2台と中央ディスプレイが1台、計3台のモニターがありますが、ここにお互い頼りになる相方とペアになって、隣り合って自由に座らせます。

 

ペアプログラミングの1回は「プログラミングバトル」と題して、ペアでお題に沿ったプログラムを考えて作るというものです。これでプログラミングの速さを競う形で、5チームできたところで終了し、答えを皆に見せて説明します。見ている生徒たちも、答えを知って、なるほどと思うだけでも学習効果はあります。プログラムを一人で考えていると、わからなければ諦めてしまいますが、ペアであれば頑張れるということもあって、ペアワークの効果は絶大で、アルゴリズムを考える授業としては、なかなか良かったと思っています。

 

もう一つが、APIを使ったプログラミングです。これは、事前にこちらで作った動くプログラムを提供して、APIで返ってきた値の中から次のプログラムを呼び出すためのキーワードが取り出せないかを分析して考えていく、ということを行いました。例えば、郵便番号を入れると町名表示ができるようなプログラムや、緯度・経度を入れると最寄り駅が表示できるもの。さらに、緯度・経度を入れると地図ができたり、地域コードを入れると天気が出てきたり、というように、どこから前のデータから取り出してつなぐことができるのかをペアで考えさせる、という授業です。これは、見通しを持った試行錯誤をさせることができて、とてもよい授業だったと思っています。

 

 

共通テストのための授業はしないが、「共通テストに出た考え方」は紹介していく

 

最後に共通テストへの対応についてです。

 

私は、基本的には共通テストのための授業はしないようにしています。ただ、共通テストに出た考え方は紹介したいので、できるだけ取り入れるようにしています。

 

また、情報オリンピックにも取り組ませているので、そこで必要な考え方も紹介するように心掛けています。

 

また、DNCL2でプログラミングができる環境もありますが、それ自体でプログラミングはしないようにしています。それでも、疑似言語は一度は見せておきたいので、見せることはしますが、プログラミング自体は、Pythonの基本をしっかりやっていくようにしています。ただ、共通テストへの対応をしないとは言えないので、意識はして、例題に出してみたり、小テストで出題したり、という形の心掛け方をしています。

 

 

3年間の学習プロセスです。

 

1年生の「情報I」の2単位の中で全部やるのは難しいという声もありますが、教科書は今の時点で大体終わりました。

 

私の授業では、体験と考えることを重視しており、学んだことを活用することを中心にしています。授業でしゃべる時間はできるだけ10分くらいにして、あとは活用する時間に取るように心掛けていますが、しゃべり過ぎということが多いです。

 

2年では、探究活動や他教科の授業などで、「情報」の学びを活用してもらうことを心掛けています。例えば、「情報I」の『仮説検定』は、2年の数学Bの統計でもう1回出てきますので、1年生の「情報I」で「来年数Bで出るよ」と言いながらやっておくと、何となくカリキュラム・マネジメントをしている形になる、というメリットがありますね。

 

3年では、知識事項の学び直しです。それによって体験が呼び起こされて、入試対策用の学びにつながっていくのではないかと思っています。講習会や補習などを考えなければならないかな、とは思っていますが、これもビデオ教材を使ってオンデマンド型にするしかないのかな、今から教材を用意しなきゃいけないかな、といったことを、今考えているところです。

 

 

質疑応答

 

Q1 高校・情報科教員

「待ち行列」の問題は、平均的なレベルの高校生は、初見では解けない人がほとんどだと思います。やはり過去問や関連問題を重点的に解法指導する必要が絶対あると私は思うのですが、過去問で知識理解や解法指導をすることは望ましくない、との意見が強いように思います。私は、それは建前論のように思うのですが、先生はどのように考えですか。

 

A1.佐藤先生

他教科の「共通テスト」にも共通する考え方ですが、図や表を読み取って解く問題が出題されます。試作問題では、丁寧なリード文があり、シミュレーションの(作成途中)とされる図も掲載されています。表や図の内容から、途中のプロセスを含めて考える必要があり、解法を覚えて答えが出ても、適切に解答できるとは限りません。

 

建前論ではなく正直なところ、考え方を学ばせるしか対応できません。目指すのは、あの問題を初見で解ける力をつけることなのだと思います。解法を覚えても、この問題にしか活用できないのですから。

 

 

Q2. 高校 情報科・公民科教員

私は経済学部出身で、本業は公民科です。近代経済学では、学部でも中級以上の教科書から微分方

程式が出てきます。待ち行列などは大学では微分方程式を使って解いていたと思いますが,理科系の

先生方は微分方程式の扱いについてはどのようにお考えでしょうか。

 

A2.佐藤先生

微分方程式を扱うつもりはまったくありません。「試作問題」を見てもらえれば分かると思いますが、待ち行列を解く問題ではなく、シミュレーションする問題ですから、微分方程式が出てくる場面はありません。微分方程式で答えが出せても、「試作問題」に解答することはできないと思います。

 

 

Q3. 高校 情報科教員

問題解決を行わせると、教科書の内容を逸脱した知識・技能を学んで満足する生徒が経験上多くて、悩んでいます。何か対応や工夫されていることがあれば教えて下さい。

 

A3.佐藤先生

素晴らしい生徒さんですね。とは思いますが、探究活動ならまだしも、授業としてはお困りだと思います。情報の授業は問題解決の手法を学ぶことが目的で、問題解決自体は目的ではありません。

 

そのため、授業で行う「問題」の設定にはいくつか工夫が必要です。題材は生徒の身近なものにし、グループで取り組ませます。時間設定は少なめにしてあらかじめ提示し、時間内にギリギリ終わるグループが少し出るぐらいに設定します。必ず最後はポスターセッションなどで発表させ、相互評価します。

 

グループで行い、最後に発表させるため、他の人に説明できる内容になります。時間が少ないため、無駄なことはせず、必要とされるものにまず取り組むようになります。まとめると、グループでアウトプットを意識して短時間で問題解決をさせるということです。時間内で終わらせられるようマネージすることも、問題解決の一つと考えています。

 

 

Q4. 高校 情報科・技術科教員

教科書の内容はすでに終わっているとおっしゃっていましたが、残りの時間はどのような授業になるのでしょうか。

 

A4.佐藤先生

「試作問題」を受けて、体験させておきたい内容を実施しました。「SSDSE(※4)でPPDAC」というタイトルで、2回の授業でオープンデータを分析して、スライドにまとめる授業をしました。

 

授業の中だけで終わらせたチームもありますが、分析が楽しくなって、自宅で夜遅くまで取り組んだ生徒もいました。授業時数が多いクラスでは簡単なポスターセッションをおこないました。

 

また、本編でもお話しした「条件の変更によるグラフの形状の変化」、「減算でカウントをしていくような形のプログラム」のほか、「散布図行列」「1週間平均」を題材とした「見たことがないと解きにくい問題」をペアで考える授業をおこないました。解き方を説明するのではなく、時間内で考える形式です。解けないペアもありますが、解説を聞いて「あぁ~」という声も多く、考えたからこそ解説がよく分かる授業となったようです。

 

※4 SSDSE(教育用標準データセット)

 

オンラインイベント「 教科『情報』授業のあり方を考える ~共通テスト試作問題をうけて~」講演より