事例325

生徒自身のペースで進める「100連ガチャのプログラミングによるシミュレーション」~「アルゴリズムとプログラミング」の全体設計~

神奈川県立横浜国際高校 鎌田高徳先生

「情報Ⅰ」の授業の一つの佳境とも言えるブログラミング。生徒が自分で考えながらプログラムを書いていくことができるよう導くために、どのように授業を進めたらよいのでしょうか。

 

今回は、神奈川県立横浜国際高校の鎌田高徳先生の「100連ガチャのプログラミングによるシミュレーション」を見学しました。この授業は、授業文部科学省の授業・解説動画「コンピュータとプログラミング」でも紹介されています(※1)。

 

※1 【情報Ⅰ】コンピュータとプログラミング(2)「100連ガチャをプログラムして作ろう!」

 

 


「コンピュータとプログラミング」の授業の構成

 

横浜国際高校の「コンピュータとプログラミング」の授業は、下のスライドのような流れになっています。今回の「100連ガチャ」は、プログラミングの集大成の授業にあたります。

 

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

 

プログラミングの授業は11月から開始して、まず前半でmicro:bitを使った導入を5回行います。プログラミングの導入としてmicro:bitから入るのは、生徒の授業評価アンケートの結果からも、非常に好評だそうです。

 

最初に、micro:bitを使って、ハードウェア(触れることができる)とソフトウェア(触れることができない)などの構成要素の仕組みと役割を学びます。

 

さらに、自分が作ったプログラムで制御することを通して、コンピュータにおける入力と出力の関係を体験します。

 

 micro:bitのプログラミングは、makecodeのタイルスクリプティングで行い、最初に1つひとつのコードや並び順に意味があることを押さえます。

 

さらに、このmicro:bitで行う5回分のプログラミングの授業は、「順次構造」と「分岐構造」だけでできるものを使います。これは、先生が授業をされる中で、プログラミングで生徒が躓くことが多いのは、実は「反復構造」だと感じられておられるからです。

 

そのため、最初の5回分の授業は順次構造と分岐構造のみを使い、変数と乱数、関数などの概念をmicro:bitをプログラムで制御しながら各自のペースで学ばせます。

 

プログラミングの後半では、Pythonで学びます。Pythonに入る前に、論理回路と真理値表を使ってコンピュータの演算の仕組みを学ばせています。

 

その後、プログラミングの順次構造と分岐構造の復習をした後に、新しい概念である反復構造のプログラミングを行い、これら3つの基本構造を押さえた上で、Pythonによるプログラミングを進めていくようにしています。

 

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

 

生徒が実際に書いてみるコードは、フローチャートに合わせた簡単なものです(スライド参照)。その中で「print」「if」「else」「for」などの意味や「=」「>=」の使い方、字下げなどについても説明していきます。

 

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

 

さらに、「公平な発表順番を考えよう」というテーマで、「リスト」と「モジュール」の意味と使い方について学びます。リストやモジュールを使うことで、これらを使った場合と使わない場合の結果を比較させ、これらの概念にどのような利点があり、どんな可能性が広がるかを実際に経験させます。

 

また、身近な事象をプログラミングで表現してみる活動を私は重視しているため、リストとモジュールの概念を使って「公平な発表順を瞬時に決めるプログラム」の作成を課題として取り組ませるようにします。

 

ここまでが、「『100連ガチャ』のシミュレーションのプログラミング」の前段階です。

 

 

「100連ガチャのシミュレーション」のプログラムを作る

 

今回の授業の目標は、「身近な事象をモデル化してプログラミングでシミュレーションできるようになろう」です。「シミュレーション」を問題解決に使うためのプログラムを作る手順を考えていきます。

 

はじめに、スライドで「モデル化」と「シミュレーション」の意味について確認します。

 「モデル」とは、物事を単純化したもの。「シミュレーション」とはモデルを使った実験のこと。この実験によって、コンピュータでいろいろな問題を解決していくためのプログラムを考える、ということです。

 

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

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

 

今回は、生徒たちにとって身近なゲームを題材にして、「当選率1%の100連ガチャを100回分引くと、何%の確率で1個以上当たりが出るか」をシミュレーションします。

 

この当たりの確率は数学の考え方でも求めることはできますが、今回はガチャをモデル化(→プログラミング)したものをコンピュータでシミュレーションすることで、当たりの確率を求めます。 

 

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

 

プログラムをどのように作っていくかの概要については、下の2枚のスライドで大枠を説明し、具体的な手順や作業の内容については、授業スライドを見ながら進めていくことになります。

 

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

 

12のスモールステップで、単純なプログラムを改善していく

 

今回の授業は、12のスモールステップに分かれています。授業スライドを読みながら、Google Colaboratory上で各自、作業を進めていきます。基本的な目標は、スライドの3-6までで、時間内にできた人は、どんどん先に進んでよいことになっています。

 

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

 

プログラムの入力は、3-1のみゼロからコードを書き、3-2以降は、前回書いたコードをコピペして、少しずつ書き換えながら改善していく形で作業を進めます。

 

各スライドでは、それぞれのコードの意味や、「if」「while」「else」などの構文、インテンドの注意などをきめ細かく説明することで、プログラムの意味を理解しながら進められる構成になっています。

これをしっかりと作りこまないと、生徒たちに作業をさせても、自分でプログラミングを進めることができないからです。

 

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

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

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

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

 

基本のゴールとなる3-6のスライドがこちらです。

ここでは、シミュレーションするプログラムを完成させ、実行した結果をスプレッドシートに貼り付けて、わかったことを記入します。

 

さらに、結果をグラフで表し、グラフから分かったことをまとめさせます。

 

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

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

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

 

できた人は、さらに高度な改善にチャレンジする 

3-6までできた人は、さらに進めて、当選確率を変えたり、当たりが出るまで引けるようにしたりした場合のシミュレーションのプログラムを考えます。

 

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

 

3-7以降はadvancedの内容であるため、プログラムを自分で書く部分も多くなっていきます。

 

最初は資料を見た通りにできますが、ここからは自分がこれまでプログラミングをしてきた内容の意図を理解していないと、できないようになっています。

 

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

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

 

端末は自分の使い易いもので。わからないところはまず自分で解決を試みる

 

授業の中での先生の説明は、授業冒頭の10分程度です。今回の授業では、鎌田先生が説明をされている間に、PCのスライド提示やプログラミングはTAの先生が行っていらっしゃいました。

 

生徒には、Google Colaboratoryの操作用と授業スライドを見るための2画面の利用が勧められています。半数近くの生徒が、説明スライドはスマートフォンで見ながら作業をしていました。

 

パソコン室には、各自1台のノートPCが備え付けられていますが、BYODの個人持ちの端末を使って作業する生徒もいるので、作業はWindowsとMacが混在する状態です。そのため、コマンドやスプレッドシートへの貼り付けなど、Mac特有の操作で手こずる人もありました。

 

 

授業の初めに、今日の授業の目標と課題提出が示されます。

 

作業中は、教室内には静かなBGMが流されています。生徒はリラックスした雰囲気で、静まり返っているわけではありませんが、他事や私語はなく、よく集中して取り組んでいます。

 

生徒たちのプログラミングがうまくいかなかったり、行き詰まったりするところがあっても、手が止まったままになったり、すぐに先生に質問したりするわけではなく、まずは授業スライドを見直したり、近くの生徒同士で教え合ったりすることができていました。

 

 

先生は、机間巡視をしながら生徒の様子を観察して、行き詰っている人には軽く声をかけていますが、基本的に生徒が自主的に進めていく姿勢に任せています。ステップが細かく設定され、スライドには躓きそうなポイントがわかり易く示されているため、うまくいかなくても自分で見直しながらやり直すことができます。

 

ただ、端末のクセによって操作がうまくいかない場合もあります。そのような場合には、先生が同じところで躓いている生徒を数人集めて修正方法を説明し。席に戻った生徒が、周りで同じところで困っている人に説明する場面もありました。

 

最終的に、クラスのほとんどの生徒が3-7まで到達していました。

 

 

[鎌田先生に聞きました]

■生徒の皆さんが、よく集中しているのと、自分達で解決していこうとしていることに驚かされました。学校の特徴として、どんなところが影響しているのでしょうか。

 

本校の授業では、自分で調べたことの発表や、生徒間で議論するなどの生徒主体の学習活動が非常に多いです。そのため、生徒たちは、わからないところは自分で調べ課題解決しようとする姿勢や、困難な課題解決に対する粘り強さがあります。

 

また、コミュニケーション能力が高く、主体的に周りと協働しながら問題解決をする力が非常に高いなと感じています。そのため、私が行っている、問題解決を中心に据えた情報の授業と非常に相性が良いように感じています。

 

■授業で使われる教材にはどのような工夫をされていますか。

 

先ほどお話ししたように、自分で粘り強く考えたり、タスクをどのようにこなしたらよいかを考えたりすることは得意なので、最初の10分で授業中に何を達成してほしいか、達成するために必要な知識やスキルは何かについて、必要最低限のことだけ説明し、あとはスライドのpdfを配布して自分で資料を読み取って、学習活動を進めていくようにしています。

 

授業で使っている資料には、7割程答えが載っていて(実習)、残り3割は自分で考えさせるもの(演習)という割合にしています。この割合が5:5だと、自力ではこなせなくなってしまう生徒がいる、という印象です。

 

授業では、「最低限ここまではやろう」というベース(今回の授業であれば3-6)を設定しておき、できた人はさらに応用的な内容まで進めるように準備しています。特に「コンピュータとプログラミング」の単元では、この設定が必要だと思います。習熟度の差が表れやすいからです。

 

 

■後半のプログラミングやデータの活用などの単元の並び順について、どのような工夫をされているのでしょうか。

 

後期は、3章の「プログラミング」に入る前に、先に4章の「データの活用」を学んでいます。「データの活用」を学んで、シミュレーションした結果をグラフで読み取り方を理解していないと、何のためにシミュレーションをしているかわからなくなってしまうからです。

 

そのため、「データの活用」を先に学んでから、プログラミングでシミュレーションを行い、シミュレーションの結果をグラフ化して考察する、という順番がよいのではないかと個人的には思います。昨年度の授業から改善したことです。

また、グラフ作成をプログラミングで行うと、プログラムが複雑になるので、あえて現段階ではスプレッドシートで行うようにしています。

 

シミュレーションは表計算ソフトでもできますが、私は「プログラミングでシミュレーションをやること」にこだわっています。あくまでも「情報Ⅰ」の目標は問題解決ですから、プログラムを使った問題解決に生徒と一緒にチャレンジしていきたいからです。

 

プログラミング言語は、micro:bitとPythonの両方扱っています。いろいろな言語に触れる機会を持たせる目的もありますが、共通テストでは「共通テスト用プログラム表記」で出題されますから、自分が学んできたプログラミング言語を置き換えて問題を解くことになります。そのためにも、言語は2種類はやっておいた方がよいかと個人的には思います。

本校の場合は、プログラミングの概念はmicro:bitで学び、身近な事象をプログラムに置き換え、実際にシミュレーションさせることをPythonで学ぶ、という切り分けですね。

 

プログラミングで重要なのは、構文そのものでなく、プログラムで「何をするか」だと思います。生徒たちがプログラミングで試行錯誤していくことを通して、プログラミングで問題を解決する力を少しでも育んで欲しいと思います。

 

 

[取材を終えて]

 

実戦事例報告会でのご発表や、文部科学省の授業動画で拝見していた「100連ガチャのシミュレーション」の授業ですが、今回は、実際に生徒たちがどのように作業を進めていくのかを見学することができました。

 

鎌田先生が他の授業の実践を発表されたときにもおっしゃっていましたが、説明は本当に冒頭の10分程度だけです。「モデル化」や「シミュレーション」についても、今日の授業で何をするか、ということにフォーカスした簡潔でわかりやすい説明だけで、用語の詳細な説明などは特にありません。

 

それでも、生徒たちが迷うことなく進めていくことができるのは、一連の流れがきめ細かいスモールステップで進み、各ステップで何をしているかが明確に示されていること。そして、躓きやすい点についてはあらかじめスライドに示されているので、うまくいかなくても、どこをチェックしたらよいかを自分で確認することができ、やり直しが容易であることが大きいことを感じました。

 

もちろん、この学校の生徒たちはディベートなどの探究的な学習を通して、自分で考え、解決して進めていく姿勢が鍛えられ、身についているということはありますが、生徒が主体的に・自分のペースで進めていくためには、それを可能にする教材やカリキュラムの設計が必要であることを改めて感じました。

 

プログラミングでは「言語は何を使うか」がしばしば問題になりますが、鎌田先生の授業ではプログラミングの前半はmicro:bitでタイルスクリプティング、後半はPythonを扱っています。前半と後半で活動の目標を明確に定めて、それぞれに合った活動をしているため、2つの言語を自然に使いこなすことができるようになり、結果的に今回の、生徒が自分のペースでブログミングに取り組むことにつながっていることがよくわかりました。

 

鎌田先生の情報科の授業の資料はこちらをご参照ください。