大学入学共通テストを見据えた「情報Ⅰ」のプログラミング教育に関する考察

愛知県立小牧高校 井手広康先生

ご本人提供
ご本人提供

今日の発表は、私がここ3年ほどの間で、プログラミング教育について研究してきたことのダイジェスト版としてご報告したいと思います。

 

プログラミング教育を行うに当たって、いろいろ疑問に思われていることがあると思いますが、まとめるとこの3つになると思います。

 

1つ目は「大学入学共通テスト(以下、共通テスト)にどの範囲のプログラミングが出るのか」ということ。

 

2つ目は「授業でプログラミングをする際の実行環境は、具体的に何がよいのか」ということ。

 

3つ目は「結局、プログラミング言語は何がよいのか」ということ。

今日はこれら3つの項目に焦点を絞ってお話ししたいと思います。

 

 

1. 共通テストに出るプログラミングの範囲って?

 

まず、令和7年度の共通テストに出るプログラミングの範囲について、私が調べた内容についてお話しします。

 

共通テストに出るプログラミングの範囲の参考となる重要な資料は、今のところ大きく3つあります。

 

1つ目は2020年11月に大学入試センター(DNC)から出た「『情報』試作問題(検討用イメージ)」(以下、「試作問題」)、2つ目は2021年3月に同じくDNCから出た「『情報』サンプル問題」(以下、「サンプル問題」)、3つ目は「情報I」の教科書見本本です。

 

教科書の見本本は6社から13種出ています。本来は、教科書よりも学習指導要領から見ていくべきですが、教科書の方が具体的でわかりやすいので、ここでは見本本を取り上げることにしました。

 

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

 

まず、「試作問題」で出題されたプログラミングの問題です。

 

これはシフト暗号を題材とした暗号解読の問題です。全部で6ページから成りますが、内容をよく見ると、配列の操作が非常に多く、さらに配列の操作に「入れ子」が含まれています。for-if、forの中にif/else、さらにその中にif/elseという入れ子があったり、配列操作における剰余(割った余り)の考え方に慣れていないと解けない問題になっています。

 

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

 

こちらは「サンプル問題」のプログラミングの問題です。中学校の社会科で扱われている、比例代表選挙の「ドント方式」における各政党の当選者数を求めるプログラムを考える問題です。

 

先ほどの「試作問題」と同様に、while-for-ifの配列操作の「入れ子」が3重になったものと、and/or/notの論理演算子が使われていました。この配列操作に「入れ子」が入ってくるというところが特徴的です。

 

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

 

「試作問題」と「サンプル問題」から見るプログラミングの15のポイント

 

「試作問題」と「サンプル問題」に、どのようなプログラミングの要素が共通して出ているかを15個にまとめてみました。

 

まずは、(1)変数、(2)代入、(3)インクリメント、(4)メッセージ、そして(5)異なるデータ型の結合です。この(5)異なるデータ型の結合は、具体的には文字列と数字の結合を意味しています。

 

 

次に、(6)算術演算子、(7)比較演算子、(8)論理演算子があります。そして(9)条件分岐(if文)と、(10)

繰り返し(for文)があります。この(10)繰り返し(for文)は、変数を1ずつ増やしながら繰り返すといったものです。

 

 

(11)繰り返し(while文)は、「○○の間繰り返す」というものです。次が、先ほどお話しした(12)入れ子(ネスト)、そして(13)配列/リストと(14)添え字(インデックス)です。最後が(15)関数です。これらのプログラミングの要素は、共通テストに出題される可能性が非常に高いと思います。

 

 

教科書によって、扱う内容にはバラつきが大きい

 

共通テストに出るプログラミングの範囲を考えるための3つ目の資料が「情報I」の教科書13種です。ただし、下段右から2つ目の日本文教出版の「情報I 図解と実習」は2冊で1冊の扱い(ブックインブック形式)となっておりますので、実質は12冊です。

 

 

これらの教科書の中で、プログラミング言語はPython、JavaScript、VBA、Scratchの4つが掲載されています。各教科書に掲載されている言語を表にすると、このようになります。

 

特徴的なのは、複数の言語を採用している教科書が多かったことです。

 

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

 

下図は、教科書のプログラミング分野の掲載内容を表にしたものです。青色が全ての教科書に記載があるもの、黄色はほとんどの教科書に載っているもの、赤が一部の教科書にしか載っていなかったものです。

 

ただし、例えば「二次元配列」は少数の教科書しか出ていませんが、「二次元配列」が共通テストに出ないかというと、断定はできないと考えます。

 

例えば「サンプル問題」では、IPアドレスのネットワーク部とホスト部に関する出題がありましたが、このことはどの教科書にも掲載されていません。しかし「サンプル問題」では、「問題の説明文で仕組みを説明した上で、内容について出題する」という形で出題されていました。それを踏まえると、例えば「二次元配列」も、説明文を入れながら出題される可能性もあると思います。

 

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

 

下図は、先ほどのプログラミングの15個の要素に対して、それぞれの教科書に記載があるかどうかを示したものです。「○」は記載があるもの、「△」は一部の記載があるもの、「×」は記載がないものとなっています。

 

これを見ると、教科書によっては掲載がなかったり、一部のみだったりということがわかります。ただ、誤解のないように申し上げると、これは決して教科書の良し悪しを表しているものではありません。しかし、教科書に記載のない項目については、別途先生が説明を加えたり、演習の機会を設けるといった対策が必要になるかと思います。

 

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

 

順次・分岐・繰り返の基本構造と配列、関数が基本。入れ子と配列の組み合わせは演習が必要

 

ここまでをまとめると、共通テストに出るプログラミングの内容としては、3つの基本構造、つまり「順次」「分岐」「繰り返し」、これに加えて「配列」と「関数」が基本になると思います。

 

それ以外の細かいことは、DNCLは日本語ですので、読めば何とかなるのではないか、というのが正直な感想です。ただし、入れ子(ネスト)と配列/リストの組み合わせについては、「試作問題」と「サンプル問題」の両方に出題されているため、しっかり演習しておかなければ解答は難しいという印象です。これらについては、時間がある限り授業で取り組ませる必要があると思います。

 

 

 

2.プログラムの実行環境って何がいいの?

 

次に、「プログラミングの実行環境は何がよいか」という話です。教科書に記載されているPython、JavaScript、VBA、Scratchの4つのプログラミング言語のうち、VBAはExcel VBE 、Scratchは(オンライン版かインストール版かはありますが)Scratchと、それぞれ実行環境は一択なので問題はありません。

 

一方、PythonとJavaScriptに関しては、本当に多くの実行環境があります。

 

例えば、表のJavaScriptの上3つの実行環境は、統合開発環境(IDE)と呼ばれるものです。その下、Google ChromeやMozilla Firefoxといった、ブラウザの中でプログラムを実行できるものもあります。

 

その下のPLAYCODE以下は、オンラインでプログラムの実行が可能なものです。このような多様な実行環境の中から、言語に合わせて教員が選ばなければならない訳ですが、その際に「実行環境によって教育効果に影響が出るのか」ということが問題になるかと思います。

 

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

 

実行環境によって教育効果に影響が出るのか、検証してみた

 

これは2年前に実施した授業ですが、Pythonのプログラミングの授業を行う際に、本校7クラスでクラスごとに実行環境を変えて、授業アンケートの結果や確認テストの結果に差異が生じるのかを検証しました。

 

使用した実行環境は、こちらの7種類です。

 

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

 

授業内容は、この10回です。本来であれば、DNCの「試作問題」や「サンプル問題」を踏まえて授業計画を立案できれば良かったのですが、当時はまだ「試作問題」が公開される前年でしたので、私の方で共通テストに必要だろうと考えたプログラミングの内容で、この10回を組みました。

 

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

 

こちらが事前アンケートと事後アンケートの比較です。

 

まず、「プログラミングに対してどのようなイメージをもっているか」という質問に対する結果です。左側が事前アンケートの結果ですが、やはり「大変難しい」「難しい」という回答が圧倒的に多かったです。

 

右側が事後アンケートの結果ですが、事前アンケートの結果と大きく変わっていません。この変化の度合いの結果に検定をかけましたが、すべてに有意差は出ませんでした。このことから、「実行環境によってプログラミングに対するイメージは変わらない」ということがわかります。

 

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

 

2つ目のアンケートは、「プログラミングの授業を始める(終わる)にあたってどのような気持ちでいるか」というものです。左側が事前アンケートの結果で、授業を始めるにあたっての気持ちを聞いていますが、比較的多くの生徒が楽しみにしていたということがわかります。

 

右側が事後アンケートの結果で、授業が終わるにあたっての気持ちを聞いた回答です。これらにも検定をかけたところ、どれも有意差は見られませんでした。このことから、「実行環境によってプログラミングに対する気持ちに差は生じない」ということがわかります。

 

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

 

3つ目は、「プログラミングの授業は何回くらいが適当か」という質問です。事前アンケートの結果は「3-4回」「5-6回」「7-8回」が多くを占めていますが、事後アンケートでは、「5-6回」「7-8回」「9-10回」が多くを占めている結果となりました。これらに検定をかけると、1組:IDLE、3組:Jupyter Lab(TextFile)、4組:JupyterNotebook、6組:Spyder、7組:Visual Studio Codeに有意差が見られました。これには、次の「実行環境の使い易さ」という項目の影響があったかもしれません。

 

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

 

4つ目の「プログラム環境は使い易かったか」という質問では、7つの実行環境でこのような差が出ました。それぞれ違いがありますが、検定をかけて唯一有意差が出たのが6組:Spyderです。

 

ご存じの方はイメージできるかと思いますが、Spyderは「変数エクスプローラー」という、変数やリストの中身がリアルタイムに表示されるという機能があります。実際に「変数エクスプローラー」がわかりやすかったと答えた生徒が多数いました。

 

右側が確認テストの結果です。これも、一見差があるように見えますが、検定の結果、実行環境において有意差は出ませんでした。

 

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

 

結論として、Spyderは「使い易い」という点で多少差が出ましたが、基本的にはどれを使ってもよいと思います。また、今回はPythonを使用して授業を実践しましたが、JavaScriptでも恐らくPythonと同様の傾向が出るのではないかと推測します。

 

ただ、これらの結果は成果物で何を作るかによっても変わってくると思います。基本的な3つの構造、配列、関数について簡単に学習するレベルであれば、さくっと使えるブラウザ型や、オンライン環境のように実行環境をインストールせずにプログラムを実行できるようなものを選択してもよいかと思います。

 

 

 

3.結局、プログラミング言語って何がいいの?

 

最後に、「結局のところプログラミング言語は何がよいのか」という話です。私も実際に「DNCLがPythonに似ているからPythonがいいんじゃないか」や「Scratchはブロック型だから、共通テストには不利なのではないか」といった声を聞いたことがあります。ここでは、プログラミング言語によって生じる教育効果の差異について検証した結果についてお話しします。

 

 

習った言語によって「サンプル問題」のプログラミングの成績に差は出るのか

 

これは、今年度本校にて実施した授業です。

 

7クラスにおいて、クラスごとにプログラミング言語を変えて授業を行い、最終的に「サンプル問題」の第2問のプログラミング問題を解かせました。「サンプル問題」を解くまでには7回の授業を行いましたが、授業の内容はプログラミング言語ごとで同一です。

 

 

授業内容がこちらです。

 

全8回で、7回目までに先ほど示したプログラミングの15個の要素全てが入るように、授業プリントを作成して授業を進めました。最後に「サンプル問題」のプログラミング問題を30分かけて解かせました。

 

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

 

こちらが実際に使った授業プリントです。

 

授業プリントの全てに、左側に授業で扱うプログラミング言語を書いて、右側にDNCLを書くようにしました。英語で言えば、左側に英文があって、右側に日本語訳があるようなイメージで、常にDNCLと対応できるようにして授業を行いました。

 

なお、DNCLに特化した授業は実施していません。

 

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

 

実行環境については、先ほどお話ししたように、Pythonではどれを使っても教育効果に大きな差が生じなかったという結果を踏まえて、PythonとJavaScriptの実行環境は、導入が容易なGoogle ColaboratoryとGoogle Chrome(デベロッパーツール)をそれぞれ選択しました。

 

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

 

合計点には差が出なかったが、言語の特徴によって正答率が異なった問題も

 

こちらが結果です。「サンプル問題」の第2問は全部で19個の選択肢(ア~テ)があります。また、第2問は大きく問1、問2、問3と分かれていて、問1が3個、問2が10個、問3が6個の選択肢があります。

 

全クラスの平均は6.9点でした。この合計点に対して検定を行った結果、右側にあるように、プログラミング言語で有意な差は出ませんでした。そのため、「サンプル問題」に限っては、「どの言語で授業を行っても結果は変わらない」ということになります。

 

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

 

なお、全19問のそれぞれの正解率に対して適合度検定(カイ二乗検定)をかけたところ、3つの問について有意な差が出ました。

 

1つ目が問1の解答欄[ア]で、変数の範囲を答える問題。2つ目が問2の解答欄[ケ]で、配列の中身を答える問題。3つ目が問3の解答欄[セ]で、while文の条件式を答える問題です。

 

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

 

解答欄[ア]は、授業でPythonを学んだ生徒たちの正解率が非常に低い結果となっています。全体の正答率が41.6%のところ、Pythonを学んだ生徒たちは30.0%しかありませんでした。

 

この理由を私なりに考えてみました。この部分をそれぞれの言語で書くと、このスライドのような表記の違いが出ます。DNCLでは「mを0から3まで1ずつ増やしながら繰り返す:」で、解答欄[ア]には「3」が入ります。

 

ところが、これをPythonで書くと、「for m in range(0,4):」となり、rangeの括弧内の右側は「終了値プラス1」で書かなければいけません。授業では,「range(0,4)というのは、0から3までを意味します」と説明していましたが、これがまだ定着していなかった生徒が間違えてしまった可能性が高いと考えます。

 

実際に、この「3」を「4」と誤答した生徒は、Pythonが最も多かったです。ですから、Pythonを使う場合は、for文におけるrange中の数字については、しっかり説明しなければいけないと思います。

 

 

2つ目に有意な差があったのが回答欄[]で、配列/リストの中身を答えるものです。これはScratchが最も正解率が高く、全体の正答率が71.0%のところ、Scratchを学んだ生徒たちは87.5%の生徒が正解できていました。

 

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

 

これも推測ですが、Scratchはリストの中身が、常にリアルタイムで見られるような状態で示されます。ですので、DNCLを解くときも、自分の中でリスト内の数値の変化がイメージしやすかったのではないかと考えます。

 

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

 

3つ目に有意な差があったのが解答欄[セ]です。これはwhile文の条件式を入れる問題ですが、VBAが最も正解率が高く、全体の正答率が38.7%のところ、VBAを学んだ生徒たちは51.9%の生徒が正解できていました。

 

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

 

先ほどの解答欄[ア]のfor文のときのように、該当のコードをそれぞれの言語で書き直してみました。これを見ると、VBAが抜き出てわかりやすいわけではなく、他の言語もシンプルでありますので、コードの表記自体が要因ではないと考えます。

 

 

これはあくまで推測ですが、この右側の「サンプル問題」の該当箇所を見ていただくと、解答欄[セ]の前に解答欄[ア]が来ています。実は、解答欄[ア]の正答率が一番高かったのがVBAでした。そのため、解答欄[ア]の問題と連動して、必然的に解答欄[セ]の正答率も高くなったのではないかと推測します。

 

以上のように、19問中この3問については、言語によって正答率に有意な差が出ましたが、その他の問題は言語によって差がなかったということになります。

 

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

 

言語によって差は出ないが、入試対策には言語の特徴に合わせてギャップを埋める指導が必要

 

こちらが事後アンケートで、「サンプル問題が難しかったか」という質問です。「とても難しい」と答えた人が7割弱あり、授業を7回やった程度では、やはりまだ難しいという印象です。こちらもカイ二乗検定をかけましたが、有意な差は出ませんでした。そのため、「言語によって感じた難易度に差は生じなかった」ということになります。

 

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

 

今回はサンプル問題を30分かけて解かせましたが、解答時間に対する印象を事後アンケートで聞きました。

 

ここでは、Scratchを学んだ生徒が、有意な差で「短い」(もっと時間が欲しかった)と感じた割合が多かったという結果が出ました。

 

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

 

事後アンケートの中で、「授業プリントのDNCLと該当言語でどちらがわかりやすかったか」を聞いたところ、Scratchを使ったクラスの生徒は、圧倒的に「DNCLよりもScratchの方がわかりやすかった」という回答になっています。そのため、Scratchを学んだ生徒はブロック型のプログラムに慣れてしまったために、「サンプル問題」ではDNCLを読むのに時間がかかってしまったのではないかと推測します。

 

 

結論として、「プログラミング言語は何がよいのか」ということについては、結局「何でもよい」ということが改めて明らかになりました。よく言われることですが,やはり大切なことは、「プログラミングの考え方」を学ぶことだと思います。

 

ただし、授業の中で「共通テストのためだけにDNCLしか扱わない」ということはやってはいけません。授業では実際のプログラミング言語を使って、トライアンドエラーを生徒に体験させることが大切なのだと感じます。また、Scratchに関しては、ブロック型のプログラミング言語ですので、特にDNCLとの表記の違いを意識して、そのギャップを埋める演習が必要だと思いました。

 

情報科教育学会東海・中部支部総会並びに研究会 講演より