事例357

生成AIが広げるプログラミング授業の可能性~生成AIを活用したプログラミング実習:発表

東京都立国立高校 小原格先生

生成AIの登場で、ちょっとしたプログラムは生成AIにプロンプトを投げれば、そこそこのものが出て来るようになりました。実際のシステム開発の現場でも生成AIの活用が進み、「『情報』でわざわざプログラミングなんて教えなくてもよい」という声もあるようです。

 

それは極論であるとしても、実際のプログラミングの授業では、タイプミスやインテンド忘れなど、いわば本筋以外のところで何かとハードルが多く、生徒は、興味を持つ以前に心が折れてしまいがちです。こういったことを防ぐためにも、生成AIをどのように使っていくかは、ここしばらくの情報科の課題ともなるでしょう。

 

今回は、東京都高等学校情報教育研究会(都高情研)のAI活用検討委員会の公開授業で、都立国立高校の小原格先生の授業を見学しました。国立高校は東京都教育委員会の「生成AI研究校」に指定されており、専用環境での生成AI活用が可能です。

 

見学した授業は、プログラミング学習の最後に、総まとめとして自分たちでプログラムを作成する「課題実習」の発表会です。

 

「プログラミングを問題解決に活用する授業」に、生成AIによる支援を取り入れることによって、生徒の取組み姿勢や活動の質が大きく変わることを実感した授業でした。

(2024年11月22日)

 

 

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

 

アルゴリズムとプログラム、モデル化とシミュレーションの基礎を学んだ総まとめの課題制作

国立高校では、1年生で「情報Ⅰ」2単位を実施。問題解決については、1学期の「情報社会の問題解決」の単元で問題解決の基礎を学び、2学期前半の「情報デザイン」でHTMLファイルをテキストエディタで編集してWebサイトを構築し、情報デザインによる問題解決を経験しています。そこで今回はその経験も生かし、テキストエディタによるPythonプログラムの作成や編集にも触れていきます。

 

2学期後半の「コンピュータとプログラミング」は、まずアルゴリズムの意味や、3つの基本制御構造のフローチャートによる表現方法などについて2時間行い、「アルゴロジック」(※1)でアルゴリズムの確認を行いました。

コンピュータの仕組みや特徴・内部表現などについては、使用教科書(「高校情報I Python」(実教出版)の関係で、1学期の「デジタル」ですでに学んでいます。

※1 https://algo.jeita.or.jp/

 

プログラミングの基礎の部分(第3~5回)は、「ブログル情報」(※2)を使いました。

 「プログル情報」は、オンラインで個人のペースで学ぶことができます。Lesson1-1で「順次」、Lesson1-2で「繰り返し」と「配列」、Lesson1-3で「判断」の3つの制御構造を学びます。

 

これを授業内で2時間行い、やりきれなかった部分は課題としました。生成AIの説明も、ここまでに一通り行っておきました。

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

 

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

 

第6~10回が「モデル化とシミュレーション」です。ここでは、シミュレーションの処理を表計算ソフトとPythonで並行して行いました。この状態遷移図や帰納的定義、数式モデル、プログラミングのコツのあたりは大事なところなので、生成AIを使っていなかったときもきちんと押さえるようにしていました。

 

ここまで大体の内容を押さえたあと、回帰のシミュレーションを数式で見せて、フィボナッチ数列を提示して、「これをプログラムでやるとどうなるか」ということをやって見せました。生徒に「これ、何だか知ってる?」と訊くと、ちゃんと「フィボナッチ数列」と答えられた人がいたところは、さすがだな、と思ったことでした。

 

フィボナッチ数列は、漸化式では

 

a n+2 = a n +1+ a n

 

となり、プログラミングで配列を使わないと、数字を次々に入れ替えていく形になりますが、配列を使えば簡単に表示することができます。

 

その後、人口のシミュレーションをしたり、定番のモンテカルロ法のプログラムを書いたりして、ある程度Pythonに慣れさせた後、今回の課題制作に入りました。

 

 

生成AIで作ったプログラムのコードを読み解き、自分たちのこだわりを入れて改編する

今回の実習の内容がこちらです。問題の発見から、プログラミングを用いて解決を行う一連の流れを経験するもので、共通テストを意識した内容にもなっています。

 

  

今回の課題では、関数、乱数と条件分岐または繰り返しを使って、何でもよいから自分たちの解決したい問題を意識してプログラムを作ること、それから生成AIを活用してもよいが、作成したコードを完璧に説明できることを条件としました。

 

これは、生成AIは、時に誤った情報をさも本当のことのように平気で言いますし、またいろいろな人の思惑が入っていることも予想されるので、怪しいコードやウイルスが紛れ込んでいるかもしれない、という前提に立ち、必ず1行ずつプログラムの意味を確認した上で使ってほしい、ということです。そして、単に生成AIが出してきたコードを貼り付けるのではなく、必ず自分たちの「こだわり」を入れて一手間工夫すること、としました。

 

このようにオーダーすることで、やりたいことを明確にするとともに、ただ面白いものを作るのでなく、「こういう問題をプログラミングで解決するためにはどうしたらよいか」というストーリーを意識させるようにしました。

 

制作にあたっては、いきなり生徒にやらせるのではなく、まず私の方で例示をしました。「ハロウィーンに皆で集まってビンゴゲームをしたいが、カードはあるけれどビンゴマシンがない。そこでビンゴゲームのプログラムを作ることにした」というケースです。ここでは、あえて60点くらいの例を示して、生徒が自分で工夫する余地を残すようにしました。

 

生成AIに「Pythonでビンゴゲームのプログラムを作って」と投げると、たちどころにプログラムが出てきます。生徒たちからは、「おおっ!!」という声が上がります。

しかし、出てきたコードをよく見ると、「ビンゴカードを生成する関数」が入っています。この場合、「カードはあるのでこの部分は要らない」ということを再度生成AIに投げることになります。

 

コードの意味が分からなければ、「このコードの意味を教えて」と訊けば教えてくれます。複雑すぎるようであれば、「もっと簡単にして」とオーダーすれば、簡単なコードが出てきます。自分で手を加えて、そこで動かなくなったら、「プログラムを修正してください」と言えば、必要なところを修正してくれます。一度で完璧なコードが出て来ることはないので、粘り強く取り組んで、皆に説明できるようにしておこう、と声をかけます。

 

ここまででの説明で大体20分ほどかけます。残りの30分で、作業グループでどんなプログラムを作るのか、どんな機能を付けるか、という要件定義の内容を相談して実際の作業に入り、次の1時間でプログラムを完成させます。

 

 

今回の授業は3回目で、自分たちが作ったプログラムを他の人に説明して、その人たちからフィードバックをもらいます。そして、今日の最後のフェーズが実は一番重要で、もらったコメントを活かしてプログラムを改善するというものです。

 

これまでにPythonの知識がついてきているので、自分たちで改善できるよね、という方針のもと、生成AIが出してきたままのもので満足するのではなく、最後の一手間を大事にしよう、というのがこの授業の目指すところです。

 

 

 

■グループ発表と評価、振り返りと改善

 

自分たちのプログラムの「こだわり」を発表。コメントを改善につなぐ

授業は、まず作業グループごとに着席し、授業の流れを確認した後、自分たちのプログラムの発表手順を確認します。

 

発表の中では、実演などとともに、このプログラムを作った目的と対象、ストーリー、こだわった点などを説明し、また、現状での課題を話してもよい、となっています。

 

 

生徒たちはポイントをスマートフォンでメモしたり、どこで実演を入れたらよいかを相談したりしながら、コードの説明方法を1行ずつ確認していきます。

 

 

その後、出席番号を割り振った座席に移動して、今日の「発表グループ」を作ります。この中でじゃんけんで発表順を決め、発表に当たった人は他の2人を引き連れて自分の作業グループの座席に移動して説明します。

 

プログラムを操作しながら4分で説明し、その後の2分で他の2人から質問やよかった点、改善提案を1人ずつ話してもらいます。これを人数分繰り返します。もらったコメントは、作業グループに持ち帰って、共有します。これを人数回分繰り返します。

 

 

どの生徒も、自分たちのプログラムを自信を持って説明していました。説明の仕方は様々ですが、ブロックのまとまりごとに関数や動作の内容を丁寧に説明できていました。プログラムを作った「ストーリー」が考えられているので、どのグループも一ひねりした工夫が見られました。

 

生徒用デスクの中間モニターにはタイマーが表示され、残り時間がわかるようになっています。また、細かなことですが、終了の合図はニワトリの鳴き声を使い、緊張感の中でものどかな雰囲気を作っていました。

 

 

「今日の運勢占い」を作ったグループは、リストの中からランダムにメッセージを出す形になっていまします。恋愛運、金運、健康運などの他に、高校生が気になる項目として、交通インフラ運(遅刻をしないか)や勉強運も項目に入れていました。

 

 

また、国立高校は文化祭を盛大に行いますが、その準備担当のシフト決定のシステムを作ったグループもありました。ここでは、予定が入っている日は最初から外したり、特定の人が3日連続にならないようにしたりするために関数を駆使していました。

 

 

和暦⇔西暦の読み替えのプログラムを作ったグルーブもありました。西暦を入力すると該当の和暦を表示するもので、「明治1年」ではなく「明治元年」と表示する、というこだわりを見せていました。今後の課題として、年単位ではなく、月日にも対応できるようにしたい、とのことでした。

 

一通りデモンストレーションタイムが終わった後は、全体に対していくつかのグループがプレゼンを行います。これは、立候補ですんなり決まっていました。

 

その後、各グループでメンバーそれぞれがもらってきたコメントを集約して、改善できるところはプログラムを修正していきます。コメントを全て受け入れる必要はなく、「ここは譲れない」という部分はそのままでもよいが、よりよくなる意見は取り入れていく、という方向です。

 

あるグループでは、「複数の項目の結果が一度に表示されてしまうのでなく、一つひとつクリックするごとに表示された方がよい」という意見に対して、早速その部分を書き換えていました。

 

印象的だったのは、この改善のステップでは、生成AIに頼ろうとするのでなく、コードを直接見て「ここを変えたらいいんじゃない?」と作業を始めるグループが目立ったことです。コードの1行1行の意味を理解しているからこそ、と思われました。

 

 

 

■授業を振り返って~小原先生のお話

 

課題制作のコーディングに生成AIを利用することで、プログラミングの負担が劇的に軽減。経験を通した気づきも

この生成AIを使った課題制作の授業は、もともと4回の予定でした。しかし、私が事前にやってみると、生成AIでプログラムを作らせるだけであれば本当に簡単で、1時間ほどでできてしまうことがわかりました。どうしようか、と考えていたとき、以前に「情報A」でWebサイト制作の実習をしたときのことを思い出しました。

 

当時、サイト制作では「ホームページ・ビルダー」というソフトを使っていました。これを使うと簡単にWebサイトができますが、実際に生徒達に作らせてみると、作り始めてしばらくすると「面白くない、やめよう」となって、また次も、の繰り返し。要は、あまりにも簡単にできてしまうので、何を作りたいのかをきちんと考えないで作ってしまい、完成のイメージが持てていなかったのです。

 

今回も、ただ生成AIに作らせるだけでは、また同じことになってしまうと思ったため、ここは原点に帰り、学習指導要領にあるように「問題解決のためのプログラム」を作らせよう、と思い至りました。

前任校では、生成AIを使っていなかったためプログラミングの負担も大きく、制作に3時間取っていても結構ぎりぎりで、完成できないグループもあり、当面のゴールはどうしてもPythonを身につけるところになりがちと思っていました。

 

今回生成AIを取り入れることで、少なくともコーディングは生成AIがやってくれるので、自分でプログラミングができる・できないに関係なく、結果的に「自分たちは何を作るのか、何を解決するためにコードをいじるのか」ということにフォーカスできたのは、非常に大きいと思います。グループで実際にプログラムをさわるのは1人のことが多いですが、全員に知識を身に付けてほしいため、他のメンバーも必ず同じ画面を表示させ、動作を確認・説明させるようにしました。

 

生成AIにプログラムを作らせようとすると、おのずと「プログラミングで解決できる課題とは何だろう」ということを考えることになります。例えば、使っているうちに、何か壮大な計画を立てるようなことは生成AIにも無理だ、と気付いてきます。それを通して、生成AIへのオーダーの仕方や、生成AIに作成してもらうのに向いているのはどんなことか、いうところがだんだん分かってくると思います。

これまでは、「プログラミングで問題解決なんて、プロでもない限り無理!」と思っていた生徒が、一気にブログミングに親近感がわいてくるように思いました。これは、まさにソフトウエアを発注する側のようなイメージです。

 

要は、コーディングは生成AIがやってくれるので、「自分は何をしたいのか、どんなものを作りたいのか」という考えをきちんと持たせて、その通り動くようになればいい、さらにそのプログラムの中身が何であるのかをしっかりと分かればいいという、完全に問題解決モードの授業にしました。

 

 

「あまり難しくなかったけれどとても楽しかった」「少し難しかったけれど楽しかった」が顕著に増加

1年生は全部で8クラスですが、前半の4クラス、約150人で、今回の授業についてアンケートを取ってみました。

 

今回のプログラミング実習のように、生成AIを用いて課題や問題を解決していく形の学習について聞いてみると、ほぼ全員が「楽しく学べた」「意欲的に取り組んだ」と答えていました。

 

一方、「難しかったか」という質問に対して、「あまり思わない」という人が、約15%いて、これは今まではなかったことでした。生成AIがプログラムをほぼ全部作ってくれるので、そんなに難しくなかった、というのは当然と言えば当然ですね。

 

 

この授業のアンケートでは、「楽しかった」と「難しかった」でクロス集計をしています。こちらがその結果で、左側が「楽しかった」、上側が「難しかった」です。「とても難しかったけれど楽しかった」という人が多かったですが、これは多少の社交辞令もあるかなと思います。

 

特徴的なのは、この黄色のセル、「あまり難しくなかったけれどとても楽しかった」人が多いことです。これは今までのプログラミングの授業ではなかった傾向でした。「少し難しかったけれど楽しかった」という人も多いですが、これは「難しいことを解決できて楽しい」という人、また「あまり難しくなかったけど楽しい」が「単純に内容が楽しい」という人とも考えられ、注目したいところです。

 

あとは、「少し難しかったからあまり楽しくなかった」という人、「あまり難しくなかったから、あまり楽しくなかった」という人も、確かに一定数はいるかなというところです。

 

 

また、「生成AIをどの程度活用しましたか」ということについては、「テーマ」では「全く活用しなかった」という人が他よりも多いのが特徴的です。「テーマを出させることもできるよ」とは言ってあるのですが、やはりテーマは自分たちで考えたいのですね。

 

「作成」では圧倒的に使っています。「修正」や「理解」でも8割くらいの人が使っていました。

これを見ると、皆がそれなりに生成AIを活用してプログラムを作ったことが分かります。

 

 

このような流れで進めたことで、「生成AIを使って何を作るのか」ではなく、「プログラミングを使って何ができるのか」という授業ができました。そのためには、前にもお話ししたように、「何を目的とするのか」ということをきちんと定める必要があると思います。それができていれば、生成AIはプログラミングの最初の一歩のための優れたツールになり得ると思いました。

 

 

Q1. 最後の制作で生成AIを入れるために、ここまでのプログラミングの授業で何か工夫されてきたこ

とはありましたか。

 

A1.小原先生 ここまでの授業では、実は生成AIはそれほど使ってきませんでした。ただ、使い方については扱ってきました。生成AIを使うことでコーディングに時間がかからないことは予想できたので、課題実習に入る前の、アルゴリズムなどプログラミングの考え方については、今までより丁寧にやりました。

 

例えば、今までソートアルゴリズムは授業で直接的には扱っていませんでしたが、生成AIを使うことで空いた時間で扱うことができました。

 

 

また、共通テストの試作問題で出てきた「待ち行列」も扱っていなかったのですが、待ち行列とはどんなものか、それをコードで書いたらどうなって、それぞれの行にはどんな意味があるか、ということも空いた時間で丁寧に説明できました。

 

制作では、生成AIを使うことでコーディングの作業がスキップでき、かつプログラム自体はある程度の完成度のものができるので、出てきたプログラムを理解して、きちんと説明できることに重点を置くことができます。

 

一方で、説明するためには、先ほどお話ししたように、生成AIが出してきたコードが正しく動くかを確認しなければいけないし、悪意のあるコードが入っていないかを判断できなければいけない。そのためには、コードを読む力が必要になります。

 

そして、コードをきちんと理解するためには、ある程度の文法の力は必要です。生徒たちには生成AIを使うことは最初からは伝えていません。バランスの取り方が大事だと思います。

 

 

Q2. 今回、生成AIの利用はプログラミングに効果があることがよくわかりましたが、今後どのようなことに使っていかれる予定があるのか、教えてください。

 

A2. 小原先生 これは3学期にやってみようと思っているのですが、生成AIで分析のプログラムを扱おうと思っています。データを与えれば、分析の方法まで教えてくれて、しかも分析のためのプログラムを書くところもある程度スキップできてしまうので、分析の結果をじっくり考える、ということができそうですね。

 

また、生徒に分析をさせる素材として、例えば「こんな人口増加のプログラムが作りたい」ということがあれば、今までは私が書いて説明していたものを、生成AIに作らせることができます。いろいろなシミュレーションのプログラムも、どんどんできるかな、と考えています。

 

 

取材を終えて

「情報Ⅰ」が始まって、プログラミングが必修となった途端に生成AIが登場して、これまで子ども達が四苦八苦しながら書いていたプログラムが一瞬で吐き出される時代がやって来ました。個人的には、教科「情報」が始まって、プログラミングが学習指導要領に入るまでの紆余曲折を考えると、「プログラムなんて(授業で)やらなくていい!」という声には、正直、何だかなあ、という思いがあります。

 

今回の小原先生の授業では、制御構造やアルゴリズムの考え方、言語の「文法」など、プログラミングの「知識・技能」を身に付ける部分をこれまで通り(あるいは、それ以上に)きちんと押さえた上で、自分たちが作りたいプログラムの土台の作成を生成AIに任せたことで、生徒の作業の負担が減るとともに、よりよい作品に近づけるための「思考・判断・表現」の部分が充実していることがよくわかりました。

 

生徒たちも、自分たちの考えがプログラムという形になることに喜びを持って取り組んでいることが伝わってきました。生成AIについても、コードを書かせるだけでなく、「占いで出て来るメッセージの内容をいろいろ考えるのがたいへんだったので、生成AIに作ってもらった」、「生成AIに夕ご飯のメニューを考えさせると洋風のものに偏るので、Cookpadで検索して入力した」等など、使いながら体験的に使い方や特徴を学んでいることがわかりました。

 

小原先生のお話の中で、「生徒に苦行を強いる必要はない」というお言葉がありました。

 プログラミングは、「写経」という言葉に象徴されるように、従来はひたすら手を動かして失敗を繰り返しながら身に付けるもの、という考え方がありました。全員がプログラミングを学ぶことになった今、苦手意識を持つことなく、プログラミングの考え方やコードの読み方を理解するために、生成AIの支援は非常に有効であることがわかりました。

ただ、そのためには、「生成AIから出てきたものをコピペして終わり」にしない、という安易に流れない授業のデザインが重要であることも感じられたことでした。