最近、Go言語とJavaのこと、ちょっと考えててさ。なんでかっていうと、Goの新しいバージョン1.24が出たり、今後のロードマップの話が出てきたりして、またこの2つの言語の比較をよく目にするようになったから。🤔
僕も仕事で両方触る機会があるんだけど、正直、どっちが良いとか悪いとかいう話じゃないんだよな、といつも思う。なんていうか、それぞれ思想が違うというか、得意な戦場が違うというか。
一言でいうと
Goは「今」のクラウドネイティブな環境で、素早く、シンプルに問題を解くために磨かれてる感じ。一方でJavaは、良くも悪くも「巨大な歴史」を背負っていて、エコシステムの力でどんな問題にも対応できる安定感がある。…まあ、だいたいそんな感じかな。だから、どっちか一方だけ知ってればOKって時代でもないんだろうね。
実際どこで使われてるの?採用事例と求人市場の温度感
「Goって流行ってるって聞くけど、実際どうなの?」ってよく聞かれる。数字だけ見ると、まだJavaの方が圧倒的に見えるんだよね。例えば、求人数を世界規模で見ると、Javaに言及してるのが37万件以上あるのに対して、Goは5万件弱くらい。やっぱりJavaは強い。長年エンタープライズの世界を支えてきただけある。
でもね、もっと面白いのは「誰が」Goを使ってるか。例えば、あのTikTokを運営してるByteDance。あそこのマイクロサービスの7割がGoで書かれてるらしい。すごいよね。Cloudflareみたいな巨大なネットワークインフラも、中核部分でGoを使いまくってる。DockerとかKubernetes自体がGoで書かれてるっていうのは有名な話。
日本国内に目を向けても、メルカリとか、比較的新しい技術を積極的に採用しているWeb系企業がGoを使ってるイメージが強い。だから、求人数の絶対値だけじゃなくて、「どういう種類のサービスで使われているか」を見ると、Goの勢いがよくわかる。スタートアップとか、新しいマイクロサービス基盤を作るぞ!っていう場面での採用が本当に多い。
逆にJavaは、金融機関とか、大企業の基幹システムとか、Androidアプリとか…もう、社会の隅々にまで浸透してる。Stack Overflowの調査とか見ても、利用している開発者の数は 항상トップクラス。これはもう、揺るがない事実。だから、「今すぐ転職したい!」ってなった時に求人が見つかりやすいのは、正直まだJavaかもしれないね。
どうやってやるの?思想の違いがわかる技術的なポイント
じゃあ、なんでGoは新しいサービスでそんなに人気なの?って話。ここが一番大事なところで、2つの言語の設計思想の違いが一番現れる部分だと思う。ちょっと技術的な話になるけど、ざっくりと。
並行処理の考え方:ゴルーチン vs. スレッド
これが多分、一番の違い。今のWebサービスって、同時にたくさんのリクエストを捌かないといけないでしょ?
- Goのゴルーチン (Goroutine): めちゃくちゃ軽い。OSのスレッドよりもずっと小さい単位で、Goのランタイムが賢く管理してくれる。だから、ポンポン数万個とか作っても全然平気。コードもシンプルに書けることが多い。「はい、これやっといて」って感じで、気軽に並行処理を投げられる。脳みそに優しい(笑)。
- Javaのスレッド: 昔ながらのOSスレッドは、ゴルーチンに比べると重い。一つ作るのにもコストがかかる。もちろん、ExecutorServiceとか色々工夫はできるけど、Goみたいに「とりあえず並行で」とはなりにくい。最近はProject Loomで仮想スレッドっていう軽量なやつも出てきたけど、まだ完全に主流ってわけじゃないしね。ちょっと気合がいる感じ。
実行方式:ネイティブコンパイル vs. JVM
これも大きな違いだね。
- Go: 書いたコードは、ビルドすると単一の実行ファイル(バイナリ)になる。これをサーバーに置けば、それだけで動く。シンプル! Dockerイメージを作る時も、このバイナリをコピーするだけだから、イメージがすごく小さくなる。起動も一瞬。
- Java: Java仮想マシン(JVM)っていう土台の上で動く。だから、動かすサーバーにはJVMが必要。起動にちょっと時間がかかったりもする。でも、その代わりJVMが動いてるうちにコードを最適化(JITコンパイル)してくれるから、長時間動かすような処理だと、最終的にすごく速くなったりする。
この違いをざっくりまとめたのが、この表。どっちが良いとかじゃなくて、トレードオフなんだよね。
| 比較ポイント | Go言語 | Java |
|---|---|---|
| パフォーマンス感 | ビルドしたらそのまま動く。起動が爆速で、リクエストごとの遅延が安定してる感じ。マイクロサービス向き。 | 最初はちょっと重いけど、長く動かすとJVMが賢く最適化してくれる。大企業のバッチ処理とかだとこっちが強い場面もあるんだろうな。 |
| 並行処理 | ゴルーチン。超軽い。雑に数万個とか作っても平気な感じ。言語レベルでサポートされてるから書きやすい。 | 昔ながらのスレッドは重い。Project Loomっていう救世主が出てきたけど、エコシステム全体が対応するにはもうちょい時間かかりそう。 |
| エコシステム | 標準ライブラリが優秀。Webサーバーとかすぐ作れる。でも、Javaに比べたらライブラリの種類はまだ少ない。自分で作る場面も。 | 巨大。無いものは無いってくらいライブラリが揃ってる。Spring Frameworkみたいな巨人の肩に乗れる安心感はすごい。 |
| デプロイ | 単一バイナリをポイっと置くだけ。Dockerとの相性抜群。CI/CDがめっちゃシンプルになる。 | JVMが必要。jarファイルとかwarファイルとか色々ある。設定もGoよりは複雑になりがちかな。 |
| 学習コスト | 言語仕様がすごく小さい。覚えることが少ないから、他の言語から来た人でもすぐ書けるようになる。正直、これはすごいメリット。 | 言語自体も大きいし、JVMのこととかフレームワークの作法とか、覚えることが山積み。一人前になるまで時間がかかるイメージ。 |
最近のGoはどこに向かってるの?Go 1.24とこれから
じゃあ、Goは今どこに向かってるのか。Go 1.24(2025年2月リリース)の内容を見ると、それがよく分かる。
正直、派手な新機能!みたいなのは少ない。でも、すごく地味で、だけど開発者にとっては嬉しい改善が多いんだよね。
- パフォーマンス改善: 何もコードを変えなくても、CPU使用率が2-3%くらい改善するらしい。特にMap(辞書型)の内部実装が新しくなって速くなったとか。 everyday tools get better. 日々使うものが勝手に速くなるのは、単純に嬉しい。
- ジェネリクスの完成度向上: Go 1.18で入ったジェネリクスだけど、まだちょっと使いにくい部分があった。それが1.24でかなり整理されて、より自然に使えるようになった。これで、もっとコードの再利用性が高まるはず。
- ツール周りの改善: `go.mod`でツールの依存関係を管理できるようになったり、`go build`の結果がJSONで出力できるようになったり。こういうのって、CI/CDのパイプラインを組んだりする時にめっちゃ便利なんだよね。
- セキュリティ: FIPS 140-3っていう、政府機関とかで求められる暗号化の基準に対応した。これも、Goがエンタープライズ領域でもっと使われるための布石って感じがする。
で、さらに未来の話、Go 1.25以降では、ジェネリクスの仕様がもっとシンプルになる予定らしい。「core types」っていうちょっと分かりにくかった概念がなくなるんだって。言語仕様がシンプルであり続けるっていうのは、Goのすごく良いところだから、この方向性はすごく支持したいな。
要するに、Goチームは「開発者の生産性向上」にめちゃくちゃフォーカスしてる。速いビルド、シンプルなエラーハンドリング(これも今後の課題らしい)、安定したパフォーマンス。そういう、開発者が毎日幸せになれるような改善を積み重ねてる感じ。
じゃあどっちを選べばいいの?エコシステムの壁と未来
ここまで話してきて、じゃあ結局どっちがいいの?ってなると思うんだけど、答えはやっぱり「場合による」なんだよな。
Javaの強みは、なんと言ってもその巨大なエコシステムと歴史。特にSpring Frameworkみたいな、超高機能なフレームワークがあるのは強い。何かやりたいことがあったら、ググれば大抵ライブラリや記事が見つかる。この安心感は、特に大規模で長期的なプロジェクトだと重要になってくる。
一方で、Goはそのシンプルさとパフォーマンスで、特定の領域、特にクラウドネイティブな世界でJavaを圧倒してる部分がある。DockerやKubernetesとの相性の良さは、もう言うまでもない。APIサーバーとか、CLIツールとか、ネットワーク周りの処理とか…そういうのをサクッと作りたいなら、Goは最高の選択肢の一つだと思う。
Tiobe Indexみたいな言語ランキングを見ると、Javaは常にトップ3とかにいて、Goは最近やっとトップ10に入ってきたくらい(2024年末に7位)。まだまだ差はある。でも、Goを使ってる開発者の満足度はめちゃくちゃ高くて、90%が満足してるっていう調査もある。これってすごいことだと思うんだ。
だから、僕の今の結論はこう。
- 新規でマイクロサービスを作る、CI/CDを高速に回したい、スケーラビリティが大事なWebサービスを作る → 迷わずGoを検討する。
- 巨大な企業の基幹システム、豊富なライブラリ資産を活用したい、Androidアプリ開発 → やっぱりJavaの安定感は捨てがたい。
- 両方使う → これが一番現実的かも。基幹ロジックはJavaで、周辺のマイクロサービスやツールはGoで、みたいな使い分け。実際にそういう会社は多い。
Goはもう「新しい流行りの言語」っていうフェーズはとっくに過ぎて、「モダンなシステムを作る上での定番の選択肢」になったんだと思う。JavaもProject Loomとかで進化を続けてるし、これからもこの2つの言語から目が離せないね。
…と、色々語ってみたけど、これはあくまで僕の今の時点での考え。みんなはどう思う?
もしあなたが今、全く新しいWebサービスをゼロから作るとしたら、GoとJava、どっちをメインの言語として選びますか?🤔 หรือว่า「いや、Rustでしょ!」とか「Elixirもいいよ」みたいな意見も、もちろん歓迎。ぜひ、あなたの考えを聞かせてください。
