基本は火曜日に隔週で進める。これで引くと、以下のようになる。
- 導入
- 第1章 プログラミング概念入門 (1/8)
- 第I部 一般的計算モデル
- 第2章 宣言的計算モデル (1/22)
- 第3章 宣言的プログラミング技法 (2/5)
- 第4章 宣言的並行性 (2/19)
- 第5章 メッセージ伝達並行性 (3/5)
- 第6章 明示的状態 (3/19)
- 第7章 オブジェクト指向プログラミング (4/2)
- 第8章 状態共有並行性 (4/16)
- 第9章 関係プログラミング (5/14)
- 第II部 特殊化された計算モデル
- 第10章 グラフィカルユーザインタフェースプログラミング (skip)
- 第11章 分散プログラミング (5/58)
- 第12章 制約プログラミング (skip)
- 第III部 意味
- 第13章 言語意味 (skip)
なにを目的にしているか:
【この本の目的】
プログラミングを教えること
この本の主目的は、プログラミングが統合的な学問である、ということを教えることである。プロのプログラマに役立つ科学的な基盤を伴う統合的な学問である、ということを。
プログラミングとは何か
本書ではプログラミングを一般的な人間の行為、すなわち、システムの機能を拡張あるいは変更する行為、と定義する。プログラミングは広範囲にわたる行為で、非専門家(例えば、目覚まし時計やセルフォン(携帯電話)の設定を変更する消費者)および専門家(コンピュータプログラマ、すなわち、本書の読者)によって行われる。本書はソフトウェアシステムの構築にピントを合わせている。システム構築の場において、プログラミングはシステム仕様と、それを実装するプログラムとの間のステップである。このステップは、そのプログラムのアーキテクチャと抽象化を設計することと、それらをプログラミング言語によってコーディングすることとでできている。これは広い見方であり、おそらく普通、「プログラミング」という言葉に付与される意味合いより広いであろう。これはプログラミングを「狭い意味」にも「広い意味」にも捉えている。つまり、(言語に関係しない)アーキテクチャの問題も、(言語に関係する)コーディングの問題も含んでいる。ある特定のプログラミング言語よりはさまざまな概念とそれらの使い方を基礎にしている。こういう広い見方が、プログラミングを教えるのに自然であると思う。ある特定の言語や設計法の限界に足を引っ張られない。特定の状況下では使用するツールの機能と限界を考慮して、この一般的な見方を調整する。
科学であり技術である
科学であり技術であるこのように定義したプログラミングには、2つの重要な面がある。技術とその科学的基盤とである。技術とは、プログラムの実行を可能にするツール、実用的技法、および規格である。科学とは、それによってプログラミングの理解を可能にする予言能力を持つ広く深い理論である。理想としては、科学は技術をできるだけ直接かつ有効に説明すべきである。どちらか一方が欠けてもプログラミングはできなくなる。技術が欠けると純粋数学と変わらない。科学が欠けると小手先仕事になる。すなわち、深い理解に欠ける。よって、プログラミングを正しく教えるとは、技術(現在のツール)と科学(基礎的概念)とを共に教えることである。
どこまでを学ぶか:
【この本を使って教えること】
この本が情報学(informatics)のカリキュラムにいかに適しているか、またどういうコースを教えることができるか、について説明する。情報学とは・コンピュータ科学、コンピュータエンジニアリング、および情報システムを含む情報技術の全フィールドを指す。情報学はコンビューティング(computing)と呼ばれることもある。情報学カリキュラムにおける役割情報学の他の領域と切り離してプログラミングという学問について考えよう。経験上、自然に核となる3つの主題に分かれる。
- 概念と技法
- アルゴリズムとデータ構造
- プログラム設計とソフトウェアエンジニアリング
この本では、主題(1)を徹底的に扱い、主題(2)と(3)は入門にとどめる。順序はどうすべきか?(1)と(3)の間には強い相互関係がある。経験によれば、学生に悪い習慣がつかないように、プログラム設計は早期に教えるべきである。しかし、これで話は終わらない。設計を表現するための概念について学生が知る必要があるからである。Parasは(3)から始め、命令的計算モデルを使う道を採った。この本は多くの計算モデルを採用しているのでそれらを使って、新しい概念と設計原理を、一緒に導入しながら(1)と(3)を並列的に教えることを奨める。