Guia para os primeiros passos no desenvolvimento Java em 2023 — Parte 2

Bruno Lellis
iFood Tech
Published in
6 min readFeb 3, 2023

Na parte 1 do guia fizemos uma introdução à linguagem Java, abordando os primeiros passos nesse ambiente.

Siga comigo nesta segunda parte do guia, em que vamos falar sobre práticas que facilitarão o seu dia a dia.

Pegue outra xícara de um bom café e aproveite esta leitura! ☕

👷‍♀️ Build Tool

Após os primeiros passos na linguagem, você precisará de uma ferramenta de automação da compilação do projeto. Essas ferramentas ajudam não apenas na compilação, como no gerenciamento das dependências (bibliotecas terceiras que você utilizará), execução e validação dos testes automatizados, montagem dos artefatos (arquivos .jar), entre outras. Existem plugins bem interessantes que analisam seu código, validando bugs e sugerindo formas melhores de escrever a mesma lógica. Aqui cabe uma observação importante: aprender com exemplos também é uma forma relevante de absorver conhecimento e que já me ajudou muito.

As ferramentas mais conhecidas incluem Apache Maven, Gradle e Bazel.

Minha recomendação é escolher o Maven. É a ferramenta mais utilizada (desde projetos simples até complexos) e é relativamente simples de entender. Para instalar, basta um sdk install maven utilizando o SDKMan. A estrutura de um projeto Maven deve seguir algumas premissas, o que também significa que você não precisa ficar pensando em muitos detalhes específicos, o que é bom quando se está começando.

Maven suporta arquétipos, como se fossem modelos prontos para serem utilizados. Por exemplo:

mvn archetype:generate -B \
-DarchetypeGroupId=org.moditect.ossquickstart \
-DarchetypeArtifactId=oss-quickstart-simple-archetype \
-DarchetypeVersion=1.0.0.Alpha1 \
-DgroupId=com.example.demos \
-DartifactId=fancy-project \
-Dversion=1.0.0-SNAPSHOT \
-DmoduleName=com.example.fancy

Uma IDE (abordaremos no próximo tópico) vai facilitar a criação de um projeto, seja com Maven ou Gradle. Ou seja, não se apegue tanto ao comando acima.

Uma funcionalidade menos conhecida e útil é o Maven Daemon, que auxilia drasticamente na velocidade das execuções, mantendo um processo rodando em segundo plano e evitando o custo de iniciar repetidamente o ambiente necessário. Para instalar, basta um sdk install mvnd.

A ferramenta Gradle também é popular e poderosa, tem muita flexibilidade e funcionalidades interessantes como compilação incremental (ou compilation avoidance, que, de forma inteligente, compila apenas as partes que foram modificadas). São funcionalidades interessantes, porém mais avançadas.

📝 Editor / IDE

Muitos desenvolvedores (não apenas no mundo Java) adoram brigar pelo melhor build tool, a melhor distribuição Linux… e com editor não poderia ser diferente. Ou seja, facilmente muitas opiniões diferentes surgirão neste ponto. Além dos editores, existem também as Integrated Development Environment ou IDEs.

Minha sugestão é utilizar o IntelliJ IDEA. É uma IDE relativamente pesada, mas te dará suporte valioso em todas as etapas do desenvolvimento: desde a criação do projeto, com o versionamento (git), com os testes automatizados, com as execuções do Maven/Gradle, com sugestões para simplificar e/ou melhorar seu código, com refatorações, suporte a debugging, ou seja, vale a pena. Vale citar que existe a versão Community (free) e também a Ultimate (paga). Reserve um tempo para aprender e se acostumar com as teclas de atalho, pois elas te salvarão muito tempo no dia a dia.

Existem outras IDEs igualmente famosas: Eclipse IDE e NetBeans.

Como não poderia deixar de ser, existem opções bastante leves, como é o caso do VSCode com o auxílio de plugins para suportar a linguagem Java. Esta seria a minha segunda opção depois do IntelliJ.

🧱 Bibliotecas

O ecossistema de bibliotecas de terceiros disponíveis é o que torna a linguagem Java tão forte: certamente você encontrará uma opção (biblioteca ou framework) pronta para ser utilizada em todas as tarefas que você imaginar, e geralmente é uma opção open-source.

No entanto, tome cuidado! Seja ponderado na escolha de quais bibliotecas você realmente necessita para importar ao seu projeto. Muitas opções também existem na própria linguagem, sem a necessidade de importar uma nova dependência.

Adicionar uma dependência ao seu projeto deve ser sempre uma decisão consciente. Sem um controle disso, você encontrará conflitos entre as versões transitivas (ou seja, dependências das dependências), aumentará a complexidade do seu projeto (mantendo tudo atualizado, o que é sempre o recomendado), estará mais sujeito a vulnerabilidades etc. Algumas vezes, é melhor codificar algo no próprio projeto, ou até mesmo copiar uma parte de uma biblioteca que você necessita — desde que a licença permita.

Algumas bibliotecas famosas que você encontrará em muitos projetos Java:

  • JUnit para testes unitários;
  • slf4j para padronização dos logs;
  • Jackson para lidar com JSON;
  • Testcontainers para facilitar testes de integração com Docker;

A lista awesome-java é um ponto de partida para conhecer muitas outras opções de bibliotecas famosas.

A grande maioria das bibliotecas está disponível no repositório do Maven Cental. Todas as ferramentas de compilação (build tools) são integradas com esse repositório. O site MVN Repository facilita na busca e detalhes das bibliotecas, com suas versões e suas dependências. Você também poderá chegar num ponto em que é necessário publicar artefatos (bibliotecas) internos na sua organização. Isto é bastante comum e possível com o uso de servidores como Nexus ou Artifactory. Também existem opções na nuvem, como o AWS CodeArtifact.

🐢 Frameworks de Aplicação

Muitos sistemas empresarias são construídos em cima de um framework que provê suporte para estruturar seu código via injeção de dependência, auxilia perfeitamente no gerenciamento das versões das dependências terceiras (no Maven, BOM ou Bill of Materials), ajuda nos testes facilitando a criação de mocks das APIs e clientes, entre outros.

Como já deve ser esperado, aqui existem várias opções, em que todas são conhecidas e nenhuma é a melhor em todos os quesitos.

As principais opções são Spring Boot, Quarkus, Micronaut, Helidon, Jakarta EE. Minha recomendação aqui é escolher o Spring Boot, pelo amplo suporte e maturidade. Quarkus e Micronaut são nomes mais novos no mercado e certamente merecem uma chance com você: eles foram criados com o intuito de levar o Java para a nuvem (cloud computing), ou seja, prezam pela simplicidade, evitam ao máximo — ou até proíbem — reflection, tudo isso com o objetivo de suportar a GraalVM (basicamente, código Java compilado nativamente).

O jeito mais simples para começar um projeto utilizando Spring Boot é pelo Spring Initializr. Basta selecionar as opções desejadas, as dependências que você gostaria de utilizar e é isso: o download de um arquivo zip será realizado, pronto para ser importado na sua IDE.

🐳 Container Base Image

Quando você está trabalhando num ambiente corporativo, provavelmente o projeto será publicado no formato de container image, facilitando assim a publicação (deploy) num ambiente de execução como Docker ou Kubernetes.

Aqui sugiro seguir com a mesma versão do Java que recomendei para instalar localmente: seguir com a imagem do Eclipse Temurin, isto é, eclipse-temurin:17 para Java 17. Sempre tenha a preocupação de manter sua imagem atualizada, assim como foi recomendado com as suas dependências.

Evite utilizar a imagem OpenJDK, pois ela está oficialmente depreciada e não é mais recomendada para produção.

🤓 Como se manter atualizado

Esse ecossistema não vai parar de trazer novidades e você precisará se manter atualizado sobre tudo o que gira em torno do Java.

Algumas fontes que utilizo para me manter atualizado e aprender com o que tem acontecido na comunidade:

🔭 Próximos Passos

Espero que este guia tenha servido para ajudá-lo de alguma forma e que sirva para uma jornada de sucesso no mundo Java. De qualquer forma, este guia é apenas o começo. Dependendo das suas necessidades e requisitos, tem uma enorme quantidade de opções para avaliar.

  • Construir binários nativos utilizando GraalVM, que permite inicialização rápida (poucos milissegundos) e baixo consumo de memória; muito útil para casos onde sua aplicação precisa inicializar (escalar) rapidamente como em funções AWS Lambda, linhas de comando etc.;
  • Estudar formas de integração com demais sistemas, principalmente nesse estágio de microsserviços: ora você precisa criar uma API (REST, síncrono), ora você precisa de algo assíncrono (mensageria). Verifique qual é a recomendação do framework escolhido, pois certamente ele terá algum tipo de suporte para uma API, seja ela REST ou GRPC. O mesmo vale para o caso de mensageria: Kafka, SQS/SNS, JMS etc.;
  • Analisar a performance e características em tempo de execução da sua aplicação utilizando JDK Flight Recorder e JDK Mission Control;
  • Se aprofundar no mundo de testes automatizados, seja unitários com uso de mocks (Mockito será um ótimo aliado), seja de integração com menos mocks (o que é ótimo e pode evitar muitos bugs, sendo o testcontainers o maior aliado). Testes automatizados devem ser sempre priorizados durante a implementação da funcionalidade, nada de deixar para depois (famoso terminei, só falta testar). O tempo economizado e a segurança que os testes trazem — desde que bem escritos — é de extrema importância.
  • CI/CD: continuous integration (CI ou integração contínua) e continuous deployment (CD ou entrega contínua) são termos que você também precisará entender minimamente como funcionam. E nada melhor do que ter seus testes automatizados integrados nessas pipelines para entregar versões o mais rápido possível.

--

--