ただ Java を使えばいい
(teamten.com)- 私がいちばん好きな言語は Python。にもかかわらず、私はどこでも――簡単なスクリプトにさえ――Java を使っている。
- いくつかの経験:
- Java ベースの会社で、テストシナリオを JavaScript で書いたことがあった。しかし、スタックトレースの追跡が難しく、Java と JavaScript の間のブリッジコードを書くのに無駄な苦労をした。
- ログを json フォーマットで保存していたのだが、同僚の開発者がこのログを扱う
logcatというプログラムを作った。そのプログラムには満足していたが、その後、似たようなプログラムを Java で作ると 10 倍以上の性能向上を示した。 - Java に関する豊富な経験と資料のおかげで、Web サービスを作るという点では Python より Java のほうが速かった。厳密に言えば、これは 1 つの言語を使うことによる利点だ。
- Java について最も熱い議論は verbose(冗長さ)だ。しかし、これはまったく欠点ではない。下の 2 つのコードを見てほしい。
// java
Map<String,User> userIdMap = new HashMap<String,User>();
// python
userIdMap = {}
- だが、実際には Python のコードは次のように書かれている可能性のほうが高い。(そうでなければ、本当に保守しづらいだろう)
# Map from user ID to User object.
userIdMap = {}
- つまり、動的型付け言語を使うことは、30 分でかっこいいものを作るために 14 日後の生産性を犠牲にするようなものだ。
- Stack Overflow は ASP.NET を使って(2010 年に)5 台のサーバーで 60,000,000 ページビューをさばいた。
- 単体テストの例を見てみよう。単体テストを書いて保守するのは時間を消費する。特に、型で簡単に確認できる例外的なケースは、動的型付け言語のユニットテストでもうまく捕まえられない。(例: パーサー)
- (Python を使わない理由を 1 つ付け加えるなら)その場しのぎの解決策(quick hack)はだんだん大きくなって非常に重要なツールになるが、それを書き直す余裕はなく、結局使うたびにパフォーマンスと保守性に苦しむことになる。
- 最後に、他の静的型付け言語ではなく Java を好む理由
- C/C++ は私の業務に適用しにくい
- C# はクロスプラットフォーム対応が不十分だ
- Scala は複雑すぎる
- D や Go のような他の言語は、私の業務に投入するには新しすぎる
- 私がこの記事を GeekNews に持ってきた理由がいくつかあります:
- 「俺は Java が本当に大好きだ!」という記事を初めて見て新鮮でした(タイトルだけ見てどんでん返しがあると思ったのですが……)
- 自分だけの(Java で作った)道具箱を持っている点が面白かったです。何かポケットからごそごそと古代の武器を取り出す老人のイメージが浮かびました。
- 私は個人的に JavaScript と Python がとても好きです。しかし、一見するとこれらの言語も「何らかの形で型を導入する」方向が主流に見えます(JavaScript には TypeScript、Python には typing/mypy)。そんな状況でこの記事を読むと、私が(型をまったく強制しないやり方で)静的型付け言語を使うのは、少し自己満足に近いのではないかと思いました。
- 著者は Java と Python の経験を持っているので、その 2 つの言語を直接比較していますが、あえてそこまで限定して考える必要はないように思います。 もっと広い観点で、静的型付け言語と動的型付け言語について、皆さんはどのように考えていますか?
PS. 特定の言語を無意味にけなすのはやめましょう :D
58件のコメント
かなり個人的な経験かもしれませんが、Java は言語そのものよりも JVM が最大の問題だと思います。
複数のバージョンの JVM でメモリ管理がうまくできないケースをあまりにも多く経験しました。
じゃあ pandas や numpy も Java で作って使えばいい。ああいう主張をする人は、近くに置かないほうがいい。
JavaはWebバックエンドに使って、PythonはAIに使いますよね。
性能を重視するならRustを使うべきで、みんな分かっている話じゃないですか?
でも今後はAIの比重が高まる見通しなので、Javaも捨てる時期に
なったんじゃないか? と思います。韓国では遅れを取ってはいけない
というマインドが強いですからね(笑)
AIの需要が高まり、一般的なREST APIや単純なCRUD作業が代替されて、そのようなシステムをもう作らなくなるなら、Javaを捨てることもあるでしょう。
また、プロジェクトが1つの言語だけで構成されていない場合もあるので、言語とプロジェクトの目的を一対一で対応づけることもできないと思います。プログラミングインターフェースはPythonで、性能が重要な部分はネイティブコードを使うケースが一般的ですから。韓国ではそのようにプロジェクトを構成するケースはあまりありませんが。
導入文が少し残念です。原文が書かれた日付を先に知らせてくれていたら、ここにいる人の半分はある程度納得したでしょうに……
私も他の方のコメントを見て気づきました。
でも私は最近書かれたものだと早合点していて、内容を読むうえでまったく違和感を覚えませんでした。少なくとも私にとっては、今でも十分に説得力のある文章です。
それとは別に、日付はたまに気にするようにします(笑)
議論が過熱しています。
反論がある場合は、その内容だけを書いてください。
サイトの利用ルールに反するコメントは削除しました。
また、利用ルールに合わない活動を繰り返していたIDはブロックしましたので、ご承知おきください。
健全な議論をお願いします。
私はOracle(JVM)よりGoogle(V8)を信頼しています。
Pythonをやっていて初めてJavaを見たときは本当に冗長だと感じましたが、最近のPythonで完全な型ヒントを追加するために必要なコードを見ていると、別にそうでもない気がします(笑)。Javaの惜しい点は、むしろメソッド名をやたらと長く付けようとする命名規約のほうだと思います。
2014年6月1日
私も静的型付け言語を好みます。
動的型付け言語に便利な面はありますが、プロダクション環境では保守が難しくなることがしばしばあります。
そして動的型付け言語は、たいてい設計思想として「シンプルなコードを書くこと」を目標にしている場合が多く、言語レベルで暗黙的に管理してくれるものも多いのですが、そのため最適化の余地が少ないこともよくあります。
結局のところ、実装のしやすさと最適化の余地の多さ、この二つの間で開発環境に合わせて検討し、選択するのがよいと思います。
10年前の記事、すごいな
そうですね(笑)
Javaを離れてから、私の人生は穏やかになりました。
Stack Overflowの調査でJavaの人気順位が下がり続けているのには、それなりの理由があります。
特に韓国では、あの政府フレームワークをSpringに固定してしまったせいで就職の際には使いどころがありますが、
欧米圏ではレガシーを除けば、新しいプロジェクトを始めるときにJavaを選ぶことはほとんどなくなっているようです
それだけの理由があるのは確かですが、その理由の捉え方が違うように思います。
TIOBEサイトでも、開発言語の順位はあくまで参考用に見るべきで、市場シェアや人気と直接関係するものではないと言及されています。
結論として、Pythonが圧倒的シェアで1位ですが、市場に出ているツールはありますか?
最もよく目にするのはC/C++と.NET、そしてJava(Kotlin)およびSwiftです。
質問や検索が多いからといって、よく使われている言語というわけではありません。
Pythonは専攻していなくても誰でも使える言語です。
人気が高いことは否定できませんが、開発市場では話が別です。
InstagramはバックエンドにPythonを使用しています。
Javaを使えばいいだけです
「市場に出ているツール」がどういう意味なのかは少し曖昧ですが……Django、FastAPI、PyTorch、NumPy、Pandas など、ツールは十分にあるのではないでしょうか……?
タイトルを見て、まずコメントに期待して入ってきたwww 最近は言語に頼れる幅が広がりましたね
コスト面だけに限れば、Javaはメモリ使用量のせいでクラウドでは費用がかさみがちです。静的言語なら100MB、200MBのメモリで済むプログラムでも、Javaで書くと1GB、2GB必要になることがよくありますし、軽量スレッドもライブラリ互換性の問題で使えない場合が多いです。
Javaをそのまま使ってください
Javaも静的言語ですが……メモリの問題はガベージコレクタやJVMに関するもので、あなたが言及した「静的言語で100MB、200MBのメモリが必要なプログラム」というのは、C、C++のようなネイティブ言語に当てはまる話だと思います。
幻覚してしまい、すみません。涙 Javaも静的言語で間違いありません。クラウドではあれこれのコストを合算すると、メモリ1Gあたり3万ウォンほどを見込む必要があるので、Javaで開発するサービスは非常に高いコストがかかることが多いです。
例外が存在するなら動的型付け言語です。別の話として、型システムとメモリ使用が別個だという論点には同意します
おっしゃっている例外の意味がかなり広く感じられるのですが、もう少し詳しく説明していただけますか?
私の知る静的型付け言語/動的型付け言語の定義では、変数の型がコンパイル時に決まっていて、それを変えるときに明示的な操作が必要なら静的型付け言語であり、動的型付け言語は実行時にいくらでも変数の型を決められたり、暗黙的に変えられたりする言語でした。
ランタイムでダウンキャストを行うような状況に直面すると、Java はランタイムで型チェックをしなければなりません。こうした理由から Java は動的型付けであり、そのときに発生するのが例外です。
根本的にこのギャップがなければ、例外を例外と呼ぶ必要はありません。
throwは、throw するオブジェクトをグローバル変数に入れておいてgotoするパターンのシンタックスシュガーになるでしょうおっしゃっていることと似たように、型チェックをランタイムで行う言語を動的型付けと呼びます。ただし、これはプログラムで扱われるすべての値についての話です。Java の話なので Java を例にすると、Java のコードはコンパイル時に型チェックされますが、これはその変数に対応する値が変数の型と一致していなければならないという重要な含意を持っています。
型チェックをランタイムで行うからといって動的型付けなら、Cも動的型付け言語なのでしょうか?
voidポインタという概念があると思いますが、両者にはどのような違いがあるのでしょうか。どのCコンパイラがコードに型チェックを組み込み、型が一致しないときに明示的なエラーを発生させるのでしょうか? そのような実装があるなら、例を1つだけ挙げてください。
C には、その過程で型チェックと呼べるものがありません。浮動小数点のデータを整数として読んでも何の問題にもならないでしょう? 動的型付けなのではなく、単に危険なだけです。
はい、Cが型チェックをランタイムで行うなら動的型付け言語です。
そうではないので、静的型付けです。
voidポインタは、単に元のデータ型が分からない raw ポインタです。そのポインタが指しているアドレスにどの型があるのかは分かりません。私の持論は、慣れ親しんだ言語が最高だということです。
同意します。チームや組織で使っている言語から外れるのも、なかなか簡単ではないように思います。
業務内容やアサインが分かれる理由はいろいろありますが、そこに言語の違いまで加わると、特定の人員に業務負荷が集中し、人の入れ替わりがあると業務が進まなくなります。採用にも影響する要素なので、技術スタックの選定は慎重に行うべきだと思います。
ただ、逆に慣れているという理由だけで、採用プールが小さい、あるいは採用後に別途学習が必要な言語に固執するのも、それはそれで問題でしょう
C# のクロスプラットフォーム性がなぜ不十分なのでしょうか。最近は .NET のサーバーアプリの大半を Linux サーバーにデプロイしています。
Python はそもそも比較対象ではありませんし、Kotlin や C# と比べて冗長で、必要な機能も多く欠けているのは事実だと思います。
ああ、10年前の文章なんですね。今は状況が大きく変わりました
C#も仮想マシンを使う言語なので、クロスプラットフォーム対応はもっと早く出ているべきでしたが、私の知る限りではごく最近になって出てきたものなので、そのため当面は「Windows以外のOSでも動かせるらしい」程度の認識が続く気がします。
しかも、365日稼働するサーバー中心のLinux環境であれば、そのシステムで10年以上にわたって安定性が検証されてきた他の言語よりも、十分に実績が検証されていない.NETを敬遠するのも事実です。
そういう意味で、クロスプラットフォーム性が不足していると言っているのではないでしょうか
では、安定性が検証される基準とは一体何なのでしょうか? 単に利用期間のことをおっしゃっているのか、私にはよく理解できないのですが。
10年前の文章なので、.NET Coreが誕生してからそれほど経っておらず、あのように書かれているのです。
すでに.NETアプリケーションはLinuxやMacでも安定して問題なく動作します。
Python風の簡潔な文法に静的型が付いた言語のようなものはないかと探していたところ、偶然GDScriptを見つけたのですが、これは汎用的に使うには難しいという点が大きな欠点です。
機会があれば、Godotで小さなプロジェクトを進めてみて、GDScriptを触ってみることをおすすめします。
Kotlinに触れてから、Java嫌いになってしまいました…
Javaは、何か機能が必要になるたびに、実証済みの正解があるという印象を受けました。
そのままKotlinを使ってください。
その件もあって、(私もKotlinユーザーとして)メールでKotlinについての意見を伺ってみたのですが、使ったことがないので経験を語るのは難しい、という返事をいただきました。
私は静的型付け言語が好きです。考える必要性を減らしてくれるので、その時間をほかのことを考えるのに使えるからです。
Javaは本当に独特な地位にある言語です。最後にJavaを仕事で使ったのはおよそ10年以上前ですが、今でも何かのプログラムを趣味ではなく業務として開発しなければならないなら、第一候補として検討する言語の一覧に入ります。
今仕事で使っている主な言語はAdaとC言語ですが、個人的に、あるいはチーム内で使うツールは主にPowerShellで書いています。ところが書いていて少し時間がたつだけで(5分だけでも……)、「この変数の型は何だったっけ?」と考えているんですよね。なので最近は型を必ず明記しています。(PowerShellは変数定義に型を指定することも、省略して動的に使うこともできます)
私はCもあまり好きではありません。Adaならコンパイラが弾いてくれる型関連のエラーを、Cはまったく捕まえてくれないからです。Cのような文法でAdaの型システムをサポートする言語があればいいのに、とよく思います。
JavaScriptとPythonはいまひとつ好きになれませんね。PerlやShell Scriptは……考えたくもありません。
C言語の基本哲学である「プログラマーを信頼せよ」のせいで、仕方ない気がしますね..
あ、それと私はJavaは好きですが、Mavenは嫌いです。
昔の良き時代には、Antですべてできたんですよ!
Java にレコードやパターンマッチングが追加されるなど、ゆっくりとモダンな言語に追随してきているので、その点はまだ救いだと思います
Javaはリファレンスが多いので良いのですが、それだけならなぜC++ではだめなのかと思ってしまいます。
Javaの利点について、もう少し話があればよかったです。
私が主に c++ を使っているので c++ を例に挙げただけです。私も java は良い言語だと思っていますが、私が指摘したかったのは、あの元の投稿には java の長所についての話が不足しているということでした。
java が大好きと書いたのであれば、java の長所の話がメインになるべきなのに、他の言語への批判がメインになっているように見えたのです。ご意見いただいたとおり、java の jvm は非常に優れていると思います。
全面的に同意します。あえてJavaに限定して話すつもりはない、というdisclaimerはそういう意図でした。うまく伝わらなかったようですが..
比較対象がJavaとC++という時点で、なんだか信頼度が一気に下がりますね(笑)
普通にJavaを使えばいいです。
JavaはJVM上で動くので、ローカルとマシン環境を同じようにセットアップできます。C++ですべての開発者とマシンの環境を同一にしようとすると、かなりの時間がかかるでしょう。保守も難しいですし……
元の著者は、単にC++を適用しにくい業務だからJavaを使っているだけのようです。おそらくPythonとC++のどちらかを選ばなければならないなら、C++を選んだのではないでしょうか?
修正: "最後に、他の静的型付け言語ではない理由" -> "最後に、他の静的型付け言語ではなくJavaを好む理由"
薪によく火がつくな.. 激しくおすすめ
私が望んだ炎ではありません(泣)
暖かいですね..