Cosa pensano gli sviluppatori Java di Scala? [chiuso]


19

Ho notato che il supporto IDE non è affatto buono, ma il linguaggio stesso supporta gli idiomi di programmazione funzionale in modo molto più pulito.


3
Python è la mia religione, quindi mi interessa solo ciò che Guido pensa di Scala. neopythonic.blogspot.com/2008/11/scala.html
Lavoro

7
La Scala è un linguaggio così grande che non solo attira tutte queste grandi menti della comunità Scala, ma purtroppo anche molti odiatori invidiosi che cercano di trovare praticamente qualsiasi cosa per attaccare la lingua e le persone che la usano.
soc,

@soc: Giusto per essere chiari: non odio la Scala, e le persone che la usano probabilmente non potrebbero (non dovrebbero!) preoccuparsi di meno di quello che penso. Penso che sia troppo complesso. È tutto. La complessità può andare bene per coloro che hanno un grande cervello. Io no :-)
Joonas Pulakka l'

3
Mi dispiace, mi annoio solo quando le persone continuano a ripetere i miti senza sostenere le loro affermazioni.
soc,

2
@soc: Beh, tutta questa domanda è del tutto soggettiva, quindi ogni risposta è giusta, che sia mito o no.
Joonas Pulakka,

Risposte:


18

Sto programmando Scala da più di un anno, quindi cercherò di tornare indietro di un anno per rispondere a questa domanda.

  • Il codice Scala è più conciso del codice Java (nessun setter o getter, molte informazioni sul tipo possono essere dedotte)
  • Il supporto integrato per XML letterale è molto interessante.
  • La compatibilità e l'interoperabilità delle librerie Java sono eccezionali
  • Il supporto per alcuni modi di dire funzionali è rinfrescante (per comprensione, chiusura, funzioni lambda, mappa, piega, riduci)
  • Non sembra esserci una caratteristica interessante che il creatore della lingua non ha voluto includere

I punti sopra erano più o meno ciò che pensavo di Scala prima di iniziare a impararlo.

Nel corso di un anno, ecco cosa ho scoperto:

  • L'acquisto del libro delle scale è stato un grande investimento e mi ha risparmiato ore di apprendimento per conto mio
  • La sintassi ha alcune stranezze e a volte c'era il punto in cui ero davvero perplesso sul perché qualcosa non fosse valido. Il compromesso è una volta che hai familiarità, il codice ha meno confusione ed è più facile da leggere. Nota che questo non è davvero un problema se leggi piuttosto che scrivere codice.
  • La libreria di raccolta in 2.8 è un piacere da usare. È difficile tornare a quello Java.
  • XML letterale è bello, ma oltre ad alcune cose basilari, ho dovuto raggiungere l'ecosistema della libreria Java. È conveniente però.
  • L'uso delle librerie Java di Scala è semplicissimo e conveniente. L'uso delle classi Scala da Java è un po 'più complicato, ma funziona.
  • Sono passato all'edizione della community IntelliJ IDEA e, sebbene non sia perfetto, è più che sufficiente.
  • Il creatore della lingua ha davvero pensato al set di funzionalità e tutto funziona davvero bene insieme. Il supporto orientato agli oggetti è migliore rispetto a Java (con i tratti) e puoi fare una programmazione funzionale.
  • È un linguaggio che apparentemente alcuni sviluppatori Java odiano con passione. Per me, ha riportato la gioia della programmazione.

21

Beh, penso che Scala sia troppo complessa. Sembra C ++ in quanto ha una miriade di modi diversi di fare le cose. Alcuni chiamerebbero questa "ricchezza", "espressività" o "potere", ma il tuo chilometraggio può variare. In molti progetti del mondo reale dovresti limitare artificialmente quali funzionalità linguistiche utilizzerai e quali no, in modo che tutti gli sviluppatori coinvolti possano parlare lo stesso sottoinsieme della lingua.

Per la programmazione funzionale preferisco Clojure , che è molto più semplice di Scala.

Che la guerra santa abbia inizio ;-)


2
Se solo Rich Hickey si preoccupasse tanto di .Net quanto di JVM ...
Giobbe

Sarebbe utile se spiegassi un po 'di più su ciò che ritieni sia troppo complesso.
Richard Warburton,

4
@Richard Warburton: I problemi della complessità di Scala (o, come afferma Martin Odersky, "forza e un problema di Scala: la sua estensibilità") sono stati ampiamente discussi in molti forum. Una di queste discussioni è qui . Non sto dicendo che complesso == cattivo di per sé . Il problema è che mentre l'1% più brillante dei programmatori potrebbe essere in grado di fare miracoli con Scala, la stragrande maggioranza semplicemente non riuscirà a "ottenerlo", e questo è un problema per l'uso nel mondo reale. È come un'auto di Formula 1: la stragrande maggioranza delle persone semplicemente non sarà in grado di guidare una tale bestia.
Joonas Pulakka,

2
+1 Per menzionare Clojure come valida alternativa (quando si tratta di programmazione funzionale).
Oliver Weiler,

Clojure è fantastico, ma è performante come Scala? Rifattorizzare è altrettanto semplice, senza tutta questa digitazione statica? (Refactoring Python è piuttosto difficile, per esempio - ho scritto dei refactoring per questo.)
9000

13

Circa un anno fa, mentre diventavo sempre più frustrato per il futuro dei prodotti della mia startup se continuavo a usare Java, ho deciso di provare Scala. Stavo già programmando in JavaScript e Python al momento, anche Ruby era una buona alternativa, ma stavo cercando un linguaggio tipicamente statico, preferibilmente uno che potesse essere eseguito su JVM.

Ho davvero provato ad amare Scala, l'ho fatto davvero, ma ho scoperto che il suo codice è assolutamente brutto e difficile da capire. Mi chiedevo drammaticamente che se Scala fosse la nostra migliore risposta a Java, allora ero sicuramente fregato e condannato a continuare a lavorare con una lingua che non mi piaceva dopo tutto ...

Fortunatamente, non molto tempo dopo, ho scoperto Fantom . Oh amico, l'ho adorato! Per me, è stata come la risposta dello splendore americano alla burocrazia tedesca! Corrispondeva ai requisiti che stavo cercando a Scala, ma molto più elegantemente . Aveva l' integrazione di Vim , Eclipse e Netbeans , un bel framework web , prodotti maturi con esso in esecuzione, una piccola ma incredibilmente utile community ... Digitazione dinamica e statica! Mi sono rallegrato!

(Potrei continuare, ma questo post dovrebbe riguardare Scala, non Fantom, quindi mi fermo qui. La mia preferenza è chiara , tuttavia c'è questo post che mette a confronto i due. Non ho mai capito perché Fantom riceva così poca attenzione rispetto a Scala. Ma a quanto pare non sono l'unico, se ascolti questo podcast [ mp3 ] fino alla fine.)


9

Quando mi sono dilettato inizialmente con Scala 2 anni fa, mi è sembrato estraneo e intimidatorio. Ad un certo punto ho scoperto che il linguaggio principale è in realtà molto più semplice di Java, ma la sua sintassi e semantica sono così flessibili che puoi creare nuovi costrutti di linguaggio simili, anche senza una funzione macro. Da allora sono passato completamente a Scala per tutti i miei progetti Java, perché mi consente di scrivere senza troppo codice boilerplate.

Mi piace Clojure, ma ci sono situazioni in cui la piattaforma ha bisogno di te per compilare in bytecode statico (Android, applet, ...) e mentre puoi farlo, in Scala, è proprio lì.

Mentre Scala ti consente di risolvere molti problemi in modo funzionale, trovo spesso problemi in cui l'uso delle classi sembra più naturale. Ciò rende le cose un po 'più complesse, ma in nessun posto vicino alle complessità e ai dolori del C ++.

Il più grande takeaway per me quando ho iniziato davvero ad imparare la lingua era che potevo programmare solo in Java, proprio senza il rumore (un po 'come quando avvii Groovy), ma alla fine vuoi provare ad immergerti più in profondità nel potere della lingua - cresce con te.

Informazioni sulla domanda IDE: dopo aver usato Emacs per tutto, tutti i miei problemi IDE sono scomparsi :-)


9

Mi piace Scala per molte ragioni, ma ce n'è una che viene spesso trascurata: la sua semplicità.

Scala potrebbe non essere semplice come, diciamo, Oberon, ma è molto più semplice di alcune altre lingue. La specifica del linguaggio Scala è ~ 160 pagine, la specifica del linguaggio Java è ~ 600 (solo la lingua, non la JVM o le librerie!), La specifica del linguaggio C # ECMA-334 (che AFAIK corrisponde a un sottoinsieme di Visual C # 2.0) è ~ 440 pagine (questo è senza elementi come la comprensione delle query LINQ, le espressioni lambda, i metodi di estensione, la co-e la contraddizione generici dynamic, argomenti opzionali con valori predefiniti, argomenti di parole chiave, var). Anche l'attuale bozza per ECMAScript 5.1 è più grande a ~ 210 pagine. E ovviamente il mio linguaggio "predefinito", Ruby, il cui attuale ISO Draft pesa circa ~ 310 pagine, che specifica solo un sottoinsieme quasi insolitamente piccolo dell'intersezione di Ruby 1.8.6, 1.9.1 e 1.9.2.


6
Il numero di pagine nella specifica del linguaggio è una misura interessante della sua complessità. È sorprendente il modo in cui Scala divide le opinioni al riguardo. Nessuno direbbe che Python è complesso, o C ++ è semplice, ma Scala sembra essere entrambi :-) ad esempio scala-lang.org/node/7431
Joonas Pulakka,

Puoi costruire cose complesse con la lingua, e alcune appariranno come se fossero la lingua - metodi con nomi non alnum, che sembrano sovraccarico dell'operatore, cosa che non è, per esempio.
utente sconosciuto

2
Il numero di pagine nelle specifiche della lingua è un modo TERRIBILE per confrontare la complessità di due lingue. Solo per fare due esempi: le specifiche Java sono scritte in modo quasi tutorial, mentre le specifiche Scala sono scritte in modo molto conciso. O un altro esempio, C # 2.0 era in realtà più o meno complesso come Java oggi, o forse un po 'più complesso dato il macchinario, i delegati e le proprietà "non sicuri". Ma come noti, le specifiche di C # 2.0 sono più piccole di quelle di JLS.
James Iry,

1
Ora Martin Odersky ha confrontato le dimensioni delle grammatiche formali delle lingue. Questa è una misura ragionevole di un aspetto della complessità. Ma è ragionevole solo perché le grammatiche non sono flessibili come l'inglese. Anche allora, devi stare attento. Proprio come con i programmi ordinari, puoi facilmente allungare o restringere le grammatiche con diverse scelte su come disporle, quante produzioni distinte includere, quali classi di personaggi base assumere, ecc.
James Iry

3
aspetta cosa ? Perché dovresti provare a misurare la complessità con le dimensioni delle specifiche? È un'idea terribile.
smartnut007,

9

Ecco cosa fa schifo di Scala:

  • Il puntatore null era una pessima idea per cominciare. Hoare lo ha definito il suo "errore di miliardi di dollari", ma Scala è anche peggio. Ha oggetti chiamati null, Null, None e Nil. null è per l'interoperabilità con Java. Null è il puntatore null dalla specifica DOM W3C, None è ciò che null avrebbe dovuto essere sostituito e Nil è qualcosa di vuoto.

  • Quando i costrutti della lingua risultano essere confusi, di solito è la responsabilità del programmatore e non la lingua. In Scala, tuttavia, il linguaggio principale contiene già classi di librerie il cui unico comportamento documentato è "Questo è un trucco". Non ci credi? Cerca nello scaladoc per scala.xml.Group.

  • Infine, Scala è mal documentata. Quasi nessuna delle classi scala nella documentazione ufficiale viene fornita con un codice di esempio. Scala è significativamente più difficile da imparare rispetto a Java e richiede una profonda conoscenza dell'informatica.

Per evitare di essere scambiato per un odiatore di Scala, ecco cosa mi piace:

  • Ho meno eccezioni. Non ho mai avuto una ClassCastException e pochissime NullPointerExceptions quando interagivo con Java.
  • Il codice è molto più breve e più conciso di Java
  • È intellettualmente stimolante. Java sembra un linguaggio infantile se confrontato.

10
nullè il puntatore null di Java, ne Nullè il "tipo". Noneè un possibile "stato" di Option[T], una raccolta con uno o zero elementi. Nilè un elenco vuoto. Mentre vuoi farlo sembrare spaventoso, non lo è. Questi tipi non sono sostituibili o intercambiabili tra loro e si comportano esattamente come dovrebbero.
soc

9

Scala è complessa. Assolutamente no! La sua sintassi è estremamente flessibile e può essere personalizzata in numerosi modi (soprattutto operatori / notazione infografica) - e il sistema dei tipi ha caratteristiche più diverse rispetto a qualsiasi altra lingua che conosco.

Quindi le cose non sono così dritte come ad esempio in Haskell: Typeclasses per coprirle tutte.

Mentre Scala cerca di mettere insieme programmazione funzionale, OO, programmazione procedurale e librerie Java, nonché idee proprie, alla fine arriviamo a molti concetti che sembrano in qualche modo andare "nella stessa direzione":

  • Valori impliciti
  • Funzioni implicite
  • esistenziali
  • I caratteri jolly
  • Tratti
  • interfacce
  • Classi astratte
  • Classi di casi
  • Tipi strutturali
  • Vincoli generici
  • Visualizza limiti
  • Tipi anonimi

La scelta tra questi sembra inizialmente difficile e ci si potrebbe facilmente chiedere se si è trovata la soluzione corretta a qualche problema. È anche facilmente possibile produrre roba da schifo abusando di implicits.

Ma la cosa interessante è che Scala funziona. A volte è difficile capire perché (soprattutto capire quali conversioni implicite + eredità + ... alcuni oggetti hanno funzionalità X), ma la maggior parte delle volte non devi preoccuparti di questo.

Scrivi Scala nel modo più semplice possibile e funzionerà. Non essere confuso da tutto ciò che è possibile e usa solo ciò di cui hai bisogno. E se hai bisogno di qualcosa, puoi essere sicuro che in qualche modo Scala ce l'ha;)

E meglio ottieni, più sarai in grado di personalizzare Scala con operatori, impliciti, monadi, sintassi funky ... e finalmente ottenere qualcosa di simile a un DSL che risolverà perfettamente il tuo problema.

Dopotutto, hai sempre la possibilità di usare Scala come un Java molto migliore con sintassi più semplice e pulita, inferenza di tipo e alcune funzionalità.


1
"soprattutto operatori / notazione infografica" - solo che scala manca di operatori. :) Sono solo metodi.
utente sconosciuto il

6

È un linguaggio eccellente che è più semplice di Java in molti modi.

Alla maggior parte delle persone non piacerà, programmatore Java o no, per gli stessi motivi per cui la maggior parte delle persone, programmatori o meno, non ama imparare nuovi linguaggi di programmazione. Ho il sospetto che alla maggior parte delle persone che hanno imparato un linguaggio di programmazione non piaceva nemmeno impararlo.

Se sei preoccupato che un linguaggio sia complicato come il C ++, eviterei Clojure come la peste. Lamentare che Scala sia più complicato di Clojure è diventato l'argomento fallback per le persone che sono completamente ignoranti riguardo a una o entrambe le lingue.

Clojure ha macro, il che significa che puoi modificare la sintassi del linguaggio quanto vuoi, dandoti non solo "una miriade di modi diversi di fare le cose" ma un numero quasi infinito di modi di fare le cose. E nessuna di questa nuova sintassi che i programmatori stanno creando con le macro sarà documentata ovunque nelle specifiche del linguaggio.

"Ma possiamo evitare di usare le macro o regolare quali sono consentite nel nostro codice", dici. Congratulazioni, ora devi "limitare artificialmente quali caratteristiche linguistiche utilizzerai e cosa no", che è esattamente ciò che gli idioti borbottanti che usano Clojure di Scala hanno usato come motivo per evitare che Scala iniziasse.


6
Grazie per il tuo contributo Scala vs Clojure, ma è proprio questo l'OP di cui sto chiedendo?
Martin Wickman,

Punto interessante in riferimento a: macro. Anche leggermente preoccupante. Macro o simili sono disponibili in Scala o l'intera cosa "limita artificialmente" è una distrazione?
Armand,

1
Questo sembra essere un commento alla mia risposta piuttosto che una risposta alla domanda originale. Sono d'accordo, le macro ti danno un potere infinito, quindi se usate male, fanno schifo. Quindi, dovresti usarli nel modo giusto (solo quando necessario). Ciò non cambia il fatto che Clojure la lingua sia una delle più semplici che ci siano. Scala sicuramente no.
Joonas Pulakka,

> Questo non cambia il fatto che Clojure la lingua sia una delle più semplici che ci siano. <Anche questo è completamente falso, a meno che tu non stia usando una metrica come "numero di costrutti della lingua". Se stai usando qualcosa di utile, come è facile leggere e scrivere programmi nella lingua, allora Clojure non è uno dei più semplici.
Josh,

Quindi, per favore continua e dacci una buona metrica della complessità del linguaggio. "Quanto è facile leggere e scrivere programmi nella lingua" è totalmente soggettivo , quindi non aiuta molto qui. Certo, trovare una metrica utile e obiettiva può essere praticamente impossibile. (Ad esempio, Jörg W Mittag di seguito utilizza il numero di pagine nella specifica del linguaggio come misura della complessità. Sebbene obiettivo, non sono sicuro che sia molto utile.)
Joonas Pulakka,

4

Mi piacciono molto i tipi più granulari della biblioteca Scala. Sembra che la nuova biblioteca delle collezioni sia stata ben pensata. Mi piace anche come riduce la quantità di codice richiesta per le classi semplici e i concetti funzionali che aggiunge. Anche la sua deduzione di tipo è molto utile. Sembra Java senza le ruote di allenamento. Dopo aver usato C # per un po ', Scala in realtà si sente come un concorrente, con Java ancora utile ma lasciato indietro.


2

Come programmatore Java, inizialmente ho trovato Scala interessante. Tuttavia, dopo essermi dilettato per un po '(e aver incontrato quasi tutti gli aspetti positivi / negativi già elencati da altri), mi è stato lasciato molto "meh" nei suoi confronti. I miglioramenti della lingua sono compensati dalla minore disponibilità di set di strumenti. Non riuscivo a trovare un motivo preciso per passare. È buono, ma non è "abbastanza meglio" per fare un caso per il passaggio. Non ha nemmeno quel fattore soggettivo di eccitazione (come sembra Clojure).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.