一歩先行くJavaプログラマが読むべきオープンソースソフトウェア10選

10万行コード読んだらJava分かるよってTwitterに書いたらすげぇ勢いでRTされたので、調子に乗って捕捉エントリ書くよ。

Java Core API

JDKインストールしたディレクトリに入ってるsrc.zipを展開すると入ってるから読むと良いよ。
すぐ近くにあるのから読むってのはメンタル的に楽でいい。
厳密にはOSSじゃなくて単に公開されてるってだけなんだけども、JavaプログラマなのにコアAPIのコード読んでないとか無いよね?
どれから読めば良いか分からんかったら、

辺りをまずはキチンと理解すること。当然コードを読み終わったら、それを使ってコードを書く事。

OpenJDKを読むことで、プログラム言語してのJavaではなくランタイムとしてのJavaを理解する事が出来ます。
Java出来ますって言ってるのにOpenJDKのコードをチェックアウトした事も無いようならモグリである可能性は高い。

サーバ編

Javaプログラマなら大体一度や二度はお世話になってるTomcat様ですよ。
ServletAPIの仕様と併せて読むべし。
Tomcatだけ読んでると世界に絶望しかねないので、口直しにJettyも読んでおくと味わい深いです。


Servletコンテナ系は分かってきたなと思ったら、テキトーなWebアプリケーションを書いてwarにパッケージングした上で、
そのWar内から利用していないと思えるサーバのコードをゴッソリ消した上で、
そのWarがちゃんと動くかどうか確認すると良いとオモウヨ。


ピュアJavaで高速に動作する上に高機能だけど、何か色々アレなH2Databaseはマジオススメ。
色々アレってのは、どういう事かは読めば分かるかと。
ちょっとした何かを作るのにはH2databaseがマジ便利。
LL系の皆様におかれましては、SQLite辺りがRDBとしては人気かと思いますが、
JavaからSQLiteは面倒な事も多いので、H2Databaseをを使うと良いとオモウヨ。
コードを全部読んだ上でRDBを使うと新しい地平が見えますです。

フレームワーク

Javaプログラマたるもの、DIコンテナを知らずに済むって話はありませぬ。
出発点は大体同じだったような気がしないでもないけど、その思想が違う為に全く違った実装になるのです。
DIコンテナが接続できるフレームワーク的な何かをひと通り追いかければ、
Webアプリケーションを作る為のパーツは何でも揃うと思って間違いないので、DIコンテナは出発点であり終着点であるのです。


JVM系言語編

プログラミング言語たるJavaを学習する為に、新しい言語のコードを読むというのはそれなりに敷居の高い事ではあるものの、
Javaがどの様な価値を持つランタイムであるかを理解する為には、言語としてのJavaとは違ったパラダイムを持つ言語を理解するべきです。
Scala辺りは何だか流行ってる気配があるけど、Scalaのコード書くだけで満足してはいけない。
どの様に実装されているのか確認するのです。

ツール編

Mavenリポジトリは最高だけど、ツールとしてのMavenは正直余り好きではない。
だってやりたい事に対してコードの量が多すぎるのだもの。
でもビルド系ツールがやりたい事ってMavenの中に全部入ってる。
そしたら、オレオレビルドツールを作る前に一度は読んでおかなくちゃ。

勿論eclipse。他のIDEの話はきっと他の誰かが捕捉してくれる。
間違いない。NetBeansとかIntelliJとか。
どれ使ってるにしても、自分が使ってるツールのコード読んでないとか大分ヤバい。
ピカチュウが電気出さないくらいヤバい。


eclipseにはJavaの理想と現実が詰まっている。


ローカルにインストールしてあるeclipseには当然ながら「Eclipse Classic」ダヨネ?
そうしたら、コードみてぇな、ってUIでおもむろに「Shift + Alt + F1」これでOK。
Plug-In Spyってプラグインが起動してコード読み放題。
とりあえずJavaのコード開いて、Plug-In Spyを起動して

  • org.eclipse.jdt.internal.ui.javaeditor.CompilationUnitEditor

辺りを読めば良いとオモウヨ。
利便性の裏に隠れて普段は見えない先人たちの努力の結晶がそこにあるから。


でもまぁ、こればっかりだとUIばっかりで辛い現実と直面する事になる。
夢の世界を一目見る為には、

  • Window -> Show View -> Other

と選んで出てきたダイアログで、

  • Plug-in Development -> Plug-ins

を選ぶ。そうするとインストールされているプラグインの一覧が見える。
そこでテキトーなプラグインを選んで、右クリック

  • Import As -> Project from a Repository...

を選ぶ。ユーザIDとパスワードとか聞かれるかもしれないけど「anonymous/anonymous」って入れとけばOK。
沢山あって迷っちゃうけど、僕のオススメを敢えて3つ選ぶなら

この二つはかのErich Gamma先生がキチンとデザインし書いたコードが入っているし、
現実に動くある種の理想を体現したオブジェクトモデルがならんでる。
そして一方でオブジェクト指向における限界点みたいな所に到達している。
それが何なのかはまた別のお話。
そうこれらのプラグインを読む事でオブジェクト指向の深淵を垣間見る事が出来るのです。
その辺に幾らでもある動く訳でも無いうすっぺらい説明なんかよりも絶対に価値あるコードが今そこにある。

僕の環境はWindowsだからプラットフォーム名がWindowsっぽいけど、
それぞれの環境に合わせたプラットフォーム名のプラグインがインストールされている筈。

この辺のコードを見ると、「Write Once Run anyware」とか言うのも一つの理想であって、
実際に様々な要件を勘案する中でそういう訳にもイカンよね?というJavaが持つグロテスクな一面を見る事が出来る。
うっかりそうなっちゃったとかじゃなくて、ガチでやってる高品質なグロテスクさって凄いんだよ?


「static メソッドしか持ってないクラス書いちゃう人って…m9」


とか言ってる場合じゃない。そしてやたらめったらオーバーロードされた

  • OS#SendMessage

を見るのだ。そういう事が必要であると判断出来るケースもあり、その極端な位置にあるコードを見て考えるべき事は多い。


何か10個以上ある様な気がするけど、どうせ最期まで読んでる人は居ないだろうって事で、ここは一つ。
RedHat系のアレソレとか、他にも色々取り上げて無い素晴らしいコードはあるけど、そういうのはきっと誰かが補足してくれるさ。