タイダログ

もっと怠けますか? (y/n)

Python の課題を解き続けた生徒が、関数の定義まで出来るようになった話

来年度から情報Ⅰの授業でプログラミングが始まるので、過去の卒業生の話を思い返して書きました。

情報系の学部に進学する生徒が、卒業までに Python で何かプログラムを書いてみたいと言って、最終的に関数を定義できるようになった話です。

※生徒本人と管理職の許可を得て掲載しています。

基本方針

私から課題を出して、生徒が自力でがんばって、できないところを私がサポートする。

目標

  • 人に聞く前に自分で調べる習慣をつける
  • 完成形をイメージし、そこに至る手順を考える力をつける
  • プログラムの動きを言語化する力をつける

Python の構文や関数についてはググればいくらでも出てくるのと、せっかく自ら言い出してきたので、生徒に自主的に取り組んでほしいと思いました。

そんなわけで、私がすべきは、プログラムを書く際の考え方を教えたり、生徒がつまずいたときにサポートしたり、今後自分で学び続けていくための手助けをしたりすることだと考え、上記の目標を設定しました。

実施方法

Python でプログラムを書く課題を提示し、生徒が書いたプログラムを見てヒントを出したりアドバイスをしました。

先週の課題に対して今週アドバイスし、今週の課題は来週、というように一週ずらして扱う形です。

期間は12月半ばから卒業までの2か月半で、週に一回程度、放課後に30分ほど対面で行いました。自由登校期間は Teams 上でやり取りしました。

学習環境

できるようになったこと

  • print文
  • 変数への代入
  • if..elif..else
  • for文
  • インデントの理解
  • リストの理解
  • for 文でのリストの利用
  • 二重ループの理解
  • 関数・引数・戻り値の理解
  • 関数の定義
  • 人に聞く前に検索
  • プログラムの動きの言語化

本当によくがんばりました。

課題の例

画面に文字を表示する

内容
Hello World!
変数に文字列を代入し、それを画面に表示する(標準出力に出力する)。
目的
  • paiza.io の使い方を知る
  • print文を使う
  • 変数の存在を知る
  • 血液型占い

    内容
    変数に、血液型を表す文字列 'A', 'B', 'O', 'AB' のいずれかが入っている。「今日のA型のラッキーアイテムは英和辞典」などのように、変数の中身に応じて異なるラッキーアイテムを標準出力に出力する。
    目的
  • 変数への代入のおさらいをする
  • if..elif..else で条件分岐ができるようになる
  • 田中さんを全員呼び出す

    内容
    1000人分の氏名のリスト(なんちゃって個人情報さんで作成)の中にいる、田中という名字の人全員について、「田中 ○○さん、職員室に来てください。」というメッセージを標準出力に出力する。
    目的
  • for文とif文を使って、大量のデータからの抽出と操作をできるようになる
  • プログラムを読んで動作を説明する

    内容
    いわゆるトレース。紙に書いてあるプログラムを読んで実行結果を予想したうえで、実際に実行して予想と結果の差異を確認する。
    そのプログラムはどういう順序でどういう処理をしているか、言葉で説明する。
    目的
  • プログラムの動きを言語化する力をつける
  • result = int("1") を説明する

    内容
    `result = int("1")` というコードの動きを説明する。
    目的
  • 関数の戻り値を変数に代入できることを知る
  • 「関数・引数・戻り値」の説明をするための準備
  • FizzBuzz を関数化する

    内容
    引数として数値を1つ取り、FizzBuzz のルールに従って数値または文字列を返す関数を定義する。
    目的
  • 「引数を取って、処理を行い、戻り値を返す」という関数の性質を再確認する
  • 関数を定義することによる、プログラムの可読性の向上を確認する
  • これまでの集大成
  • プログラミング教育について考えたこと

    私は就職してから独学で VBAPowerShell、F# を始めたのですが、プログラミングをやっていくうちに、物事を順序立てて考える力が増していくのを感じました。「目標を設定し、そこに至るまでの手順を考える」という流れや、「効率的に処理する方法を考える」、「処理のまとまりを意識してプロシージャや関数に分ける」という作業を繰り返したことが理由だと考えています。この

    • 目標を設定し、そこに至るまでの手順を考える
    • 効率的に処理する方法を考える

    といったことは、文部科学省が述べるプログラミング的思考に通じるものがあると思います。

    自分が意図する一連の活動を実現するために、どのような動きの組合せが必要であり、一つ一つの動きに対応した記号を、どのように組み合わせたらいいのか、記号の組合せをどのように改善していけば、より意図した活動に近づくのか、といったことを論理的に考えていく力

    「小学校段階におけるプログラミング教育の在り方について(議論の取りまとめ)」(平成28年6月28日)より引用

    プログラミングそのものではなく、プログラミング的思考を身につけさせるという話は、素晴らしいと思います。そのためには、プログラミングの関数や構文を覚えることに終始せず、手順や効率の良い方法を考えることに時間を割く必要があると思います。

    とはいえ、「情報Ⅰ」の授業でプログラミングに割ける時間はおよそ6~8時間と聞きますので、その限られた時間内でソフトや言語の使い方から「プログラミング的思考」までカバーするのは難しいでしょう。そのため、プログラミングの単元以外でも「プログラミング的思考」を意識する必要があると思っています。

    たとえば、すごく単純な例ですが、Excel の関数で何かの平均値を求めるという課題に取り組む際に、「平均を求めるには、合計と、数値の個数が必要。合計は SUM 関数で出して、数値の個数は COUNT 関数を使おう」という風に考えることができたら、それは「プログラミング的思考」と言えるのではないでしょうか。まあ AVERAGE 関数を使えというツッコミは置いといて。

    国公立受験者は共通テストで情報を受験するという話ですが、おそらくほとんどの高校で情報Ⅰの授業をするのは1年生か2年生でしょうから、3年生向けの受験対策講座をあらためて開くんでしょうね。みんながんばろ。

    結び

    意欲的な生徒の学習のサポートをするという、教員にとってこれ以上ないほど嬉しい体験をさせてもらえました。今後の教員生活でも生徒の主体的な学びを大切にできるよう、授業を計画していきたいと思います。

    参考