Pharoによるプログラミング入門

3年生ゼミのプログラミング入門では、言語環境としてPharoを採用した。今まで個人学習のためにSmalltalk/80系の言語を推奨したことはあったけど、全体で採用したのは始めての試みである。

私がメインで開発に使用している言語ながら、今まで入門として使ったことがなかったのは、率直に言ってプログラミングの経験が全くない初心者に教える自信がなかったから。

その考えが変わったのはいろいろあるのだけれど、大きな理由の一つはちょうど良い題材が見つかったからである。「がまぐ」は土本さんが編集されている中高生向けのオンラインゲーム雑誌であるが、オッサンホイホイの異名通り私もすっかり虜になって、これをネタとしてみたいという思いが強くなった。

 がまぐ:http://sites.google.com/site/gamagreader/

Morphicならば元のJava実装よりも、かなりコンパクトに作れるだろうし、初心者でも十分把握できるレベルになるのではないかと思った。SqueakでなくPharoを選んだ理由は、単に個人的に興味があったのと、パッケージングがシンプルだということ。

授業の組み立てとしては、最初にProfStefで簡単な入門を行った後、「がまぐ 2011/2」のJackPotを例にPharo環境の説明を行い、後半は「ブロック崩し」「ピンポン」「弾幕ゲシュタルト(がまぐより)」から1つを選んでもらい、設計から作り上げるというもの。

前半のJackPotでは、オリジナルソースのPharo版のメソッドを一つ一つ説明しながら、役割や文法について理解してもらい、プレイヤーの高速化や宝物入手時の動作など「がまぐ」と同じストーリーで進めていった。

JackPotでは4種類のオブジェクトが登場する。「自分」「敵」「宝物」「ゲーム本体」である。MVCのようなすっきりとした設計ではなく、オブジェクトとその表現が直感的につながるよう、各々Morphとして実装していった。

後半で学生に実装済みのゲームを見せたところ、圧倒的に「弾幕ゲシュタルト」が人気だったので、設計から取りかかることにした。設計といってもゲームを見ながらオブジェクトを見いだしてCRCカードを作成するというもの。二人一組でゲームを文章化し、その文章をもとにオブジェクトや属性、振る舞いを明確にしていく。それほど厳密な定義ではなく、作成途中で方向性を見失わない程度のものとした。

最初にJackPotからキーボード処理など流用できる部分をコピーさせ、その後一つずつオブジェクトを仕上げていった。1台のPCを二人が交互に使うように、ペアプログラミングもさせてみた。10名の受講者がいたので5組のチームに分けた。

かなり単純化して提示したものの、全くの初心者である学生にとっては、難易度の高い学習体験だったことは間違いない。受講者中の1名は興味を持った4年生だったが「昨年のゼミよりずっと難しい」とコメントしていた。

それでも5組中の1組はほぼ完全に理解し、2組は自力である程度作れるようになった。残りの2組はサポートがあれば何とかできそうといったところ。レベルの差こそあれ、プログラムと動作との関係をきちんと理解した上で、きちんと問題解決しているようだった。当初の見込みよりはかなり高いレベルに達したと思うし、オブジェクト指向プログラミングの基本的な考え方は身に付いたのではないかと思う。

もちろん、教えた範囲はかなり限定している。基本的な考え方としては、オブジェクトとメッセージパッシング中心で行い、クラス階層や継承なども教えていない。キーワードメッセージもできるだけ引数1つになるように誘導していった。題材が単純で、かつ面白いということも良い方向に作用したようである。

8月3日からゼミ合宿が始まる。メインは4年生の卒研発表なのだが、3年生からも2組の発表がある。完全に理解した組と要サポートの組である。この両者の発表を通じて、前期の成果がどの程度なのかわかるだろう。とても楽しみにしている。