# Java ## Nivel 1 - [ ] **Java - Fundamentos**: - Conhecer os tipos primitivos - Declarar variáveis, considerando os diferentes tipos - Usar estruturas condicionais ('if', 'else') - Conhecer os operadores de comparação - Usar estruturas de repetição e laços ('while', 'for') - Usar funções, passando parâmetros e argumentos - Manipular métodos - Manipular arrays e listas - Obter dados de uma API - Fazer chamadas assíncronas 'Future', etc - Criar construtores - [ ] **Conceitos de Orientação a Objetos**: - A Programação Orientada a Objetos é um paradigma de programação de software baseado na composição e interação entre diversas unidades chamadas de 'objetos' e as classes, que contêm uma identidade, propriedades e métodos). Ela é baseada em quatro componentes da programação: abstração digital, encapsulamento, herança e polimorfismo. - Como funcionam objetos - Criar e utilizar construtores - O que são classes - Criar e utilizar métodos - Como funciona encapsulamento - O que é herança - O que é polimorfismo - Como funcionam interfaces - O que são abstrações - [ ] **Java - Manipulação de Erros**: - Tratar exceções pré-definidas - Uso de 'try' e 'catch' - Criar exceções específicas - Fazer o processo de Debug - [ ] **Java - Coleções**: - Aprender os usos e diferenças entre List, Set e Map - Aprender os usos e diferenças entre Equals e HashCode - Saiba trabalhar com ArrayList, LinkedList ou Vector - Classes Wrappers - [ ] **Java - Pacotes**: - Use imports e organize o seu código através de packages - Conhecer a java.lang - Entender a imutabilidade e a classe String - Entender a classe java.lang.Object - Conhecer a java.io - [ ] **Java - Gerenciamento da Memória**: - Entender como funciona a memória e seu gerenciamento em Java - Entender como funciona a memória o Garbage Collector - [ ] **Java - Concorrência**: - Executar tarefas simultaneamente - Colocar tarefas para aguardar até que um determinado evento ocorra - Entender como a memória funciona nessa situação - [ ] **Java - Persistência**: - Entender sobre JDBC e JPA - Comunicar-se com um banco de dados relacional - Entender a diferença entre relacionamentos EAGER e LAZY - Planejar queries com join fetch - Encapsular o acesso em um DAO - Entender como a memória funciona nessa situação ## Nivel 2 - [ ] **JVM**: - Entender como funciona a máquina virtual do Java - [ ] **Spring Framework**: - Entender os usos do Spring Framework - Entender o conceito de Injeção de Dependências - Entender o padrão MVC - [ ] **Java Build Tools**: - Conheça as principais ferramentas de build do Java - Aprenda a usar uma delas - [ ] **Java - Testes**: - Usar testes unitários - Usar testes de integração - Usar testes de comportamento (behavior) - Usar mocks - [ ] **Java - Serialização**: - Realizar a criação de um objeto a partir de um fluxo de bytes e vice-versa - [ ] **Java - Rede e Sockets**: - Abrir uma sessão de comunicação interativa entre o navegador do usuário e um servidor - Enviar mensagens para um servidor e receber respostas sem consultar o servidor - [ ] **Java - Servlets**: - Criar páginas web dinâmicas em Java - Lidar com requisições para um servidor - Conhecer o ciclo de vida de um servlet ## Nivel 3 - [ ] **Contêineres**: - Isolar seu software para funcionar independentemente - Implantar software em clusters - Modularizar seu sistema em pacotes menores - Conhecer a plataforma Docker - Conhecer Kubernetes - [ ] **Spring Boot**: - Criar aplicações Spring standalone - Usar os servidores HTTP embutidos - [ ] **Estruturas de Dados**: - Conhecer as principais estruturas de dados - Implementar as principais estruturas de dados - [ ] **Design Patterns**: - Na engenharia de software, um "padrão de projeto" (Design Pattern em inglês) é uma solução geral e reutilizável para um problema que ocorre normalmente dentro de um determinado contexto de projeto de software. - Conhecer e aplicar os principais Design Patterns - [ ] **SOLID**: - Conhecer boas práticas no desenvolvimento de software - [ ] **Clean Architecture**: - Conhecer a metodologia a ser usada na codificação, a fim de facilitar o desenvolvimento códigos, permitir uma melhor manutenção, atualização e menos dependência - [ ] **Reflection e atributos**: - Escrever código que lê as informações e metadados de objetos em tempo de execução - Obter nomes de classes em tempo de execução e criar objetos de uma classe - [ ] **JSF**: - Escrever e manter aplicações executadas em um servidor - Renderizar a interface de usuário - Migrar os dados da aplicação para a interface - [ ] **JMS**: - Enviar e receber mensagens - [ ] **Java - Logging**: - Realizar logging de mensagens para indicar o comportamento de determinada aplicação - [ ] **Java Swing**: - Renderizar os componentes da interface gráfica de um sistema ## Habilidade Auxiliar: Infraestrutura e boas práticas - [ ] **HTML - Fundamentos**: - Aprender quais tags são necessárias para um HTML básico - Criar um parágrafo de texto - Exibir uma imagem - Conhecer a diferença entre 'h1', 'h2', 'h3', etc - Criar um texto com hyperlink - Criar um formulário com campos relevantes - Criar uma lista de itens ordenada ou não ordenada - Criar uma lista de itens dentro de uma lista suspensa (dropdown list) - Conectar com um arquivo de CSS - Criar uma tabela - Adicionar IDs e classes - [ ] **JavaScript - Fundamentos**: - Conhecer os tipos primitivos - Declarar variáveis, considerando a diferença entre 'var', 'let' e 'const' - Usar estruturas condicionais ('if', 'else') - Conhecer os operadores de comparação ('=', '==', '===') - Usar estruturas de repetição e laços ('while', 'for') - Usar funções, passando parâmetros e argumentos - Manipular arrays e listas - Aprender o conceito de Orientação a Objetos - Fazer um CRUD - Obter dados de uma API - Fazer chamadas assíncronas usando 'Async/Await', 'Promise', etc - [ ] **CSS - Fundamentos**: - Aprender a estrutura visual de uma página, com 'margin' e 'padding' - Estabelecer o tamanho com 'width' e 'height' - Aprender sobre a posição de um elemento ('static', 'relative' ou 'absolute) - Aprender sobre o 'display' de exibição de um elemento ('block', 'inline', 'inline-block') - Aprender a posicionar imagens em relação ao texto - Aprender sobre alinhamento - Aprender sobre estilo de fontes - Aprender as diferenças e vantagens de usar as diferentes unidades de medida em CSS (%, relativas, etc) - Conectar com os elementos (IDs, classes) de um arquivo HTML - Alterar características de um elemento quando o mouse passar por cima dele ('hover') - Aprender box-sizinh - Aprender Flexbox - Aprender Grid ## Habilidade Auxiliar: Front-end - [ ] **HTML - Fundamentos**: - Aprender quais tags são necessárias para um HTML básico - Criar um parágrafo de texto - Exibir uma imagem - Conhecer a diferença entre 'h1', 'h2', 'h3', etc - Criar um texto com hyperlink - Criar um formulário com campos relevantes - Criar uma lista de itens ordenada ou não ordenada - Criar uma lista de itens dentro de uma lista suspensa (dropdown list) - Conectar com um arquivo de CSS - Criar uma tabela - Adicionar IDs e classes - [ ] **JavaScript - Fundamentos**: - Conhecer os tipos primitivos - Declarar variáveis, considerando a diferença entre 'var', 'let' e 'const' - Usar estruturas condicionais ('if', 'else') - Conhecer os operadores de comparação ('=', '==', '===') - Usar estruturas de repetição e laços ('while', 'for') - Usar funções, passando parâmetros e argumentos - Manipular arrays e listas - Aprender o conceito de Orientação a Objetos - Fazer um CRUD - Obter dados de uma API - Fazer chamadas assíncronas usando 'Async/Await', 'Promise', etc - [ ] **CSS - Fundamentos**: - Aprender a estrutura visual de uma página, com 'margin' e 'padding' - Estabelecer o tamanho com 'width' e 'height' - Aprender sobre a posição de um elemento ('static', 'relative' ou 'absolute) - Aprender sobre o 'display' de exibição de um elemento ('block', 'inline', 'inline-block') - Aprender a posicionar imagens em relação ao texto - Aprender sobre alinhamento - Aprender sobre estilo de fontes - Aprender as diferenças e vantagens de usar as diferentes unidades de medida em CSS (%, relativas, etc) - Conectar com os elementos (IDs, classes) de um arquivo HTML - Alterar características de um elemento quando o mouse passar por cima dele ('hover') - Aprender box-sizinh - Aprender Flexbox - Aprender Grid