Edited at

逆転オブジェクト指向入門

More than 3 years have passed since last update.


要旨

B. Meyer. The outside-in method of teaching introductory programming. In Manfred Broy and Alexandre V. Zamulin, eds., Ershov Memorial Conference, volume 2890 of Lecture Notes in Computer Science, pages 66--78. Springer, 2003. に出てくる outside-in method (Inverted Curriculum)の自分なりの理解をメモとして残す。かなり自分(tomooda)の解釈を盛り込んでいるので、原著の正確な内容を知りたい人は 原著 に当たること。


背景

プログラミング導入教育では、最小限の言語機能を使って小さなプログラムを書くところから始まることが多い。例えば Hello World とか。配列に格納された数値の平均値を求める、など。それは学習者を森の中に放り込んで、森全体の形を見せずに木ばかりを見せることになるのではないか。C++やJavaで課題を与えると、ググル駆動開発でコピペで提出する学生が出る。コピペ開発は「再利用」の名に値しない(少なくとも工学的には)ものであり、望ましくない。プロフェッショナルなプログラミングに必要なのはシステムを「正しく構成する」ための能力だ。その重要な1つが、抽象能力である。従来の、小さな実装から始めるアプローチでは、抽象に辿り着くまでの道のりが長い。


外から中へ

「外から中へ」のアプローチは、その逆である。「外から中へ」のアプローチはソフトウェアを理解する最良の方法は高質なソフトウェアを「使う」ことだ、という仮説に基づいている。現代では多くの「プログラミング初心者」は既にコンピュータのユーザーだ。彼らの多くは普段からコンピュータプログラムを利用している。そこが出発点ではないのか。大きなプログラムを手にして、そのインターフェイス(API)からその内容を分解していき、小さなプログラムの実装に到達するのではないのか。プログラムを理解する視点を、消費者としてプログラムを外から見る視点から、開発者としてプログラムを中から見る視点に進めていく。それが逆転オブジェクト指向入門の背骨である。


外から見る

学習者はまずライブラリに触れる。ライブラリには高品質なモデルがあり、学習者は実装ではなくインターフェイス(契約)を通してモデルを理解する。これによって学習者は Hello World のようなオモチャではなく、意味のあるプログラムを構築することができる。

原著者が提供するプログラミング入門クラスで学習者が最初に取り組む課題は、パリの観光客向けに地下鉄路線図をマップ上に表示してお勧めコースをゲーム感覚でグラフィカルに表示する、というものだ。合計12行の Eiffel プログラムで、本体は4行である。強力かつ高品質なクラスライブラリがあるために可能になっている。ここから中のメカニズムにだんだんと踏み込んでいくことで、(教育目的とはいえ)方便でごまかすことなく進んで行くことができる。

良い開発者になるためには抽象能力は欠かせない。プログラムを実装からではなくインターフェイスから理解することで、抽象というものがいかに重要なことなのかを理解することができる。


中から見る

そして学習者はプログラムの実装を学ぶ。あるコンポーネントは他のどのようなコンポーネントを利用しているのか。そのコンポーネントの契約が、他のコンポーネントの契約(事前条件、事後条件、不変条件など)を利用してどのように実現されているのかを理解する。正当性証明までする必要はない。

学習者は契約プログラミングに触れることでプログラミングを系統的で論理的なものとして理解することができ、ソフトウェア工学に進むことができる。プログラマの中には契約(事前条件、事後条件、不変条件)を怖がる者がいる。また、多くのプログラミング言語は契約のための言語機能を提供していない。高品質なライブラリと契約プログラミングのための機能を持った言語で「外から中へ」教えることで、学習者はプログラミングの基本としての数学を恐れることなく学ぶことができる。


まとめ

契約プログラミングとしてのオブジェクト指向を前提としたプログラミング導入教育の方法論の1つとして「外から中へ」進んで行く手法を紹介した。前提として、高品質なクラスライブラリ(もちろん質の高い契約が記述されていることを前提としている)が必要であり、Bertrand Meyer は Eiffel のクラスライブラリの利用を勧めている。

プロフェッショナルなプログラマを養成する大学でのカリキュラムとして興味深い提案である。コンピュータサイエンス専攻ではない大学生に対してはどうなのか。契約(論理式)の理解を必須とするのは敷居を高めるかもしれない。また、コンピュータサイエンス専攻の学生のうち一定数は既にプログラミング経験を持つが、彼らにとって提案手法はどのような効果があるのか。今後の研究や実践の進展が楽しみである。


補足

オブジェクト指向プログラミングといってもそれは単一の技術要素を示すのではなく、いくつかの共通要素を持つ複数の「流れ」が存在すると考えられる。

* Smalltalkを始めとする、メッセージングを中心としたオブジェクト指向

* C++を始めとする、抽象データ型の発展形としてのオブジェクト指向

* Eiffelを始めとする、契約を系統化する枠組みとしてのオブジェクト指向

原論文の著者である Bertrand Meyer は 契約プログラミングのためのプログラミング言語 Eiffel の設計者であり、また、多くの形式的仕様記述言語の言語設計や方法論に貢献した研究者である。今回対象としている論文はその Bertrand Meyer が取り組んでいるプログラミング導入教育のエッセンスを示している。また、彼がこの Inverted Carriculum を実践する時に使っているのが、自身が書き下ろした教科書 Touch of Class Learning to Program Well with Objects and Contractsである。