torutkのブログ

ソフトウェア・エンジニアのブログ

Java書籍の選び方*1

ソフトウェア開発プロジェクトに加わるプログラマーは、必ずしも全員が使用するプログラミング言語に習熟しているわけではないのが発端です。
Javaプログラミングに習熟する一環として、専門書籍を読んで学ぶことになりますが、その際どんな本を薦めるかは常に悩みます。

  • Javaの場合、プログラミング言語の中では出版されている書籍の数が多く、目を通していないものが大半
  • 読む人の習熟度によって、適する書籍の難易度が異なる

習熟度は、最近読んだ書籍「リファクタリング・ウェットウェア ―達人プログラマーの思考法と学習法」で紹介されているドレイファスモデルで分類するとよさそうです。ドレイファスモデルは、技能モデルを5段階でモデル化しています*1

以下に、ドレイファスモデルの技能レベルと、Javaプログラミング技能においてそのレベルで読みこなし自分に取り込むことを目標としたい書籍を記載します。

レベル 名称 このレベルで読みこなせる目標となるJava書籍
第1段階 初心者 プログラミング言語Java(4版)」
第2段階 中級者 「Effective Java(2版)」
第3段階 上級者 Java言語仕様(3版)」「Java仮想マシン仕様(2版)」
第4段階 熟練者 すべての書籍を読みこなすことができる
第5段階 達人 名著を執筆する

このうち、初心者、中級者は、自力で最適な書籍を選ぶことが難しいので、この段階の人に向いていると思われる書籍の条件と書籍を列挙してみます。

第1段階 初心者

ドレイファスモデルの初心者は、「状況(コンテクスト)に左右されないルールが与えられれば仕事を遂行できる」ということなので、考えさせる本ではなく明確に言い切り型の本が適しています。
Java言語全般を押さえ、かつ実際にプログラムを書くときに必要な言語仕様とライブラリが浅くでも載っているものが良いでしょう。プログラミングはアルゴリズム+データ構造と言われるとおり、ここを重点的に押さえたいところです。

第2段階に進むための目標

指導する立場としては、第1段階 初心者は、以下の書籍をマスターすることを目標とすることを薦めます。

この本は、プログラミング言語としてのJavaについてその基盤をしっかり解説している書籍です。C言語の上級者以上であれば、「K&R プログラミング言語C(2版)」をご存知でしょう。この本と同じ位置づけにあると思います。

しかし、この本は決して入門本(チュートリアル)ではありませんので、第1段階 初心者のうち、この本を最初に読んで理解に至る人は少数で、おそらく他のプログラミング言語において、少なくとも第3段階 上級者以上でないと厳しいでしょう*2。この本の書評やWeb上でのコメントで賛否が極端に分かれているのもその表れと思います。

第1段階の最終課題 「プログラミング言語Java」を読むための準備

そこで、第1段階 初心者は、まずは入門本を勉強しプログラミング言語Javaの基礎を習得することからはじめるのがよいでしょう。

まず、Java言語の仕様(文法)(2010年5月現在であれば、最低でもJava SE 5.0以上の内容、できればJava SE 6の内容が解説されたもの)を解説し、プログラミングに導くためのアルゴリズムとデータ構造を解説している入門本(チュートリアル)をいくつか挙げてみます。入門本は、実際にコードを書いてコンパイルして動かすための手順も初心者向けに書かれているので、まずここで必要なトレーニングを積むのです。

ここで挙げた本は、Java SE 6の文法全般のほか、コレクションAPIは重要、また、実行環境(クラスパスやJARファイル形式、クラスロード、GC)についても書かれているものです。第1段階 初心者といえども仕事では実コードを書く必要もあります。そのとき、最低でもインタフェースとコレクションAPIは押さえておきたいので、その気持ちを含めて入門本をリストアップしています。なお、すべての入門本に目を通したわけではないので、ここに挙げた以外でも目的に合致している本はあるかと思います。

独習Javaには要注意

なお、最初に取り組む際に買う人が多い独習シリーズの「独習Java 第4版」はリストから外しています。この本(第4版)はJDK6対応と謳っていますが、Java 2, v1.2で導入され、アルゴリズムとデータ構造には欠かせないコレクションAPIすら解説がなく、あろうことか、java.util.Vectorクラスを

Javaクラスライブラリの中でも非常に重要なクラス

と述べている状況です。内容がJava, v1.1の頃から表面的にしか改訂されていないと思われます。

第1段階 初心者の補講

先に挙げた入門本(チュートリアル)でも難しくて読みこなせないという人も半数はいるかと思います。自分の技能レベルでは歯が立たない技術専門書は読んでも身につくことがありません。そのようなときは、その本は本棚に飾って、いったん自分に合ったさらにやさしい本から始めるしかありません。

ここは、さすが裾野の広いJava、たくさんのいわゆる入門書が並んでいますし、毎年のように出版されます。先の入門本のどれかが読みこなせるようになるためのステップなので、モチベーションが持続し、楽しそうならなんでもいいかと思います。
あえて一つだけ挙げてみると・・・

  • 第3版Java言語プログラミングレッスン(上)(下)
    • プログラミングが初めて、という人向けに書かれている入門書です。目次を見ると、まず(下)を読んでみて、それが骨と感じるようであれば(上)から読む、という方法があるかもしれません。他の言語でのプログラミング経験があるなら、(上)は少しゆるゆるな内容かもしれません。いずれにせよ分かりやすさは一品と思います。

第2段階 中級者

ドレイファスモデルでは、中級者は独力で仕事に当たれる(でも手こずる)、少しだけルールから離れられる、細部は見えるが全体を見ようとはしない、ということだそうです。第1段階 初心者は、臨機応変ができないので、「状況に応じて適切な方を選択する」と言われると困ってしまうわけですが、中級者は少し考えられるようになってきた段階です。ここからは、状況に応じた判断を身に付けていく段階です。

第3段階に進むための目標

第2段階 中級者は、以下の書籍をマスターすることを目標とすることを薦めます。

この本はルールではなく判断基準を教えています。この項目について、判断基準を理解し、自分が出会う様々な状況で判断基準に基づき適切な判断できるようになれば上級者に達します。

この手の本の難しさの1つは、本に書かれていることを鵜呑みにし、杓子定規に適用しようとする道に陥らないようにすることです。初心者が読むと、「Effective Java にこう書いてあるからこうしないといけないんだ」となってしまう点です。
2つめは、Effective Java自体、内容が難しいこともあります。問題意識がないことに対する解決策を読んでも身につかないので、実際にJavaプログラミング経験を積んで書かれている問題に直面したことがあってからでないと、読むレベルに達していないということになりかねません。

第2段階の最終課題 「Effective Java」を読むための準備

Effective Javaのようなスタイルで、もう少しやさしい課題を扱った本を読むというのが一手と思います。

第2段階 中級者の間に行うこと

上級者への道として、中級者は豊富な経験を積む(修行)段階でもあります。Java言語でいろいろな種類のプログラムを作成し、その中で様々な経験を積んでいきます。作成するプログラムによって必要な特定分野の解説書籍を揃えて参照できるようにしておくこともあるでしょう。

  • ネットワーク、マルチスレッド、データベース、GUI(Swing)、セキュリティ、テスト、Web、フレームワーク、など特定分野に特化した書籍

また、要素技術だけでなく、設計技法、テスト技法、デバッグ技法、チューニング技法や、よいユーザー・インタフェース、よい保守性などの観点もこの時期に身に付けていく時期です。

ただ、こうした観点は、独力ではなかなか気づかないので、この期間、よいメンターに付く、社外の様々な技術活動に参加し幅広い見方を学ぶ、といった活動も必要です。

良い修行を積むことができたものだけが、上級者へと至ることができます。

Javaでネットワーク(TCP/IP)プログラミングするなら

マルチスレッドプログラミングするなら

パターンについて*3

パターンに関する書籍を読みこなせるようになるのは、早くても第2段階、通常第3段階ではないかと思います。周囲に上級者がいて指導を受けられるのであれば、早い段階からパターンに触れていくのは良いことと思います。しかし、そうでない場合、第2段階で「状況に応じた判断力」を培うための修行中にパターンに触れると、人によっては

  • パターンはいいものだから積極的に使おう
  • パターンは曖昧でどこがいいのかわからない

などのような反応に陥ってしまいます。前者は、「よし、このプログラムではすべてのパターンを使ってみるぞ」のような間違った使い方をし、後者はパターンについて学習する機会を放棄してしまうので、いつまでたっても技能が向上しない、ということがありえます。

*1:こちらのページにドレイファスモデルの定義を簡単にまとめています

*2:他の言語での上級者がJava言語での初心者になるかは疑問点もありますが

*3:2010/05/20追記