限られたシーンでのお話なんだけど、割と世の中でありそうなシーンであることと、違っているところや他の観点があればアップデートしたいのでQiitaにpublishする。
あと、細かい構文レベルでの差異を取り扱う記事は多く見られるものの、様々な観点で比較している記事が少なく見えたことも書いた理由。
比較の前提
- 既存のJavaシステムをSpring Bootで再構築する
- Spring Bootについては、特定のコンテキストなため、ここでは取り扱わない
- 細かい言語レベルの差異は比較対象外
- 数十人規模のチーム開発
Java
メリット
- 実績
- ミッションクリティカルなシステムを含め、多くの開発実績がある
- 人
- 学習コストを支払い済みの人が多いため、実質学習コストが低い
- 技術
- Optionalだと実行時null safe可能、@Nullableとか使えばコンパイラレベルでnull safe可能だが…
- 将来性
- Oracle次第な面が少し薄れてきているし、色んなベンダーが関わっているので危うさは低い
- 情報流通
- 新しいもの古いものあるが、総じて得られる情報は圧倒的に多い
- 再構築文脈
- 再構築時、同じ言語であれば再利用が可能
デメリット
- 人
- エンジニアの母数としてJava人材は非常に多いが、玉石混交になりがち
- 生産性
- 慣れたKotlinエンジニアに敵わない?
- 再構築文脈
再構築時、同じ言語であるが故に単純なコピペも可能、せっかくの再構築なのに台無しなコードが混じる可能性あり
Kotlin
メリット
- 人
- 採用時、Kotlinができる = Java人材と比較して高レベルの人材である確率が上がる
- 技術
- 構文レベル+コンパイラレベルでnull safe、他にもJavaで陥りがちな落とし穴を構文レベルで防止している感
- 生産性
- 慣れるまでは上がりづらいが、慣れればJavaと比較して高い?
- 再構築文脈
- 再構築時、異なる言語であるため、単純な流用ができず、変換やリファクタリングをするため、台無しなコードが混じる可能性が低い
デメリット
- 実績
- Androidはさておき、サーバサイドの言語として大規模だったり複雑性が高かったりする実績が少ない
- 人
- 学習コストを支払い済みなエンジニアが少ないため、学習コスト高め
- 将来性
- JetBrains主体でOSSとして開発し、GoogleがAndroid標準としているが、JVMありきなため、Oracleの去就がリスクになりうる?
- 情報流通
- Javaと比較すると、圧倒的に得られる情報が少ない
- 再構築文脈
- 再構築時、異なる言語であるが故に変換やリファクタリングが必要