Pythonの静的タイピングの欠如は、大規模なプロジェクトの保守性と拡張性にどのように影響しますか?

StackOverflow https://stackoverflow.com/questions/3671827

質問

読んだあと この非常に有益な(やや議論的ではあるが)質問 Pythonで大規模なプロジェクトをプログラミングした経験を知りたいです。プロジェクトが大きくなるにつれて、物事は管理できなくなりますか?この懸念は、私がJavaに執着していることの1つです。したがって、私は特に興味があります 通知 大規模プロジェクトのJavaとPythonの保守性と拡張性の比較。

役に立ちましたか?

解決

私はPythonで行われた大規模な商用製品に取り組んでいます。それぞれ5000ファイルx 500行の非常に大まかな推定値を提供します。それは約250万行のPythonです。このプロジェクトの複雑さは、おそらく他の言語の10ミル+コード行に相当することに注意してください。 Pythonコードが維持できないことについて不満を言う1人のエンジニア/アーキテクチャ/マネージャーから聞いたことはありません。バグトラッカーから見たものから、静的タイプチェックによって回避できる体系的な問題はありません。実際、オブジェクトタイプの誤った使用から生まれたバグはほとんどありません。

これは、静的クラスベースの言語が考えるほど重要ではないと思われる理由を経験的に研究するための非常に優れた学術的なテーマだと思います。

そして、拡張性について。製品のデータベース1の上にデータベース2を追加しました。どちらも非SQLです。タイプチェックに関連する問題はありません。まず、さまざまな基礎となる実装を予測するのに十分な柔軟性をAPIを設計しました。この点で、ダイナミックな言語は妨げよりも役立つと思います。テストとバグの修正フレーズに進んだとき、私たちはあらゆる言語に取り組んでいる人が直面しなければならない種類のバグに取り組んでいました。たとえば、メモリ使用量の問題、一貫性と参照整合性の問題、エラー処理の問題。これらの課題のいずれかについて、静的タイプのチェックが多くの助けを持っているとは思わない。一方、私たちは、飛行中にコードを注入できるか、単純なパッチング後にコードを注入できることにより、ダイナミックな言語から大きな恩恵を受けました。そして、私たちは仮説をテストし、修正を迅速に実証することができます。

100人以上のエンジニアのほとんどがPythonを使用して幸せで生産的であると言っても安全です。おそらく、同じ品質の同じ時間で静的なタイプされた言語を使用して同じ製品を構築することは考えられないでしょう。

他のヒント

私の経験から、静的にタイプされた言語を維持するのは難しい場合があります。たとえば、パラメーターとしてカスタムクラスを受け入れるユーティリティ関数があるとします。道を進んでいる場合、このクラスの名前が変更するよりも新しい命名条約を採用する場合、すべてのユーティリティ機能も変更する必要があります。 Pythonのような言語では、クラスが同じ方法を実装するほど重要ではありません。

個人的には、邪魔になる言語を軽spしています。あなたのアイデアを表現するスピードは価値があり、これがPythonがJavaよりも利点です。

適切なテストカバレッジのないPythonの大規模なコードベースが問題になる可能性があります。しかし、それは画像の一部にすぎません。それはすべて、仕事をするのに適したアプローチについてです。

それなし

  • ソースコントロール
  • バグトラッキング
  • ユニットテスト
  • 献身的なチーム

あらゆる言語で失敗する可能性があります。

Intellijのアイデアの革新の前後の日を覚えています。大きな違いがあります。以前は、静的タイピングはコンパイル用のみでしたが、開発は基本的にソースコードをテキストファイルとして扱いました。ソースコードは構造化された情報である後、静的タイピングのおかげで、多くの開発タスクが簡単にする必要があります。

しかし、それは昔が地獄に住んでいたようではありません。私たちはそれをそのままとし、必要なことを何でもし、これまで利用可能なツールを使用し、システムを構築して満足させます。不幸な思い出はあまり多くありませんでした。それはおそらく、ダイナミックなタイピングプログラマーが今感じていることです。それは悪いことではありません。

もちろん、私は決して昔に戻ることはありません。私がそのようなIDEを使用することを禁じられているなら、私は私たちにすべて一緒にプログラミングを与えると思います。

多くのIOCまたはその他のデザインパターンを備えた、大きく動的にタイプのフレームワークで、明らかに奇形のオブジェクトのソースをトレースして、オブジェクトをスタックを直接トレースできない場合を試してみてください。

これを静的にタイプの言語で試してみてください。

オブジェクトのタイプが使用サイトの近くで文書化されていない限り(例:タイプアノテーション、A-La PythonのTypeSafeライブラリなど)、またはスタックのどこかで、それがどこから来たのかを推測することは事実上不可能です。私は、BuildBotフレームワークの一部をデバッグしようとした経験から話します。 Pydev、Komodo、Wingwareなどの派手なIDを使用しても、フレームワークを通して膨大な量の生のテキストを検索することが含まれていました。

動的言語にいくつかのタイプの制約を課すことが可能であることは疑いはありませんが、これに関する標準化の欠如は、存在する大きなフレームワークの一部をデバッグしようとしている人にとっては障害のようです。

編集:2014年以来、GuidoはPEP484、MyPy、およびタイピングモジュールを追加しました。これにより、大規模なプロジェクトを維持するという点で、私の経験がずっと良くなりました。

私の経験では、保守性は低カップリング、優れたドキュメント、優れた開発プロセス、優れたテストに依存します。静的タイピングは、これのいずれかとはほとんど関係がありません。

コンパイル時間にJavaがキャッチするエラーは、発生する可能性のあるエラーのわずかなサブセットにすぎません。また、ほとんどの場合、テストによって最も些細なことです。コードが正しい答えを生成することをテストしている場合、間違ったクラスのオブジェクトでメソッドを呼び出すことを見逃すことはできません!その点で、あなたはPythonが実際にあると主張することができます より良い 品質を確保するため。に 強制 コードに簡単なタイプミスがないことを確認するために少なくとも少しテストしてください。 行う 少なくとも少しテストしてください。

実際、Javaは、多くのバグをキャッチするための強力な静的チェックを持つ言語の非常に良い例でもありません。 HaskellまたはMercuryでプログラミングを試して、私が意味することを確認するか、Scalaでプログラミングを試してJavaライブラリとのインターフェースを試してみてください。コンパイラがあなたのために保証できる「正しさ」の違いは、SCALAライブラリを使用して通常の慣用ScalaコードをJavaライブラリを扱わなければならないコードと比較するときに印象的です(私は実際にこれを行ったので、私はAプログラムaをプログラムしているのでAndroidのScalaでビット)。

Scalaのような言語と比較してJavaの静的エラー検出の欠点にもかかわらず、多くの開発者が長期間にわたって多くの開発者によって機能した大きなコードベースで優れた保守可能なコードを作成する能力は、 まったく同じテクニック Pythonプログラマーは、Javaと比較してPythonの静的エラー検出の欠点にもかかわらず、大きなコードベースで同じことを行うために使用します。

私は、数百行から数千行まで、多くのプロジェクトにPythonを使用しました。ダイナミックタイピングは素晴らしい時間の節約であり、多型のようなOOの概念を使いやすくします。タイプシステムは、プロジェクトを維持できないものではありません。それを想像するのに苦労している場合は、Pythonにいくつかのことを書いてみて、それらがどのように進むかを確認してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top