プログラミング課題不正回答を防ぐ手法の提案

この記事は、mast Advent Calendar 2022の23日目の記事です。

 

22日目はちゅるりさんがなにか書くはずです。

 

どうも、mast21のShore(しょあ)です。興味がある分野は高校におけるプログラミング学習、および教育用プログラミング言語です。

枠が空いてたので2つ目の記事になります。前回の記事は次のものです。

shore01.hatenablog.com

 

今回の記事は題目の通り、前回よりは真面目、と思いきや結構ふざけたこと書いてます。真面目な文章は秋Cに書かないといけないので頑張らねば……

 

1. 導入

 

さて、AI使って課題、作成してますか~?(いえ~い!!!)

今回はAIを使って課題をする、ということに関する倫理的問題については議論しません。

 

先日、CE研の167回研究発表会を聴講していたら次のような研究発表がありました。題名は『オンライン試験における不正抑止システム』です。

ipsj.ixsq.nii.ac.jp

内容はまだ会員しか無料閲覧できないので割愛しますが、この発表と教授らの反応を見てると、「あ~、皆課題の不正嫌いなんだな~」って感じました(当たり前です)。で勿論私は、プログラミング講義における不正について考えを巡らせるわけです。

 

🤔.。○〇(なんちゃらソートを改変したやつとかを課題として出す、とかかなぁ?)

 

そんな時にChatGPT君の登場! なんとコードも書いてくれる! すげえ! これに仕様ぶち込んだらコード書いてくれる! もう人間がコードを考えなくてもAIにぶち込んで体裁整えてレポートを作ればよい! 感動できる!!!

 

 

さて、どうしますか?という話。

 

Webの閲覧を禁止します?

別にCopilot君で似たようなことできますね~。てか別端末で見ればいいし。

 

疑似コードで書かせます?

実行できないプログラムとかプログラミングできる人でもミスするし採点やってられませんよね?

 

対面でやります?

まあいいんじゃないですか?けどレポート課題出せませんね。

 

2. 提案手法

このAIによって生み出されたプログラミング教育の問題を解決する、画期的な手法を提案します。

 

はい。

 

2.1 どうゆうこっちゃ

そもそも、ChatGPTやCopilotは何をしているか、というと基本的には過去の膨大なコードを分析して推定しているわけです。つまり、『学習していない言語であれば書けない』。

 

なので、作りましょう。学習されていない言語を。

 

2.2 場面設定

実用場所として弊学の講義であるデータ構造とアルゴリズム実習を設定します。この講義はソートや二分木などのコードを書くものです。コンソール実行ができればよいのが良いですね。

 

2.3 方法

インタプリタを作成します。

仕様としては次の通り。

  • 正規表現を用いて書かれた字句定義ファイルを読み込むことで字句解析を行う
  • 文法を構文定義ファイルから読み込むことでパースする
  • 様々な個所に変更可能点を作成する。
  • パースした結果作成されるASTは同じであるようにする

 

字句定義ファイルを読み込んで解析!

例えば、

INT::=[0-9][0-9]*

のように書かれている、BNF記法風の定義ファイルを読み込んで字句解析をする。教員側が変更するのが簡単!やったね!

 

文法もファイルを読み込んで解析しよう!

例えば次のような記法で文法を定義します。

<FOR>::=name num num num ::=NAME (WO) num (KARA) num (MADE) num (ZUTSUFUYASHINAGARAKURIKAESU COLON)

 

左から、構文名、AST設定、構文設定です。

こんな感じにすれば教員側が文法を変更するのが簡単!やったね!

 

様々な個所に変更可能点を作成する

例えば、

  • for文がfor文してたりforeachしてたり
  • forの終了条件数字まで演算したりその一つ前までだったり
  • インデックスが0から始まったり1からだったり
  • インデックスをマイナス指定できたりできなかったり
  • 文字列をインデックスで指定できたりできなかったり

というのを教員側が設定できるようにするわけです。

 

パースしたAST

処理系を毎年書き換えるのはめんどくさいので固定にします。つまり、外見は違う言語だけど処理は全く同じってわけですね。なでしことおんなじ、なのかな?

 

3. どうなる?

次のことが防止できます。

 

3.1 先輩の出した課題をもらってそれを提出する!

だって去年と文法違うから丸写しできない!

(これを疑って課題点を0にした教員がいましたねぇ……的外れでしたが)

 

3.2 ChatGPTに解いてもらう!

だって学習してない言語だもん!

 

3.3 Copilotに頼る!

学習してない+言語仕様の細かいところをいじれるからセグフォ出しまくりになる!

 

4. 結論

やったね!これで学生は自分でコードを書かざるを得なくなるよ!

AIが課題をする、なんてこともできなくなる!

 

学生同士で教えあい、まで防止したかったら構文設定、字句設定ファイルを学生ごとに乱数で生成して渡せば防止できる!これで完璧だ!!!

 

 

5. 追記

技術的にはこのように完全にAIなどを用いた講義課題不正回答の防止を行うことはできます。実際に実験をしていないので断言はできませんが、かなり強度が強いと思います。

 

けど、ここまでする必要ありますかね?不正を防止するのもそりゃあ重要ですが、それよりも内的動機により学習を行うよう、教材に工夫をする、とかのほうが建設的な気がします。

あと、この方法使うと講義で学んだ内容を全くほかの場所で使えないのもよくない。学んで終わり。さあ次の実用的な言語ってなる。

 

けど、大学って実学じゃない部分を学ぶことにも意義があって、そこをやらないなら専門学校もろもろでいいじゃん、ってなるのは確かにそうなんだよなぁ。難しい。

 

 

以上。皆様良いお年を。