Por que Groovy?

groovylogo

Certa vez fui a uma palestra sobre Scala em que ao perguntar ao palestrante o que justificaria minha equipe treinada em Java adotar a linguagem recebi como resposta segundos de silêncio seguido por “muito obrigado a presença de todos vocês aqui”.  Como pretendo falar sobre Groovy em breve (coisas boas a caminho no próximo mês) aqui seguem algumas razões.

A pergunta que deve ser feita é: quais problemas Groovy soluciona ou pelo menos torna mais fácil de serem resolvidos?

Primeira pseudo-razão: é executado na JVM

Beng! Esta não é uma boa razão para se usar Groovy, pois o Java também é executado na JVM assim como diversas outras linguagens. É apenas um facilitador de adoção visto que você pode tirar proveito do seu código legado e de toda a bagagem que o Java já nos trás, mas não a razão.

(embora meu aprendizado por Groovy tenha sido fortemente influenciado no início por isto)

Pode ser executada como script usando código java legado e suas bibliotecas favoritas

Esta já é uma boa razão: não é raro eu precisar escrever código de manutenção. Pequenos scripts que executam determinadas tarefas em meus sistemas, tarefas estas que não precisam ser novos recursos deste, mas sim tarefas auxiliares. Exemplo: manipulação de entidades do sistema usando a lógica de negócio do próprio sistema.

Outra boa razão: scripts para manutenção de infra estrutura mesmo. Muitas vezes preciso escrever um script que use alguma biblioteca Java útil, como por exemplo o Commons Digester. É mais fácil pra mim que não sei bash direito usá-la com minha experiência Java do que com scripts do sistema operacional. (eu sei que é um exemplo bobo, mas vocês captaram a idéia).

E o formato script também é bastante convidativo. Há aqueles casos nos quais você quer escrever um programa que apenas varra uma lista de arquivos. O que você acha mais fácil de escrever e entender? A versão Java abaixo?


public class LeiaDiretorios {
public static void main(String args[]) {
File diretorio = new File("/diretorio");
for (File arquivo : diretorio) {
System.out.println(arquivo);
}
}
}

Ou a versão Groovy?


File diretorio = new File("/diretorio");
for (arquivo in diretorio) {
println arquivo
}

Tem recursos que ainda não existem no Java

É fato: Java tá a cada dia que se passa mais parecido com Groovy, mas nunca será o Groovy. Há alguns recursos na linguagem que sempre me atrairam tal como os que cito a seguir:

  • Closures: facilitam demais a escrita de código funcional e também criação de código polimorfico. É um recurso muito poderoso, e que você só da valor depois de experimentar. Gravei um vídeo sobre isto.
    (eu podia escrever um outro post só sobre como este recurso sozinho já justificaria a linguagem)
  • Builders: Groovy te permite lidar com estruturas hierarquicas usando o padrão de projeto builder nativamente. E ei… é lindo viu. Quer ver um exemplo? Conheça o Swing Builder, que te permite criar aplicações desktop com uma mão nas costas (e que o antigo Java FX era suspeitamente bastante parecido). Lidar com XML também é muito mais simples graças a este recurso. Da uma olhada no Markup Builder.
  • O modo como lidamos com números: em Java quando preciso lidar com BigDecimal é uma luta (sei que vai melhorar no futuro, mas ainda não é uma realidade).
    Pra que escrever a.multiply(b) se posso simplesmente escrever a * b?
  • Poder interpolar strings ao invés de simplesmente concatenar como no Java.
    Isto evita muito código horroroso e além disto é muito mais interessante. Strings em Groovy são como deveria ser no Java desde o início. Da uma lida neste link.
  • O fato de ser uma linguagem dinâmica. Poder alterar meu código fonte em tempo de execução poupa muito tempo e a necessidade de implementar padrões de projetos muitas vezes complicados. Exemplo: por que implementar um decorator se posso mudar o comportamento de minha classe usando poucas linhas? Gravei um vídeo sobre isto que pode ser visto neste link.
  • E basicamente tudo o que acho muito chato no Java em Groovy está resolvido. Ei: gravei sobre isto um vídeo também. Você pode assisti-lo neste link.
  • Possui construtores específicos na linguagem para lidar com coleções. Isto te poupa MUITO tempo e não entendo por que no Java não há este recurso.
    Ao invés de escrever
    List<String> lista = new ArrayList<String>();
    Em Groovy eu simplesmente escrevo
    def lista = []
    Sim, é simples assim. Tenho um vídeo só sobre este recurso, que também pode ser usado pra facilitar a escrita de testes unitários quando aplicado a hashes.

Porta de entrada para a plataforma Java

Deixe sua arrogância de lado. Ao contrário do que muitos pensam, aprender Java não é uma tarefa simples, especialmente para quem já está acostumado com programação procedural a anos. Em Groovy diversos componentes de sintaxe são opcionais como por exemplo parênteses para chamar funções ou procedimentos, ponto e vírgula e mesmo o formato de script.

É uma sintaxe maravilhosa que por um lado é bastante parecida com o Java e por outro muito próxima de linguagens como Visual Basic. E como você tem acesso a todas as bibliotecas Java, aos poucos vai se acostumando com a plataforma Java EE, e de uma forma muito mais agradável e pragmática.

Groovy Console

Não é exatamente um recurso da linguagem, mas sim um acessório que vêm com esta, mas é uma boa razão. Groovy vêm com um REPL completo que, na minha opinião, é o laboratório perfeito para que possamos experimentar código e mesmo aprender novas APIs. Adivinha? Gravei um vídeo sobre isto também que pode ser acessado neste link.

Criar DSLs com Groovy é muito fácil

Sei que não faz parte do dia a dia da maior parte das pessoas mas faz do meu, então tenho de incluir este motivo. Groovy e Lisp são as melhores linguagens que conheço para criarmos DSLs (Domain Specific Languages, Linguagens Específicas de Domínio). São pequenas linguagens de programação, próximas do mundo do usuário final que possibilitam a este expandir o sistema com facilidade.

É um recurso extremamente poderoso e existe inclusive um livro muito interessante sobre como fazer isto com Groovy cuja leitura recomendo chamado “Groovy for Domain Specific Languages” que li dois anos atrás e cuja resenha publiquei aqui.

Grails

A maior parte das pessoas conhece Groovy por causa do seu killer app: Grails, um framework para desenvolvimento de aplicações web que são executadas na plataforma Java EE.  O que posso dizer sobre Grails?

Simples: ele ANIQUILA o tédio da plataforma Java EE e a torna acessível, fácil de usar e pragmática.

Concluindo

Estas não são todas as razões pelas quais você deve adotar Groovy como linguagem de programação, mas são pelo menos as que considero mais importantes.

Groovy resolve um problema fundamental para mim: o da entrada de iniciantes na plataforma Java. Sua sintaxe pragmática torna a transição muito menos traumática. Isto aliado ao fato de existir algo como Grails e Griffon fornecem um outro grande passo: uma entrada ainda mais suave para a plataforma Java EE que mesmo com sua simplificação nas últimas edições ainda é osso duro de roer para os iniciantes.

E sabem o que acho mais legal? Já faz uns seis (talvez sete) anos que brinco e trabalho com Groovy e sempre me surpreendo. E sim: eu sei que sou suspeito pra falar. E você? Já experimentou Groovy? O que achou?

20 thoughts on “Por que Groovy?

  1. É isso aí, Kiko.

    Em 2 semestres lecionei o Grails como framework Web na disciplina de Desenvolvimento WEB na faculdade onde dava era professor. Então, sempre antes do Grails em si fazia um “basicão” de Groovy.
    Durante e depois desse momento, 9 em cada 10 alunos diziam “poxa, por que não nos ensinaram Groovy ao invés de Java nas disciplinas de programação?”
    Eu dizia a eles que java é padrão de mercado para quem quer entrar no mercado de trabalho por isso era ensinado em 2 semestres…
    Eles se conformavam , mas ratifico que era explico a preferência de cerca de 9 em cada 10 pelo Groovy.

  2. Na Informant, a 3 anos atrás tomamos a decisão de tornar o Grails o framework padrão para projetos que iniciam conosco e hoje mais de 80% dos projetos que estamos trabalhando usam Grails/Groovy.

    Se por um lado a barreira de trabalhar com Groovy é fácil de romper, existe uma barreira a ser vencida. Somos uma empresa de serviço e com isso, existe uma preocupação enorme em tecnologia uma vez que a longo prazo, alguns clientes buscam internalizar a manutenção do produto quando o mesmo entra em uma fase menos crítica para o desenvolvimento de novas funcionalidades.

    A dúvida gira sempre em torno da seguinte: Como vou fazer para treinar profissionais em Groovy/Java. Geralmente tenho um leque de respostas para apresentar(para diretores e executívos, falar de facilidades técnicas nem sempre faz sentido :-) ) mas a resposta em muitas vezes gira em torno do que fazemos aqui na Informant. Contratamos profissionais com experiência em Java e eles aprendem muito fácil.

    O que achei interessante no seu texto e um argumento muito válido é outro ponto. Groovy é muito mais simples e prático para quem não conhece Java, então se a sua equipe trabalha com linguagens funcionais, é muito mais fácil para esses profissionais aprenderem Groovy.

    Muito bom Kico. Parabéns pelo post.

  3. Oi Yoshiriro,

    este é um fato muito interessante. E sabe por que seus alunos acabam preferindo Groovy ao Java? Por um fato muito simples: a sintaxe do Groovy é muito mais pragmática pra quem está começando, faz muito mais sentido.

    Exemplo: um programa é uma sequencia de passos, certo? Então por que começar com uma classe ao invés de simplesmente código como no formato script?

    E outra: dado que a questão da proximidade com o idioma também entra, pequenos detalhes como por exemplo parênteses opcionais e ponto e vigula no final fazem toda a diferença pra quem está começando a programar e tenta entender o que é este negócio.

  4. Oi Rafael, valeu!

    Bom saber de casos como o seu. Sabe algo que já observei?
    As pessoas que vêm de outras linguagens como Delphi, VB, Cobol aprendem Groovy fácil, mas o mesmo não ocorre com o caminho pro Java. É por isto que considero Groovy uma porta de entrada para a plataforma Java EE.

    Se você for levar em consideração que a quantidade de programadores COBOL, Delphi, Visual Basic (pré .net), PHP e tantas outras linguagens é imensa, esta é uma oportunidade de crescimento do próprio Java que infelizmente não vejo ser tão valorizada quanto deveria.

  5. Primeiro peço perdão pelas palavras esquisitas no meio do meu post anterior… eram quase 3 da manhã :P Mas acho que me fiz entender.

    Cabem aqui criticas não ao Groovy, mas às ferramentas (IDEs):

    1. Eclipse (ou GGTS): Dentre as livres é a melhor, mas o Debug ainda está no máximo 80% do que é para Java em projetos Grails. Exemplo: Breakpoints condicionais não funcionam, após alterar o código de projeto com ele rodando algumas variáveis não aparecem na aba de variáveis e as “expressions” deixam de funcionar.

    2. Netbeans: Totalmente lerdo para Groovy! Nem vale a pela usar. Uma pena, pois atualmente para Java estou preferindo Netbeans a Eclipse.

    3. IntellijIdea: É paga e vale o quanto cobra! Suporte a debug e autocomplete de código quase 100% como pra Java já!

  6. Concordo com você: sabe o que não entendo?

    Como a IDE oficial, o GGTS, pode ser tão inferior ao Intellij Idea. Se tem gente paga pela Pivotal pra melhorar o GGTS, por que não fazem isto direito?

  7. Mas o plugin de Groovy pra Eclipse e o GGTS como um todos têm melhorado sempre a cada versão.
    Se for pesar o “custo x benefico” da GGTS x IntellijIdea (uma é de graça e outra custa algumas centenas de reais) a GGTS vale muito a pena sim.
    O negócio pega pra quem está muito habituado a deitar e rolar com os recursos de Debug para Java do Eclipse. Quem não usa muito “debug mode” vai achar o GGTS melhor do que ele é ;)

  8. Ola Henrique,

    Gostei do seu artigo. Achei entretanto que o início ficou estranho! Na verdade, se o camarada não respondeu sua pergunta sobre scala é porque ele não fez a lição de casa! O Scala tem todas essas funcionalidades que você citou como qualidades do Groovy e pra quem quiser, mais detalhes em http://www.scala-lang.org/docu/files/ScalaOverview.pdf ou no site da linguagem http://www.scala-lang.org/. Achei que faltou abordar funcionalidades de linguagem como possibilidade de manipular/inspecionar a AST, suporte a funções de primeira ordem / alta ordem, suporte à imutabilidade, recursão de cauda, suporte a pattern matching, metaprogramação, suporte à covariancia e contravariancia, suporte a uso de resultados opcionais (Optional) etc, que são coisas bem úteis no dia-a-dia de um programador (seja no paradigma funcional ou não) e certamente FAZEM parte do SCALA. Forte abraço!

  9. Oi Leo, valeu.

    na realidade esta não é uma comparação com o Scala, muito pelo contrário. São apenas algumas justificativas que acho importantes para a adoção do Groovy como linguagem de programação.

    Realmente poderia ter falado um pouco sobre o AST, mas até hoje usei pouquíssimas vezes este recurso de forma direta, então não justificava o uso do Grails para mim neste ponto. Com relação aos outros, na realidade se você for dar uma olhada nos atributos da linguagem, vai ver que os trato, só que não de forma tão direta, mas sem sombra de dúvidas são também excelentes razões para se adotar tanto Groovy quanto Scala. :)

  10. O valor do Java pra mim tá na máquina virtual bem mais que na linguagem.

    Java já foi uma linguagem massa: quando surgiu, porque era o que todo mundo queria no C++. Mas o mundo andou, as pessoas se acostumaram com Java, e hoje querem em Groovy, Scala, Clojure, etc coisas que não vêem mais no Java.

    É a vida! :)

  11. Estou à meses matutando como resolver um problema e você me deu uma luz :)! Leciono Algoritmo e Programação em uma faculdade e a linguagem inicial sugerida pela coordenação é o Java. Apesar de programar a um bom tempo em Java acho muita sacanagem com os alunos ensiná-la como primeira linguagem. Apesar de não ter experiência em Groovy tenho vontade faz tempo de aprender. Sua frase “Groovy resolve um problema fundamental para mim: o da entrada de iniciantes na plataforma Java. ” faz muito sentido e caiu como uma luva! Obrigado e ótimo post e blog!

  12. Oi José Alexandre, valeu!

    FINALMENTE alguém vai usar Groovy na educação!
    Nunca entendi por que começar de cara no Java (do ponto de vista estritamente pedagógico). Como disse no post, este negócio de começar seu programa tendo de encapsulá-lo em uma classe torna a coisa MUITO mais complicada pra quem está começando. Soa como bobagem mas não é: vejo isto diáriamente quando dou consultorias sobre Groovy e Grails.
    Este seu comentário já valeu o post! Valeu!

  13. Nossa empresa trabalhava com Delphi e Firebird, porém precisávamos inovar nossos produtos ai surgiu o grails em nossa vidas, aprendi muito em um ano trabalhando com o framework, no inicio era meio java com groovy, agora já esta muito mais groovy, :) estamos muito felizes pois nossos produtos estão muito mais atuais e inovadores as facilidades acima já citadas e mais algumas como uma leitura de xml que era um “parto” em java no groovy chega a ser ridículo rsrsrsrsrrs seu site kiko + grails brasil dão um suporte muito bom

  14. Que bom saber disto Fernando, obrigado!
    Espero no futuro poder te ajudar muito mais. :)

  15. Henrique, show de bola as explicações sobre Groovy. Com esse post e alguns vídeos teus e um que vi tbm do Gilliardi, fiquei extremamente curioso. Trabalho em uma instituição cujos sistemas são todos JEE, porém utilizam várias tecnologias e frameworks em conjunto: spring, jsf, hibernate, código legado em struts, etc. Enfim, os sistemas são gigantes e tudo que vamos fazer temos de: criar entidade, fazer o mapeamento nessa para a tabela existente no banco, criar mbean, dao, etc. Há desvantagens e outras vantagens nisso (não vem ao caso nesse momento). O fato é que eu e mais dois colegas de trabalho estamos com um projeto de desenvolvimento à parte do nosso trabalho e gostaríamos de ter os benefícios do java, já que é a vivência do nosso dia-a-dia, porém, até pelo fato dos participantes do projeto virem de outras linguagens, queríamos algo não tão “trabalhoso” quanto o java.
    Enfim, gostaria de te perguntar como leigo no assunto:
    1 – Tu utiliza o groovy/grails nos projetos do teu dia-a-dia ou mais como uma forma de iniciar as pessoas no JAVA e depois volta a utilizar os frameworks mais “tradicionais” (spring, jsf, cdi, etc.) e faz a integração deles você mesmo?
    2 – De leigo: existe algum problema em utilizar os benefícios do groovy e utilizar uma biblioteca de componentes ricos, como o primefaces, por exemplo.
    Não sei se tá entendendo minhas dúvidas, mas é que queria saber como é que um cara como você, que está há mais tempo no meio, utiliza essas tecnologias no teu dia-a-dia de trabalho prático.
    Desde já agradeço pela atenção e peço desculpas pelo texto gigante, mas é que fiquei empolgadaço com as idéias do groovy e, ainda mais, do grails e me geraram muitas dúvidas :)

  16. Oi Luiz, legal que tenha gostado, valeu :)

    Agora, com relação às suas perguntas.

    1. Sim, uso das duas formas. Tanto como uma linguagem substituta ao Java em alguns projetos como também em projetos Groovy/Grails. No caso do Java costumo inclusive usar mais o Groovy quando preciso dar mais dinamismo ao projeto, por exemplo, inclusão de scripts gerados por usuário, este tipo de coisa.

    2. Não que eu saiba. O único problema que você poderia vir a ter (mas nunca vi ocorrendo) diz respeito ao uso de strings. Groovy tem a GString (apesar de também trabalhar com as strings tradicionais do Java), então pode ser que alguma confusão ocorra aí.

    Qualquer coisa Luiz, to aí pra te ajudar ok?

    Grande abraço!

  17. Ok Henrique. Muito obrigado pela rápida resposta.
    Qualquer coisa, volto a te perturbar sim :)
    Vlw!

  18. antes de começar a aprender Programação (ainda sou iniciante!), fui orientado a escolher uma Linguagem como padrão!

    fiquei pesquisando na WEB e resolvi me decidi entre Java ou C# (não cheguei a encontrar o Groovy nas pesquisas WEB, não sei porque)!

    olha, quando eu vi que em Java era necessário escrever mais Códigos para executar um Comando, do que em C#, óbvio que adotei como Linguagem Padrão o C# !!!!!

    eu gostei da forma simples do Groovy escrever Códigos!! Vou deixar nos Favoritos e vou ver se acho vídeo-aulas sobre essa Linguagem!

    Abraços!

  19. Oi Weliton, que bom que este texto lhe foi útil. Obrigado!

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.