技術の中心でJavaを叫ぶ -2017年のJavaエンジニアが追うべきテーマと要素技術-

# かつてJavaは技術の中心だった
私はSIerでシステム開発のアーキテクトやPMを担当しています。SIではまだまだJavaが主流ですが、文法を理解してコーディングできるだけでは活躍できない時代がすでにきていることを実感します。
私の上司が**「技術の渦」**という独特の表現を使って説明してくれたのですが、2000年から2006年ぐらいまではJavaを書くということは、いろいろな最新技術の実装を学べる時代でした。アプリケーションサーバー、XML、SOAP、MQ、CORBA、マルチスレッドなど、現代の評価としては芳しくないものも多いですが、そういった技術的チャレンジが多かったため、Javaエンジニアはあえて外に出ることもなく、ITの主要技術を学ぶことができていました。

# 時代の変化とそれへの追随
ただ、Web2.0やiPhone/Android登場以降、技術の渦はフロントエンドを経てアプリへと移ってきました。そして、最近ではクラウド、AI、ブロックチェーンやそれらを技術として支えるリアクティブや分散処理へと移動していると感じています。
Qiitaでもフロントエンドエンジニアの方々が素晴らしい技術的挑戦あふれる投稿を書いて、皆さんの人柱になっているのを目にすることが多いと思います。本当に頭が下がります。
そういう記事を見て、
「俺も(私も)ReactやAngularでMVVM開発に挑戦しなければ。。。」 とか、
「昔から知ってるJavaScriptじゃなくて、ES2015(ES6)とかTypeScriptをVisual Studio Code使って書かないと。。。」 とか、
「KotlinとかScalaはJavaに似てるから試しに書いてみよう」

とか思っているかもしれません。

しかし、**普段あまりプログラムを書く機会のないSIer所属のJavaエンジニアの皆様、そこはちょっとおいておいてもいいかもしれません。**今からその領域で追いつくのは結構きついです。さらにいうと、その領域は進化が早すぎて、今皆さんが、よちよち歩きで勉強しても、覚えたころには「そんなん、ありましたねー」と若者に平然と言われてしまうでしょう。

# 技術の中心でJavaを書く
幸いなことにJavaは今でもメジャーな言語です。Kotlin、Scalaなどいわれていますが、[Oracle Java SDKの公開アップデート終了](http://www.oracle.com/technetwork/jp/java/javase/overview/index.html)などが、発表された現在においてJavaとのインターオペラビリティがメリットであった言語はエンタープライズの世界において、不安定さが高まったと言わざるを得ないでしょう。

風速が弱くなり始めた技術の渦ではなく、Javaを捨てずに今最も勢いのある技術の渦に飛び込んでいきませんか？言語はあくまでも手段という人もいますが、どんな言語でもできるスーパーなエンジニアはそれほど多くいないと思います。すでに持っている資産で新しい分野に飛び込んでみましょう。

それではいくつかの技術の渦候補に今持っているJavaで挑戦するため、主要テーマと必要な技術を上げます。最後に整理として、必要な技術をどう学ぶかを個人の経験ですが簡単に記載しました。

# ブロックチェーン
ブロックチェーンは処理可能なトランザクションが遅いとか、現実的なソリューションがまだないとか言われていますが、最新技術を巻き込んでさらに成長を続けている分野です。ここは今から入ってもまだまだ間に合います。

## ブロックチェーンとJava
ブロックチェーン自体の説明は専門のblogに任せますが、Javaエンジニアとしてはまず以下の３つのJava向けのライブラリを通して学習してみると良いと思います。ただし、BitCoinJはエンタープライズ的な視点で見ると、オープンしたままのセキュリティバグや性能面でのスケーラビリティの問題があるため、BitCoinのことをすごく理解したいという人以外は対象外としたほうがよいと個人的には考えます。

1. [Web3J](https://web3j.io/)
1. [HyperLedger Fabric](https://www.hyperledger.org/)
1. [BitcoinJ](https://github.com/bitcoinj)

そして、これらのライブラリを使ってアプリケーションを開発してみると以下の主要技術が避けられないことがわかると思います。

- RxJava2、ReactiveStream
- Lambda関数、Stream(Java8)
- 関数型プログラミング手法(java.util.function)
- Docker

# クラウド
今更何を書くのかという感じですが、意外とSIerではEC2/RDS/S3とか、現行システムをクラウドに**リフト**する案件は経験していても、それを**シフト**するような案件は未経験であることが多いと思います。ここではいわゆるクラウドネイティブな分野を対象としています。

## クラウドとJava
クラウドネイティブ案件ではJavaははっきり言って、現時点で劣勢だと言わざるをえません。それはJavaScriptを得意とするフロントエンド勢が入ってくることが多く、AWS Lambdaを使う時はJavaではなく、Node.jsやPythonが採用されることが多いと思います。しかし、AWS LambdaもAzure FunctionsもJavaで実装できます。また、静的型付け言語の方がSIで使いやすいというメリットがあります。パフォーマンスの点でJavaは落ちるという意見もありますが、[対策はあると思います](https://www.slideshare.net/keisuke69/tune-up-aws-lambda)。さらに、関数型アプリケーションだけでなく、WebアプリケーションもDockerを使うことで容易にクラウドネイティブな構成を取ることが可能となっています。
そんな中で、クラウドネイティブなJavaエンジニアになるためには以下の主要技術が避けられないと思います。

- WebSocket/Json/WebFlux(Spring5)
- Spring Cloudなどを使用したマイクロサービスアーキテクチャ
- AWS、Azureの各種サービスを利用する上でのAPIの理解
- CloudへのDeploy (Serverless Framework)
- Lambda関数、Stream(Java8)
- Docker

# 要素技術の押さえ方
ブロックチェーンとクラウドを例にあげましたが、Docker、リアクティブ、関数型プログラミング、ストリームなどを多少でも理解しておかないとサンプルアプリケーションを修正することすらできないと感じるのではないでしょうか。

Java8やRxJava2の登場によりJavaでも最近のトレンドが実装可能なりましたが、これらは他の言語ですでに存在するアーキテクチャをJavaに持ってきています。これは設計として正しいことが保証される反面、技術的ベースがゼロの技術者が取り組む際に障壁となることがあります。すでに別の言語で語り尽くされていることが多く、Java向けの書籍でこの部分をわかりやすく説明している書籍があまりないという課題も感じました。その場合、別の言語の当該分野の書籍を読んでみるのも、遠回りですが深い理解に繋がったりもします。

以下、それぞれ少量ですが、私が学習していて理解が深まった数冊の本をコメント付きであげておきます。「鶏と卵」かもしれませんが、RxJavaや関数型プログラミングだけを学んでも「何に活用すればいいんだ？」ということになりかねませんので、ブロックチェーンやクラウドという文脈を踏まえて、以下を習得するのが挫折しない1つの手かと思います。

## Java8の知識をメンテナンスする
[Javaプログラマーなら習得しておきたい Java SE 8 実践プログラミング](http://amzn.to/2iwZSYi)
やはり、Java8の正しい理解は大切です。ラムダ式、ストリームついて不安があって理解したいなら、プログラムを書きながら是非３回ぐらい読んでみてほしいです。

[Qiita:Java8でJava8っぽいコードを書く](https://qiita.com/IsaoTakahashi/items/b07356ba465aba5c6667)
Java8っぽいというのは大事。ほとんどのライブラリはすでにJava8っぽいです。

## 関数型プログラミングを理解する
[JavaScriptで学ぶ関数型プログラミング](http://amzn.to/2iwIJhd)
[関数型プログラミングの基礎 JavaScriptを使って学ぶ](http://amzn.to/2iw1cKT)
ある程度は最初にあげたJavaの本に記載があるのですが、上記の２冊を読むことで関数型プログラミングのパワーが理解できると思います。Javaだけで理解しようとすると、なぜ関数型を使っているのかが理解しづらいという人も多いと思います。
さらに副産物ですが、括弧だらけで読むのが難しかったJavaScriptの意味がわかるようになります。

## アーキテクチャを理解する
[アジャイルソフトウェア開発の奥義 第2版 オブジェクト指向開発の神髄と匠の技](http://amzn.to/2iyh5Aj)
ブロックチェーンなどのライブラリはSOLIDの原則やデザインパターンが活用されており、全体の動きを理解するためにはこの辺りの理解が必要。

[テスト駆動開発(新訳版)](http://amzn.to/2hRiDJF)
「テスト駆動開発なんて、SIではできない！」そう思っていた自分が恥ずかしいです。この本はTDD原理主義の教本ではありません。テストコードが実際のプロダクションコードをより洗練させるということに気づかされます。
1章はJavaですので、ぜひとも写経してみてください。プロダクトのコードでなぜこういう風にできあがったのかわからないというようなコード改善の跡が見えてくるかもしれません。


[RxJavaリアクティブプログラミング](http://amzn.to/2iwNiYQ)
リアクティブは最近のアーキテクチャでは利用されることが多いです。本書籍はRxJava2をベースに書かれており、2017年においては問題ないでしょう。Spring5ではWebFluxがリアクティブの実装として採用されていますが、仕様はRxJava2と同じReactive Streamsに準拠しているので本書の理解はWebFluxの利用においても十分に役立つと思います。

## クラウドネイティブを理解する
[Amazon Web Services クラウドネイティブ・アプリケーション開発技法　一番大切な知識と技術が身につく](http://amzn.to/2ix3E3U)
クラウドは常に進化しているので、Webサイトの情報が鮮度もあって良いとおもいます。ただ、基礎的な部分を飛ばしていることが多いので、この本を読んで、クラウドネイティブの基礎を身に付けるのは近道になると思います。AWS Lambdaだけを作り続けるLambdaおじさんにはならないように気をつけましょう。

# おわり
是非、JavaEE7やSpring4などの従来のServletだけのWebではない、新しい技術の中心でJavaで挑戦してみてください。フロントエンドやScalaに挑戦するよりもずっと本質的な部分で困難さや楽しさを実感できるのではないかと思います。