既存の言語の中で何がおすすめですか?と質問された人もいます。私が「Java」と言うと、彼らは「え? Java!」と驚いていました。
Javaは、それを呪っていたすべての「動的言語」を超えました
若者の反抗的な心理のためか、人々は入門言語を真剣に受け止めていません。非常に早い段階で、コンピューター サイエンスの学生は Scheme または Pascal を使用して学習を開始しました。現在では、ほとんどの学校で Java が使用されています。多くの人が Java を嫌い、Java を使用する人を軽蔑するのはこのためかもしれません。 Javaというと祖父の世代が使っていたような気がします。 Java は時代遅れで、大きく、複雑で、肥大化していると言われます。
Python プログラマの中には、フォーラムで Python の利点を初心者に説明する人もいます。その理由の 1 つは、「Python は Java ではないからです!」というものです。 Type を書く必要さえありません...」 Java に対する彼らの不当な憎しみと盲目的な否定により、Java の重要な利点が見えなくなり、道を見失ってしまいます。勢いという点ではPythonが優勢ですが、実はプログラミング言語としてはPythonはJavaに全く太刀打ちできません。
パフォーマンスの点では、PythonはJavaよりも数十倍遅いです。静的型付けなどの重要な機能が欠如しているため、Python コードのバグを検出することは難しく、検出された場合のデバッグも困難であるため、Python を使用して大規模で複雑なシステムを構築することはできません。一部の新興企業のメインコードは Python で書かれていることがありますが、これらの企業のソフトウェアの品質は実際には非常に低いです。成熟した企業では、Python はせいぜいツールのようなもの、またはシステムの信頼性に影響を与えない小さなスクリプトを作成するためにのみ使用されます。
静的型がないため、Python で適切な IDE サポートを利用することも不可能になり、Python コードを完全に確実にリファクタリングすることはできません。 PyCharm は初期の Python プログラミング環境に比べて大幅に改善されていますが、理論上、「変数名の変更」などの基本的なリファクタリング操作を完全に確実に実行することはできないことが判明しています。
設計の観点から見ると、Python と Ruby は実際には Java よりもはるかに複雑です。多くの重要な機能が欠けており、バグのある「強力な機能」がさらにたくさんあります。いわゆる「本物のオブジェクト指向」アプローチ、いわゆる「遅延バインディング」を盲目的に賞賛しているため、これらの言語にはセマンティクスで「オーバーロード」できる箇所が多すぎます。すべてが再定義される可能性があるため、コードが大幅に不確実になり、複雑になります。 Python と Ruby のコードは悪用されやすく、理解しにくく、煩雑で、問題が発生しやすいです。
多くの JavaScript プログラマーも盲目的に Java を軽蔑していますが、実際には JavaScript は Python や Ruby よりも劣っています。これらにはすべての欠点があるだけでなく、基本的なクラス定義など、多くの必要かつ便利な機能も欠如しています。 JavaScript のさまざまな「WEB フレームワーク」が次々と登場し、常に新しいものを導入しているように見えますが、実際にはそれらはすべて闇の中で混乱しています。 JavaScript コミュニティは世間知らずであることで有名です。 JavaScript の「専門家」がカンファレンスで、あたかも偉大な発見であるかのように説いている非常に基本的な常識をよく見かけます。 JavaScript コミュニティでこうしたミーティングを開催する意味がわかりません。単につながりを築き、仕事を見つけるためだけのようです。
Javaの「後継者」はそれを超えることができなかった
最近、多くの人がScala、Clojure、Goなどの新興言語に熱中しています。彼らはこれらがJavaよりも現代的で高度な言語であると考えています。 Java は、最終的には Java に置き換わると考えています。しかし、これらの愛好家たちは、Scala、Clojure、Go が実際には彼らが解決すると主張した問題を解決するのではなく、独自の問題をもたらしていることに徐々に気づきました。これらの問題の多くは Java には見られません。
Go についてたくさんコメントしましたので、興味のある方はここを読んでください。つまり、囲碁は民間科学と傲慢の産物なので、ここでは多くを語りません。
私は最初、Scala をまるで救世主であるかのように非常に賞賛した人を何人か知っています。私は、大騒ぎするのをやめて Java を使用することをお勧めします。彼は私の言うことを聞かず、結局一日中あらゆる種類の問題について Scala を叱ることになりました。しかし、方法はありません。プロジェクトは海賊版であるため、使用し続けなければなりません。私は個人攻撃をするのは好きではありませんが、言語の品質は設計者のレベル、性格、モチベーションに依存することが多いと感じています。多くの場合、人々についての私の直感は非常に正確であるため、言語設計者の第一印象に基づいて、その言語が将来どのように発展するかを予測できます。ここでは、Scala と Clojure の設計者についての私の見解を話したいと思います。
Scalaの設計者であるMartin Oderskyは、プログラミング言語の分野で多大な功績を残し、一見奥深い学術論文を多数発表しています(実際、その多くはナンセンスです)が、彼は「設計」が特に得意ではありません。言語の「。したがって、Scala がいくつかの非常に基本的な点を間違っていることに気づき、驚きました。 Odersky は評判の良い大学教授であるため、多くの人が彼から博士号を取得したいと考えており、そのことについて話しており、Scala に不明瞭で潜在的に問題のある「機能」を追加することを好みます。その目的は、論文を発表してそれらを混合することです。卒業します。その結果、Scala は過度に複雑になり、多くの機能が追加されましたが、後にほとんど役に立たないことが判明し、代わりに問題が発生しました。学生は Scala コンパイラにコード実装を追加し、卒業後はそのまま放置するため、Scala コンパイラには歴史的なゴミやバグの山が残されます。
Clojureについて話しましょう。 Clojure が最初に登場したとき、熱心に私に勧めてくれた人もいました。そこで、デザイナーのリッチ・ヒッキー氏によるプロモーション講演のビデオを見てみました。当時、私は彼の胸打ちのスキルについては漠然としか知らなかったので、非常に感銘を受けました。リッチ・ヒッキーは本当に中途半端に僧侶になり、CSの学位も取得していませんでした。しかし、彼の勢いは他の言語設計者には何も理解できず、彼だけが真実を見ているかのようでした。でもそういう人たちにしか「宗教」は作れませんよね? Clojure が精力的に推進している「機能」 (遅延メモリ、純粋メモリ、トランザクションメモリなど) はすべて他の言語の伝聞からコピーされたものですが、その本質を深く理解することはできません。 「関数型言語」の一部の機能には本質的に問題がありますが、それらは「教義の正しさ」のために無差別にコピーされました。結局のところ、この言語は羊の頭で犬の肉を売ろうとしていることがわかりますが、実際に使用すると非常にダサいです。
Clojure コミュニティは、Scheme コミュニティと Racket コミュニティからアイデアをコピーすることに忙しいですが、それを自分たちの発明であると主張したいとも考えています。たとえば、Typed Clojure は Typed Racket を変更せずに盗用します。同じ基本概念の一部は Scheme に何十年も存在しているため、最初に Scheme で導入されたことがバレないように、別の名前に変更する必要があります。 SICP や The Little Schemer などの有名な本のコードをすべて Clojure で書き換えた人もいます。その結果、元の作品の単純さと本質は完全に失われています。結局、Clojure のすべての優れた機能はすでに Scheme で利用可能であり、Clojure のほぼすべての新機能には問題があることがわかります。私はいくつかの Clojure ミートアップに参加しましたが、その後、あらゆる種類の初心者が大きなスローガンを叫び、あらゆる種類の傲慢な市民科学を叫び、そして彼らは非常に無知であることがわかりました。
Scala や Clojure を盲目的に賞賛する多くの人々は、最終的に、これらの言語のほぼすべての「新機能」に欠陥があることに気づきました。その中で最も重要で便利な機能は、実際にはすでに Java に組み込まれています。 「ほら、Java ではこんなことはできないよ!」と私に言う人もいました。後で分析したところ、彼らは目標を達成するには最新の最もクールな言語機能を使用する必要があると潜在意識ですでに固く決められていたことがわかりました。 Java にはこれらの機能がないため、Java ではそれができないため、別の言語を使用する必要があると考えられています。実際、問題を別の角度から見て、掘り下げずに、最新で最もクールな「書き方」を追求するのではなく、問題を解決することに集中すれば、Java で問題を解決でき、きれいに解決できます。 。
今システムを構築したい場合は、Scala や Clojure で時間を無駄にするよりも、Java を使用することをお勧めします。間違った人々が間違った言語を設計し、それを使用することで全員の時間を無駄にしました。
Javaに関して特に面倒なことは何もありません
Javaには便利な機能が欠けているかもしれませんが、長い間、Javaは教育、Javaでの作業、PySonar、RubySonar、ying言語の開発に使用されてきました... Java は実際のところ、世間で言われているほど憎しみに満ちたものではありません。必要な関数の 95% 以上が Java で比較的簡単な方法で使用できることがわかりました。残りの 5% は、もう少し愚かなアプローチで問題を解決できます。
多くの人は Java を嫌います。実際、初期の GoF デザイン パターンが型にはまったテンプレートを考え出そうとしたため、プログラムに不必要な複雑さがもたらされました。ただし、Java 言語自体は実際にはデザイン パターンと同等ではありません。 Javaの設計者とデザインパターンの設計者は全くの別人です。デザイン パターンを使用せずに、Java で非常に単純なコードを作成できます。
Java は優れた IDE サポートを備えています
私は普段、IntelliJを使ってJavaコードを書いています。 IntelliJ には非常に優れた設計アイデアがいくつかあることがわかりました。これらの機能の多くは、実際にはすべてのテキスト エディター (Emacs、VIM など) を上回っています。 IntelliJ により Java はさらに強力になり、開発はまるで飛んでいるような気分になります。
IntelliJ を使用する場合、「変数の名前付け」などについて心配する必要はありません。 IntelliJ には非常に強力で使いやすいリファクタリング機能があるため、変数名を非常に迅速に置き換えることができます。したがって、最初に変数を作成するときに、完璧な名前を考え出すことを心配する必要はありません。適切な名前を使用し、コードをすばやく記述すれば、実験は成功します。次に、戻ってコードを確認し、名前をより適切な名前に変更します。
IntelliJ は非常に高速な構造変換も実行できるため、彫刻を構築しているアーティストのような気分になります。最初は大胆にコードを大まかな形に切り刻み、その後慎重に洗練し、よりわかりやすく、より魅力的な形に練り上げます。
結論
プログラミングにどのようなツールを使うかは重要ですが、結局のところ、ツールは自分の技術ほど重要ではありません。多くの人は、コードの品質が奇跡的に向上することを期待して、さまざまな新しい言語をいじることにあまりにも多くの時間を費やし、結局何も得られません。プロジェクトの成功は最終的には言語ではなく人に依存するため、言語を選択するための最も重要な条件は「使いやすい」である必要があります。