O que os desenvolvedores Java pensam do Scala? [fechadas]

19

Observei que o suporte ao IDE não é nem de longe tão bom, mas a própria linguagem suporta idiomas de programação funcional de maneira muito mais limpa.

Richard Warburton
fonte
3
Python é minha religião, então eu só me importo com o que Guido pensa de Scala. neopythonic.blogspot.com/2008/11/scala.html
Job
7
Scala é uma linguagem tão boa que não só atrai todas essas grandes mentes da comunidade Scala, mas infelizmente também muitos inimigos invejosos que tentam encontrar basicamente qualquer coisa para atacar a língua e as pessoas que a usam.
soc
@soc: Só para deixar claro: eu não odeio o Scala, e as pessoas que o usam provavelmente não poderiam (não deveriam!) se importar menos com o que penso sobre isso. Eu acho que é muito complexo. Isso é tudo. Complexidade pode ser boa para quem tem um cérebro grande. Não :-)
Joonas Pulakka
3
Desculpe, fico chateado quando as pessoas repetem mitos sem fazer backup de suas reivindicações.
soc
2
@soc: Bem, toda essa pergunta é inteiramente subjetiva, então qualquer resposta é certa, seja mito ou não.
Joonas Pulakka

Respostas:

18

Estou programando o Scala há mais de um ano, então tentarei me atrasar um ano para responder a essa pergunta.

  • O código Scala é mais conciso do que o código Java (sem setter ou getter, muitas informações de tipo podem ser inferidas)
  • O suporte interno para literal XML é muito atraente.
  • A compatibilidade e interoperabilidade da biblioteca Java é excelente
  • O suporte para certos idiomas funcionais é revigorante (para compreensão, fechamento, funções lambda, mapear, dobrar, reduzir)
  • Não parece haver um recurso interessante que o criador do idioma não queira incluir

Os pontos acima eram mais ou menos o que eu pensava em Scala antes de começar a aprender.

No decorrer de um ano, eis o que eu descobri:

  • Comprar o livro da escada foi um grande investimento e me salvou horas aprendendo coisas sozinho
  • A sintaxe tem algumas peculiaridades e, às vezes, eu realmente fiquei intrigado por que algo não era válido. A desvantagem é que, quando você estiver familiarizado, o código terá menos confusão e será mais fácil de ler. Observe que isso não é realmente um problema se você ler em vez de escrever código.
  • A biblioteca de coleções em 2.8 é um prazer de usar. É difícil voltar ao Java.
  • O literal XML é bom, mas além de algumas coisas básicas, eu tive que chegar ao ecossistema da biblioteca Java. É conveniente, porém.
  • O uso de bibliotecas Java da Scala é super fácil e conveniente. Usar as classes Scala do Java é um pouco mais complicado, mas funciona.
  • Mudei para a edição da comunidade IntelliJ IDEA e, embora não seja perfeita, é mais do que suficiente.
  • O criador do idioma realmente pensou no conjunto de recursos e tudo funciona muito bem em conjunto. O suporte orientado a objetos é melhor do que em Java (com as características) e você pode fazer programação funcional.
  • É uma linguagem que aparentemente alguns desenvolvedores de Java odeiam com paixão. Para mim, trouxe de volta a alegria da programação.
huynhjl
fonte
21

Bem, acho que Scala é muito complexo. Parece C ++, pois ele tem uma infinidade de maneiras diferentes de fazer as coisas. Alguns chamariam isso de "riqueza", "expressividade" ou "poder", mas sua milhagem pode variar. Em muitos projetos do mundo real, você teria que limitar artificialmente quais recursos de idioma você usará e quais não, para que todos os desenvolvedores envolvidos pudessem falar o mesmo subconjunto do idioma.

Para programação funcional, prefiro o Clojure , que é bem mais simples que o Scala.

Que comece a guerra santa ;-)

Joonas Pulakka
fonte
2
Se apenas rico Hickey importava tanto sobre .Net como ele faz sobre JVM ...
Seria útil se você explicasse um pouco mais sobre o que sente ser muito complexo.
Richard Warburton
4
Richard Warburton: As questões da complexidade do Scala (ou, como Martin Odersky coloca, "força e um problema do Scala: sua extensibilidade") foram amplamente discutidas em vários fóruns. Uma dessas discussões está aqui . Eu não estou dizendo que complexo == ruim por si só . O problema é que, embora o 1% mais brilhante dos programadores possa fazer milagres com o Scala, a grande maioria simplesmente não vai "entendê-lo", e isso é um problema para o uso no mundo real. É como um carro de Fórmula 1: a grande maioria das pessoas simplesmente não será capaz de dirigir um animal assim.
Joonas Pulakka
2
+1 Por mencionar o Clojure como alternativa válida (quando se trata de programação funcional).
Oliver Weiler
Clojure é ótimo, mas é tão eficiente quanto Scala? É tão fácil refatorar, sem toda essa digitação estática? (Refatorar o Python é bastante difícil, por exemplo - eu escrevi refatorações para ele.)
9000
13

Há cerca de um ano, quando fiquei cada vez mais frustrado com o futuro dos produtos da minha startup, se continuasse a usar Java, decidi experimentar o Scala. Eu já estava programando em JavaScript e Python na época, Ruby também era uma boa alternativa, mas estava procurando uma linguagem de tipo estaticamente, de preferência uma que pudesse ser executada na JVM.

Eu realmente tentei gostar de Scala, mas realmente achei o código totalmente feio e difícil de entender. Eu me perguntei dramaticamente que, se Scala era nossa melhor resposta para Java, certamente estava ferrado e condenado a continuar trabalhando com uma linguagem que eu não gostava, afinal ...

Felizmente, não muito tempo depois, descobri o Fantom . Oh cara, eu adorei! Para mim, foi como a resposta do esplendor americano à burocracia alemã! Ele correspondia aos requisitos que eu procurava no Scala, mas com muito mais elegância . Tinha integração com Vim , Eclipse e Netbeans , uma boa estrutura da Web , produtos maduros em execução, uma comunidade pequena, mas incrivelmente útil ... Digitação dinâmica e estática! Eu me alegrei!

(Eu poderia continuar, mas este post deve ser sobre Scala, e não Fantom, por isso paro aqui. Minha preferência é clara , no entanto, há este post comparando os dois. Eu nunca conseguia entender por que o Fantom recebe tão pouca atenção quando comparado ao Scala. Mas, aparentemente, eu não sou o único, se você ouvir este podcast [ mp3 ] até o final.)

ivo
fonte
9

Quando me envolvi inicialmente com Scala há 2 anos, parecia estranho e intimidador para mim. Em algum momento, descobri que a linguagem principal é realmente muito mais simples que Java, mas sua sintaxe e semântica são tão flexíveis que você pode criar novas construções de linguagem como essa, mesmo sem um recurso de macro. Desde então, mudei completamente para o Scala para todos os meus projetos Java, porque ele me permite escrever sem muito código clichê.

Eu gosto do Clojure, mas há situações em que a plataforma precisa que você compile no bytecode estático (Android, applets, ...) e enquanto você pode fazer isso, no Scala, está lá.

Embora o Scala permita que você resolva muitos problemas de maneira funcional, geralmente encontro problemas em que o uso de classes parece mais natural. Isso torna as coisas um pouco mais complexas, mas nem de longe as complexidades e dores do C ++.

A maior vantagem para mim, quando eu realmente comecei a aprender a linguagem, foi que eu poderia programar exatamente como eu fiz em Java, sem o barulho (um pouco como quando você inicia o Groovy), mas eventualmente você quer tentar mergulhar mais fundo no poder da língua - cresce com você.

Sobre a pergunta do IDE: Depois de usar o Emacs para tudo, todos os meus problemas de IDE desapareceram :-)

boxofrats
fonte
9

Gosto de Scala por muitas razões, mas há uma que é frequentemente esquecida: sua simplicidade.

Scala pode não ser tão simples quanto, digamos, Oberon, mas é muito mais simples do que algumas outras línguas. A Scala Language Specification é ~ 160 páginas, a Java Language Specification é ~ 600 (apenas o idioma, não a JVM ou as bibliotecas!), A ECMA-334 C # Language Specification (que AFAIK corresponde a um subconjunto do Visual C # 2.0) é ~ 440 páginas (isso não inclui coisas como compreensão de consultas LINQ, expressões lambda, métodos de extensão, co-violação e contravariância genéricas dynamic, argumentos opcionais com valores padrão, argumentos de palavras-chave var). Até o rascunho atual do ECMAScript 5.1 é maior em ~ 210 páginas. E, claro, minha própria linguagem "padrão", Ruby, cujo atual rascunho ISO pesa em ~ 310 páginas, que apenas especificam um subconjunto quase inusitavelmente pequeno da interseção do Ruby 1.8.6, 1.9.1 e 1.9.2.

Jörg W Mittag
fonte
6
O número de páginas na especificação de idioma é uma medida interessante de sua complexidade. É incrível como Scala divide opiniões sobre isso. Ninguém diria que o Python é complexo, ou o C ++ é simples, mas Scala parece ser os dois :-) eg scala-lang.org/node/7431
Joonas Pulakka
Você pode criar coisas complexas com a linguagem, e algumas parecerão que eram a linguagem - métodos com nomes que não sejam alnum, que parecem sobrecarga de operador, o que não é, por exemplo.
usuário desconhecido
2
O número de páginas na especificação de idioma é uma maneira TERRÍVEL de comparar a complexidade de dois idiomas. Apenas para dar dois exemplos: a especificação Java é escrita de maneira quase tutorial, enquanto a especificação Scala é escrita de forma muito concisa. Ou outro exemplo, o C # 2.0 era na verdade tão complexo quanto o Java hoje em dia, ou talvez um pouco mais complexo, considerando as máquinas, os delegados e as propriedades "inseguras". Mas, como você observa, a especificação C # 2.0 é menor que a JLS.
precisa
1
Agora, Martin Odersky comparou o tamanho das gramáticas formais das línguas. Essa é uma medida razoável de um aspecto da complexidade. Mas é apenas razoável, porque as gramáticas não são tão flexíveis quanto o inglês. Mesmo assim, você tem que ter cuidado. Assim como com programas comuns, você pode facilmente esticar ou encolher gramáticas com diferentes escolhas sobre como colocá-los fora, quantas produções distintas para incluir, quais base de classes de personagens para assumir, etc.
James Iry
3
espere o que ? Por que você tentaria medir a complexidade com o tamanho da especificação? É uma péssima ideia.
smartnut007
9

Aqui está o que é péssimo em Scala:

  • O ponteiro nulo era uma péssima idéia para começar. Hoare chamou seu "erro de bilhão de dólares", mas Scala é ainda pior. Possui objetos nomeados nulo, Nulo, Nenhum e Nulo. null é para interoperabilidade com Java. Nulo é a especificação DOM do W3C do ponteiro nulo, Nenhum é o que nulo deveria ter sido substituído e Nil é algo vazio.

  • Quando as construções de linguagem se tornam hacky, geralmente é o programador quem deve culpar, e não a linguagem. No Scala, no entanto, a linguagem principal já contém classes de biblioteca cujo único comportamento documentado é "Isso é um hack". Não acredita nisso? Pesquise no scaladoc por scala.xml.Group.

  • Por último, não menos importante, Scala está mal documentado. Quase nenhuma das classes scala na documentação oficial vem com código de exemplo. O Scala é significativamente mais difícil de aprender que o Java e requer profundo conhecimento em ciência da computação.

Para evitar ser confundido com um odiador de Scala, aqui está o que eu amo sobre isso:

  • Eu tenho menos exceções. Eu nunca tive uma ClassCastException e muito poucas NullPointerExceptions ao interagir com Java.
  • O código é muito mais curto e mais conciso que o Java
  • É intelectualmente desafiador. Java parece uma linguagem infantil quando comparado.

fonte
10
nullé o ponteiro nulo de Java, Nullé o "tipo" dele. Noneé um "estado" possível de Option[T]uma coleção com um ou zero elementos. Nilé uma lista vazia. Embora você queira parecer assustador, não é. Esses tipos não são substituíveis ou intercambiáveis ​​entre si e se comportam exatamente como deveriam.
soc 02/01
9

Scala é complexo. De jeito nenhum! Sua sintaxe é extremamente flexível e pode ser personalizada de várias maneiras (acima de todos os operadores / notação infix) - e o sistema de tipos tem mais recursos diferentes do que qualquer outro idioma que eu conheça.

Portanto, as coisas não são tão corretas como, por exemplo, em Haskell: Typeclasses para cobrir todos eles.

Como o Scala tenta reunir programação funcional, OO, programação procedural e bibliotecas java, além de idéias próprias, finalmente acabamos com muitos conceitos que de alguma forma parecem "ir na mesma direção":

  • Valores implícitos
  • Funções implícitas
  • Existenciais
  • Curingas
  • Traits
  • Interfaces
  • Classes abstratas
  • Classes de casos
  • Tipos estruturais
  • Restrições genéricas
  • Exibir limites
  • Tipos anônimos

Escolher entre eles parece difícil no começo e pode-se facilmente perguntar se encontrou a solução correta para algum problema. É facilmente possível produzir coisas hacky abusando de implicits.

Mas o interessante é: Scala funciona. Às vezes, é difícil entender por que (especialmente descobrir através de quais conversões implícitas + herança + ... algum objeto tem funcionalidade X), mas você não precisa se preocupar com isso na maioria das vezes.

Escreva Scala o mais direto possível e funcionará. Não se confunda com tudo o que é possível e use apenas o que você precisa. E se você precisar de algo, pode ter certeza de que, de alguma forma, Scala o possui;)

E quanto melhor você obtiver, mais poderá personalizar o Scala com operadores, implícitos, mônadas, sintaxe descolada ... e finalmente obter algo próximo a uma DSL que resolverá perfeitamente o seu problema.

Afinal, você sempre tem a possibilidade de usar o Scala como um Java muito melhor, com sintaxe mais limpa e fácil, inferência de tipos e alguns recursos funcionais.

Dario
fonte
1
"acima de todos os operadores / notação infix" - apenas que scala não possui operadores. :) São apenas métodos.
usuário desconhecido
6

É uma excelente linguagem que é mais simples que Java de várias maneiras.

A maioria das pessoas não gosta, programador Java ou não, pelas mesmas razões que a maioria, programador ou não, não gosta de aprender novas linguagens de programação. Eu suspeito que a maioria das pessoas que aprendeu uma linguagem de programação nem gostava de aprender isso.

Se você está preocupado com uma linguagem tão complicada quanto o C ++, eu evitaria o Clojure como uma praga. Lamentar que Scala seja mais complicado que Clojure se tornou o argumento de retorno para pessoas que são completamente ignorantes em relação a um ou ambos os idiomas.

O Clojure possui macros, o que significa que você pode alterar a sintaxe da linguagem o quanto quiser, fornecendo não apenas "uma infinidade de maneiras diferentes de fazer as coisas", mas um número quase infinito de maneiras de fazer as coisas. E nenhuma dessa nova sintaxe que os programadores estão criando com as macros será documentada em qualquer lugar da especificação da linguagem.

"Mas podemos evitar o uso de macros ou regular quais são permitidas em nosso código", você diz. Parabéns, agora você está tendo "de limitar artificialmente quais recursos de idioma você usará e o que não usará", que é exatamente o que os idiotas tagarelas que estão usando Clojure of Scala usaram como razão para evitar o Scala para começar.

Josh
fonte
6
Obrigado pela sua contribuição Scala vs Clojure, mas é isso que o OP estou perguntando realmente?
Martin Wickman
Ponto interessante re: macros. Um pouco preocupante também. Existem macros ou similares disponíveis no Scala ou a coisa toda "artificialmente limite" é uma distração?
Armand
1
Este parece ser um comentário para minha resposta, e não uma resposta para a pergunta original. Eu concordo, as macros fornecem a você um poder infinito; portanto, quando usadas incorretamente, elas são ruins. Portanto, você deve usá-los corretamente (somente quando necessário). Isso não muda o fato de que o idioma Clojure é um dos mais simples que existem. Scala definitivamente não é.
Joonas Pulakka
> Isso não muda o fato de que o idioma Clojure é um dos mais simples. <Isso também é completamente falso, a menos que você esteja usando alguma métrica como "número de construções de idioma". Se você estiver usando algo útil, como é fácil ler e escrever programas no idioma, o Clojure não é um dos mais simples.
21410 Josh
Então, por favor, nos dê uma boa métrica da complexidade do idioma. "Quão fácil é ler e escrever programas no idioma" é totalmente subjetivo , por isso realmente não ajuda aqui. É verdade que criar uma métrica útil e objetiva pode ser praticamente impossível. (Por exemplo Jörg W Mittag abaixo é usando número de páginas na especificação da linguagem como uma medida de complexidade Enquanto objetivo, eu não tenho certeza que é muito útil..)
Joonas Pulakka
4

Eu realmente gosto dos tipos mais granulares da biblioteca Scala. Parece que a nova biblioteca de coleções foi bem pensada. Também gosto de como ele reduz a quantidade de código necessária para classes simples e os conceitos funcionais que ele adiciona. Sua inferência de tipo também é muito útil. Parece Java sem as rodinhas. Depois de usar o C # por um tempo, o Scala realmente parece um concorrente, com o Java ainda útil, mas sendo deixado para trás.

Matt H
fonte
2

Como programador Java, inicialmente achei o Scala interessante. No entanto, depois de mexer com ele por um tempo (e deparar com quase todos os aspectos positivos / negativos já listados por outros), fiquei me sentindo muito "meh" em relação a isso. As melhorias de idioma são compensadas pela menor disponibilidade de conjuntos de ferramentas. Eu simplesmente não conseguia pensar em nenhuma razão para mudar. É bom, mas não é "melhor o suficiente" para defender a mudança. Também não possui esse fator de excitação subjetiva (como Clojure parece ter).

Brian Knoblauch
fonte