A linguagem de programação Groovy - Radar da itexto

Este post inicia a série "Radar da itexto" na qual apresentamos à comunidade as tecnologias que usamos e recomendamos. Nosso objetivo é responder a questões essenciais que deveriam nortear a escolha de qualquer tecnologia: o que é? onde aplicar? tem passado e futuro?

O que é Groovy?

Uma linguagem de programação desenvolvida e pensada para a plataforma Java. Por "plataforma Java", entenda "executada pela e na JVM". Mas o que "mais esta linguagem" pra JVM trás pro jogo?

Ter como alicerces a JVM e a linguagem Java

Groovy convive muito bem com código Java pré-existente. Você pode executar código Java a partir do Groovy e vice-versa. Groovy, assim como Java, gera bytecode que é executado pela JVM de forma indiscriminada.

Mas mais do que isto: Groovy respeita a estrutura de tipos e modelo de execução adotado pela linguagem Java, o que torna esta integração no nível mais baixo da linguagem (bytecode) um processo totalmente transparente.

Como nota histórica, a linguagem aparece pela primeira vez em um post do blog de James Strachan (seu criador) em 2003: o objetivo era ter uma linguagem dinâmica na plataforma Java que surgisse tendo a JVM em seu centro, ao contrário das linguagens Jython e JRuby que, na época, não tinham atingido com pleno sucesso este objetivo.

Surge assim Groovy: "uma linguagem dinâmica para a plataforma Java", mas com um diferencial importantíssimo: sintaxe muito próxima à do Java, o que reduz significativamente a curva de aprendizado.

Uma linguagem dinâmica (mas só se você quiser)

É importante entender um dos principais fatores de venda do Groovy que é o fato desta ser "uma linguagem dinâmica". Groovy é muito influenciado por Ruby e Python que também são linguagens dinâmicas.

Em essência uma linguagem dinâmica permite que você modifique o comportamento do seu código em tempo de execução. Soa estranho em um primeiro momento: se você já colocou seu código em produção, pra que incluir novos comportamentos neste? Qual o sentido?

A primeira forma como encontramos o aspecto dinâmico de linguagens diz respeito à tipagem. Uma linguagem possui tipagem dinâmica quando descobrimos seu tipo (inteiro, texto, booleano...) em tempo de execução e não de compilação.

Há aqui um tradeoff entre desempenho e produtividade. Não raro do ponto de vista do desenvolvedor o tipo não é tão importante quanto parece. Pense em uma hierarquia de classes na qual precisemos da existência de um conjunto de comportamentos (métodos). Em uma linguagem estática criamos uma hierarquia ou estrutura de interfaces que identifiquem estes comportamentos. Em uma linguagem dinâmica só precisamos que o método exista: é o que chamamos de duck typing.

Mas nem só de tipagem dinâmica vivem estas linguagens: você também pode incluir novos métodos e atributos em classes existentes ou mesmo interceptar a invocação de métodos usando recursos nativos da linguagem ao invés de frameworks como Spring ou AspectJ.

No frigir dos ovos, entretanto, é importante salientar que estes recursos são usados mais por quem desenvolve código de infraestrutura (frameworks) que a esmagadora maioria dos desenvolvedores.

Um aspecto importante a ser levado em consideração no caso do Groovy é que os aspectos dinâmicos da linguagem são opcionais: se quiser, você pode desenvolver com tipagem estática sem problema algum e com isto obter algum ganho de desempenho (não é tão significativo assim).

Um "Java++"?

Observamos em nosso time e de diversos clientes que a adoção do Groovy pode aumentar significativamente a produtividade da equipe devido aos pontos que trataremos aqui.

Uma consequência interessante de estarmos lidando com uma linguagem dinâmica é que a equipe responsável pelo desenvolvimento do Groovy acabou evoluindo a própria API do Java.

Como podemos incluir novos métodos em classes já existentes, Groovy acabou por adicionar uma pletora de novas funcionalidades na API padrão do Java, aumentando significativamente a produtividade do desenvolvedor. É o que chamamos de GDK (Groovy Development Kit). Observe os métodos incluídos na classe String, por exemplo: inúmeras funcionalidades que você sempre quis mas precisava antes de outras bibliotecas encontram-se ali.

Mas os ganhos não estão apenas no enriquecimento das bibliotecas padrão: a sintaxe também possui diversas melhorias. Como mencionado, você pode dar seus primeiros passos na linguagem usando o que já conhece do Java, mas pouco a pouco ir experimentando novas features, tais como:

  • Sobrecarga de operadores.
  • Operadores para lidar com Collections, tais como "[]" para lidar com listas ao invés da classe java.util.List (e implementações) e "[:]" para lidar com mapas ao invés de java.util.Map (e implementações).
  • Interpolação de valores em strings.
  • Uma sintaxe que pode ser muito mais limpa por remover atributos que poderiam ser opcionais (";" ao final de cada comando quando há um único por linha, parênteses opcionais, expressão "return" opcional, método "main" opcional, e muitos outros).

E esta é uma lista bem pequena. Anos atrás (Windows Vista!) gravei um vídeo de quase uma hora só expondo estas funcionalidades que pode ser visto neste link: https://youtu.be/eEUKRhPoJAY

Com sua sintaxe menos burocrática e o enriquecimento da API padrão do Java, Groovy trás para o universo Java uma experiência muito próxima da que desenvolvedores Python e Ruby tem em seu dia a dia.

Indo além, acreditamos que temos aqui o que chamamos de "tecnologia ponte": Groovy fornece aos menos experientes uma introdução suave a conceitos e bibliotecas mais complexas do ecossistema Java (incluindo Java EE).

Construa suas próprias linguagens (DSLs) com Groovy

A sintaxe do Groovy unida aos seus aspectos dinâmicos e a inclusão de funcionalidades como builders e outros o tornam a ferramenta ideal para a construção de linguagens específicas de contexto (DSLs - Domain Specific Language).

Há alguns projetos de sucesso hoje que são essencialmente DSLs escritas com Groovy, sendo o mais famoso provavelmente o Gradle, seguido do Spock.

Em nossa experiência já implementamos, por exemplo, linguagens específicas de contexto para os setores de engenharia, e-commerce, comunicações e outros. Caso queira ler mais sobre Groovy para a construção de linguagens específicas de contexto, leia este link de sua documentação oficial ou leia este livro.

Aplicações

Groovy é uma linguagem de uso geral: pode portanto ser usada, em teoria, para qualquer coisa, entretanto há usos para os quais esta se mostra uma alternativa interessante, e são estas que traremos aqui. Naturalmente há outras, entretanto estes são os usos que consideramos mais populares.

Um problema que a linguagem enfrenta é o fato de na maior parte das vezes ter seu nome vinculado ao do framework Grails, o que limita bastante a sua percepção pelo público.

Complementando o Java

Como linguagem embarcada

É possível embarcar Groovy em projetos Java de uma forma relativamente simples, o que possibilita a construção de plataformas que possam ser estendidas em tempo de execução por seus usuários através da inclusão, edição e remoção de scripts Groovy a serem executados por esta.

Em uma plataforma de vendas, por exemplo, é possível termos scripts que validem promoções em tempo de execução, podemos pensar também em fórmulas e cálculos definidos pelo usuário, algoritmos de processamento sinais e muitas outras funcionalidades cujo conhecimento está nas mãos dos usuários e não da equipe de desenvolvimento. Uma opção muito mais fácil de ser implantada que a adoção de motores de regras complexos como Drools, por exemplo.

A equipe de desenvolvimento passa portanto aqui a atuar como responsável pela evolução de uma plataforma a ser enriquecida por seus usuários finais, sem a necessidade de realizar complexos procedimentos de manutenção de código e implantação. Bateu aquela curiosidade pra saber como isto pode ser feito? Aqui segue um vídeo em que explico como proceder: https://youtu.be/_njSd-efuCo

Como ferramenta de automatização/integração com scripts

Código Groovy pode ser executado sob a forma de scripts. E dado que o acesso a código Java é direto, abrem-se aqui possibilidades de automatização bastante interessantes.

É possível, por exemplo, incluir suas bibliotecas de negócio (arquivos JAR) ou de infraestrutura (como frameworks de persistência ou biblitoecas utilitárias) no classpath dos seus scripts e executar nativamente as funcionalidades ali implementadas.

Um uso muito comum é a execução de tarefas agendadas de manutenção como, por exemplo, usando as regras de negócio distribuídas como arquivos JAR, invalidar registros, executar relatórios, etc através de agendamentos simples de sistema operacional (CRON).

Você pode, por exemplo, tirando proveito das melhorias introduzidas pelo GDK inclusive executar ações como raspagem de dados, implementação de crawlers, processamento em massa de dados e muitas outras atividades que normalmente são implementadas como scripts simples.

Como ferramenta de onboarding de novos membros na equipe

Uma das maiores dificuldades de equipes que precisam contratar profissionais Java é encontrá-los. Então por que não usar Groovy como uma ponte para desenvolvedores Python, Ruby ou JavaScript?

Esta é uma possibilidade real: muitas vezes profissionais habituados a estas linguagens possuem forte resistência ao ecossistema Java devido à linguagem (Java). Como Groovy apresenta uma sintaxe muito próxima do Python/Ruby, estes programadores tendem a sentirem-se mais confiáveis usando Groovy e, pouco a pouco, começam a se habituar ao ecossistema Java a partir desta ponte.

Desenvolvimento web

Desenvolvimento web com Groovy vai muito além do Grails (em breve um texto aqui sobre este assunto). Sou obrigado a citá-lo, mas é fundamental que você saiba que há várias outras alternativas que também são de altíssima produtividade:

  • Grails - de longe a opção mais popular da linguagem, sendo fortemente inspirado em Ruby on Rails - https://grails.org
  • Micronaut - desenvolvido pela equipe que desenvolveu o Grails, uma solução interessantíssima para o desenvolvimento de microserviços. - https://micronaut.io
  • Spring Boot - é possível com pouquíssimo código Groovy escrever microserviços com este framework, sabia?
  • Ratpack - uma opção extremamente produtiva para a escrita de aplicações web no estilo de microserviços - https://ratpack.io/
  • Groovy Servlets - quer um desenvolvimento mais raíz? Que tal implementar seus próprios servlets com o mínimo de código? Aprenda mais aqui.

Desenvolvimento desktop

Quem disse que o desenvolvimento desktop acabou? Groovy é uma opção muito interessante nesta área. Duas alternativas bastante interessantes:

Griffon

Pense no Griffon como se fosse um Grails/Ruby on Rails/Django para o desenvolvimento desktop. Os mesmos princípios de convenção sobre configuração e não se repita (DRY - Don't Repeat Yourself) se aplicam aqui.

Saiba mais neste link.

Swing Builder

Em sua biblioteca padrão Groovy trás um recurso muito interessante que é o Swing Builder. Com ele é possível desenvolver aplicações desktop na plataforma Java usando um ambiente que desenvolvedores JavaFX (especialmente em sua primeira versão) acharão bastante familiar ;)

Adoção e futuro

Uso no mercado

Por muitos anos Groovy foi a segunda linguagem mais popular na plataforma Java (atrás do próprio Java). Com a adoção do Kotlin no desenvolvimento Android a situação mudou e esta não é mais a realidade.

No índice TIOBE de novembro/2020, a linguagem quase chega ao TOP 10 global, encontrando-se na décima primeira posição, tal como pode ser visto neste link. Este crescimento vêm sendo observado pela mídia internacional nos últimos meses, tal como pode ser visto neste, neste e neste link.

Entretanto popularidade não deve ser levada em consideração na adoção de uma tecnologia, especialmente o índice TIOBE, que mede apenas menções a tecnologias na web (e fora do Brasil). Há muito hype que deve ser filtrado, o que realmente interessa são outras métricas em relação ao futuro do projeto:

  • Atividade do repositório: bastante ativa como pode ser vista no Github.
  • Frequência na liberação de releases: há pelo menos uns dois ou três por ano, tal como pode ser visto neste link.
  • Adoção em outros projetos: são realmente muitos, tais como pode ser visto neste (Awesome Opensource) e neste link (Github).
  • Comunidade - a comunidade Slack do Groovy é bastante ativa e há muita movimentação no StackOverflow também, como pode ser visto aqui. Entretanto é importante salientar que temos aqui comunidades difusas, dado que estas se distribuem entre os diferentes projetos que se baseiam na linguagem (Gradle, Grails, Jenkins, etc.).
  • Adoção pelo mercado e maturidade: Groovy surge em 2003, já tem 17 anos de idade e adoção nos mais variados cenários.
  • Livros publicados a respeito: há muito material publicado a respeito, o que pode ser verificado, por exemplo, no site da Amazon ou na documentação oficial da linguagem.

Portanto há desenvolvimento e também uma comunidade ativa que usa a linguagem em seu dia a dia, o que lhe confere relevância. Levando em consideração que temos um projeto open source, é seguro dizer que não desaparecerá tão cedo do nosso radar.

Recentemente saiu a versão 4.0 do Groovy, que trás uma série de melhorias e avanços, que podem ser vistos neste link. Entretanto, dado que seu uso mais popular ainda é o Grails, poderá levar um tempo até que este último release se popularize, dado que o último release do Grails (4.0.5) ainda usa a versão 2.5.6 da linguagem. Outro fator que impactará sua adoção é o fato de depender da versão 9 ou posterior do JDK, em um mundo no qual o Java 8 ainda domina, mas estes dois pontos são questão de tempo.

Dificuldades na adoção em equipes

Em nossa experiência encontramos alguns fatores que devem ser levados em consideração caso seu time opte pro adotar Groovy como linguagem de programação. É muito importante levar estes pontos em consideração caso esteja considerando adotar esta tecnologia.

Cuidado com o primeiro contato

A principal dificuldade na adoção do Groovy é o modo como profissionais tem o primeiro contato com a linguagem, normalmente a partir de um framework (Grails). Um comportamento muito similar que observamos com a linguagem Ruby em relação ao Ruby on Rails (e poderíamos também mencionar Python com Django).

Muitas vezes o desenvolvedor se limita ao que é apresentado pelo framework, acabando por não se aprofundar na linguagem e, com isto, usando apenas uma pequena parte do que esta tem a oferecer.

Vícios do Java

Groovy oferece uma sintaxe que é muito próxima à do Java. A vantagem desta abordagem é que a curva de aprendizado é realmente muito pequena para quem já conhece a linguagem, entretanto há um perigo aqui.

A escrita de código Groovy muito similar ao do Java deve ocorrer somente nos primeiros contatos com a linguagem. Com o passar do tempo a equipe deve ser incentivada a escrever código que seja o mais próximo possível do estilo Groovy para que possa tirar máximo proveito do que esta tem a oferecer e, também, evitar uma série de problemas difíceis de serem detectados se lermos código Groovy como se fosse Java.

Caso enfrente este problema, recomendamos que os dois textos a seguir sejam divulgados para o time:

Dinamismo

O dinamismo da linguagem também pode ser considerado uma dificuldade por equipes habituadas a trabalhar com linguagens estáticas. Essencialmente vemos aqui estas equipes tendo o mesmo tipo de dificuldade com outras linguagens, tais como Ruby ou Python, o que talvez justifique, nos mesmos times, o sucesso de linguagens como TypeScript.

É muito importante que a equipe esteja consciente do significado de uma linguagem dinâmica para que possa tirar máximo proveito do que esta tem a oferecer, caso contrário há o risco real de comportamentos esperados da linguagem serem mal interpretados como defeitos e não como o que realmente são: funcionalidades.

Ferramental

Após tantos anos no mercado é natural que tenha surgido todo um ferramental que rodeia a linguagem. Seguem algumas ferramentas que consideramos essenciais para a adoção e aprendizado da tecnologia.

SDKMan

Hoje a principal ferramenta para se instalar o Groovy e qualquer outra ferramenta do ecossistema Java é o SDKMan, que nos permite gerenciar diferentes versões das principais ferramentas do ecossistema Java.

Maiores detalhes sobre o SDKMan podem ser obtidas em seu site oficial. Caso queira se aprofundar no assunto, recomendo que leia nosso guia do SDKMan.

IDEs e editores de texto

O fato de Groovy ser uma linguagem dinâmica torna o desenvolvimento de IDEs uma tarefa mais difícil se comparado às linguagens estáticas. Felizmente existem boas opções no mercado que podem ser adotadas:

  • Intellij IDEA - a melhor IDE para se trabalhar com Groovy e Grails.
  • Eclipse Groovy Development Tools - a instalação pode ser um pouco mais complicada, mas oferece o essencial para quem está habituado a trabalhar com Eclipse.
  • Visual Studio Code - apesar de não oferecer recursos avançados como "code complete", já possui plugins que permitem a refatoração de código e, ao que tudo indica, é questão de tempo até que alternativas melhores apareçam no editor.

É possível ter acesso a mais opções na documentação oficial da linguagem neste link, entretanto é importante ter em mente que as opções sempre são bem mais limitadas, devido à natureza da linguagem, que aquelas que temos com linguagens de tipagem estática como Java ou Kotlin.

Um ponto importante a ser levado em consideração é que na maior parte das vezes observamos que as equipes optam por não usar IDEs completas, mas sim editores de texto para escreverem seus sistemas com Groovy.

Para praticamente todos os editores do mercado existem plug-ins que possibilitam aplicar estilos e formatações a código Groovy, atendendo bem a este segmento. Dentre os editores os mais populares são:

REPL

Pelo fato da linguagem poder ser executada como scripts, esta oferece opções interessantes de interfaces REPL (Read Eval Process Loop), tal como o IRB do Ruby ou o interpretador do Python. Dentre estas, destacamos:

  • Groovy Web Console - que permite experimentar código Groovy na web sem a necessidade de tê-lo instalado localmente.
  • Groovy Console - interface desktop provida pela instalação padrão da linguagem (comando groovyConsole) que permite editar e executar pequenos scripts (inclusive depurá-los).

Ambas as ferramentas são bastante úteis no dia a dia em momentos nos quais é necessário avaliar possibilidades da linguagem e, principalmente, no aprendizado da mesma.

SonarQube

Para saber mais

O objetivo deste post é apresentar, do ponto de vista gerencial, uma tecnologia que pode agregar valor a seus projetos e que dominamos na itexto.

Caso deseje se aprofundar no assunto, segue uma pequena lista de recursos:

13