プログラミング演習の実行履歴に基づく演習課題の評価
○桑田 喜隆
†1石坂 徹
†1小川祐紀雄
†1政谷好伸
†2長久勝
†2横山重俊
†2†3浜元信州
†3 †1 室蘭工業大学 †2 国立情報学研究所 †3 群馬大学Evaluating the exercise assignment of programming
by using the execution record of Jupyter Notebook
Yoshitaka Kuwata†1, Toru Ishizaka†1, Yukio Ogawa†1,Yoshinobu Masatani†2 ,
Masaru Nagaku†2, Shigetoshi Yokoyama†2†3, and Nobukuni Hamamoto†3 †1 Muroran Institute of Technology, Japan
†2 National Institute for Informatics, Japan †3 Gumma University, Japan
概要
筆者らはJupyter Notebook 環境である CoursewareHub で Python を使ったプログラミン グ教育を実施している.演習の実行履歴は全てサーバ上に記録されており解析可能な状態に あるが,実行履歴中の言語処理系の出すエラーの分析結果について述べる.また,分析結果 を指導や出題方法にフィードバックする方法について論じる.
Abstract
The authors use CoursewareHub, a Jupyter Notebook environment, for Python programming classes. All of the records executed by students are stored in the server and ready to analyze. We report the first results of the analysis of error messages generated by Python programming system. We also dis-cuss how to make use of the results to direct students, and to improve exercise materials.
1. はじめに1 1.1 プログラミング教育における課題 プログラミング教育に関する重要性が認識されるよ うになってきており,例えば,2020 年度より小学校 でのプログラミング教育が必修化されることと なった.また,高等教育機関でもデータサイエン ス分野の人材育成に力をいれる大学も増えてき ている. 室蘭工業大学では,2019 年度の改組にあわせ て,情報教育の強化の一環として,全学生を対 象とした一般教養としてのプログラミングの授 業を開始した.これまで全学生を対象とした授 業の一部でプログラミングを取り入れていた が,コースとしてプログラミングを扱うのは初 1 Yoshitaka Kuwata 室蘭工業大学 北海道室蘭市水元町27−1 [email protected] めてである. 今後,小学校からのプログラミング教育が普 及するに従い,状況が変化する可能性はあるも のの,現時点で全学生を対象にプログラミング 教育を行う場合,プログラミングに関する学生 の知識がバラバラであることが大きな課題であ る. 例えば,2019 年度入学学生への事前アンケー トでは,高校までにプログラミングの授業を受 講したことのある学生は全体の 1/4 程度であ る.また,「プログラミングが得意ですか?」と いう問いに対して,半数が「普通」と回答して いるのに対して,1/3 が「苦手」1/6 が「どちら かというと苦手」と回答している.図 1 に結果 を示した.
図 1 事前アンケート結果: 「プログラミングが得意ですか」 (N=637) 2. Jupyter Notebook を活用したプログラミング演習 筆者らは,Jupyter Notebook1)環境を活用してプロ グラミングの授業を実施することを提案している.小 規模な模擬授業によって,その有効性を評価した. (参考文献 2,3)
Jupyter Notebook を拡張した CoursewareHub4,5)で
は,利用者の実行履歴を順次記録する機能を提供 している.この機能を利用することで,利用者ごとの 進捗状況を把握し,状況に応じてアドバイスを与え る方法について論じた.また,教材の中で分かりにく い箇所を事前に知るための手段として有効であるこ とが分かった. 2019 年度下期に,室蘭工業大学で初めて全学の 学生を対象にしたプログラミングの授業を行なった. 模擬授業で得られた知見を活かして,教科書や演 習教材,講義の準備を行なった.参加人数の多い 授業であり,4人の教師により同時に5クラスが開講 された.15回の授業を実施した結果,有益なデータ を収集することができた. 本稿では,授業のログの中で,Python 言語処理系 の出すエラーメッセージに注目し,その分析を実施 した.分析の結果をもとに,授業の改善方法および 教材の改善などについて論じる. 3. プログラミング授業 3.1 授業の概要 表1に本稿で報告する授業の概要を示す. 表1 プログラミング授業の概要 項目 内容 コース名 プログラミング入門 対象者 創造工学科/システム理化学科/夜 間主コース 1 年生 総計約 600 名2 クラス数 4クラス(昼間),1クラス(夜間) 担当教員数 4 回数 15回(90分) 2 これ以外の受講希望者がいたため,実際の受講者はもう少し 多い.ただし,合意がとれた学生のデータのみを分析対象とし たため,分析対象はこの数より少ない. 選択/必修 必修 プログラミング言語 Python プログラミング環境 Jupyter Notebook 授業形態 講義/演習 (反転学習) ティーチングアシス タント(TA) 学生約 30 名に対して 1 名を配置 教科書 Jupyter Nortebook で始めるプログ ラミング20196) 3.2 授業の実施方法 予め教科書の内容を読んで理解してもらうことを前 提とした反転授業の形式を採用した.授業時間内の 講義時間を減らし,演習および課題でプログラミング に取り組む時間を出来るだけ多く取ることが出来た. 表2に授業の実施方法と時間割り当てを示す. 表 2 授業の進め方 No. 内容 方法 時間 - 事前学習 教科書 前日まで 1 前回小テス ト の 答 え 合 わせ スライド説明 (Moodle 資料配布) 5 分 2 講義 スライド説明 (Moodle 資料配布) 10-15 分 3 演習 CoursewareHub で配布 20-30 分 4 課題 CoursewareHub で配 布,回収,採点,返 却 30-40 分 (宿題) 5 小テスト Moodle で実施 5 分 理解度を測るため,各回の終わりに小テストを実施 した.また,課題は教員およびティーチングアシスタ ントが採点し,学生にフィードバックを行なった.な お,小テスト及び課題は成績に反映した. 3.3 演習環境 図2 に今回の授業で使った環境を示す. Jupyter Notebook の環境は,SINET 経由で NII のCoursewareHub4,5)を使用した.また,教材の配
布や小テストはLearning Management System (LMS)である Moodle を使用した. CoursewareHub は以下の利点がある. • パソコンへのインストールが不要であり, 学生は認証後にすぐに演習に取りかかるこ とが出来る. • CoursewareHub 上で教材の配布および回収 を教員が一括して行うことが出来るため, 学生の操作が不要となり,課題の提出ミス などを防ぐことができる.
• 実行履歴を取得する設定をすることで,教 員が学生の実行状態を逐一把握することが できる. 図 2 演習環境の構成 3.4 授業各回のテーマと教材 授業 15 回の各回のテーマと,利用した教材を表 3 に示す. 各回とも,予め教員が準備した教材(演習および 課題ファイル)を各学生のフォルダに配布した.ただ し,初回はNotebook を作成する練習として各自で 新規に作成してもらった.このため,学生間で Notebook やセルの ID が異なり比較できないため, 分析対象から外している.また,15 回はまとめの意 味で演習を出題せずに課題のみとした. 表 3 各回のテーマと演習,改題 回数 テーマ 演習 Notebook 課題 Notebook 1 イントロダクション - kadai01.ipynb 2 プログラミングの 基本概念 02/ensyu02.ipynb 02/kadai02.ipynb 3 条件判断 03/ensyu03.ipynb 03/kadai03.ipynb 4 制御構造,繰り 返し 04/ensyu04.ipynb 04/kadai04.ipynb 5 総合演習1 05/ensyu05.ipynb 05/kadai05.ipynb 6 データ構造 06/ensyu06.ipynb 06/kadai06.ipynb 7 関数 07/ensyu07.ipynb 07/kadai07.ipynb 8 総合演習2 08/ensyu08.ipynb 08/kadai08.ipynb 9 可視化 09/ensyu09.ipynb 09/kadai09.ipynb 10 アルゴリズム1 10/ensyu10.ipynb 10/kadai10.ipynb 11 アルゴリズム2 11/ensyu11.ipynb 11/kadai11.ipynb 12 総合演習3 12/ensyu12.ipynb 12/kadai12.ipynb 13 シミュレーション1 13/ensyu13.ipynb 13/kadai13.ipynb 14 シミュレーション2 14/ensyu14.ipynb 14/kadai14.ipynb 15 総合演習4 - 15/kadai15.ipynb 4. エラーの分析方法と結果 4.1 実行履歴から得られる情報
Jupyter Notebook では教材を Notebook 単位で作 成し,配布した.Notebook には複数のセルが含まれ ており,セルにプログラムを作成し,評価(プログラム を実行)することで演習を進めた. CoursewareHub で,Notebook のセルの評価ごと に,関連情報がログファイルに逐一記録される設定 とした. 表 4 に記録される情報の一覧とその意味を示す. 表 4 実行履歴として記録される情報 項目 表記 意味 1 user 利用者の ID 2 cell_name 実行したセル名 3 program_code 実行したプログラムコード 4 path_logfile ログファイルの格納場所 5 file_name Notebook のファイル名 6 lc_notebook_meme Notebook の識別子 7 server_signature Notebook を実行したサーバ の識別子
8 uid Notebook プロセスの uid 9 gid Notebook プロセスの gid 10 start_time 実行開始時刻 11 output プログラムの出力 12 end_time 実行終了時刻 13 results プログラムの評価結果 14 error エラーの種別 15 traceback トレースバック情報 項目 1, 7, 8, 9 は利用者ごとに決まり,項目 2,6 は 教材のNotebook で決まる.その他の項目は,セル の評価ごとに異なる情報である.また,同じ利用者 が同一セルを何度も評価した場合には,時刻だ けが異なるデータが記録される. 分析の方法として,例えば,ある利用者の履歴を 調べるためには,項目1が同じ履歴を抽出する.ま た,あるNotebook の特定セルの評価を比較したい 場合には,実行履歴の項目 2,6 が同じものを取り出 すことで実現可能である. 4.2 エラーに関する情報 実際のエラーの例を図3 に示す. 図3 Notebook の Python のエラーの例 Python 言語処理系でエラーが発生すると,エラ ー種別,その原因とそれまでの実行状況を示す traceback 情報が記録される. • エラー種別 traceback message traceback message error error
同じ種類のエラーを分類分けして提示する. Python3.7 のドキュメント9)では組み込み例外 (エラー)として約50 種類が示されている. • traceback 発生した場所,関数の呼び出し履歴,および 具体的なエラー内容を示す情報が記録され る.画面に色付け表示するための情報も含ま れており,不要な情報を除外して解析するこ とが必要になる. 今回の授業範囲で発生した主なエラー種別を 表5 に示す. 表5 言語処理系で発生した主なエラー種別 エラー種別 意味 SyntaxError 構文上の誤り NameError 名前が未定義 TypeError 型に関する誤り IndentationError インデント(段付)の誤り KeyboardInterrupt 利用者による停止 IndexError インデックスに関する誤り AttributeError アトリビュートに関する誤り ValueError 値に関する誤り KeyError キーに関する誤り UnboundLocalError ローカル変数に関する誤り RecursionError 再帰呼び出しに関する誤り ModuleNotFoundError モジュールが見つからない ZeroDivisionError 0による除算 OverflowError 数値表現できる範囲を超えた MemoryError メモリが不足した RuntimeError その他のエラー 4.3 エラー種別の分析 5 クラス 15 回の授業で収集したデータのうち, 実証実験に同意した学生 593 人の分について分 析を実施した. ログの総数(評価数)は 658,094 個であり,そ の中でエラーとなった数は,185,984(28%)であっ た.図4 に発生したエラー種類(縦軸)と頻度(横 軸)を示す. 図4 エラーの種類とその頻度 Python 処理系の組み込み例外 50 のうち,実際 に発生しているエラーは15 種類であり,全体の 1/3 程度であった.本結果は,利用した教材にも 依存すると考えられるが,組み込み例外として本 来発生しにくいものも含まれていると考えられ る. 図5 にエラーの割合を示す. 図5 エラーの割合 SyntaxError,NameError,TypeError の上位 3 種 類のエラーが8割を占めることが分かる.このた め,これらのエラーを学生が自己解決できるよう に指導することが重要であると考えられる. エラー発生数5 位の KeyboardInterrupt はエラー ではなく,利用者が動作を停止させた際に出力さ れる.プログラムの無限ループなどの状況が発生 したものと想定される. 5. エラー情報解析の評価 5.1 エラー発生の時系列変化 図6 に教材ごとの評価回数およびエラー回数を 示す.横軸の教材は左から右に時系列に並んでお り,左側のデータの方が初期に実施した教材であ ることを示している.図の青が総評価回数を示し ており,オレンジ色の部分がその内エラーの発生 数を示している. 教材の種別や各回のテーマによって,教材の Notebook に含まれるセルの数が異なっている. 評価数が多いNotebook には多くのセルが含まれ ており,教材として分量が多いことが分かる.た だし,Notebook には,予め式やプログラムの一部 をヒントとして記載しており,評価だけすれば良 いセルも含まれる.このため,一概に評価数の多 いNotebook が難しいとは言えない.
図6 教材ごとの評価回数とエラー回数 5.2 エラー率の時系列変化 エラーの発生は評価回数にも依存すると考え られる.そこで,実行回数に対するエラーの発生 する割合(エラー率)を分析した.図7 にエラー 率の時系列の推移を示す.横軸はNotebook を実 施順に左より並べており,縦軸はそれらのエラー 率を示す. 図7 エラー率の時間推移 授業が進むにつれて,エラー率も下がっている ように見うけられる.エラーを解決する方法を習 得し,複数回同じエラーを出さなくて済むように なったことが考えられる. また,全体的に演習よりも課題の方がエラー率 が高い傾向にある.これは,演習はある程度プロ グラムのヒントを予め与えてあり,比較的易しく 設定したのに対して,課題は自由にプログラムを 書けるようにし,難しい設定としたためであると 考えられる. 5.3 エラー種別の時系列変化 授業の回ごとにエラー種別に特徴があるか調 べるため,発生したエラーの割合を調べた.図8 に教材ごとの各種エラーのエラー全体に対する 比率を示す. 図8 教材ごとのエラーの比率 図8 より,以下の特徴が観察される. (1) SyntaxError は全体を通して高い比率を占め ており,最も発生しやすいエラーである. 回を追うごとに,エラー全体に占める割合 が減少している傾向にある. (2) NameError は 5 回目の授業より発生数が増 加している.教材で変数の利用が増加した ためと考えられる. (3) 5 回目の授業で,IndexError が非常に多く発 生している.第 5 回はリストを扱う回であ り,内容と符合する. (4) 13,14 回では演習および課題において mod-ule を使うが,import を忘れてエラーを出し ている学生が多い. 以上述べたように,回によってエラーにも特徴 があることが分かった.セルごとの分析をすると, より顕著な違いが出ることが予想される. 6. 考察 6.1 エラーの自己解決に向けた支援 演習中の観察で,処理系のエラーが発生すると, どうして良いか分からずに戸惑う学生が多数見 られた.ティーチングアシスタントや友達,教員 に尋ねる学生もいるが,自己解決しようとして多 くの時間を費やす学生も多く観察された.必要に 応じて教員から助言を与えたりしたが,全員にタ イムリーに助言することは難しい.そこで,以下 の方法をとることが考えられる. (1) 予め教科書でエラーの読み方を解説する 現在の教科書はエラーについての説明が少 ない.エラー読み方,考えられる原因,解決
方法などの解説を記載することが必要であ ると考えられる. (2) 授業中にエラーの読み方を解説する テーマによって発生する可能性のあるエラ ーに偏りがあることが分かったため,必要 に応じて,対象テーマの中で発生し易いエ ラーに関する注意を実施すると効果が高い ことが予想される. 6.2 エラーのフィードバック方法 エラー解析の活用方法として,上記以外に直接 学生にフィードバックする方法が考えられる.例 えば,学生ごとのエラーの発生数を分析し,エラ ーの多少や種別などを通知することも技術的に 可能である. しかし,エラーの多少は学生がプログラミング を理解しているかどうかに直接関連があるかど うか,明らかではない.安易なフィードバックは 学生を萎縮させる可能性がある.むしろ,積極的 にエラーを出してプログラムのコツを掴むよう なことを推奨したい. また,明らかに課題の一部のセルでエラーを出 し続け,進捗が止まっているようなケースを検出 し,支援を行うような方法が考えられる. 7. 関連研究 近年C/C++や Java に代わり Python を初等プロ グラミング教育に利用する事例が報告されてい る.Alzahrani ら7)によると従来のC++のコースと Python のそれとの比較では,Python の方が顕著 に「苦労が多い」との報告がある.Python の方が 学習が容易であると考えられていたこともあり, 事前の予想とは異なる結果である.このため,更 に分析が必要であると考えられる. Liu らは参考文献 8 において Python のエラーメ ッセージを改良し,統計的な情報を用いて共通的 なエラーの解説をつけることで,学習を助けるシ ステムを提案している.本取り組みでも学生の演 習のエラーに関する多量のデータが得られてお り,それらを活用することで,有益な情報を学生 に提供できる可能性があると考えられる. 8. まとめと今後の課題 本稿では,Jupyter Notebook 環境を活用してプロ グラミングの授業を実施した結果を報告した.600 人 規模の授業を実施し,有益なデータを収集すること ができたが,本稿では,Python 言語処理系の出す エラーに注目し,その分析結果を報告した. よくあるエラーについては,本分析で得られた結果 に基づき,教科書を改定しその中で解説する予定で ある.また,授業でもエラーの読み方について説明 する予定である. ここで述べたデータの解析は,授業実施中に得ら れるため,その場で解析することで学生のフィードバ ックすることが可能である.今後の課題として,授業 中にエラーの傾向を解析し,タイムリーに学生にフィ ードバックする方法を検討したい. 本研究はJSPS 科研費 (JP18K11561)の「クラウ ドを活用したプログラミング演習環境に関する 研究」の助成を受けたものである. A. 参考文献
1. Project Jupyter, Project Jupyter Homepage, http://ju-pyter.org/ (2020/2/25 参照) 2. 桑田喜隆, 石坂 徹, 政谷好伸, 長久勝, 横山重 俊,浜元信州, Jupyter Notebook の実行履歴を活用 したプログラミング演習の状況把握, 第 24 回 人工知能学会 知識流通ネットワーク研究会, 2019 年 3 月 8 日 3. 桑田喜隆,石坂 徹,小川祐紀雄,政谷好伸, 長久勝, 横山重俊,浜元信州, Jupyter Notebook を使ったプ ログラミング模擬演習の評価,第 25 回人工知能 学会 知識流通ネットワーク研究会, 2019 年 9 月 13 日 4. 長久勝, 政谷好伸,合田,憲人, Notebook による講 義・演習環境の開発, 情報処理学会 教育学習支 援情報システム研究会報告2019-CLE-27, 2019 年3 月 13 日
5. Literate Computing for Reproducible Infrastructure, https://literate-computing.github.io/ (2020/2/25 参 照)
6. 室蘭工業大学情報教育研究会編, Jupyter Nortebook で始めるプログラミング 2019, 学術 図書出版社, 2019 年 9 月
7. Nabeel Alzahrani, Frank Vahid, Alex Edgcomb, Kevin Nguyen and Roman Lysecky, "Python Versus C++: An Analysis of Student Struggle on Small Coding Exercises in Introductory Programming Courses", ACM SIGCSE’18, February 21-24, 2018 8. David Liu and Andrew Petersen, "Static Analyses in Python Programming Courses", ACM SIGCSE '19, February 27–March 2, 2019
9. Python Software Foundation, Python 3.7 組み込み例 外,
https://docs.python.org/ja/3.7/library/exceptions.htm l (2020/2/25 参照)
※ 記載されている会社名,商品名,又はサービス名は, 各社の商標又は登録商標です.