Guia para Trainee e Dev Jr usando Java
Tags: beginners, softwaredevelopment, roadmap, codenewbie
Published: 2023-10-22 17:04:34

## Conceitos

Como pessoa iniciante, uma parte importante na entrevista técnica é saber conceitos e conseguir explicá-los. A pessoa entrevistadora pode também solicitar exemplos práticos.
Abaixo estão conceitos que vejo serem solicitados para iniciantes e o que seria legal saber. Tudo o que está sublinhado é um link para alguma referência.


![Candidato sendo entrevistado (source: pexels.com)](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d04dwl2thhugs19fwzta.jpg)


## API

É comum mencionarem REST API, mas é bom saber o conceito de API e qual a motivação para criar uma e sua utilidade.
[Leitura sobre APIs.](https://www.redhat.com/pt-br/topics/api/what-are-application-programming-interfaces)

## POO - Programação Orientada a Objetos
Saber os 4 pilares e conseguir explicar. Como são conceitos básicos - no sentido de serem a base - é importante saber.
[Leitura sobre POO.](https://www.freecodecamp.org/portuguese/news/os-quatro-pilares-da-programacao-orientada-a-objetos-com-javascript/)

## MVC - Padrão arquitetural Model-View-Controller
Saber explicar o porquê de usar arquitetura MVC - prós e contras, onde é utilizada, como se divide, como funciona.
[Leitura sobre MVC.](https://www.devmedia.com.br/introducao-ao-padrao-mvc/29308)

## Microsserviço e Monolito - Tipos de arquitetura
Não existe melhor nem pior, existe a solução mais adequada para o problema. O texto do link explica muito bem as diferenças.
[Leitura sobre microsserviços versus arquitetura monolítica.](https://www.atlassian.com/br/microservices/microservices-architecture/microservices-vs-monolith)


## Cloud Computing - Computação na Nuvem
Saber falar por que usar cloud, quais benefícios, riscos e trade-offs. Se tiver utilizado alguma, citar a necessidade e como ela foi atendida. Se conhecer os recursos apenas teoricamente, citar os mais utilizados e o que fazem. Os mais conhecidos são da Amazon - S3, SQS, SNS, EC2, API Gateway.
[Leitura sobre Cloud Computing.](https://rockcontent.com/br/blog/cloud-computing/)


## CI/CD - Continuous Integration/Continuous Delivery
Saber benefícios de integração contínua e entrega contínua. É importante entender como era feito o processo antes do CI/CD ser criado, porque nessa hora tudo fará sentido.
Existem ferramentas que fazem todo o processo, sendo o Jenkins a mais conhecida e utilizada - talvez por ser gratuita e de código aberto.
[Leitura sobre CI/CD.](https://www.redhat.com/pt-br/topics/devops/what-is-ci-cd)


## VCS - Version Control System - Git, CVS, SVN
Aqui o importante mesmo é entender o Git e como ele funciona. CVS e SVN são antigos e é raro encontrar lugares que ainda o utilizem. Pessoas entrevistadoras não costumam se aprofundar nesse tema, costumam apenas perguntar se você sabe se seguir em frente.
[Git e Github](https://www.zup.com.br/blog/git-github-e-gitlab) não são a mesma coisa. É importante conhecer e saber quando utilizar as operações rotineiras - criar branches, abrir MR, trocar de branch, enviar código, resolver conflitos. PR (pull request) e MR (merge request) são a mesma coisa - Gitlab chama de MR e Github chama de PR.
[Leitura sobre Git e outros VCSs.](https://blog.geekhunter.com.br/git-svn-e-cvs-comparacao-dos-principais-vcs/)

## Análise estática de código - Qualidade
É legal conhecer alguma ferramenta que faça esta análise. A mais utilizada por onde passei foi o Sonarqube. Consiga explicar o que ele faz, por que é bom e citar que ele pode ser incluído no processo de CI/CD como uma barreira que impede que códigos com bugs ou baixa qualidade cheguem aos ambientes.
[Leitura sobre análise estática com Sonarqube.](https://medium.com/cwi-software/o-sonarqube-n%C3%A3o-%C3%A9-seu-inimigo-6e3c96b9c25b)

## Testes - Unitários e de Integração
Projeto sem testes é um erro, então saiba criar testes unitários e tenha algum conhecimento de testes integrados. O unitário faz parte da base, o integrado dá pra conseguir entender sob demanda e em pouco tempo. Com Java utilizamos muito jUnit e Mockito, mas também existem Wiremock, Faker, Fixture Factory etc. Saiba diferenciar a utilidade de cada um.
Faker, Instancio e Fixture Factory servem para criar objetos falsos, então não precisa estudar todos, só saber quando e por que utilizar.
[Leitura sobre testes.](https://mmarcosab.medium.com/criando-mocks-e-escrevendo-testes-unit%C3%A1rios-com-junit-5-f54e6407bd7c)


## Padrões de Projeto, do inglês Design Patterns
Saber que existem pra resolver problemas da área de desenvolvimento de software comum a vários projetos. O [Refactoring Guru](https://refactoring.guru/pt-br/design-patterns) ajuda bastante com texto. Se quiser um curso, recomendo [este aqui do ITA](https://pt.coursera.org/learn/desenvolvimento-agil-com-padroes-de-projeto).
Na entrevista, saber o que são e para que servem. É comum pedirem para citar e explicar 3, e os mais simples que prefiro são Singleton, Façade e Builder. O Strategy é uma excelente resposta, então se você souber, só vai.

## Java - Versões, recursos e APIs

1. Podem solicitar as novidades que você mais gostou desde o Java 8, porque foi a versão que trouxe mais recursos.

2. É comum perguntarem sobre Collections (List, Set, Map etc), então saiba para que servem, o que fazem e como. Se for o caso, saber algumas implementações dessas interfaces e dar algum exemplo de uso. 
Exemplo de pergunta: quero agrupar objetos que não podem se repetir e que estejam ordenados por sua chave natural, qual seria a melhor coleção de dados? Por quê?

3. Sobre recursos novos, citar nova DateTime API, que veio no Java 8. Consiga comparar alguns recursos antigos com os novos.
Stream API (Fluent API) também chegou no Java 8 e é muito utilizada, então saiba dizer o que ela facilita e simplifica. Se souber falar de Lambdas, melhor ainda.

O [Baeldung ](https://www.baeldung.com/)é meu site preferido para aprender e explorar novidades de Java e Kotlin. Ele também tem uma newsletter maravilhosa. Recomendo.

## Spring
Saber que é um framework, para que serve, no que ajuda, qual a função dos módulos mais usados (Boot, Data, Security)
Mais simples: Boot e Data
Complexo, porém importante: Security (opinião pessoal)
[Leitura sobre Spring](https://www.baeldung.com/). Neste site tem muita coisa, é tão bem escrito que muitas vezes pesquiso nele antes de conferir a documentação oficial.

## Persistência - Gravação de dados no banco de dados
Saber que existe JDBC, mas falar de JPA. Geralmente pedem Spring Data ou Hibernate, sendo que o Spring Data encapsula o Hibernate e adiciona facilidades.

- _Banco de dados relacional_

Falar qual conhece/usou, saber que existe normalização de dados e por que é importante, saber que existem tamanhos de dados e a importância de analisar pra não haver desperdício de espaço/performance.
- _Banco de dados não-relacional_

Se tiver usado, dizer quando ele é mais recomendado que o relacional e por qual motivo, citar performance e formato de dados gravados. Famosos: MongoDB e Redis (Redis também é cache)

## Mensageria - Event-Driven Architecture
Este é um assunto extenso porque as tecnologias usadas neste modelo arquitetural possuem muitas configurações.
O importante aqui é saber o que é, como funciona, quais os prós e contras. Saber quais ferramentas são mais utilizadas, qual resultado procuram atingir e as diferenças entre elas. Os termos para se atentar são publisher e subscriber - ou Pub e Sub - porque tudo o que importa no início está relacionado a eles.
As mais utilizadas são [RabbitMQ](https://www.rabbitmq.com/getstarted.html) para mensagens e [Apache Kafka](https://kafka.apache.org/intro) para eventos, e ambas têm suas versões para nuvem.
No site da Confluent tem vídeos sobre o assunto e que usam Apache Kafka como ferramenta, é bem legal. Não precisa se aprofundar muito.
[Leitura sobre event-driven architecture - EDA.](https://medium.com/@marcelomg21/event-driven-architecture-eda-em-uma-arquitetura-de-micro-servi%C3%A7os-1981614cdd45)

## Conteinerização - Docker
Não é um assunto trivial e eu não exigiria de um iniciante.
Caso você tenha tido tempo de estudar o assunto, costumam cair perguntas sobre os prós e contras, quais ferramentas utilizam, como os dados são salvos e onde, quais benefícios o Docker adiciona no desenvolvimento e escalabilidade.
Recomendo ver os vídeos da [LinuxTips](https://www.youtube.com/@LinuxTips) sobre Docker. O material deles é muito bom e o @gomex_87 escreveu um livro gratuito sobre o assunto.
[Leitura sobre Docker.](https://blog.geekhunter.com.br/docker-na-pratica-como-construir-uma-aplicacao/)