2024年7月30日
Java Champion
EverforthとAcroquestの2社で正社員として働くエンジニア。仕事のかたわらでコミュニティ活動も行っており、日本Javaユーザーグループの代表を務めるほか、アメリカで開催されたJavaOneやSpringOneなど国内外のイベントで登壇。その実績から日本で3人目の「Java Champion」に任命された。著書に『Java本格入門』(技術評論社)。趣味は対戦格闘ゲームと、BABYMETALを追いかけて世界中を旅すること。
X: @cero_t
Blog: https://cero-t.hatenadiary.jp/
こんにちは、Java Championの谷本 心 (@cero_t) です。前回に引き続き、私の技術力を培ってきた書籍、オススメしたい書籍を紹介します。今回はJava Championの名に負けない、Javaに関する書籍です。言語の習熟度別に、「初心者〜中級者向け」、「一段階レベルを上げたい人向け」、「さらにレベルを上げたい人向け」の3段階に分けて、それぞれのフェーズにおいて出会いがちな課題に向き合うヒントを得られる書籍を6冊紹介します。
多くのプログラミング言語は定期的にアップデートされて、新しい機能やAPIが追加されます。もちろんJavaも例外ではありません。以前は約2〜3年ごとにメジャーバージョンアップされていましたが、最近では半年ごとのメジャーバージョンアップで、2〜3年ごとにLTS版(長期サポート版)がリリースされるという形になっています。ただ、いくらJavaの新しいバージョンがリリースされても、現場では古いバージョンが利用されることがありますし、たとえ新しい新しいバージョンを使っていても、古いスタイルやAPIが使われたりすることが少なくありません。
2010年前後、さまざまなプロジェクトに参加していた私は、古いスタイルのコードをたくさん目にしてきました。単にスタイルが古いだけに留まらず、まるでC言語のコードかというようなJavaのコードもありました。私はそこに強い課題意識をもったため、JJUG(日本Javaユーザーグループ)の勉強会などで「from Old Java to Modern Java」という発表を行っていました。
タイトルの通り「以前はこう書いていたコードが現代ではこう変わっている」という所に焦点を当てた発表です。それが出版社の編集の方の目に留まって書籍の執筆を打診され、同僚たちと一緒に書いた書籍が『Java本格入門~モダンスタイルによる基礎からオブジェクト指向・実用ライブラリまで』です。
本書はJavaの機能やAPIについて解説しながら、現場ではどのように利用しているか、またバージョンアップによって書き方やスタイルがどう変わったかという点に力を入れて説明しています。そういう点でいえば、タイトルに「入門」という言葉が入っているものの、実際には本書は「再入門」と呼ぶべき「入門書を終えた2冊目」や「10数年前の知識で止まっている人向け」という位置付けの書籍です。
いくらプログラミング言語に新しい機能やAPIが追加されたとしても、プログラマーがそれらを継続的に習得し続けることは意外と簡単なことではありません。いったんプログラミング言語を習得した後、まったく知識のアップデートをしないことだって現実的にはよくあります。特に当時Javaは最もよく使われていた言語だったため、プログラマーのレベル感にもばらつきがあり、知識のアップデート具合も人によってさまざまだったのです。
またJavaは後方互換性を重視して開発されている言語であるため、メジャーバージョンアップしても既存のコードは変更せず、既存のコードをそのまま動かせることが少なくありません。逆に言えば、古いスタイルやAPIを使って書かれたコードでも問題なく動作するのです。それが仇となって、知識をアップデートしないままとなる要因になったのかも知れませんね。
そんな偉そうなことを言っておきながら、本書は発売から10年が経過し、一部の内容はもはや古いものとなってしまいました。そのため、新しいJavaのバージョンに合わせた第二版も鋭意執筆中です。
『Java本格入門』は再入門のための書籍という位置付けであると前述しましたが、これから初めてプログラミング言語を学ぼうという入門者の方には、次の書籍がオススメです。
こちらはプログラムをつくりながら、プログラムの楽しさや難しさを体験するような形となっています。つまり座学的な知識の列挙ではなく、手を動かしながら学んでいくという位置付けです。特に入門者がハマりやすい開発環境構築やミスしやすいプログラミングの部分についても、できるだけつまづきにくく、分かりやすい言葉で説明されています。
これから仕事でJavaを使うという方にとって、まさに「1冊目」の書籍としてオススメできます。
私も会社勤めのITエンジニアですから、中途採用のための面接や、パートナーをアサインする案件を決めるための面談を行うことがあります。対話を通じて面談相手のレベルやポジション、適性などを把握していくのですが、特にプログラミングを中心に行ってきた方に、私は必ず一つの質問をするようにしています。
それが見出しに書いた「あなたは、OSS(オープンソースソフトウェア)のコードをどれくらい読みますか?」というものです。
まったく読んだことがない、読もうと思ったこともないという方もいらっしゃれば、フレームワークやライブラリで問題が起きた時や挙動を確認したい時に部分的に読むという方や、自分たちでフレームワークやミドルウェアを拡張するために読む方、また勉強や趣味として読むという方もいらっしゃいます。そして、やはりOSSのコードを読む機会が多い人ほど技術力は高い傾向にあり、より難しい仕事を依頼しやすくなると感じています。
私自身の話でいうと、新人時代に「Strutsというフレームワークは、どういうことをしているんだろう」と疑問に思って、そのコードを読んだのが最初でした。その後もいくつかのOSSプロダクトのコードを読んで挙動を把握したり、独自拡張をしたりしているうちに、OSSプロダクトのコミッタとして活動するようにもなりました。これらの活動を通じて、コードの書き方やAPIの使い方、設計方法、あるいはまったく自分が知らなかったテクニックなどをたくさん学ぶことができました。
しかしながら、OSSコードを読み始めるのは大変です。特定のAPIの挙動を把握する場合など、対象が明確に分かっていればまだしも、「そもそもこれはどう動いているのか」と思って調べる場合には、どこから読み始めれば良いか分からないこともあります。
そんな時に助けられたのが、この書籍です。
本書はいくつかのOSSプロダクトについて、どこから読み始めれば良いのかを示したうえで、そのOSSプロダクトが使っている設計や実装のテクニックなどを紹介しています。具体的に取り上げているOSSプロダクトは次のようなものになります。
本書ではそれぞれのプロダクトについて、主要な部分や特徴的な部分のコードを示しながら、リフレクションなどのAPIやデザインパターンなどの設計手法を、どのように適用しているかを説明しています。私もデザインパターンは座学的に勉強したものの、それらが実際にどう使えるのか、どう使うべきかはよく分からない状態だったのですが、本書を読むことで「あぁ、こういう風に使えるのか!」と納得したものです。
もちろん各プロダクトのすべてのコードを説明しているわけではありません。しかし、対象がOSSプロダクトなのですから、この書籍で学んだところを切り口にして自分が気になった箇所について、公開されているコードを読みにいくこともできます。そのような時に役立つよう、本書ではOSSのコードを読みながら図を描く手法や、統合開発環境を使ってコードを追うための手法なども紹介されています。
ただ、残念なことに本書は20年近く前の書籍ですので、今となってはあまり使われないプロダクトもあります。またJUnitやSpring Frameworkのように現役で使われているプロダクトであっても、当時と今ではコードも大幅に変わっています。しかし、コアな部分の考え方に大きな違いはありませんから、本書を導入に用いることで確実にコードが読みやすくなると思います。そうやってコードを読むことに慣れてしまえば、本書で扱われていないOSSプロダクトのコードも読み進めやすくなります。
そもそもさまざまなテクニックや設計手法が詰まったプロダクトのコードがインターネットに公開されており、気軽に読めるというのは本当に素晴らしいことです。
世はまさに大公開時代! 読め! コードのすべてはそこに置いてある!
本書を羅針盤としてOSSの大海原への航海に出かけましょう! オープンソース!!
さて、テンションを通常に戻しますが、前回でも書いた通り、私はJavaアプリケーションの監視やトラブルシュートを行うためのツールを業務で開発していました。そのためトラブルシュートやパフォーマンスチューニングの仕事をすることも少なくありませんでした。その経験を通じて、この分野は他の分野に比べて「とても詳しい人」と「まったく知らない人」に差が生まれやすいように思いました。そのひとつの要因が、トラブルシュートやパフォーマンスチューニングなどについて書かれた書籍が少なく、結果的に業務でそれらの知識が必要になった際には、得意な人が呼ばれて解決するケースが多い点にあると感じています。
ここで紹介したいのは、そんなトラブルシュートやパフォーマンスチューニングに役立つ貴重な一冊です。
本書は次のような内容をカバーしています。
Java SEの実装やデータベース処理などで発生しやすいパフォーマンス問題についてもある程度は述べられているものの、本書の中核はガベージコレクションやJITコンパイルなどJavaVMの持つ機能の詳しい解説とそのチューニング方法にあります。複数あるガベージコレクションのアルゴリズムの違いや、オプションによる挙動の変化などについて詳しく説明されています。
これらがきちんと紹介されている日本語の書籍はなかなか他にありません。
また、ツール類についても紹介されているため、単に知識としてヒープメモリやガベージコレクションについて知るだけでなく、実際にツールを使って自分が作ったアプリケーションの状態を把握することもできます。実際に手を動かして理解するのとしないのとでは、身につき方は大きく違いますからね。
ただ、ガベージコレクションやJITコンパイルなどに関する話題は、以前に比べて目にする機会が減っています。おそらくその背景にはクラウドサービスの普及があるでしょう。オンプレミス環境にサーバを構築していた時代には、あまり気軽にハードウェアリソースの増強ができず、限られたリソースの中でパフォーマンス改善させることを余儀なくされました。クラウドサービスが普及した現代では、仮想サーバのリソースを追加することが比較的容易になり、パフォーマンスを改善する代わりにスケールアウト・スケールアップさせて凌ぐこともできるようになりました。
しかし、本書で述べられているような知識を備えてパフォーマンスの良いアプリケーションを開発・運用することで、必要なサーバリソースが抑えられ、運用コストを削減できることが有益であることは、クラウド時代になっても変わりません。そのようなことができる一段階上のJavaエンジニアを目指すためにも、本書を役立ててください。
ただ、残念ながら本書は2015年発売(原著は2014年発売)ということもあり、内容がJava8までで止まっています。そこで英語にはなりますが、本書の原著には第二版があります。
この書籍はJava8とJava11を踏まえたものとなっており、ZGCなど新しいガベージコレクションについても説明されています。
また、本書と似たような内容をカバーしていながら異なるアプローチをとっている書籍もあります。
こちらもJITコンパイルやガベージコレクションについても詳しく説明しながら、現場での活用や教訓などについても述べられている書籍です。洋書を読むことに抵抗さえなければ、『Javaパフォーマンス』で学んだ知識を踏まえてこの書籍を読むことで、より知識を広げ、深めることができます。
今回は「初心者〜中級者向け」、「一段階レベルを上げたい人向け」、「さらにレベルを上げたい人向け」の3つに分けてそれぞれ書籍を紹介しました。次回は設計やアーキテクチャに関する書籍を紹介します。
関連記事
人気記事