Un interessante caso di studio sulle questioni relative al ridimensionamento di progetti che utilizzano un linguaggio dinamico e interpretato può essere trovato in Beginning Scala di David Pollak.
Ho iniziato a cercare un modo per esprimere il codice nel mio cervello in un modo più semplice e diretto. Ho trovato Ruby and Rails. Mi sono sentito liberato. Ruby mi ha permesso di esprimere concetti in molte meno righe di codice. Rails era molto più facile da usare rispetto a Spring MVC, Hibernate e agli altri framework Web Java "ottimizzati". Con Ruby e Rails, ho potuto esprimere molto di più di ciò che avevo in testa in un periodo di tempo più breve. Era simile alla liberazione che ho provato quando sono passato dal C ++ a Java ...
Man mano che i miei progetti Ruby and Rails sono cresciuti oltre alcune migliaia di righe di codice e quando ho aggiunto membri del team ai miei progetti, le sfide dei linguaggi dinamici sono diventate evidenti.
Stavamo spendendo più della metà del nostro tempo di scrittura del codice per scrivere i test e gran parte dei guadagni di produttività che abbiamo visto sono stati persi nella scrittura dei test . La maggior parte dei test non sarebbe stata necessaria in Java perché la maggior parte di essi era orientata a garantire che avremmo aggiornato i chiamanti quando abbiamo refactored il codice modificando i nomi dei metodi o il conteggio dei parametri. Inoltre, ho scoperto che lavorando su team in cui c'erano combinazioni mentali tra due e quattro membri del team, le cose andavano bene in Ruby, ma mentre cercavamo di portare nuovi membri nel team, le connessioni mentali erano difficili da trasmettere ai nuovi membri del team .
Sono andato alla ricerca di un nuovo linguaggio e ambiente di sviluppo. Stavo cercando un linguaggio espressivo come Ruby ma sicuro e performante come Java ...
Come puoi vedere, le principali sfide nel ridimensionamento del progetto per l'autore si sono rivelate essere nello sviluppo di test e nel trasferimento di conoscenze.
In particolare, l'autore approfondisce i dettagli nello spiegare le differenze nella scrittura di prova tra linguaggi tipizzati dinamicamente e staticamente nel capitolo 7. Nella sezione "Poignantly Killing Bunnies: Dwemthy's Stairs" l'autore discute il porto alla Scala di un particolare esempio di Ruby:
Why the Lucky Stiff ... introduce alcuni dei concetti di metaprogrammazione di Ruby nell'array di Dwemthy in cui un coniglio combatte una serie di creature. N8han14 ha aggiornato l' esempio per lavorare in Scala ...
Rispetto al codice Ruby, le parti della libreria del codice Scala erano più complesse. Abbiamo dovuto fare molto lavoro per assicurarci che i nostri tipi fossero corretti. Abbiamo dovuto riscrivere manualmente le proprietà di Creature nelle classi DupMonster e CreatureCons. Questo è più lavoro di method_missing
. Abbiamo anche dovuto fare una buona dose di lavoro per sostenere l'immutabilità nelle nostre creature e armi.
D'altra parte, il risultato è stato molto più potente della versione Ruby. Se dovessimo scrivere dei test per il nostro codice Ruby per verificare ciò che ci assicura il compilatore Scala, avremmo bisogno di molte più righe di codice. Ad esempio, possiamo essere certi che il nostro coniglio non potrebbe impugnare un'ascia. Per ottenere questa certezza in Ruby, dovremmo scrivere un test che assicuri che l'invocazione |^
su un coniglio fallisca. La nostra versione Scala assicura che solo quelle Armi definite per una determinata Creatura possano essere usate da quella Creatura, qualcosa che richiederebbe molta riflessione sul runtime in Ruby ...
Leggere sopra può far pensare che, man mano che i progetti diventano ancora più grandi, la scrittura di prova potrebbe diventare proibitiva in modo ingombrante. Questo ragionamento sarebbe sbagliato, come evidenziato da esempi di progetti molto grandi di successo menzionati in questa domanda ("Python è usato con successo per ... YouTube").
Il fatto è che il ridimensionamento dei progetti non è molto semplice. I progetti di grandi dimensioni e di lunga durata possono "permettersi" diversi processi di sviluppo dei test, con suite di test di qualità di produzione, team di sviluppatori di test professionali e altre cose pesanti.
Le suite di test di Youtube o Java Compatibility Kit hanno sicuramente una vita diversa rispetto ai test in un piccolo progetto tutorial come Dwemthy's Array .