矢沢さんもJavaを教えるのは難しいと仰っています。ポイントは以下。
(1)キー入力に時間がかかる
(2)プログラムの改造をやってくれない
(3)オブジェクト指向は難しい
(1)はコード補完でなんとかできるかもしれませんが、やはり文字列が長くなり、さらに英語嫌いとなると可読性は極端に落ちてしまいます。(2)は。。。難しいですね。。。題材次第といえばそれまでですが、改造したくなるようなものがあれば。。。でも万人に受けるのは難しいですね。(3)については、ちょうど昨日の担当授業で改めて実感したところです。以下、少し書きます。
3年生向けにServlet&JSPを用いたWebアプリ開発の授業を担当しています*1。ServletやJSPなどの仕組みはすんなり理解できるのですが、意外とネックになるのが、スクリプトレットで処理するときに必要となるコレクションクラスの取り扱いだったりします。
1,2年次にJavaの基礎を学習&演習しているはずですが、まだまだ身についていないんですね。当然といえば当然かもしれません。コレクションクラスの入出力はObjectクラスを基本としています*2。コレクションクラスからデータを取りだすときにはキャストする必要があります。例えば、以下のような感じです。キャストはなぜ必要か?きちっと理解してもらう説明が難しい。継承と実装についてしっかり理解してもらわなければならない。でも、それをやっているとWebアプリどころではなくなる。迷いどころです。
1: LinkedList a = new LinkedList();
2: a.add("takahashi");
3: System.out.println((String)a.get(0));
また、矢沢さんも書かれているように組み込み型(intやdoubleなど)はクラスではないのでコレクションクラスに入れるときにはIntegerクラスのインスタンスに入れて。。。などという説明が必要になります。また、Tigerから採用されたオートボクシングのお陰でさらに説明がややこしくなります。新人教育となると数ヵ月後には実戦配備されるのでしょうから、大学とは異なりあるレベルまでに短期間でもっていく必要があるでしょうから大変だと思います。
このあたりの処方箋は、小さな問題の積み重ねしかないのかな。。。と思っています。Javaの様々な機能と有効性を確かめられるような10数行程度のサンプルを数十、数百と組んでは動かしているうちに「型」を体得できると思います。そのような教科書ってあまりないかもしれませんね。このあたりの教育訓練法がしっかり定まっていないことも、ソフトウェアはエンジニアリングではない、といわれる由縁なのかもしれません。