Eine interessante Fallstudie zum Thema Skalierung von Projekten, die dynamische und interpretierte Sprache verwenden, finden Sie in Beginning Scala von David Pollak.
Ich suchte nach einer Möglichkeit, den Code in meinem Gehirn einfacher und direkter auszudrücken. Ich habe Ruby und Rails gefunden. Ich fühlte mich befreit. Mit Ruby konnte ich Konzepte in weitaus weniger Codezeilen ausdrücken. Rails war viel einfacher zu verwenden als Spring MVC, Hibernate und die anderen „optimierten“ Java-Webframeworks. Mit Ruby und Rails konnte ich in kürzerer Zeit viel mehr ausdrücken, was in meinem Kopf war. Es war ähnlich wie die Befreiung, die ich empfand, als ich von C ++ nach Java wechselte ...
Als meine Ruby- und Rails-Projekte über einige tausend Codezeilen hinauswuchsen und ich Teammitglieder zu meinen Projekten hinzufügte , wurden die Herausforderungen dynamischer Sprachen offensichtlich.
Wir haben mehr als die Hälfte unserer Programmierzeit für das Schreiben von Tests aufgewendet, und ein Großteil der Produktivitätssteigerungen ging beim Schreiben von Tests verloren . Die meisten Tests wären in Java unnötig gewesen, da die meisten darauf abzielten, sicherzustellen, dass wir die Aufrufer aktualisiert haben, als wir den Code überarbeitet haben, indem wir die Methodennamen oder die Parameteranzahl geändert haben. Außerdem stellte ich fest, dass es bei der Arbeit in Teams, in denen zwei bis vier Teammitglieder sich in Gedanken versammelten, in Ruby gut lief, aber als wir versuchten, neue Mitglieder in das Team zu holen, war es schwierig , die mentalen Verbindungen auf neue Teammitglieder zu übertragen .
Ich habe mich auf die Suche nach einer neuen Sprache und Entwicklungsumgebung gemacht. Ich suchte nach einer Sprache, die so aussagekräftig war wie Ruby, aber so sicher und leistungsstark wie Java ...
Wie Sie sehen, waren die größten Herausforderungen bei der Projektskalierung für den Autor die Testentwicklung und der Wissenstransfer.
Insbesondere geht der Autor ausführlicher auf die Unterschiede beim Schreiben von Tests zwischen dynamisch und statisch getippten Sprachen in Kapitel 7 ein.
Why the Lucky Stiff ... stellt einige von Rubys Metaprogrammkonzepten in Dwemthys Array vor, in denen ein Kaninchen gegen eine Reihe von Kreaturen kämpft. N8han14 hat das Beispiel für die Arbeit in Scala aktualisiert ...
Im Vergleich zum Ruby-Code waren die Bibliotheksteile des Scala-Codes komplexer. Wir mussten viel arbeiten, um sicherzustellen, dass unsere Typen korrekt waren. Wir mussten die Eigenschaften von Creature in den Klassen DupMonster und CreatureCons manuell umschreiben. Das ist mehr Arbeit als method_missing
. Wir mussten auch eine Menge Arbeit leisten, um die Unveränderlichkeit unserer Kreaturen und Waffen zu unterstützen.
Andererseits war das Ergebnis viel leistungsfähiger als die Ruby-Version. Wenn wir Tests für unseren Ruby-Code schreiben müssten, um zu testen, was der Scala-Compiler uns zugesichert hat, bräuchten wir viel mehr Codezeilen. Zum Beispiel können wir sicher sein, dass unser Kaninchen keine Axt führen kann. Um diese Gewissheit in Ruby zu erhalten, müssten wir einen Test schreiben, der sicherstellt, dass das Aufrufen |^
eines Rabbits fehlschlägt. Unsere Scala-Version stellt sicher, dass nur die für eine bestimmte Kreatur definierten Waffen von dieser Kreatur verwendet werden können, was in Ruby eine Menge Reflexion zur Laufzeit erfordern würde ...
Das Lesen oben kann den Eindruck erwecken, dass das Schreiben von Tests mit zunehmender Größe der Projekte möglicherweise unhandlich wird. Diese Argumentation wäre falsch, wie Beispiele für erfolgreiche sehr große Projekte belegen, die in dieser Frage erwähnt wurden ("Python wird erfolgreich für ... YouTube verwendet").
Die Skalierung der Projekte ist nicht ganz einfach. Sehr große, langlebige Projekte können sich unterschiedliche Testentwicklungsprozesse "leisten", mit Test-Suiten in Produktionsqualität, professionellen Test-Entwicklerteams und anderem Schwergewicht.
Youtube-Testsuiten oder das Java-Kompatibilitätskit führen ein anderes Leben als Tests in einem kleinen Tutorial-Projekt wie Dwemthy's Array .