動的で解釈された言語を使用するプロジェクトのスケーリングに関する興味深い事例研究は、David PollakによるBeginning Scalaにあります。
私は自分の脳でコードをよりシンプルで、より直接的に表現する方法を探し始めました。RubyとRailsを見つけました。私は解放されたと感じました。Rubyを使用すると、はるかに少ないコード行で概念を表現できました。Railsは、Spring MVC、Hibernate、およびその他の「合理化された」Java Webフレームワークよりもはるかに使いやすかったです。RubyとRailsを使用すると、短時間で頭の中にあったものをより多く表現することができました。C ++からJavaに移行したときに感じた解放に似ていました...
RubyおよびRailsプロジェクトが数千行のコードを超えて成長し、プロジェクトにチームメンバーを追加すると、動的言語の課題が明らかになりました。
コーディング時間の半分以上をテストの作成に費やしており、生産性の向上の多くはテストの作成で失われました。ほとんどのテストは、メソッド名またはパラメーターカウントを変更してコードをリファクタリングするときに呼び出し元を確実に更新するためのものであるため、Javaではほとんど不要でした。また、2人から4人のチームメンバーの間に精神が混ざったチームで作業し、Rubyでうまくいったことを発見しましたが、チームに新しいメンバーを連れ込もうとすると、精神的なつながりを新しいチームメンバーに伝えるのが困難でした。
新しい言語と開発環境を探していました。Rubyと同じくらい表現力豊かで、Javaと同じくらい安全で高性能な言語を探していました...
ご覧のとおり、著者のプロジェクトスケーリングにおける主要な課題は、テスト開発と知識の伝達にあります。
特に、著者は第7章で動的に型付けされた言語と静的に型付けされた言語のテスト記述の違いをより詳細に説明します。
なぜラッキースティフ...は、ウサギが生き物の配列と戦うドウェムジーの配列で、Rubyのメタプログラミングの概念のいくつかを紹介します。N8han14 は、Scalaで動作するように例を更新しました...
Rubyコードと比較して、Scalaコードのライブラリ部分はより複雑でした。タイプが正しいことを確認するために、多くの作業を行う必要がありました。DupMonsterおよびCreatureConsクラスのCreatureのプロパティを手動で書き換える必要がありました。これは、よりも多くの作業ですmethod_missing
。また、クリーチャーと武器の不変性をサポートするためにかなりの作業を行わなければなりませんでした。
一方、結果はRubyバージョンよりもはるかに強力でした。Scalaコンパイラーが保証していることをテストするためにRubyコードのテストを作成する必要がある場合は、さらに多くのコード行が必要になります。たとえば、ウサギがRを振るうことができなかったと確信できます。Rubyでこの保証を得る|^
には、Rabbitの呼び出しが失敗することを確認するテストを作成する必要があります。私たちのScalaバージョンは、特定のCreatureに対して定義された武器のみがそのCreatureで使用できることを保証します。
上記を読むと、プロジェクトがさらに大きくなるにつれて、テストの作成が非常に面倒になる可能性があると考えることができます。この質問で言及された成功した非常に大規模なプロジェクトの例で実証されているように、この推論は間違っているだろう(「Pythonは...に使用されている... YouTube」)。
事は、プロジェクトのスケーリングは本当に簡単ではありません。非常に大規模で長生きするプロジェクトは、生産品質のテストスイート、プロのテスト開発チーム、その他のヘビー級のものを含む、さまざまなテスト開発プロセスを「実現」できます。
YoutubeテストスイートまたはJava互換性キットは、Dwemthy's Arrayのような小さなチュートリアルプロジェクトでのテストとは異なる寿命を確実に実現します。