実用的なプログラミングの学び方はいろいろありますが、プログラミングというもの自体について徹底的に扱った書籍を利用するというのはその一つです。
有名な古典として "Structure and Interpretation of Computer Programs"(邦題:計算機プログラムの構造と解釈, 1985年) がありますが、ここでは比較的新しい "Concepts, Techniques, and Models of Computer Programming"(邦題:コンピュータプログラミングの概念・技法・モデル, 2004年) を読みます。この本を選んだ理由として、並行・分散プログラミングのような現在では実務的にも重要になっている領域のモデル・技法も逐次的なプログラミングと同等程度に重視して取り扱っていること、サービスのアーキテクチャのような大規模なソフトウェアの設計をする際に通用するような方法でプログラミングの概念と技法を教えていることがあります。
これを読むことでプログラミングについて深く理解し、小手先仕事ではなく、確たる判断軸を持って適切にプログラミングをできるようになることがこの会の目的です。
なので、例えばプログラミングを始めて、ひとまず動くものは作れるようになったけど、任意の言語で様々な領域のものをどう書くか、なぜそのように設計するのか、といったことについてはまだ一貫して説明できないと感じているような人や、経験は積んだけどあまり体系的に学んでこなかったというような人の方が得るものが多いと思います。
以下、本書まえがきより一部を抜粋したので、興味のある人は読んでみてください。
---
【この本の目的】
- プログラミングを教えること -
この本の主目的は、プログラミングが統合的な学問である、ということを教えることである。プロのプログラマに役立つ科学的な基盤を伴う統合的な学問である、ということを。
- プログラミングとは何か -
本書ではプログラミングを一般的な人間の行為、すなわち、システムの機能を拡張あるいは変更する行為、と定義する。プログラミングは広範囲にわたる行為で、非専門家(例えば、目覚まし時計や携帯電話の設定を変更する消費者)および専門家(コンピュータプログラマ、すなわち、本書の読者)によって行われる。本書はソフトウェアシステムの構築にピントを合わせている。システム構築の場において、プログラミングはシステム仕様と、それを実装するプログラムとの間のステップである。このステップは、そのプログラムのアーキテクチャと抽象化を設計することと、それらをプログラミング言語によってコーディングすることとでできている。これは広い見方であり、おそらく普通、「プログラミング」という言葉に付与される意味合いより広いであろう。これはプログラミングを「狭い意味」にも「広い意味」にも捉えている。つまり、(言語に関係しない)アーキテクチャの問題も、(言語に関係する)コーディングの問題も含んでいる。ある特定のプログラミング言語よりはさまざまな概念とそれらの使い方を基礎にしている。こういう広い見方が、プログラミングを教えるのに自然であると思う。ある特定の言語や設計法の限界に足を引っ張られない。特定の状況下では使用するツールの機能と限界を考慮して、この一般的な見方を調整する。
- 科学であり技術である -
科学であり技術であるこのように定義したプログラミングには、2つの重要な面がある。技術とその科学的基盤とである。技術とは、プログラムの実行を可能にするツール、実用的技法、および規格である。科学とは、それによってプログラミングの理解を可能にする予言能力を持つ広く深い理論である。理想としては、科学は技術をできるだけ直接かつ有効に説明すべきである。どちらか一方が欠けてもプログラミングはできなくなる。技術が欠けると純粋数学と変わらない。科学が欠けると小手先仕事になる。すなわち、深い理解に欠ける。よって、プログラミングを正しく教えるとは、技術(現在のツール)と科学(基礎的概念)とを共に教えることである。学生がツールを知ることは現在に対する備えである。学生が概念を知ることは将来の発展に対する備えである。