大学で最初に教える言語は何が良いか

情報科学を専攻する学部生には scheme をまず教えるということで問題ないと思いますが*1、そうじゃない普通の学生さんにプログラミングの授業でどの言語を教えるか、というのはよく話題に上がるネタです。

さすがにいまどき Pascal という選択肢はないとは思いますが、やはりC言語をいきなり教えるところも多いんでしょうか。ただ、C言語って初心者に教えるには実装に引っ張られすぎている仕様が多すぎるんですよね。例えば、実用的な用途では良く出てくる文字列の取り扱いにしてもそうです。混乱させる要素が多く、プログラミングのエッセンスを教えるには不適当と判断せざるを得ません。

文系の学生さん相手であれば、実用性メインで Excel とセットで VBA というのもあるのかもしれません。ただ、やはりマクロ言語ですので、どこまでがプログラミング言語の能力なのかなどのところで混乱は生まれてしまいそうです。きちんと閉じたコンパクトな環境から始めたい気もします。

そんな中、最近は最初にJavaを教えるケースが増えてきているようです。Java は実用面でも発展性はありますし、C言語ほど実装よりでもありません。何より、PascalやCと比べ、教えていて心が痛む量が少ないというのが大きな利点です(笑)。scheme や ML をいきなり教えられない先生方が自分に言い訳できる(研究的なバックグラウンドのある言語だし、実用的ではあるし……)ぎりぎりのラインといってもよいでしょう。

ただ、Java はお約束として書かないといけないコード量が多すぎるという欠点があります。言語としての厳密さのために、コードはかならずどこかの class の中に入れなければなりません。しかし、これからプログラミングを学ぼうとしている人にとって、public static void main なんておまじないは混乱の元になるだけでしょう。System.out.println なんていうのもいかにも不細工です。下手にアプレットに走ると、今度は Graphics オブジェクトやらなんやらとクラスライブラリに手を突っ込むことになり、学生の混乱は増すばかり。

そこで、教育用に、Java のおまじないを無くそうという試みもあります。早稲田大学の長さんによる Nigari がそれです。おまじないいらずで、いきなりコードが書けるようになっている上に、実行結果のビジュアライズも意識しています。

Nigari のアプレット版を実行してみれば分かりますが、x やら y やらの値を変えるだけで、横の表示が変更されるという仕組みです。他にも、配列の中身を一覧表示するなんていう機能もあります。Nigari は書かせるものが Java 風の専用言語になっているように見えますが、長さんのほかの作成物では、Java そのもののコードを書かせる N-Java というものもあったと記憶しています。そちらも、最初は実行したい文だけを書けば、周りのおまじない部分をくっつけて実行してくれるようなもので、学習段階に応じて徐々にシステムが隠蔽している部分を解除して、メソッドを作れたり、クラスを作れたりするようになる、というシステムでした。

ただ、ここまで頑張って Java を教えないといけないという理由もないような気がしてきます。そこで候補として出てくるのが Ruby です。

Ruby勉強会の後の懇親会で、京都女子大の小波先生とお話しする機会があったのですが、学部生相手に Ruby を教えていらっしゃるのだそうです。Ruby の利点としては、いきなり書きたいことから書き始められるので、教えやすいというのがまず一点。実行結果をシンプルに print で出せるのも魅力です。二点目としては、言語としてそんなにクセもないので、Ruby でプログラミングのエッセンスさえ理解してしまえば、C 言語や Java に乗り換えるのは簡単であろうという考えがあります。ruby は括弧の省略に端を発する混乱さえなければ、綺麗な設計をしていますし、教える先生としても心の痛みは少ないでしょう。

また、講義の自習システムとして、Web フォームからプログラムを打ち込んで合否判定を出すコンテンツを作っているというお話にも感心しました。残念ながらアカウントが無いので試せませんが、アルゴリズムとデータ構造 にある「プログラミング道場」なるもののようです。評価にも反映されるとのことで、皆、積極的にチャレンジしているとのこと。現在も全角スペースなどの典型的な間違いに関しては警告を出しているそうですが、もっと典型的な誤答例を分析して自動的にアドバイスを出せるようにするなど、自習システムとしての今後の発展も期待できます。*2

しかし、一番驚いたのは、Ruby を勉強した学生さんは、class も理解したとの話でした。どのくらい本質的な理解まで至ったのかは分かりませんが、下手に大仰に構えて教えるより、動物クラスと犬猫クラスで def bark; puts "bowwow" などをさせていたほうが理解は早いのかもしれません。

あとは、Nigari 的な、結果表示をできるだけシンプルにグラフィカルに表示できるライブラリを Ruby でも用意できれば、教育用にはもってこいな気もしますね。専用 GUI でぱっと入力してぱっと結果がビジュアライズされて、しかもインタラクティブに動く、みたいな。今度、だれかをそれとなく突っついてみるのもいいかも。

*1:今日の懇親会で、東大だけじゃなく京大もそうだと聞いて安心しました(笑)

*2:Java の誤答例収集に関しては長さんの [http://www.kake.info.waseda.ac.jp/~cho/res/proGrep.pdf:title=proGrep(PDF)] という先行研究があります