Taverna /dev/All

Quais as tecnologias que estão no seu radar de 2022?

Ano novo, tecnologias novas?

Quais tecnologias estão no seu radar para este ano de 2022?

Seguem as minhas:

  • Jakarta EE - estou decidido a revisitar o padrão Java EE este ano, pois está começando um processo de competição com o Spring que acho muito interessante.
  • GraalVM - para a geração de projetos Java com menor consumo de memória e tempo de inicialização, o que vai incluir também o Spring Native.
  • Machine Learning - comecei isto ano passado com muito Python e todo o ecossistema relacionado e este ano deve voltar com tudo.
  • Kubernetes - pra infraestrutura, pois já passou da hora de dominar esta tecnologia.
4 Curtidas

Jakarta EE, sério? Como é que você tem percebido essa competição com Spring?

Eu queria dominar a arte de criar ferramentinhas que facilitam nossas vidas no dia-a-dia e nos tornam mais produtivos. Nesse sentido, Babashka parece uma boa ideia para quem, como eu, gosta de Clojure.

Acho que eu também preciso investir em devops em geral e Kubernetes em particular.

1 Curtida

Bizarro né? Também achei!
Foi após ter lido este post aqui olha: Is Spring Boot Still State of the Art? – Ralph's Open Source Blog

O que está no meu radar é data science.
Desde o ano passado tenho estudado estatística e aplicado em linguagens como julia e python.
Não é fácil não. Precisei revisar matérias do ensino médio e voltar algumas que fiz na graduação para poder começar a entender o processo.

1 Curtida

Também estou com Kubernets no radar, mas como aceitei um novo desafio eu pretendo aprender:

  • Kotlin - aprender o idioma;
  • Spring Native - pra ter menor consumo e maior rapidez na carga dos projetos;
  • AWS - o ecossistema da Amazon e me aprofundar na boa arquitetura de tecnologias da nuvem.
1 Curtida
1 Curtida

Estou me aprofundando no mundo do Javascript (Frontend), sempre fui mais do backend, então estou usando bastante o Angular 12/13 para Web e Ionic para desenvolvimento mobile.

Quero dar uma olhada (e eventualmente usar profissionalmente) o Pact (https://docs.pact.io/) para testes de contratos de APIs.

Também não pretendo abandonar o Java, que na minha opinião está melhor a cada versão. Recomendo o Micronaut que é um framework voltado para microsserviços e que é perfeitamente integrável com a GraalVM. Quem quiser, pode entrar no nosso grupo no LinkedIn:

https://www.linkedin.com/groups/12289274/

Além disso, pretendo continuar firme no Kubernetes, que para meu contexto atual, é imprescindível.

Vi que algumas pessoas tem interesse no Kubernetes. Estou fazendo uma série gratuita sobre ele chamada Kubernetes Para Todos! Ela está disponível no Youtube na seguinte playslist:

Esse ano pretendo trazer novos conteúdos.

2 Curtidas

Interessante essa parte:

“However, the original advantage of Spring Boot to build a bootable server seems more and more a disadvantage in today’s time of container environments. You lose flexibility and run the risk of becoming very dependent on libraries whose effects you can not oversee as a developer. In contrast, modern application servers today offer the use of container technology and enable you to work on a production-like server system during development. From this point of view, in my opinion, it no longer makes sense to build a bootable server around your microservice today.”

Concordo plenamente, por isso na minha opinião Micronaut e Quarkus são opções bem melhores considerando microsserviços.

Não sei se todos conhecem, mas eu gosto bastante do Skaffold (https://skaffold.dev/). Você consegue desenvolver localmente usando um cluster Kubernetes para subir os containers.

fenomenal sua iniciativa Bruno, obrigado!

Obrigado pelo apoio @kicolobo! Ouvir isso de você é um elogio imenso.

Você foi o primeiro cara de TI que comecei a acompanhar (na época por causa do Grails). E suas iniciativas para divulgar conhecimentos e reunir a galera sempre me motivaram bastante, como o Devall e a Taverna!

Obrigado por todo seu apoio e dedicação!

1 Curtida

Eu entendi o argumento do artigo mas não consigo determinar a relevância. Essa argumento de “vincular seu código a uma implementação específica e torná-lo menos portável” já rolou outras vezes (com o padrão Java EE mesmo, na definição dos servidores, em que cada um acabou incluindo suas próprias extensões e as pessoas passaram a usá-las). Na minha experiência eu nunca vi um sistema ser portado entre servidores de aplicação (mas é só minha experiência). Uma única vez eu vi um sistema dar suporte a múltiplos RDBMS com Hibernate e termos que ajustar algumas coisas para usar HQL/SQL padrão.

O argumento mais razoável é o do tamanho do artefato gerado, mas só é pequeno porque você espera que tudo exista no servidor de aplicações. Aí também pode rolar aquele problema de seu servidor escolhido ter uma extensão presente que num existiria noutro.

Eu não comparei os ecossistemas Java EE e Spring mas este é um “monstro”, tem de tudo o que você quer, integra com tudo o de mais importante que existe na indústria em questão de aplicações “enterprise”. Java EE tem tantas features quanto Spring? Eu acho que é aí que está a possível principal vantagem de um ou outro framework. Só tamanho do artefato e portabilidade eu não acho que são fortes o suficiente para trocar Spring por Java EE.

pois é Matheus: justamente por ter me afastado do mundo Java EE é que to querendo estudar pra ver o que é (se é que há) que estou perdendo, saca?

Entendi, isso faz sentido. De vez em quando eu penso em trocar Spring por outro modelo mas é sempre complicado especialmente nesse aspecto do tamanho do ecossistemas e das integrações que Spring oferece: dificilmente uma alternativa oferece tanta coisa como o Spring. De certa forma isso é um grande vendor lock-in, né? :wink:

total lock-in!

Este que é o problema inclusive: a gente vai se acomodando com uma tecnologia e de repente: tamo viciado nela! kkkkk

Com Grails foi exatamente assim comigo

1 Curtida
  • nand2tetris: comecei o curso do nand2tetris. Fiquei fascinado com arquitetura de computadores ao ler o livro Code The Hidden Language of Computer Hardware and Software (que recomendo fortemente!), e no nand2tetris tenho a chance de partir para prática. Indo para o projeto 2 agora, e está fenomenal até o momento!
  • Terraform: sempre fiz as coisas que precisava na AWS pelo dashboard, apesar de existir Cloudformation (que não gostei, por sinal) nunca usei uma ferramenta totalmente automatizada. Quero aprender Terraform a ponto de criar toda minha infra do zero (ou quase tudo). Talvez experimentar Pulumi, se tiver a chance.
  • Erlang: com uma certa frequência preciso escrever e manter código escrito em Elixir. Conhecer mais sobre Erlang, sua VM, e suas abstrações são fundamentais para entender melhor o Elixir. Preciso aprender mais sobre a parte de concorrência e tolerância a falhas, ainda sinto esse gap bem forte. Ainda não entendi a filosofia do “let it crash”.
  • Kotlin: ano passado caí de paraquedas em um projeto por uma semana em Kotlin, e gostei da experiência. Me pareceu um bom meio termo entre Java e Scala.
  • Scala 3: somente ver as novidades por curiosidade. Já usei a v2 no passado para escrever um scraper e gostei bastante (apesar de muita gente odiar e dizer que é lento).

Acho que minha lista está um tanto pretenciosa, capaz de deixar Kotlin e Scala de escanteio com o andar da carroagem :sweat_smile:

Muito legal a sua visão sobre o Jakarta EE, estou apostando e focando muito nessa stack no momento visto que o mundo não é só Spring e nem toda aplicação (talvez a grande maioria) precisa abraçar o mundo Cloud. Meu radar de tecnologias para este ano:

Jakarta EE

Apesar do mercado ter sido movido nos últimos anos por tendências e um pouco pelo hype, acredito que o Jakarta EE sempre vai ser a opção mais sólida no longo prazo. Acontece que nosso setor parou de considerar a compatibilidade/portabilidade e estabilidade como coisas valiosas, como se não fosse possível migrar para a cloud e/ou evoluir as aplicações que ainda estão no Java EE. Todos esses problemas foram resolvidos no passado por meio da especificação e servidores de aplicação, a diferença é que hoje possuímos uma especificação a mais que é focada em microservices, o MicroProfile. A implementação do MP (como a SmallRye que é usada no Quarkus e OpenLiberty) já vem embutida em todos os profiles do WildFly, e se quiser só o MP, existe um profile separado para ele.

Claro que a distribuição da aplicação em containers é muito importante para escalabilidade automatizada, mas não faz parte do design inicial da aplicação, pois na maioria das vezes não é necessário muita escalabilidade no início e nem sempre é viável ter profissionais focados em DevOps logo na fase inicial do software, portanto escalar verticalmente é muito mais barato em um primeiro momento, só alguns nodes do WildFly em cluster no modo HA (High Availability) com o Load Balancer integrado e Infinispan como servidor de cache distribuído já resolve muito bem esses problemas. A integração do Infinispan com o cluster do WildFly é possível graças aos subsystems disponíveis no profile HA e através do JGroups que realiza a comunicação entre os nodes distribuídos na rede. Lembrando que pode ser adicionado vários nodes dentro de um server-group controlado por uma instância master (modo domain), rodando uma ou mais aplicações em cada node.

Ao observar a evolução da JVM, percebe-se que ela evoluiu muito, além disso temos muitas opções do OpenJDK para escolher, basta deixar a JVM trabalhar, nosso trabalho como desenvolvedor é utilizar todos os recursos que estão disponíveis ao nosso alcance, não adianta querer escalar em container se a aplicação tem baixo throughput ou outros gargalos de performance.

Após chegar até esse ponto e ainda precise de mais escalabilidade, existem ótimas opções para Cloud com escalonamento automático no Kubernetes, basta usar o WildFly Operator para administrar o cluster, caso queira criar uma Bootable JAR com o servidor de aplicação embarcado basta montar o script de configuração via CLI do WildFly para deixar o servidor pré-configurado no build da JAR, tudo isso é possível através de plugins e profiles no Maven, o build padrão pode ser apenas a aplicação empacotada em um WAR (arquivo leve), já os profiles seriam os builds customizados para cloud, uma JAR para K8S e outra para OpenShift por exemplo, a JAR fica com um tamanho maior por conta de ter um servidor embarcado mas para reduzir o tamanho pode ser configurado um servidor embarcado apenas com os layers (Galleon Layers) que a aplicação precisa. Lembrando que pode ser criado uma imagem Docker da aplicação com servidor embutido em uma JAR só com os módulos necessários como também pode ser utilizado a imagem Docker padrão do WildFly.

Além de ter um ambiente de produção, o ambiente de desenvolvimento pode ser mais leve do que Bootable JARs, basta utilizar o modelo tradicional porém com uma instância remota do WildFly, configurando a IDE para realizar o deploy remoto de cada WAR no servidor, não tem necessidade de reiniciá-lo, dessa forma os redeploys ficam muito rápidos, principalmente se a aplicação é distribuída dentro do servidor. Caso opte pela Bootable JAR, tem uma opção interessante, para rodar o processo em modo de desenvolvimento (watch-mode) que detecta as alterações e automaticamente realiza o deploy da aplicação.

Recomendo a leitura desse artigo: Don’t replace Spring Boot with Quarkus, replace it with Wildfly | by Hélio Bessoni Rodrigues | Medium

Cloud Native

Supondo que o grande desafio da aplicação seja a escalabilidade e performance, a solução EE pode não ser a opção mais recomendada para esse tipo de desafio, principalmente se as aplicações forem muito grandes e distribuídas. Nesse contexto começa a fazer sentido a proposta do Quarkus com AOT (Ahead of Time Compilation), para entender a real vantagem do Quarkus, devemos pensar em aplicações que são realmente grandes.

Tempo de compilação: Todas as ações aplicadas em tempo de compilação para montar o executável (jar, war, imagem nativa). Normalmente esta etapa é composta pela compilação, processamento de anotações, geração de bytecode, etc.

Tempo de execução: Normalmente, enquanto o código de negócio é executado, várias ações técnicas também são executadas, como carregar bibliotecas e arquivos de configuração, escanear o classpath, configurar a injeção de dependência, configurar seu mapeamento objeto-relacional, instanciar seus controladores REST, etc.

Basicamente, o Quarkus move boa parte desse processamento realizado em tempo de execução para tempo de compilação, dessa forma qualquer framework que dependa do uso de Reflection em runtime deverá ser adaptado em uma extension, trazendo ganhos significativos de performance.

No entanto, existem existem aplicações web como JSP (action-based) e JSF (component-based) totalmente servlet-based que precisam ser evoluídas, migrando do Java 7 para Java 17, porém o Quarkus utiliza o Vert.x como servidor e não suporta a especificação MVC muito menos o JSF por isso ainda acredito que Jakarta EE tem muito mercado para esse tipo de aplicação, é uma solução com um nível de maturidade adequado para resolver o problema, mas se tratando de Cloud Native existem boas alternativas para o Quarkus que estão em desenvolvimento como por exemplo o Qute que é uma Template Engine que substitui a proposta do JSP, apesar de possuir algumas diferenças técnicas como a questão de não depender do Servlet (JSP é compilado, vira um “.class”, tende a ser mais performático que as templates engines mas não sei se dá para considerar essa diferença). Por outro lado, o Quarkus traz muitas vantagens para escalabilidade considerando que ele possuí as Reactive Extensions (non blocking IO) e permite combinar o modelo tradicional (bloqueante) com o reativo. Uma alternativa as implementações tradicionais do JSF seria utilizar uma extensão desenvolvida para rodar nativamente, o Quarkus MyFaces, note que essas extensões ainda estão marcadas como “Experimental”, e, eventualmente, podem sofrer várias alterações até serem marcadas como “Stable”.

Ressalto ainda que, uma arquitetura Jakarta EE pode ser migrada parcialmente ou totalmente para rodar na plataforma Quarkus, pois boa parte das especificações serão reaproveitadas.

Monólito Modularizado

Dado que a arquitetura de microservices não é tão relevante na maioria das vezes e acaba agregando complexidade e custos elevados para manter essa arquitetura distribuída, vale a pena focar em criar sistemas menos distribuídos porém com mais qualidade, não se trata de um monólito qualquer mas sim de uma separação de camadas bem definida, essa camadas podem ser apenas código de negócio ou aplicações separadas e organizadas em módulos do Maven.

Recomendo que assistam essa palestra do Rafael Ponte que aborda esse tema de Monolito X Microservices com clareza.

Web Standards

A ideia de construir um software duradouro vai muito além do Java, pode ser aplicado a mesma linha na Web (Client Side Framework X Web Standards). Quem disse que todas as aplicações Web devem ser migradas para frameworks que funcionam apenas no client-side (SPA)? Do ponto de vista de um desenvolvedor back-end, SPA com certeza não é bala de prata e deve ser evitada em muitas aplicações, como E-Commerces por exemplo, que aproveitam a renderização server-side para indexar conteúdos no Google. Mas então, como resolver o problema do SSR oferecendo uma boa experiência para o usuário? Web Standards, apenas isso, separando os Web Components renderizados no client-side do HTML que é gerado no servidor, dessa forma o software não fica preso a um fornecedor específico, tornando-se a melhor escolha no longo prazo. E, para minimizar um pouco o uso do javascript pode ser usado libs mais simples como o HTMX (11.6 kB) por exemplo.

Outro ponto que deve ser considerado, principalmente em uma stack full Java, é o modelo action-based (MVC) vs component-based (JSF): acredito que para aplicações de intranet ou com poucos acessos, o JSF com PrimeFaces 11 é uma solução muito robusta e produtiva, você realmente não fica na mão e ainda tem suporte da PrimeTek, porém não recomendo misturar essa camada da aplicação com o backend, pois a aplicação JSF pode apenas consumir a aplicação Rest de forma desacoplada e esse mesmo backend também pode ser utilizado por outros clients como aplicativos mobile por exemplo. Para o restante das aplicações que precisam escalar, o action-based aliado com as boas práticas e Web Standards resolve o problema permitindo renderização client-side e server-side.

1 Curtida

que show este post Fernando!

Sua defesa do Jakarta EE é de longe uma das melhores que já vi: agregou pra daná aqui, valeu!

1 Curtida

As tecnologias que estão no meu radar são principalmente as relacionadas com segurança e cloud. IAM, SOAR. De infra, acho que cedo ou tarde vou precisar mergulhar de cabeça em Ansible. E estou molhando os pés um pouco em python.

1 Curtida

itexto