SSS2021 情報処理学会 情報教育シンポジウム

大学入学共通テスト『情報』サンプル問題を踏まえた『情報Ⅰ』の教科書におけるプログラミング分野の比較

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

新課程の学習指導要領にプログラミング言語の指定はない

ご本人提供
ご本人提供

まず本研究の背景と目的をご説明します。高等学校では令和4年度より、これまで「情報の科学」と「社会と情報」の2科目の選択必履修だった情報科が「情報Ⅰ」に統合になり、プログラミングの単元が必修になります。

 

この「情報Ⅰ」で扱うプログラミング言語については長らく議論されてきましたが、学習指導要領には具体的なプログラミング言語に関する記載はありません。「どのプログラミング言語を使うのかではなく、プログラムの考え方を学ぶ」と言ってしまえばそれまでですが、これまでプログラミングを教えたことがない先生方も多くいますので、やはりプログラミング言語の選択は現場の先生方にとって大きな壁になっていました。

 

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

 

センター試験「情報関係基礎」のプログラムはDNCLで出題

 

下図が情報入試のこれまでの流れです。ご存じのように、令和3年7月30日付で文部科学省から、「令和7年度大学入学者選抜に係る大学入学共通テスト実施大綱の予告」が公表され、「情報I」が大学入学共通テストに正式に加わることになりました。

 

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

 

ただし、プログラミングの問題はここで初めて出題されるのではなく、これまでもセンター試験/共通テストの数学2で実施されていた「情報関係基礎」の中で出題されていました。ここで使われているDNCL(大学入試センター言語)というプログラミング言語は、大学入試センターが独自に作成した疑似言語です。

 

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

 

こちらは令和2年11月に、大学入試センターから各自治体の教育委員会や大学等に通達された大学入学共通テスト「情報」試作問題(検討用イメージ)です。この試作問題のプログラミングの問題はDNCLで書かれています。

 

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

 

下図は、令和3年3月に同じく大学入試センターが公開した大学入学共通テスト「情報」サンプル問題です。こちらにも、試作問題と同様にDNCLが使われています。

 

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

 

下図の左側が情報関係基礎のDNCL、右側がサンプル問題のDNCLです。同じDNCLではありますが、見ていただくとかなり違っていて、右側のサンプル問題のDNCLは、Pythonを彷彿とさせる表記になっております。

 

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

 

下図は、令和元年5月に公開された「高等学校『情報I』教員研修用教材」が掲載されている文部科学省のホームページです。

 

左側は「情報Ⅰ」の4つの領域について章立てされており、プログラミングは第3章「コンピュータとプログラミング」が該当します。

 

教員研修用教材の「本編」はPythonで書かれていますが、後日、第3章の「別冊」としてJavaScript、VBA、ドリトル、Swiftの4つが公開され、計5つのプログラミング言語が使用されました。これは現場の教員にとっては衝撃的で、文科省はこのようなプログラミング言語の使用を想定しているのではないか、と話題になりました。

 

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

 

下図は、教員研修用教材の同じ領域を比較したものになります。

 

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

 

一方、1年後に出た「高等学校『情報Ⅱ』教員研修用教材」は情報Ⅰのように別冊はなく、Pythonのみの表記となっています。

 

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

 

新課程の教科書には、Python、JavaScript、VBA、Scratchが掲載

 

下図が、令和3年4月から5月にかけて全国の高等学校に各教科書会社から送付された「情報I」教科書の見本本になります。全13種類ありますが、右下の青い点線で囲っている2冊の教科書は「ブックインブック」という本の中に本を挟む形態となっています。この2冊は、教科書目録では別の冊子になっていますが、採択時には1冊としてカウントされます。結果的に、「情報Ⅰ」の教科書には、Python、JavaScript、VBA、Scratchの4つのプログラミング言語が使われていることがわかりました。

 

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

 

本研究では、この「情報I」の教科書におけるプログラミング分野に関して比較を行いました。その中で、DNCLと4つのプログラミング言語がどれだけ類似しているかという類似度を調査しました。また、サンプル問題を踏まえて、サンプル問題に出題されたプログラミングの内容が各教科書でどのように扱われているかを比較しました。さらに、それを踏まえて、各プログラミング言語を授業で扱う際の注意すべき点について考察しました。

 

 

まず、発表内容に関する注意点をお話ししておきます。

 

サンプル問題は、「情報Ⅰ」の教科書の検定中に作成されたものになります。そのため、サンプル問題の表紙にも書かれていますが、サンプル問題は「情報Ⅰ」の教科書に対応したものではありません。

 

逆に、教科書もサンプル問題を参考にしたものでもないので、双方が対応していないのは当然ということになります。

 

また「情報Ⅰ」では、1つの教科書会社が複数の教科書を発行している場合が多くあります。これは、複数の難易度を設けることで、幅広い学力層の生徒に対応するための配慮であると考えられます。

 

この発表は、どのプログラミング言語が良いとか、教科書の優劣を比較したりするものではないということをご理解いただきたいと思います。

 

 

次に、教科書目録と各教科書の特徴についてお話しします。こちらは文科省が公開してる令和3年度の教科書目録、つまり現行の教科書の一覧です。左側が「情報の科学」で8種類、右側が「社会と情報」で13種類の教科書があることがわかります。

 

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

 

下図が令和4年度の「情報Ⅰ」の教科書目録で、全部で13種類あります。

 

右側の表は、各社における現行課程と新課程の教科書を比較したものです。「社会と情報」と「情報Ⅰ」は同じ13種類ですが、「社会と情報」には「改訂版」や「新編」が含まれています。そのため、数だけで見ると同じですが、種類で見ると「情報Ⅰ」の方が多いということがわかります。

 

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

 

教科書によって取り扱う内容は大きく異なる

 

「情報Ⅰ」の教科書では4つのプログラミング言語が使われていますが、プログラミング言語を併記している教科書が非常に多く、これが今回の教科書の大きな特徴となっています。

 

例えば、東京書籍の2冊はPythonをベースに、ScratchとJavaScriptがそれぞれ併記されています。

 

実教出版は4冊出していますが、これらは併記ではなく、4つの言語で1冊ずつ分けられています。開隆堂と第一学習社はVBAのみで1冊ずつ、数研出版は2冊ともPython、JavaScript、VBAの3つのプログラミング言語を併記しています。そして、日本文教出版は、1冊がPythonとJavaScriptの併記、もう2冊は、先ほどお話ししたブックインブック形式となっているもので、Scratchで書かれています。

 

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

 

下図は、各教科書で扱われているプログラムにどのような内容が書かれているかを調べたものです。

 

青枠の部分が全ての教科書に記載があったもの、黄色が一部の教科書には記載がなかったもの、赤は逆に一部の教科書にしか記載がなかったものになります。これらを見ると、各教科書によって取り扱っている内容が大きく異なることがわかります。

 

表中に「難易度」と書いてありますが、これは教科書に記載されているプログラムの難易度を、私見で1(易)/2(普)/3(難)でランク付けしたものです。プログラムの難易度から見ても、各教科書会社が幅広い生徒に対応できるように工夫していることがわかります。

 

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

 

下図は、教科書に記載されているプログラムの具体的な内容を洗い出したものです。教科書によっては、情報デザインやシミュレーションの単元にまでプログラミングが含まれているものもありました。このように、プログラムの内容から見ても、各教科書会社で様々な工夫がされていることがわかりました。

 

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

 

下図は、令和3年6月に実施した愛知県高等学校情報教育研究会研究協議会で、約70校に「どのプログラミング言語を使う予定か」というアンケートを取った結果です。このときはまだ教科書採択が確定していない段階でしたので、「検討中」という回答が多くなっています。

 

これを見ると、やはりPythonとVBAが非常に多いことがわかります。これは愛知県に限った結果ですが、全国的に見てもこの結果とそこまで大きくは変わらず、PythonとVBAに二極化するのではないかと予想します。

 

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

 

DNCLと教科書で扱われるプログラミング言語を比較してみると…

 

続いて、DNCLと4つのプログラミング言語の類似度について見ていきます。

 

スライドの左側は、サンプル問題に出題されたDNCLのプログラムです。それをPythonで書き直したプログラムが右側になります。先ほど、DNCLがPythonに類似していると言いましたが、確かにDNCLとPythonは一対一のコードで対応ができています。そのため、授業でPythonを扱っている場合、共通テストの問題にスムーズに対応できるのではないかと思います。

 

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

 

続いてJavaScriptです。これも、おおむねコードの一つひとつが対応しています。細かい点で言えば、例えばfor文の中の表記「初期値/終了値/増分値」の特徴的な書き方の違いが挙げられます。ただし、そこまで大きな違いではないので、授業でJavaScriptを扱っていても、大きな違和感なくDNCLを読むことができると思います。

 

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

 

こちらがVBAです。VBAに関しては、初めにDim文を使用して変数の定義を行うのが一般的ですが、それを除くとほとんどJavaScriptと同じで、おおむねコードの一つひとつが対応しています。そのため、授業でVBAを扱っていても、大きな違和感なくDNCLを読むことができると思います。

 

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

 

最後にScratchです。Scratchは、ご覧のとおりDNCLと表記が大きく異なります。Scratchはブロック型のプログラミング言語ですので、テキスト型と比較すること自体に無理があると言えばそれまでですが、リストの定義の仕方や、繰り返しの部分は大きく表記が異なります。

 

例えば、Scratchはfor文のステートメント内でインクリメントする仕組みがないため、「for文の前に変数を置いて、それをfor文内で1ずつ変える」という手順を踏む必要があります。また、「≧」や「≦」の比較演算子や、until文の「○○まで繰り返す」に該当するブロックがありません。プログラムを読むことだけを考えると、ScratchよりもDNCLの方がはるかに簡単であるという印象です。

 

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

 

サンプル問題に出題されたプログラミングの要素は、教科書でどのように扱われているのか

 

次に、サンプル問題の内容を踏まえて教科書のプログラムの内容を比較しました。

 

まず、サンプル問題のプログラムの要素を洗い出してみると、大体15個の要素に分けることができるかと思います。順番に説明していきます。まず、(1)変数、(2)代入、(3)インクリメント、(4)メッセージ、そして、(5)異なるデータ型の結合です。(5)異なるデータ型の結合というのは、例えば、数値と文字列、また変数との結合などがこれに該当します。

 

 

続いて、(6)算術演算子、(7)比較演算子、(8)論理演算子になります。サンプル問題では、選択肢の中で論理演算子が使われていました。あとは、(9)条件分岐(if文)、(10)繰り返し(for文)になります。

 

 

もう1つ、for文ではなく(11)繰り返し(while文)も使われています。次の(12)入れ子(ネスト)では、試作問題やサンプル問題でも三重の入れ子が使われていました。

 

あとは、(13)配列/リスト、(14)添え字(インデックス)です。これら(13)と(14)は一つにまとめても良いのかもしれませんが、一部の教科書では添え字が0からではなく1から始まっているため注意が必要です。そして最後に(15)関数です。試作問題やサンプル問題では、初めの文章に関数の説明があるので引数や戻り値までは扱っていませんが、今後、引数や戻り値を含む関数が出題される可能性は十分にあります。

 

 

これらの15個のプログラミングの要素に対して、13種類の教科書にその内容があるかどうかを比較した表がこちらになります。青(○)はプログラムの記載があるもの、赤(×)はプログラムの記載がないもの、黄色(△)は一部のプログラムの記載しかなかったり、説明はあるがプログラムの記載がなかったりするものです。また、Scratchの場合は、プログラムの表記に大きな違いがあるため、黄色(△)としている箇所が多いです。

 

こう見ると、教科書によっては含まれていない要素があることがわかります。今回はこれら15個のプログラミングの要素のうち、特に意識していただきたい3つの要素についてコメントします。

 

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

 

授業で別途演習が必要な内容は、論理演算子、for文/while文、入れ子(ネスト)

 

1つ目が論理演算子です。今回のサンプル問題には、選択肢としてAND、OR、NOTが使われていましたが、教科書に論理演算子の説明がないものが意外に多かったです。

 

実際、論理演算子は「数学A」の「集合と論理」の単元で出てきますが、それを実際にプログラムに入れて考えるにあたっては、別途演習が必要であると思います。

 

2番目がfor文とwhlie文です。両者とも繰り返し処理を表しますが、どちらか一方しか記載されていない教科書が多くありました。「繰り返す」という概念は同じですが、両者とも考え方として知っておくべきであると思います。

 

そして私が最も気になっているのが、3番目の入れ子(ネスト)です。試作問題とサンプル問題も、この入れ子によるプログラムが多く使用されていました。例えば、試作問題ではfor-if-if、サンプル問題ではwhile-for-ifが使用されています。自分がこれまでプログラミングの授業をしてきた中で、繰り返しの問題は理解できても、その次に、例えば「九九の表」のようなfor文の中にさらにfor文が入る入れ子構造になると、生徒はとたんにわからなくなってしまいます。ですので、この入れ子に関しては、例え教科書に記載があったとしても、さまざまなパターンの演習が必要になると思います。

 

最後に、まとめと今後の課題です。

 

まず、DNCLと4つのプログラミング言語(Python、JavaScript、VBA、Scratch)の類似度についてです。当たり前のことですが、プログラミング言語によってDNCLとの類似度が異なります。共通テストで重要なのは、プログラムが「書けること」ではなく「読めること」です。共通テストを受ける以上は、DNCLを知っておく必要がありますので、DNCLと授業で扱ったプログラミング言語との差分に関する演習が必要であると思います。

 

特にScratchに関しては、ブロック型である以上、やはりDNCLとの表記が大きく異なるので、もし共通テストを受ける場合は、DNCLに慣れるための演習はかなり必要になります。このように、程度の差はありますが、授業でいずれのプログラミング言語を扱う場合も、やはりDNCLに関する事前の演習は必要になると思います。

 

 

次に、サンプル問題と教科書の内容の比較した結果についてです。今回はサンプル問題に使用されている15個のプログラミングの要素を挙げましたが、この15個の要素が全ての教科書に記載がある訳ではないということがわかりました。

 

もちろん、教科書はサンプル問題を参照して作られた訳ではありませんが、15個の要素はプログラミングの基本的な要素であると思いますので、掲載がなかった教科書に関しては、別途演習が必要であると思います。特に入れ子(ネスト)に関しては知識だけ知っていても意味がなく、身体で覚えておかないと共通テスト本番には対応できません。

 

 

最後に今後の課題です。今回はサンプル問題だけを取り上げて教科書と比較を行いましたので、共通テストへの対応という意味では十分な分析はできておりません。

 

また、今後はプログラミング言語によって今まで以上の対策が必要になる可能性もあります。

 

ただ、これについては、「情報関係基礎」で莫大な問題の蓄積があり、情報処理学会のWebページにアーカイブ(※) が公開されています。今後はこのような問題を参考に、楽しくプログラミングを学習しながら、かつ共通テストに対応できる授業について考察を深めていきたいと思っています。

 

[質疑応答]

 

Q1.

「入れ子」というのは繰り返し、ループの入れ子のことでしょうか。ifの入れ子や、ループの中にifがあるというのはどうなるのでしょぅか。

 

A1.井手先生

例えば、サンプル問題では、while文の中にfor文があり、さらにその中にif文がある、という使い方がされていました。また、試作問題でも、for文の中に二重のif文が使用されています。このような制御文の使われ方を「入れ子(ネスト)」として考えています。

 

Q2.

ScratchとDNCLは特に違いが大きいですが、学習者の理解の度合いか、指導者の指導のしやすさか、どちらの観点で見るかで評価が変わるのではないか思いますが、先生の肌感覚としてはいかがでしょうか。

 

A2.井手先生

ScratchとDNCLの違いは大きいので、評価は難しいと思います。ただ、私自身は固定概念で「ScratchをやってからDNCLに進む」という感覚でいたのですが、先日ある先生とお話ししたとき、「それ、逆でもいいよね」とアドバイスいただきました。「学習者には日本語の方が理解しやすいので、DNCLで入ってからScratchをやるというのもアリかもしれないね」ということです。指導のしやすさという観点では、このような順序で授業を進めるのも選択肢の一つだと思いました。

 

Q3.

教科書によって、扱っている内容やレベル、言語も違いがあることはわかりましたが、そこまで違っていいのか。つまり、教科書はあくまで入り口であって、入試でいきなりDNCLを見せられても対応できるような、いわばもう一段上のメタな能力を身に着けるのが目標だ、ということなのでしょうか。

 

A3.井手先生

今、おっしゃっていただいたことがまさにプログラミング教育の本質であり、われわれ高校の教員は、これを目指した授業をしなければいけないと思います。これはどの教科も同じですが、学力の3要素として「知識・技能」「思考力・判断力・表現力等」「学びに向かう力・人間性等」がありますが、基盤となる知識だけをとっても、教科書に書いてあることを知っているだけの知識と、自分の中に落とし込んで、それを応用できる知識というようなレベルの違いがあると思います。

 

ただ知っているだけの知識を、いわば一段階上の知識まで発展させられるような授業ができれば、その場でDNCLを見て、「これはこういうことなんだろうな」という思考力・判断力・表現力が使えるようになると思います。ただの理想で終わらせず、これを目指してわれわれ高校の教員は授業をしていかなければいけないと思っています。

 

Q4.

教科書についてはわかりましたが、副教材について、何か期待されるところはありますか。

 

A4.井手先生 

おそらく今、多くの教科書会社で副教材を作っていることと思います。ただ、全ての単元の中でプログラミングはそこまで大きな領域を占めていないので、教科書ではそこまで踏み込んだ内容にはなっていません。そのため、教科書以外にも、さまざまな生徒のレベルに応じた例題や類題が載っているものや、ブログラミングが好きな生徒が自分でどんどん進めていけるものなど、生徒自身が取捨選択できるような副教材があると、より高いレベルまで自分の力を伸ばしていけるかと思います。

 

SSS2021 情報処理学会 情報教育シンポジウム 口頭発表より