ソフトウェア工学研究の日々

ソフトウェア工学の学術研究を紹介しています。ここではソースコードなどのプロダクトが研究の主役です。

Python は C よりもプログラミング教育に適しているかもしれない

プログラミング言語を C から Python に変えた効果を報告した論文

 プログラミング言語として何を使うと良いのかは重要な問題です。生のコンピュータの挙動が直接見えるC言語と、人気の高い Python ではどちらがよいか、実際にプログラミングの授業で使う言語を切り替えてみた結果を分析した論文 「A Controlled Experiment on Python vs C for an Introductory Programming Course: Students’ Outcomes」 が2018年の ACM Transactions on Computer Education に掲載されていました。

 論文中 Table 1 に授業内容が書いてありますが、全30回の授業で、代入、数式、入出力、条件分岐やループ、配列(Pythonではリスト)、ソーティングなどはまったく同じように教えています。C言語ではポインタとメモリアクセスを扱っていたところが、Pythonでは正規表現と辞書型に置き換わっていますが、全体からみると30回中3回程度なので、大きな内容の変更はありません。

 論文中 Table 2 に詳しい数字と、Table 3 に統計的な有意差の分析がありますが、それらをまとめると結果は以下の通りです。

  • 途中でドロップアウトする学生の数は変わらない。
  • 合格点(10段階評価で5点)に足りなかった学生 (Fail) の数は、Python のほうが少ないが、統計的に有意な差ではない。
  • 中間試験の平均成績は10段階評価で C言語 6.41 に対してPython 7.08 で有意に上がっている。
  • 期末試験の成績も同様で、C言語 6.72 に対して Python は 7.55 と有意に上がっている。
  • 合格者が提出した宿題(プログラム)のうち、自動テストを通過したものの割合 (Proportion of completed labs) はあ C言語 76.0% に対して Python 82.3% で有意に上がっている。
  • 合格者が提出した宿題のうち、自動テストを通過するまでに提出した平均回数は C言語 2.91 に対して Pyhon 2.46 で有意に下がっている。

 以上の結果から、Pythonを使うほうがC言語よりも、学生への教育効果は高いのではないかと結論づけられています。毎年、受講している学生の数や試験問題の内容などは異なるので、偶然内容が簡単になってしまった可能性などのリスクはあります(そうでない証拠は出せないと論文中でも記述があります)が、Python を使ったほうが実際に学生は誤りの少ないプログラムを記述でき、学習効果が上がったと考えたほうが自然です。

 開発支援ツールの導入などの被験者実験では、通常、このような大きな違いが明確に出ることは少ないので、言語の切り替えでここまで明確な違いが出ている点は非常に驚きでした。

プログラミング言語の構文の違いは初心者にとって重要である

 Python のどこが良いのか?というのはこの論文単独で明確になっているわけではありませんが、C言語系のプログラムの構文が RubyPython よりも初心者にとっては難しいという指摘が「An Empirical Investigation into Programming Language Syntax」という2013年の論文で出されています。

 こちらの論文では、予約語としてすべて記号を使う人為的な言語 Randomo を導入し、複数の見本プログラム(内容に関する説明なし)を見ながらの一連のプログラム作業(たとえば変数 x を定義して 175.3 を代入せよ、など)の正確さを評価しています。

 プログラムの見本は、たとえば Javaであれば

public static void main(String[] args) {

    double  x = z(1, 100, 3);

}

となるところが、PythonRuby ならば

x = z(1, 100, 3)

となります。Randomo は、構文自体はC言語系を採用していて、

^ Main {

  ~ x \ z (1, 100, 3)

}

となります(論文 Fig.3 より。~ が変数宣言、\ が代入です)。

 Ruby, Python, Quorum, Perl, Java, Randomo という6つの言語で学生がどのぐらい正しく作業できるかを調べた結果(論文中 Table XXIII)、

  • Ruby, Python, Quorum の3つは Randomo と有意差あり。
  • PerlJava は Randomo と有意差がない。
  • RubyJava とも有意差あり。

という結果になりました。Randomo では、記号の意味も通常とは異なっているにもかかわらず、学生たちは JavaPerl と違わない程度に作業をこなせていたことから、予約語の選び方よりも、初心者にとっては構文の違いが重要であると結論付けています。RubyPython の構文は初心者に優しい、というわけです。

 論文では、プログラミングのどこで間違うのか、構文エラーなしに正しく書けた確率を Token Accuracy Map という名前で可視化して分析しています。Ruby は正確さは一番高かったものの、 for 文における「in」や、数値の範囲を表す「..」の記述を半分以上の人が間違っていると報告されています(論文中 Fig.6)。また、Java における変数の型宣言は、既存研究でプログラマの作業に良い効果があると示されているのに、初心者には優しくない可能性があると指摘されています。

 プログラミング言語が変わっても概念は共通というふうに考えていましたが、この論文の結果からすると、初心者にとって分かるような教え方、どこに重点を置くべきかは、言語によって変えていく必要もあるのかもしれません。