いろふ Advent Calendar 2014 2日目 @irof さんが書いたJavaエンジニア養成読本を読んだ

この記事は いろふ Advent Calendar 2014の二日目。

昨日の記事はうらがみさんの「スタックトレースろふ #irof」でした。

ことしもやってきました、いろふAdvent Calendar。
今年は [twitter:@daiksy]さんの依頼で作成いたしましたが、ご本人の登録がまだありません。
早くご登録していただけることをお待ちしております。

さて、もう先月となりましたが、Javaエンジニア養成読本が発売されました。

Javaエンジニア養成読本 [現場で役立つ最新知識、満載!] (Software Design plus)

Javaエンジニア養成読本 [現場で役立つ最新知識、満載!] (Software Design plus)

この著者の中にのざきひろふみさんという方がいらっしゃいますが、Googleで検索して彼のFacebookページを見るとなぜかいろふさんのアイコンが見え隠れしたりします。
(中略)*1

実は、Javaエンジニア養成読本を送付いただきましたので、そちらに関するレビューということで、この記事を書かせていただきます。
ただ、全部書こうと思ったら結構長くなりそうなので、全体に対する感想と、のざきひろふみさんが記述された記事についての感想を中心に述べたいと思います。

全体としての感想としては、昔Javaをやっていた人が今のJavaがどうなっているのかを俯瞰するために良い本だと思いました。
JavaJavaコミュニティの概要から始まり、昨今のJavaの書き方、Java 8から入ったラムダ式、ポストStruts時代のJava EE、今のビルドやバージョン管理の仕方、ツールの使い方と、ちょっと運悪く閉鎖空間かどこかでJava 1.4を使い続けてしまったよーという浦島太郎状態の人が現実についていくためには非常に良いのではないかと思いました。
Javaの基本的なコンパイル方法やエディタの使い方について完全にオミットしてその上の層に注目点が置かれているため、薄い本ではありますが、十分ではないかと。なかなか良い。

問題点としては、この本自体はJava SE 8とJava EE 7を中心に記載されていますが、なぜそれらを中心にしたのかについては記載されていないこと、そのため、現時点では非常に良い本だと思いますが、1年後、2年後にこの本を勧めることができるかといえば、コンテキストが違うため間違いなく勧めることはできなくなってしまうだろうこと。
ムック本なのでそもそもの賞味期限が短く設定されているのだろうけれども、コンテキストの説明が無いためそれが加速してしまっているのは残念かなーという気がします。

今現時点では、Java SE 8とJava EE 7が最新仕様で、GitHubがあるからgitで、Gradleが現時点でのJava EE 7では微妙だからmavenを使用しみたいな感じで、なぜこの技術が使われたのかがわかるのですが、さて・・・・・・*2

のざきひろふみさんの書いたところについて

さて、ということで、のざきさんが記述されたところについてのツッコミを。
最初に全体をパラ見してこれは久々にJavaをやる人向けの本かなーと思ったものの、のざきひろふみさんが書かれた箇所だけ微妙に毛色が違って、いまいち対象読者がわからないという印象でした。
本を校正された人に聞いてみたところ、のざきさんが書いた場所は力尽きて校正しきれてないとのことでしたので、ああ・・・・・・という感じ。
うむ。

さて、さくさくっとツッコミいくよー。
てにをはについては突っ込まない。
P.18 HelloWorldみたいなのはキャメルケースではなくパスカルケース、もしくはアッパーキャメルケース。
P.19以降 型とクラスが同じものを示しているとは思うけれども混ざってる。
P.19

P.22 他のコンストラクタという表現は(継承関係にない)他の(クラスの)コンストラクタとも読めた。知っている人からすれば当然なのだけど?
p.22 引数なしのコンストラクタが呼び出されるというのは間違えて覚えている人が多いので記載してあるのは良いと思う
p.23 クラスフィールドとstaticフィールドの表現が入れ替わってる
p.25 StringクラスやBigDecimalクラスが悪いのだけど、もうちょっとstaticファクトリメソッドについて詳しく説明してもいいのではないか・・・・・・(ヽ´ω`)
p.27 インターフェースの実装で匿名クラスでの実装方法しかないので突然の印象を受ける
p.28 クラス名はパスカルケースでという説明なのになんでenumはアッパーケース?ていうか、クラス名以外の変数の規則の説明はないのか
p.29 アノテーションの概要の説明がないままいきなり@Overrideアノテーションの説明に入ってる
p.29 アノテーション一般的な話で、valueという変数名は省略できるという話なのに、@Pathアノテーション固有の話に見える
p.29 動的な情報を持たせることはできないので、やりたいと思っても他の方法を検討したほうが良いでしょうとは???できないから諦めて他の方法をやってくださいでは・・・・・・(ヽ´ω`)
p.29〜p.31 ネストしたクラスとインナークラスとの差で重要なのはエンクロージングインスタンスへの参照を持つかどうかなのだけれども、29ページと31ページとに説明が分散している
p.30 正しくクラス #とは
p.31 イミュータブルにすることで貴重な脳のリソースを状態追跡に割かずに済むとは?最新の状態が何かをきちんと考えないといけないのは一緒では?
p.35 異常時の判断にコードを使用するのは問題?戻り値のこと?
p.35〜 全体的に例外の説明は参考になりますが、個人的にはThrowable#addSuppressedについての説明が欲しかった
p.36 Java VMからの文句という表現は好きだ!
p.38 AutoCloseableへの導線がほしいかなぁ。
p.45 プリミティブ型の説明で言語自体に組み込まれているというのは語弊があるのでは。BigDecimal等も言語仕様に含まれているわけですし。
p.47 ファクトリメソッドを使用すれば必ず余計なインスタンスが生成されないというように読めるのは微妙では。
p.49 スレッドについては書かないっぽいのにスレッドセーフといきなり出てきているのは違和感。書きたくなる気持ちは非常によく分かる(ヽ´ω`)
p.51 多くの場合emptyList()を使用するのが正解という表現は、微妙な気が。多くの場合は要素数0のListを作ってから要素を追加するので、多くの場合ではない気がします。
p.52 拡張for文に対応するのはfor(int i=0〜のはずで、isEmptyと対応させるのは違和感。
p.55 タグという記法という表現は微妙な気が。タグを使用してでは。
p.55 GCがない場合にどうする必要があるのかの説明がない

と、こんな感じでした。
ページ数は短いながらガチ付箋張りながら隅から隅まで読みましたぜ。
のざきひろふみ先生の次回作に期待しています╭( ・ㅂ・)و ̑̑ グッ !

*1:考えるのが面倒くさくなった

*2:渡辺さんの記事はここらへんがきちんと書かれていてさすがだなぁと思いました。