10 dicas para você evoluir como desenvolvedor Java
- #Java
1. Obtenha uma base sólida e uma ideia clara sobre os princípios do OOP.
Java é uma linguagem orientada a objetos, por isso, em vez de subestimar os princípios do OOP, os desenvolvedores devem fazer um esforço para adquirir um conhecimento profundo do conceito. Aprender como aplicar os princípios OOP ao programar e adquirir um conhecimento profundo de modelação de objetos, princípios SOLID, padrões de design, herança, e outros conceitos. Estas são coisas que devem ter em mente ao desenvolver um software, especialmente numa linguagem moderna orientada a objetos.
2. Leia os livros que cobrem esses princípios
Ter esses conceitos sob seu domínio irá ajudá-lo a construir projetos aplicando princípios OOP. Muitos conceitos são cobertos por alguns livros clássicos que eu vejo como leitura obrigatória para os desenvolvedores:
- “Padrões de Projetos: Soluções Reutilizáveis de Software Orientados a Objetos” — Gang of Four;
- “Código Limpo” — Robert Martin;
- “Arquitetura limpa” — Roberto Martin;
- “Refatoração” (segunda edição) por Martin Fowler and Kent Beck;
- “Programação extrema explicada” por Kent Beck;
- “Test Driven Development: By Example” by Kent Beck
3. Familiarize-se com o Framework Spring.
O Spring Framework desempenha um papel significativo no desenvolvimento moderno de Java. O Spring Framework, como o Spring MVC e o Spring Boot, são normalmente utilizados por empresas para construir micro serviços ou aplicativos de web. Os desenvolvedores que compreendem todas as vantagens do Spring Framework são mais propensos a brilhar em seu campo, transformando o método Java local numa operação de gestão ou num procedimento remoto.
Se você nunca usou nenhum tipo de Spring, o primeiro passo é familiarizar-se com os princípios essenciais do Spring, como os princípios da Injeção de Dependência (DI), Inversão de Controle (IoC) e a Spring MVC em geral.
O próximo grande marco é definitivamente o Spring Boot e as capacidades que o mesmo traz à mesa para construção e execução dos aplicativos de web. Aprenda as principais anotações importantes que lhe fornece e o seu comportamento, e considere as anotações da Spring em geral (especialmente se vier de um background baseado em XML).
Tais como @Repository, @Service e @Controller ou @RequestMapping vão se tornar os seus amigos do dia a dia. Tente construir um pequeno aplicativo de web os usando. É claro que, para esse aprendizado, você precisa de uma boa compreensão dos padrões de design e de como os componentes que estas anotações definem devem interagir uns com os outros.
Você ficará surpreendido como é fácil lançar e executar seu aplicativo recém criado com Spring Boot, em comparação com outras opções de implementação que você tenha usado com Java anteriormente. Esta estrutura foi concebida para simplificar enormemente a sua vida e permitir que você apenas obtenha um arquivo .jar “all-inclusive” executável, que pode fluir a partir da linha de comando no seu computador, a partir de um “container” Docker, ou instalar como um serviço Linux normal e colocá-lo atrás do Nginx, se não utilizar o Docker em produção.
O próximo componente do Spring, que você irá certamente querer aprender mais cedo e não mais tarde, é o Spring Security. Tudo que você precisa para estabelecer um acesso adequado aos seus pontos finais e serviços em geral, como autenticação e autorização, login, registro e diferentes fornecedores de segurança serão encontrados lá.
Outro componente bastante grande que também se pode encontrar em vários projetos é o Spring Data. Esse fornece uma abstração conveniente e elegante para o acesso aos dados. Não é uma ORM e nem uma implementação JPA — apenas fornece uma abstração mais versátil por cima, permitindo você reduzir a quantidade de código necessária para a manipulação de dados, e torná-las simples e sustentáveis.
Finalmente, um componente que vale a pena mencionar explicitamente (não esquecer que todo Spring é enorme) é o AOP (Aspect Oriented Programming) do Spring. Isso fornece uma forma de incluir várias anotações para controlar declarativamente múltiplos aspectos do seu comportamento de código, tais como registro, exceções ou transações. A compreensão desta filosofia e abordagem te dará um impulso em qualquer entrevista de emprego.
Não há dúvida de que o Spring é peixe grande no mundo Java, mas não é o único. Nem todos os programadores Java querem se submeter ao domínio total do Spring — alguns querem ser especializados em diferentes tecnologias e ir mais fundo em diferentes domínios. Para estes programadores, eu distinguiria o Java EE. Embora seja antigo, ainda está por perto, especialmente em projetos mais antigos e de grande dimensão.
4. Aprender as APIs e Bibliotecas Mais Essenciais.
As API’s e bibliotecas vão junto a estruturas Java, por isso é importante conhecê-las se quiser se sobressair. São uma parte integrante do ecossistema Java e têm a segunda maior comunidade no website StackOverFlow Q&A.
Este é um tópico extremamente amplo que inclui muitas coisas ao mesmo tempo — eu poderia dedicar uma dúzia de artigos — mas falando em geral, o conhecimento profundo das principais APIs, bibliotecas principais e de terceiros, assim como do Java Development Kit (JDK), define um desenvolvedor Java altamente qualificado. Para evitar confusões, devo dizer que não se espera que os especialistas aprendam todas as APIs possíveis e conheçam todos os elementos da Biblioteca. Basta ter uma compreensão clara do Apache Commons, Guava, Maven, e algumas outras APIs e bibliotecas importantes.
5. Obtenha um conhecimento profundo de Java 11.
Recentemente, a comunidade de desenvolvedores Java testemunhou o lançamento da última versão de Java 15. Contudo, o fluxo de desenvolvimento de software no domínio Java é normalmente muito lento quando se trata de adotar novas versões de qualquer coisa — o princípio “se não está quebrado, não o conserte” é especialmente abraçado nos projetos empresariais.
Cada pequena mudança que acontece nesses projetos tem de se enquadrar em requisitos de alta segurança e é comum a utilização de tecnologias mais antigas. Por exemplo, no banco, na companhia aérea ou no sistema de seguros, é pouco provável que encontre tecnologias com menos de cinco anos ou mais. É aqui que mais velho significa estável, fiável, e seguro.
No entanto, novas versões estão sendo adotadas de forma lenta, mas firmemente também nestes domínios. Após cada nova versão, cada vez mais empresas exigirão que você esteja familiarizado com as novas funcionalidades. O Java 8, que foi um grande avanço para o seu tempo, levou alguns anos para se tornar um padrão de indústria. Definitivamente “não passará” sem dominar a Stream API, métodos de interface padrão, expressões Lambda, Java Time API, e outras características principais desta versão.
Outras versões Java mantiveram a viagem da adoção da funcionalidade ativa. A versão seguinte do LTS foi Java 11 — esta é a que você pode se satisfazer muitas vezes em termos de requisitos de trabalho nos dias de hoje. Muitas empresas não mudarão dela até que a próxima versão LTS seja lançada, que deverá ser Java 17 a chegar em Setembro de 2021. Definitivamente não recomendo que comece a sua caça ao trabalho antes de entrar em contato e de se familiarizar com todas as características do Java 11.
As versões posteriores de Java, até 15 como foi mencionado acima, ainda estão, em certa medida, no processo de ganhar uma adoção mais ampla, mas já estão sendo utilizadas bastante. Por exemplo, já está disponível uma versão do Amazon Corretto 15.
Seja como for, uma prática importante para um bom desenvolvedor Java é seguir cada nova versão com muita atenção e familiarizar-se prontamente com todas as novas funcionalidades. Nenhuma delas pode ser ignorada.
6. Foco na JVM e os seus Internos
Java não existe sem JVM (Java Virtual Machine). É um motor de tempo de execução que permite que as aplicações Java funcionem em qualquer plataforma possível. Portanto, se quiser se juntar a um grupo de bons programadores Java, compreender os princípios do trabalho da JVM é uma necessidade. Além disso, o conhecimento de uma máquina virtual irá te ajudar na resolução de problemas durante o desenvolvimento. Assim, entre outras coisas, certifique-se de dominar os tópicos do sistema JVM e a forma como Java é executado em runtime.
7. Ter múltiplas metodologias em mãos.
Se quiser ficar à frente de muitos outros programadores Java, você deve prestar uma atenção especial a diferentes metodologias. Antes de mais nada, familiarize-se com Agile e especialmente SCRUM, mas também compreenda Waterfall e prepare-se para trabalhar com ela. Desde que muitos programadores selecionem a metodologia em função das preferências dos clientes, sabendo que muitos deles o ajudarão a estar em cima do assunto.
Além disso, você pode aprender técnicas de programação extremas (o livro clássico de Kent Beck é mencionado acima) para ganhar uma experiência mais rica e um trabalho eficaz.
8. Habitue-se aos testes automatizados.
O que distingue um verdadeiro programador Java de alguém que tenta parecer-se com um é a capacidade de fazer testes automatizados. Em termos simples, qualquer tipo de teste que não seja manual pode ser considerado automatizado: unidade, integração, e outros, que precisam ser melhorados se você quiser ser um grande programador Java. Deve também aprender a entregar projetos de uma forma que os testes façam parte do seu pipeline CI/CD e o código não vá para produção se algumas partes importantes não forem cobertas por testes.
Aqui está uma forma de como poderia parecer o seu desenvolvimento e fluxo de implantação com testes.
Você desenvolve um componente da sua aplicação e o cubra com testes unitários até prosseguir para o próximo.
Se seguir esta prática minuciosamente, poderá reparar como ela o obriga implicitamente a manter uma boa modularidade do código. Um bom teste unitário é algo que te permite executar o código do seu componente de forma isolada. Você não poderá utilizar a base de dados, APIs externas, ou contar com outras classes. Apenas o seu componente está em cena neste momento.
Você o alimenta com dados de demonstração que se reúnem com precisão, tendo em conta todos os casos de limite como valores vazios ou nulos verificando que se obtém o resultado exatamente como esperado. Depois de fazer isso, você pode ter a certeza de que o seu componente não é uma fonte de falha e pode simplesmente confiar na sua lógica em outros locais. JUnit 5 e Mockito são os seus melhores amigos aqui — domine-os e utilize-os todos os dias.
Além disso, outra vantagem é a utilização de TDD quando escreve os seus casos de testes antes de escrever o próprio código do componente.
Depois de todos os componentes serem desenvolvidos dessa forma, é necessário fornecer testes de integração automatizados.
Na maioria dos casos, isso significa apenas alavancar a sua aplicação programática com um script simples, executá-la com alguns dados de entrada, e controlar a saída (muitas vezes você fará isto num contentor Docker). Contudo, por vezes significa testar componentes separados ou uma cadeia deles, mas desta vez utilizando recursos externos reais como base de dados ou armazenamento de ficheiros.
Seja como for, pense em que casos de entrada de dados pode ter globalmente e verifique se a sua aplicação pode tratar estes casos corretamente.
9. Finalmente, você deve incorporar os testes na sua conduta de CI/CD.
Uma forma moderna e clássica é que uma vez que você submete o seu código no seu repositório Git, seja em commit, pull request, ou fundir-se a uma branch específica, um Gatilho é disparado. Este executa um script de implantação e sobe um container Docker, que tenta construir a sua aplicação, ou uma imagem Docker com a sua aplicação, dependendo da sua implantação.
Seja como for, dado que a aplicação foi construída com sucesso (e se não foi, você fica automaticamente protegido de aplicações com erro na produção), tenta executar todos os seus testes dentro do container, tanto na unidade, como na integração. Se algum dos testes falhar, todo o processo falha, e Git não aprova automaticamente o pedido de puxar ou simplesmente falha a sua construção.
Alguns detalhes deste fluxo irão variar, mas em geral, este método de entrega de aplicações irá trazer-lhe um controle de qualidade inequívoco, literalmente numa base per-commit te poupando horas de “combate a incêndios” quando a sua aplicação cai na produção.
10. Polir as Suas Habilidades de Codificação.
A codificação é principalmente uma questão de prática. Não importa quantos livros você leia, não serão tão eficazes como se você tivesse aperfeiçoado os seus conhecimentos na prática. Felizmente, a codificação hoje em dia não é tão entediante como se possa pensar — existem muitas plataformas gamificadas na web para tornar a codificação envolvente e até divertida.