事例358

基本構文を繰り返し学んで定着を図るプログラミング授業

世田谷学園中学校・高等学校 神藤健朗先生

幅広い内容を扱う「情報I」の中で、プログラミングにかけられる時間は10時間程度と言われています。限られた授業時間の中でプログラミングの基礎を学んでも、実際プログラムを動かす場面を重ねないと、「深い理解」にはなかなかつながりません。

 

今回は、東京都高等学校情報教育研究会の「授業ツアー」で、世田谷学園高等学校の神藤先生の「すごろくのプログラミング」の授業を見学しました。

 

神藤先生のプログラミングの授業は、基本構造が同じで、題材の異なるプログラムを繰り返して作成しながら身に付ける、という形で行われます。さまざまなプログラムを何度も作成することで、順次・条件分岐・繰り返しを順番に説明するよりも、プログラムの構造全体を繰り返し身に付けていくことを目指します。

 

この実践については、「キミのミライ発見」でも紹介していますが(※1)、今回はこの総まとめとなる「すごろくのプログラム」の授業を見学しました。基本的なプログラム作成のシリーズから2か月以上空けて行われた授業で、生徒の気づきを見ることができました。

2024年12月2日

 

※1 「身近な題材を例に繰り返し学ぶプログラミング~授業実践事例報告2023年度改訂版~」

      

  「学習活動を中心に据えた授業展開について~記憶に残る学習活動を繰り返し展開する~」

 

■プログラミングの授業の構成~神藤先生の説明

 

手順を文章で表現する「アルゴリズム」を1学期に学んでおく 

本校の情報科関係の授業の位置付けとしては、中学校の技術家庭科は1年生が家庭科2単位、2年生で技術科1単位、3年生で技術科2単位を行っています。高校1年生で「情報Ⅰ」が2単位で、現在は「情報Ⅱ」や受験対策用の講座は設定していません。

 

そのため、「情報Ⅰ」の進め方のコンセプトとしては、生徒たちは1年生で一通り学んで、2年生がまる1年空いた後、共通テストの準備をする頃にはすっかり忘れてしまう、ということを前提で考えています。それでもなるべく忘れさせないようにするためには、1年を通して、いかに繰り返し行うか、ということが重要になると思います。

 

プログラミングに関しては、昨年度までは2学期の前半に一通り学んでから、間を空けて3学期に2回目を行っていましたが、今年度は順番を入れ変えて、2学期末に2回目を前倒しした、という流れになります。

 

プログラミングの最初の入り口として、1学期の11回目、ちょうど5月の中間テスト明け頃の時期に、「アルゴリズム」を3時間行います。ここでは、まずカップラーメンを作る手順を考えてもらいます。

 

 

この授業では、NHK for Schoolの「TAKE TECH(テイクテック)」というおもしろい動画のシリーズの中の、「ロボットに対して言葉で命令して動かそう」(※2)を見せながら、「プログラムというのはちゃんと命令してあげないと動かないんだよ。まずは、低学年の弟や妹に、けがをしないように安全にカップラーメンを作る手順を書き出してみよう」という活動をします。

 

生徒たちは、箇条書きであっても手順を書き出すことがなかなかできないので、これはプログラムを考える手始めとして、非常に重要な作業です。

 

※2 TAKE TECH「流れを操る」

 

この手順の書き方は、おおざっぱ過ぎてはダメですし、細か過ぎてすぎても何をするのかわからなくなるので、ポイントとなる条件をもれなく入れて、きちんと判断できるような形で表現することが必要であることを伝えます。

 

 

実際の商品に書いてある手順も、メーカーによって書き方が全く違うことを見せて「表現の仕方はいろいろあるけれど、間違いなく伝えられるように、これよりはもう少し丁寧に書き出してみよう」と伝えて、作業を進めます。

 

プログラミングでいきなり「並べ替えのアルゴリズム」を考えさせると、そもそもの部分で時間がかかって大変ですが、言葉で表現するのであれば、生徒たちも考えやすいです。ここでは「手順を言葉で書ける」ということをゴールにします。

 

 

ですから、まず「お湯を沸かす」という行動をアルゴリズムで考えると、その中には「順次」「条件分岐」「繰り返し」が自然に入っていたね、ということを確認します。

 

 

このあと、実際にアルゴリズムを考えてみるために、トランプの並べ替えの手順を考えてもらったこともあります。

 

これは、JavaScriptで作られたカードの並べ替えのゲーム(※3)で、2枚のカードを開いて大小関係を判定して順番を入れ替え、大きい順(小さい順)に並べるというものです。このとき、なるべくカードを開く回数を少なくする攻略法のアルゴリズムを考えて書きます。

※3 https://javalab.org/ja/sorting_game_ja/

 

 

3時間目には、まとめとして、「実は、並べ替えの方法にもいろいろあるんだよ」という話をしつつ、バブルソートやシェーカーソート、挿入ソート、マージソート、クイックソートなどの手順を紹介します。

 

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

 

マージソートやクイックソートは、NHKの「ピタゴラスイッチ」の動画を見せます。そのうえで、改めて自分の書いた攻略法の内容について再度精査させます。ここでは、「ソートの流れにはいろいろな方法がある」ということに触れておく、という程度にします。

 

いきなりプログラミングから入ると、アルゴリズムについてはここまで詳しくできませんが、プログラミングの授業とは切り離して押さえておくことによって、後で行うプログラムの構造の理解がスムーズになります。

 

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

 

 

2学期のプログラミングでは基本的に同じ構造のプログラムを1時間に1つ、スモールステップで進めことを繰り返す 

2学期のプログラミングの授業では、はじめにガチャのシミュレーションのプログラミングをします。最初にプログラミング環境のPyTry(※4)の使い方を簡単に確認した上で、ガチャのプログラミングを作ります。

 

ここでは細かく段階を踏んでおり、第1段階は3行入力すれば実行して動作を確認できるところから始めます。

※4 https://pro-ktmr.github.io/pytry/

 

 

それぞれのステップで、「乱数の利用と変数」「繰り返し」「条件分岐」など、ポイントとなる内容の解説スライド)を入れています。この解説は、5分程度の短い動画でも見られるようにしています。

 

第2段階は、第1段階に繰り返し処理を1行入れて、インデントを揃えるだけです。これも実行して、動きを確認します。この後も、当たり判定を入れたり、当たった回数をカウントしたり、と1段階ずつ動作を増やしていきます。その後、余力があれば100連ガチャを200回引いたときに、どのような分布になるかを集計します。慣れてくると入力するペースも早くなってきて、何とか自力で完成できるようになります。これを1時間で行います。

 

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

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

 

ガチャのプログラムの後でおみくじのプログラムとじゃんけんのプログラムを、それぞれ1時間ずつ行います。この3つは、いろいろな題材を扱っていますが、実は変数を使ったり、繰り返しを使ったり、判断分岐・条件分岐も使ったり、と基本的にはいずれも同じ構造です。

 

そして、おみくじは、elif、つまり「○○でなければ」という条件を追加していく形になるので、条件をもっと増やしたい、という動機付けにもなります。じゃんけんは、andやorを使った複数の条件式が必要になるので、かなり内容が濃くなります。つまり、基本確認のガチャ。条件分岐の分岐を増やしたいという気持ちを高めるおみくじ、最後に条件式を複雑にしたじゃんけんという流れです。

 

いずれも、最後まで完成できる生徒もいれば終われない生徒もいますが、途中まででもOKということにしています。手順の詳しい説明はスライドや動画に入れておいて、基本的に生徒が自分で進めます。

 

1学期にアルゴリズムを学んだ後、その間に2進数やデータの分析など別のことをやってから、2学期にガチャ・おみくじ・じゃんけんのプログラミング(※5)に入り、その後またしばらく時間を空けて今回のすごろくのプログラミングということになります。なるべく薄く、繰り返しながら、だんだん内容を深めていくという流れです。

 

このように、前にやったことを思い出しつつ、さらに深い内容をすることで、理解度も上がっていくように思います。今日の授業は、前回から2か月以上空いていますので、忘れている部分はかなりあったと思います。

 

※5 「身近な題材を例に繰り返し学ぶプログラミング~授業実践事例報告2023年度改訂版~」の中に授業スライドや動画教材へのリンクが含まれています。ご確認ください。

 

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

 

■生徒たちの作業

 

共通テスト「情報関係基礎」の問題のプログラムをつくってみる 

今回は、2021年の共通テスト「情報関係基礎」で出題されたすごろくの問題に取り組みます。もとのプログラムはかなり長いので、今回も6段階の細かいステップに分けて書いていきます。解説動画も6段階のステップに分けて用意しています。

 

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

 

このステップの第5段階には意図的にバグが仕込まれており、ここから抜け出すのが最大の難所となります。

 

先生からは、「生成AIを使えば、すごろくのプログラムはすぐ出て来るけれど、出てきたプログラムを読めなければ意味がない。2学期は、まず読めるようになろう」とお話があり、その後は生徒たちの作業になりました。

 

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

 

今回のスライドはGoogle Classroomで共有され、コードはPyTryに直接打ち込んでいきます。スライドには、コードの各行に#で1行ずつの意味が示されています。

 

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

 

今回のすごろくのプログラムでは、第2段階に「2次元配列」が新しく登場しています。ここでつまずいて、周りの人に訊いたり、動画を見直したりしてなかなか抜け出せない人が目立ちました。

 

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

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

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

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

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

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

 

先生の説明は最初の10分程度で、その後はスライドや解説動画を見ながらそれぞれのペースで作業を進めていきます。席の移動は自由なので、わからないところがあると周りの人に訊いたり、検索エンジンや生成AIで調べたりしながら進めていきます。

 

先生も生徒たちの様子を見守ることが多く、質問に対してもすぐに答えを示すのでなく、「どこで行き詰っているのか」「どんなエラーが出たからおかしいのか」と、確かめるポイントを示す方向で答えていらっしゃいました。

 

 

スライドとPyTryの画面を往復しながら作業を進めますが、多くの生徒が前回3つのプログラミングをやって以来で、振り返りでも「9月にやったとは思えないほどすっかり忘れていた」「イコールを表すのは『==』であることを忘れていた」「スペルミスや大文字・小文字の間違いになかなか気が付かなくて時間がかった」など、苦戦した様子がうかがわれました。

 

一方で、「何回かやっていたから今回はスムーズに終わった」「前回より複雑だったが、どのコードでどのプログラムが作れるのか、わかってきた」「二分探索のアルゴリズムで、一気に処理時間が短くなる事に驚いた」「第一段階で詰まってしまって全てを行うことが出来なかったけれど、大体プログラミングの仕組みは理解できたのは良かったなと思う」等など、何度も繰り返してきた経験を実感しているコメントもありました。

 

先生からは、2学期の初めにプログラミングをしたときの動画を見ておくように、という指示があったとのことでしたが、見て来なかった人も多かったようで、忘れてしまっていることが分かったことで、「プログラミングが重要であることがよくわかった」、「テストまでにもう一度動画を見て復習しておきたい」という振り返りにつながったことが感じられました。

 

■プログラミングの授業の構成~神藤先生の説明

 

ソースコードと日本語を行ったり来たりしながら考えられる力を身に付けるための工夫 

プログラミングの実行環境としてPyTryを使うのは、エラーメッセージが日本語で出るところが良いと思うからです。日本情報オリンピック日本委員会が出している冊子(「JOI 公式テキスト Pythonで問題解決」)でPyTryが紹介されていて、試してみたら使いやすかったので、授業でも使っています。

 

PyTryに短所があるとすれば、グラフを描画することができないことですが、グラフであれば表計算ソフトで出力すればよいので、その辺りは割り切って、プログラミングのスキルを身に付けるためにはコーディングのミスが見つけ易いことを優先して、これを使っています。

 

今日のすごろくのプログラムが最後までできた生徒は、2~3割だと思います。これができた人は、次に10進法から2進法の書き換えのプログラムや、並べ替えのプログラム、最大公約数を求めるプログラム、リスト(配列)の中にある数値を検索するプログラムなどから、好きなものを選んで進むことになりますが、おそらく今回のすごろくよりは易しいと思います。

 

その他、共通テストの「情報関係基礎」を書き換えた問題や、「情報Ⅱ」を意識して少し発展的な内容に触れてもよいかとも考えています。

 

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

 

1人1台端末を使うようになってから、授業は教室で行い、コンピュータ教室を使うのは、例えばピボットテーブルでデータ分析したり、ハイスペックな機能のPCが必要な作業のときだけです。

 

基本的にどの単元でも、今日のように一人でやっても、隣同士で一緒に考えてもよい、という形で進めています。これは、私自身が1人で集中してやりたいタイプで、ワイワイやるよりも、考えたいところは1人で考えて、分からなければ相談したいので、全員に対してグループでやるのを押し付けることは抵抗があり、そのあたりは、各々が進めやすいやり方にゆだねています。

 

パソコン室で席が固定だったときは、背中合わせで相談することはありましたが、席を移動することはさせませんでした。1人1台端末を使うようになってからは、席の移動も自由にしました。

 

1人1台端末は、iPadを使っています。iPadはGoogleスプレッドシートの制限があってグラフがうまく書けないとか、範囲選択がしにくいといったことはありますが、関数を入れたりシミュレーションをしたりというレベルであれば、何ら問題はないと思います。

 

 

生成AIは、使える人は使っている、という感じです。今のところは、使っている人でもプロンプトを自分なりにアレンジして精度の高い答えを引き出すレベルまでは行っていない印象です。本当に簡単な質問を書いてChatGPTに投げて、出てきたものを丸々コピペして出してくるのですぐバレる、という感じです。

 

ただ、プログラミングに関しては、生成AIは簡単な質問をするだけで詳細な回答を返してくれるので、いずれは使うのが当たり前になると思います。

 

実際に企業の開発系の人に聞いても、今は業務でも普通に生成AIを使っているようなので、今後はこれを使う前提で進める展開を考えないといけないかな、と思っています。

 

共通テストのプログラミングの問題は、プログラムを読めること。さらに読んだ内容からしっかりと条件式が導き出せるか、繰り返しの条件はどうなってるか、ということを、ソースコードと日本語を行ったり来たりしながら考えられるか、ということが問われています。

 

ですから、実際の授業でも、まずはそのレベルを目標にしています。もちろん、「情報Ⅱ」を学内で設置しているのであれば、次のステップとして「情報Ⅱ」ではプログラムを一から書いたり、ChatGPTを使って書いたものに、さらに改造を加えていったり、といった段階を置けるとよいと思います。

 

 

取材を終えて

 

初めて「共通テストで情報Ⅰ」の受験する高3生・高卒生が受験した今年の模試では、プログラミングの問題は他の分野に比べて平均点が目立って低く、受験勉強が軌道に乗る夏休みを過ぎても、なかなか得点が伸びない生徒が一定数いるという傾向がありました。

 

「情報I」で初めてプログラミングを学んだ人が、10時間そこそこの授業でプログラムを完璧に理解するのは、もとより無理があります。「情報Ⅱ」や学校設定科目の授業で、あるいは探究活動の中で、問題解決のためのプログラミングを経験できることが理想ですが、そのような機会がない場合、1年生で一通り学んだだけで、受験のための勉強を始める段になって初めて演習問題に取り組んでもさっぱり理解できない、ということになりかねません。

 

「情報I」が共通テストに入ったのは、情報科社会を生きるための読み・書き・そろばんとして、そして大学の学びに必要な不可欠な資質・能力を身に付けるためでした。「テストで点が取れないから『情報』は苦手、避けよう」ということになってしまっては、まさに本末転倒です。

 

神藤先生のお話で、「生徒は忘れるのが当たり前」ということがありました。これはプログラミングに限らず、他教科でも同様です。それをなるべく忘れさせないように、忘れていても「まずい、もう一度やり直そう」という気づきにつながる授業設計の工夫によって、生徒が理解を深め、様々な問題解決に取り組む可能性が広がることを感じました。