タイトルの通り、Javaに戻ってきました。
見える世界がまるで違う。強くなって初めて分かるぜ。Javaってこんな仕組みだったのか!?てきな。
ウェブアプリケーション開発に新言語を採用したときにインフラで考えたこと
仕組みというのは↑的な意味です。
駆け出し時と今の違い
僕の駆け出しのときの状況ですが、
- Java
- プロジェクトのプログラミングルールを覚える
- tomcat
- IDEの使い方
- DBとの接続ツールの使い方
- Gitの使い方
- SQL
- リリースなどのオペレーション
- 障害対応
- 社内用語
- 先輩との付き合い方
- チャットツールとの付き合い方
- HTTPとかWeb全般の知識
- クロスサイトスクリプティングとかセキュリティ関連の話
- HTML
- JavaScript
- Websocket
- 認証方式
- LinuxOS
- サーバーマシンのスペックによる上限値の意識
などなど、覚えることが多く正直深く理解せずに、コントローラとサービス書くしかない状況でした。
(今思えば、ペアプログラミングでベテランが引っ張ってくれたら、高速道路理論が使えて成長速度が違ったと思います。)
一応、昼休みに技術書読むなど頑張ってました。
しかし、今思えばずいぶんとレベルが低かったなぁと思います。
(駆け出しなので当たり前かと思いますが。。)
現状では、記述したものはだいたい分かっている状況となっています。
その状態で改めて見たJavaの良いとこ、悪いとこをNode.jsとの比較も交えて書いていきます。
環境
- Java8
- Nginx
- Tomcat7系
- Spring4系
- MongoDB3.0系
- MongoDB3.6系
- MariaDB5.5系
- RabbitMQ
- Redis3.0
- Redis4.0
- メインのインフラはDCにあるベアメタルサーバ
- Websocket(WSS)
良いところ
- Node.jsと違って非同期のイベント駆動では無いのでコードが追いやすい
- 型があるのでコンパイルさえ通れば割と動くという安心感がある
- Javaは使われているし、枯れてもいるので安心感がある
- やろうと思えば非同期処理も書ける
- ググれば色々と情報が出てくる(量が多すぎて逆にノイジーでもある)
- MongoDBがスキーマレスなので、Java側で型を使ってスキーマ定義できるのは非常に良い
悪いところ
- コンパイルに時間が掛かる
- 回避方法はあると思うが、プロジェクトの現状では2分30秒掛かる
- IntelliJ IDEA(統合開発環境)が無いと開発できない(なんとかしたい。。)
- Node.jsの場合、VimとかVisualStudioCodeとか自由だった
- テスト(JUnit)が、Node.jsのMochaと比べて書きづらい
- 事前処理とか事後処理を明示的に書きたいが、テスト内にごちゃっと書くしか無い。
- Springのせいで実装がしづらい(バッチ処理もまともに書けない状況)
- SpringもDIがほしいだけなら、Google Guiceとかもある
- SparkJavaとかシンプルだと思う
- 同期型のせいか?わからないが、全然パフォーマンスが出ていない
- これに関しては、現在のプロジェクトの実装の仕方がまずい可能性も高い。
- 生存期間の短いオブジェクトでもクラスを作る
- 1リクエストパスでしか使わないようなVOクラスは、ListとMapで良いと思う。
- Node.jsではListとMapしか使ってないようなもので、それでも運用できていた。
- コーディング速度優先のテスト駆動開発さえできれば、ListとMapでも行けると思う。
- Getter, Setter要らなくないですか?
- Mavenのせいかもしれないが、ディレクトリ構成が不格好
- アノテーションのせいで動作の仕組みがわからずに苦労することがある
- メソッド前に動くのか?メソッド後に動くのか?とか実装見ないとわからん
- アノテーションは仕組みがぱっと見でわからんのでダメだと思う
- Lombok程度なら良いと思います
まとめ
なんか悪い点に書いたものって、実装次第で全然変えられると思う。
Javaの今までの慣習が邪魔なだけな気がする。
Node.js風のJava開発とかをやってみたら面白いのでは?と思う。
(そういえば、CyberAgentに居るときにPlayFrameworkを使ってNode.js風の開発をしていた人が居た気がする。)
僕としては早く帰るには、速く実装する必要があるので、それが出来る環境にしたいです。