web-dev-qa-db-ja.com

プロジェクトの規模と言語の厳格さの間に相関関係はありますか?

言語の厳格さとパラダイムの違いを私の同僚に説明したところ、私は次のように主張しました。

  • 動的言語やインタープリター型言語などの寛容な言語は、プロトタイプや小規模なプロジェクト、または中規模のWebアプリケーションに最適です。 PythonまたはJavaScriptとNode.jsのようなエレガントな動的言語を選択すると、次のような利点があります。

    1. 迅速な開発、

    2. ボイラープレートコードの削減

    3. Javaのように「企業言語」から逃れる若い創造的なプログラマを引き付ける能力。

  • 静的に型付け/コンパイルされた言語は、ビジネスに不可欠なアプリや中規模から大規模のアプリ向けのアプリなど、より厳密性が要求されるアプリケーションに最適です。

    1. 何十年もの間開発されてきた有名なパラダイムとパターン、

    2. 静的チェックのしやすさ

    3. 数十年の経験を持つ多くのプロの開発者を見つける能力。

  • Haskell、Adaなどの厳格な言語、またはC#のコードコントラクトなどの技法は、ライフクリティカルシステムや非常に安定していることが期待されるシステムなど、柔軟性よりも安全を優先するシステム(Has​​kellが非常に柔軟である場合でも)に適しています。利点は次のとおりです。

    1. コンパイル時にできるだけ多くのバグをキャッチする機能、

    2. 静的チェックのしやすさ

    3. 正式な証明のしやすさ。

しかし、大企業による大規模プロジェクトで使用されている言語と技術を見ると、私の主張は間違っているようです。たとえば、Pythonは、YouTubeや他のGoogleアプリケーションなどの重要な量の厳密さが必要な大規模システムで正常に使用されます。

プロジェクトの規模と、使用すべき言語/パラダイムの厳格さの間にはまだ相関関係がありますか?

考慮し忘れていた3つ目の要因はありますか?

どこが間違っているのですか?

74

あなたの主張は間違っていません。あなたは少し深く掘る必要があります。

簡単に言えば、大きなシステムは1つの言語だけでなく、複数の言語を使用します。 「厳密な」言語を使用して構築された部分がある場合と、動的言語を使用して構築された部分がある場合があります。

あなたのGoogleとYouTubeの例については、Pythonは主にさまざまなシステム間の「接着剤」として使用していると聞きました。これらのシステムが何で構築されているかを知っているのはGoogleだけですが、Googleの重要なシステムは、C++やJavaなどの厳格な「企業」言語、またはGoのように独自に作成したものを使用して構築されています。

大規模システムに寛容な言語を使用できないわけではありません。 FacebookはPHPを使用していると多くの人が言いますが、この規模でFacebookを効率的に使用するには、Facebookが非常に厳しいプログラミングガイドラインを作成する必要があったことを忘れています。

したがって、はい、大規模プロジェクトにはある程度の厳格さが要求されます。これは、言語またはフレームワークの厳密さ、またはプログラミングのガイドラインとコードの規則のいずれかから発生します。大学を卒業してPython/Ruby/JavaScriptを与え、何百万人ものユーザーに対応するソフトウェアを書くことを期待することはできません。

24
Euphoric

大規模なシステムでの私の経験は、言語の選択ではなく、design/architectureまたはテストカバレッジの問題によって立つか下がるかということです。大企業のプロジェクトには、平凡なPython 1よりも、才能のあるJavaチームが必要です。

そうは言っても、大幅に記述できる言語コードが少ないは一見の価値があります(例Python vs Java)。おそらく将来は賢いでしょう、高度な型推論を使用した静的型付き言語(たとえば、Scalaモールド内)。または、C#などのハイブリッドがdynamic修飾子を使用して試行しています...?

そして、「他の」静的型付けの利点を忘れないでください:適切なIDE code-completion/intellisense、これは私の見解では、必要な機能ではなく、必須の機能です。

3
Cornel Masson

チェックするエラーには、タイプエラー(整数と浮動小数点数のリストを連結したもの)とビジネスロジックエラー(銀行口座への送金、ソースアカウントにお金があるかどうかのチェック)の2種類があります。

動的プログラミング言語の「動的」部分は、型チェックが行われる場所です。 「動的に型付けされた」プログラミング言語では、各ステートメントの実行中に型チェックが行われ、「静的に型付けされた言語」では、コンパイル時に型チェックが行われます。また、静的プログラミング言語用のインタープリター( emscriptem のように)を作成でき、動的プログラミング言語用の静的コンパイラー( gcc-python など)を作成することもできます。 shed-skin します)。

PythonやJavascriptなどの動的プログラミング言語では、プログラムのビジネスロジックだけでなく、プログラムに構文エラーや型エラーがないかどうかを確認するための単体テストも作成する必要があります。たとえば、浮動小数点数のリストに「+」整数を追加すると(これは意味がなく、エラーを発行します)、動的言語では、ステートメントを実行しようとすると、実行時にエラーが発生します。静的プログラミング言語では、 C++、Haskell、Javaの場合、この種の型エラーはコンパイラーによってキャッチされます。

動的にチェックされるプログラミング言語の小さなコードベースは、ソースコードを100% カバレッジ にするのが簡単であるため、型エラーを探すのが簡単です。それだけです。コードを手動で数回実行し、さまざまな値を指定して完了です。ソースコードを100%カバーしていると、プログラムに type errors がない可能性があるというかなりのヒントが得られます。

動的にチェックされるプログラミング言語の大きなコードベースでは、特に、不注意で、引数に応じて文字列、リスト、またはカスタムオブジェクトを返す可能性がある関数を作成する場合、可能なすべての型の組み合わせですべてのステートメントをテストすることは困難です。

静的にチェックされたプログラミング言語では、コンパイラーはコンパイル時にほとんどの型エラーをキャッチします。ゼロによる除算エラー、または範囲外の配列エラーも型エラーであるため、私はほとんどを言います。

多くの場合、実際の議論はプログラミング言語についてではなく、それらの言語を使用する人々についてです。たとえば、アセンブリ言語は他のプログラミング言語と同じくらい強力ですが、JavaScriptでコードを作成しているためです。どうして?私たちは人間だからです。最初に、私たちは皆間違いを犯し、特定のタスクに特化した専用ツールを使用することで、エラーが発生しやすく、エラーが発生しにくくなります。次に、リソースの制約があります。私たちの時間は限られており、議会でウェブページを書くことは完了するまでに時間がかかります。

3
vz0

もう1つの考慮事項は、大規模なアプリケーションの作成の背後にあるwhoです。いくつかの大規模なエンタープライズスタイルのプロジェクトでRubyまたはPython=を使用したいが、ITマネージャーによって一貫して「撃ち落とされ」ている)たくさんの場所で働いてきたプロジェクトのオープンソースの性質上、企業のセキュリティチーム。

「Ruby on Railsは使用できません。これはオープンソースであり、重要な情報や保護された情報を盗むハッキングが行われる可能性があるためです。 「申し訳ありませんが、オープンソース==悪という考え方を誰かが持っていると、それを変更することはほぼ不可能です。その考え方は企業の病気です。

C#とJavaはtrustedtrustedプラットフォームでの言語です。RubyとPythonは信頼できる言語ではありません。

0
Jarrett Meyer