• 検索結果がありません。

教育意図を利用したプログラムのプルーフリーダの提案

N/A
N/A
Protected

Academic year: 2021

シェア "教育意図を利用したプログラムのプルーフリーダの提案"

Copied!
4
0
0

読み込み中.... (全文を見る)

全文

(1)

教育意図を利用したプログラムのプルーフリーダの提案

2012SE027後藤悠太 2012SE172長谷優磨 2012SE246田原寛隆

指導教員:蜂巣吉成

1

はじめに

大学でプログラミング演習を行う際,学習者は教育者か ら課題を与えられ,プログラムを作成するといった形式が 多い.課題には実行例が載っているので,学習者は実行例 通りにプログラムが動作すれば良いと考える傾向があり, 教育者の意図と異なるコードを書いている学習者もいる. このような場合,教育者が学習者に対して意図と異なる記 述を指摘する方法で解決できるが,教育者が学習者一人ひ とりに対して指導する必要があり,負担が大きい.教育者 が学習者に対して模範解答を開示し,学習者が自身の解答 と比較するという方法もあるが,学習者は内部動作を考え ないことが多く,どこが悪いのか分からない場合がある. 2014年度の卒業研究“プログラミング演習における模 範解答派生機能を備えた学習用校正ツールの提案”[1]で は,学習者の解答に教育意図を含んだ記述があるか判定す るツールの提案をしている.この研究では,模範解答から 教育意図が記述されている箇所を教育意図パターンとして 抽出する.その教育意図パターンが学習者の解答に記述さ れているかを調べ,判定を行っている.しかし,すべての 課題において教育意図パターンが一律のルールで抽出され ているので,教育者が意図しない箇所が抽出される場合や 抽出して欲しい箇所が抽出されない問題がある.これによ り,適切な学習者の解答が不適切と判定されたり,不適切 と判定したい解答を適切と判定することがある. 本研究では,課題ごとに学ばせたい記述が異なると考え, 学習内容ごとに異なる抽出基準で教育者の模範解答から教 育意図を満たした箇所を抽出することで,2014年度研究の 問題点を解決する.本研究では,課題ごとに教育者が学習 者に学ばせたいことを教育意図とした.学習項目は,明解 C言語入門編[6]の章立てを参考に,学習内容ごとにまと めたものである.教育者が課題ごとに模範解答を用意し, 学習項目を選択することで模範解答から異なる基準で教育 意図を含んだ記述を抽出することができる.学習者の解答 からも同じ基準で教育意図を含んだ記述を抽出し,それぞ れ抽出されたコード断片を比較することで不適切な学習者 の解答を検出することができる.本研究で提案するプルー フリーダによって,学習者の学習効率向上と教育者の負担 軽減が期待される. 本研究で提案するツールは,プログラミング演習で学習 者がテストを行った上で教育意図と合っているかを確認す るために使用されることを想定している.したがって,学 習者のコードは「コンパイルに成功し,実行結果が正しい プログラム」を対象とする.

2

関連研究

コーディングチェッカや学習者向きのフィードバック を行うツールはいくつか提案されている. CX-Checker[2] は,C言語プログラムのコーディングチェッカである. コーディング規約に基づき静的解析を行う.また,XPath などを用いてルールをカスタマイズすることができる.課 題ごとに教育者の意図を考慮した指摘やアドバイスを与え るためには,教育者が課題ごとにルールをカスタマイズす る必要があり,負担が大きい.proGrep[3]は,プログラム の翻訳(コンパイル)・実行と同時に履歴サーバに学習履歴 を蓄積し,学習履歴を利用して自動でパターンに記述され たアドバイスを行う.コンパイラの出力に対してアドバイ スを行うので,作成したプログラムが教育者の意図を満た しているかどうかは判定できない.C-Helper[4]は,静的 解析を用いてあらかじめ決められたルールに基づき,学習 者が陥りやすいミスを発見,指摘し,可能な範囲で解決策 を提案する.C-Helper[4]で決められたルールで指摘する ので,課題ごとに異なる指摘を行うことはできない.

3

教育意図を利用したプルーフリーダ

本研究では,模範解答を用いることにより一般的なコー ディングチェッカではチェックすることが困難な課題に対 して正しく判定する.学習者が学習内容ごとの教育意図を 満たした記述をしているかをチェックするために,学習内 容ごとに異なる抽出基準で教育者の模範解答と学習者の解 答から教育意図が記されているコード断片を抽出する.抽 出したコード断片はそれぞれマッチングさせるために変数 名や関数名の抽象化を行う.これを評価コードとする.2 つの評価コードをマッチングすることで判定を行う.想定 される課題としてソースコード1の模範解答に対しソース コード2,ソースコード5の模範解答に対しソースコード 6のような学習者の解答が考えられる. Listing 1 模範解答のコード断片 1 max = array[0]; 2 for( i = 1 ; i < size ; i++){

3 if(max < array[i]) max = array[i]; 4 }

Listing 2 学習者の解答のコード断片

1 max = 0;

2 for( i = 0 ; i < size ; i++){

3 if(max < array[i]) max = array[i]; 4 }

(2)

Listing 3 ソースコード1の評価コード 1 =[] 2 for(=1;<;++){ 3 $var= 4 } Listing 4 ソースコード2の評価コード 1 =0 2 for(=0;<;++){ 3 $var= 4 } ソースコード1は,「配列の最大値を求めるプログラムを 作成しなさい」という課題に対する模範解答のコード断片 で,教育意図は「配列の先頭要素の処理を行って,残りの 要素を順に走査し処理を行う」である.ソースコード1で 示したコード断片は要素数size(≥1)の配列arrayから最 大値を求める処理であり,まず配列の先頭要素を仮に最大 とし,2番目の要素からfor文で順に走査するのが適切で ある.これに対しソースコード2の学習者の解答では,変 数maxは0で初期化され,for文で配列の先頭要素から順 に走査を行っている.この書き方は定数0を最大値として 仮定しており,教育意図と合わない解答と考える.この場 合評価コードはソースコード3,4のようになり,それぞ れ比べると1,2行目が異なるので,学習者のコードは不 適切であると判断される. Listing 5 模範解答のコード断片 1 sum = 0; 2 for( i = 0 ; i < size ; i++ ){ 3 sum += array[i]; 4 } Listing 6 学習者の解答のコード断片 1 sum = array[0]; 2 for( i = 1 ; i < size ; i++ ){ 3 sum += array[i]; 4 } Listing 7 ソースコード5の評価コード 1 =0; 2 for(=0;<;++){ 3 $var= 4 } Listing 8 ソースコード6の評価コード 1 =[] 2 for(=1;<;++){ 3 $var= 4 } ソースコード5は,「配列の合計値を求めるプログラムを 作成しなさい」という課題に対する模範解答のコード断片 で,教育意図は「合計を例に,配列の先頭要素から最後ま で順に走査し処理を行う」である.ソースコード5は要素 数(≥0)の配列の合計値を求める処理であり,この場合は for文のカウンタ変数は0から繰り返し処理させることが 適切である.これに対しソースコード6の学習者の解答 は,変数sumを配列の先頭で初期化しており,配列の途 中から繰り返しの処理をしている.このような解答も教育 意図と合わないと考えられる.また,評価コードはソース コード7,8のようになりそれぞれ比べると1,2行目が異 なるので,学習者のコードは不適切であると判断される. 最大値を求めるにはfor文は 1から繰り返し処理をす るほうが良いが,合計を求めるにはfor文は 0から繰り 返し処理をする方が良い.しかし, 一般的なコーディング チェッカではソースコード1,6のコードを区別して判定 することができない.模範解答から評価コードの抽出を行 うことによりこのような問題に対処できると考えた. 次に「anを計算するプログラムを作成しなさい」とい う課題を例に考える.この課題の教育意図は「for文でn 回繰り返し計算を行う」である.模範解答は変数powを1 で初期化し,for文でi=0からi<nまで繰り返しpowにa を掛けて計算する.この課題に対して,powを1で初期化 し,for文でi=1からi<=nまで繰り返しpowにaを掛け て計算する解答や,powをaで初期化し,for文でi=1か らi<nまで繰り返しpowにaを掛けて計算する解答が想 定される.教育意図から前者の解答は適切,後者の解答は 不適切である.しかし,昨年度の研究[1]では抽出基準を 一律としているので前者の解答も不適切であると判定され てしまう.正しく判定を行うためには課題ごとに異なる基 準で評価コードを抽出する必要がある.

4

学習項目と評価コード

4.1 学習項目の必要性 本研究では,学習内容ごとに異なる抽出基準で模範解答 から評価コードを抽出することにより,昨年度研究の問題 点を解決する.抽出基準を課題ごとに教育者が記述するこ とでこの問題は解決できるが,この方法では教育者の負担 が大きい.そこで,学習項目ごとの評価コードに同じ特徴 が現れれば,学習項目に対し抽出基準を設定することで, 教育者が学習項目を選択するだけでその課題に適した抽出 基準を用いて抽出できると考えた.これにより,教育者の 負担は少なく,評価コードには過不足ない教育意図を表し た記述のみを残すことができる.そこで,我々はどのよう な学習項目があり,それに対する評価コードはどのような 形で出現するのかを調べた. 4.2 学習項目の決定 学習項目を決定するに当たっては明解 C言語入門編 [6]の章立てを参考にした.その結果,学習項目は条件分 2

(3)

岐(if),条件分岐(switch),繰り返し(while),繰り返し (for),繰り返し(do-while),配列の6つに分類できた.ま た,同文献のサンプルコードから学習項目ごとに評価コー ドを抜き出した.なお,学習項目の決定において評価コー ドを抜き出す作業は手作業で行った.その結果評価コード を学習項目ごとに分類し,抽象化することができた.これ を意図パターンとする. 4.3 評価コードと意図パターン 意図パターンとは,評価コードを自動で抽出するために 使用するパターンであり,学習項目ごとの評価コードの特 徴的な箇所を示している.意図パターンは学習項目と条件 式,初期化の有無によって記述が変わり,条件式,初期化 の有無は教育者が判断する.教育者が学習項目を選択する ことで,意図パターンが決まり,この意図パターンを用い て模範解答から自動で評価コードを抽出することができ る.3節であげた「配列の最大値を求める」課題と「配列 の合計値を求める」課題を例に考える. Listing 9 意図パターン(配列初期化有り) 1 ={ 値又は[] } 2 for値関係演算子演算子(=;;){ 3 $var= 4 } Listing 10 意図パターン(for文条件式無し初期化有り) 1 値 2 = 3 for(){ 4 $var= 5 } Listing 11 anを計算するプログラムの評価コード 1 =1 2 for(){ 3 $var= 4 } この2つの課題の学習項目は,教育意図から「配列(初期 化有り)」となる.配列は条件式を必ず抜き出すので条件 式の有無は問わない.この学習項目に対して定義されてい る意図パターンはソースコード9になる.意図パターン中 の値,関係演算子,演算子はソースコード中の該当する箇 所をそのまま評価コードに抽出する.[]はソースコード の該当する箇所に配列が使われていれば[]を抽出する. $varはソースコード中の変数を$varに変換した記述であ る.ソースコード1,5にソースコード9をパターンマッ チングさせることで,ソースコード3,7が抽出される. また,3節であげた「anを計算するプログラムを作成しな さい」という課題を例に考える.教育意図から学習項目は 「for文(条件式無し初期化有り)」となり,この学習項目で 定義されている意図パターンはソースコード10となる. 模範解答にソースコード10をパターンマッチングさせる ことで,評価コード11が抽出される.この評価コードを 用いることにより,学習者の解答に,変数powを1で初期 化する初期化式があるか,for文が記述されているか調べ ることができ,3節であげた学習者の解答を正しく判定す ることができる.学習項目を選択することで,意図パター ンが決まり,課題ごとに異なる抽出基準で評価コードが抽 出できる.

5

ツールの実現

本研究では,教育者が利用する「教育意図抽出ツール」 と学習者が利用する「教育意図判定ツール」を実現した. プルーフリーダの全体像を図1に示す. 図1 ツールの全体像 教育者は学習者が教育意図判定ツールを利用する前に, 作成した模範解答のファイル名,その課題に対する学習 項目を教育意図抽出ツールに入力する.入力された学習項 目に対して意図パターンが定義されているので,その意図 パターンと模範解答を用いて評価コードと判定ファイル を出力する.判定ファイルには,入力された学習項目と評 価コードのファイル名が記述されている.その後,学習者 は教育者から判定ファイルと評価コードを受け取り,教育 意図判定ツールに解答のファイル名を入力する.これによ り,学習者の解答から評価コードが抽出され,模範解答の 評価コードとマッチングを行い,学習者にフィードバック する.ツールの実装には,パターンに基づいたコード変換 が可能であるTEBA[5]を利用した.

6

検証

南山大学情報理工学部1年生を対象に開講された2012 年度秋学期プログラミング基礎実習の課題(計59問)と 3

(4)

これらの課題に解答をした9人の学生の解答を対象に,提 案したツールを用いて不適切な学習者の解答が検出できる か確認を行った.対象とした課題59問中19問は,異なる 解答を記述している学習者はいなかったので,ツールを利 用する必要がない課題として考え,集計の対象外とした. また模範解答の中には,設定した学習項目が含まれない課 題も存在したので,ツールの検証には,残りの36問を対 象に集計を行った. ツールを利用したところ36問中22問で不適切な学習 者の解答が検出された.検出された課題として,課題内容 「3つの整数を入力として受け取り,値が等しい数を出力 するプログラムを作成しなさい」,教育意図「if文とelse 文を用いて適切な条件式の記述」という課題がある.模範 解答のコード断片はソースコード12となる.この課題に 対して入力された3つの整数がすべて等しい場合の条件式 をソースコード13のように記述している学習者の解答が あった.この学習者の解答には,不要な条件式の記述がある ので,この解答は不適切であるという出力を得られた. Listing 12 模範解答のコード断片 1 if (na == nb && na == nc) 2 printf("三つの値は等しいです。"); Listing 13 学習者の解答のコード断片 1 if (na == nb && na == nc && nb == nc) 2 printf("三つの値は等しいです。"); また判定ができなかった課題は14問あり,大きく分け て2種類に分類することができた.1つ目は,複数の学習 項目がある課題である.これは,本ツールが複数の学習項 目の入力に対応していなかったので,評価コードの抽出が できなかった.この問題に対して,7.1節で考察する.2つ 目は,適切な学習者の解答を不適切と判定してしまう課題 である.これは,模範解答が複数記述できることが原因で ある.この問題は,教育者が複数の模範解答を用意し,そ れらの模範解答を用いて学習者の解答を判定することで, 解決することができる.

7

考察

7.1 複合課題 繰り返しと条件分岐の入れ子構造のように1つの課題に 学習項目が複数存在することがある.現在の実装では,複 数の学習項目を用いて,一度に評価コードを抽出すること ができない.この問題に対しては,ツールを2回用いてそ れぞれの学習項目に対して評価コードを抽出する方法で解 決することができる.しかし,この方法ではソースコード の構造まで確認することができない.検証では,正しく判 定できない課題は見つかっていないが,構造が変化しても 正しく動作し,構造が重要な課題があるかもしれないので, 更なる検証が必要である. 7.2 アンチパターン 課題には,模範解答には現れない記述をしてはいけない という課題もある.このような課題にも対応するために, アンチパターンを利用する.アンチパターンとは,学習者 の解答に不適切な記述がないかを調べるために利用する意 図パターンである.具体的には,「配列の合計と平均を求め るプログラムを作成しなさい」という課題内容で,合計を 求めるfor文の中で平均を求める処理をしている解答など が想定される.この解答に対して,「for文の中に”/”を用 いた計算がある」というアンチパターンを適用させると, 不適切な記述なので,模範解答にはマッチングせず,不適 切な学習者の解答のみにマッチングする.よって,不適切 な解答から抽出した評価コードと模範解答から抽出した評 価コードとで違いが出るので,このような解答を不適切で あるという判定を行うことができる.

8

おわりに

本研究では,学習者が教育意図を満たした解答をするこ とを目的に,模範解答と学習者の解答から教育意図にあた る箇所を評価コードとして抽出し,それらを照らし合わせ フィードバックを行う教育意図を考慮したプルーフリーダ を提案した.今後の課題は,学習者に対するフィードバッ ク方法の決定,複合課題の解決である.

9

参考文献

[1] 堀尾美貴,金崎真奈美,佐藤成,“プログラミング演習 における模範解答派生機能を備えた学習用校正ツール の提案”,南山大学情報理工学部2014 年度卒業論文, 2014. [2] 大須賀俊憲,小林隆志,et al.,“CX-Checker:柔軟なカ スタマイズが可能なC言語コーディングルールチェッ カー”,情報処理学会論文誌, Vol. 53, No.2,pp. 590-600,2012. [3] 長慎也,筧捷彦,“proGrep-プログラミング学習履歴 検索システム”,情報処理学会研究報告.コンピュータ と教育研究会報告,vol. 2005,NO. 15,pp. 29-36, 2005. [4] 内田公太,権藤克彦,“C-Helper:C言語初学習者向け 静的解析ツールの提案”,ソフトウェア工学の基礎XIX 日本ソフトウェア科学会FOSE2012,近代科学社,pp. 231-232,2012. [5] 吉田敦,蜂巣吉成,沢田篤史,張漢明,野呂昌満,“属性付 き字句系列に基づくソースコード書き換え支援環境”, 情報処理学会論文誌,Vol. 53,No.7,pp. 1832-1849, 2012. [6] 柴田望洋,“[新版]明解C言語入門編”, ソフトバンク クリエイティブ株式会社,東京, 2004. 4

参照

関連したドキュメント

 高齢者の外科手術では手術適応や術式の選択を

子どもたちは、全5回のプログラムで学習したこと を思い出しながら、 「昔の人は霧ヶ峰に何をしにきてい

つまり、p 型の語が p 型の語を修飾するという関係になっている。しかし、p 型の語同士の Merge

LUNA 上に図、表、数式などを含んだ問題と回答を LUNA の画面上に同一で表示する機能の必要性 などについての意見があった。そのため、 LUNA

これらの事例は、照会に係る事実関係を前提とした一般的