Candidato: Obrigado pelo seu tempo. Tenho 5 anos de experiência como desenvolvedor full stack Java, com domínio de tecnologias front-end e back-end.
Primeira Rodada: Fundamentos de Java e JVM
Entrevistador: Primeiro, explique o mecanismo de garbage collection do Java.
Candidato: A coleta de lixo é gerenciada automaticamente pela JVM, que verifica referências a objetos. Algoritmos comuns incluem marcação-eliminação, marcação-compactação e cópia. Por exemplo, o coletor G1 é recomendado para melhor controle de pausas.
Entrevistador: Cite coletores de lixo conhecidos.
Candidato: Serial, Parallel Scavenge, CMS e G1.
Entrevistador: Você já enfrentou vazamentos de memória em projetos?
Candidato: Sim, em um sistema, um cache estático não era liberado, causando alto consumo de memória. Analisamos a heap, otimizamos a estratégia de cache e adicionamos uma tarefa agendada para limpeza.
Entrevistador: Você tem experiência com Vue 3?
Candidato: Sim, uso Vue 3 com Composition API, que oferece mais flexibilidade que Options API.
Entrevistador: Explique a comunicação entre componentes em Vue 3.
Candidato: Pode-se usar props e emits para comunicação pai-filho, ou Vuex/Pinia para gerenciamento de estado global. Para cenários complexos, provide/inject ou um barramento de eventos podem ser úteis.
Entrevistador: Você usa TypeScript?
Candidato: Sim, em um sistema de e-commerce, o TypeScript reduziu erros de tipo e melhorou a manutenção do código.
Segunda Rodada: Spring Boot e Microsserviços
Entrevistador: Como o Spring Boot simplifica o desenvolvimento?
Candidato: Através de configuração automática e dependências de inicialização. Por exemplo, adicionar spring-boot-starter-web configura rapidamente uma aplicação web.
Entrevistador: Explique a configuração automática.
Candidato: Baseada em starters e anotações condicionais (@Conditional). Se uma DataSource existir, o Spring Boot configura automaticamente os beans relacionados.
Entrevistador: Como você gerencia arquivos de configuração em um projeto?
Candidato: Uso perfis (dev, test, prod) com spring.profiles.active e injeção de valores via @Value ou @ConfigurationProperties.
Entrevistador: Experiência com microsserviços?
Candidato: Em um projeto de e-commerce, utilizei Spring Cloud para registro de serviço, configuração centralizada e API Gateway. Comunicação entre serviços usava REST ou gRPC, com filas de mansagens para processamento assíncrono em alta concorrência.
Entrevistador: E com Kubernetes?
Candidato: Sim, containerizamos microsserviços com Docker e orquestramos com Kubernetes para implantação automatizada e escalonamento elástico.
Terceira Rodada: Banco de Dados e ORM
Entrevistador: Você usou MyBatis ou JPA?
Candidato: MyBatis para controle SQL flexível e JPA para abstrações de alto nível.
Entrevistador: Como o JPA mapeia relacionamentos entre entidades?
Candidato: Usando anotações como @OneToOne, @OneToMany e @ManyToMany.
Entrevistador: Como você gerencia transações no banco de dados?
Candidato: Uso @Transactional para consistência. Em lógicas complexas, divido operações em múltiplas transações para evitar deadlocks.
Entrevistador: E otimização de banco de dados?
Candidato: Criação de índices, otimização de queries para reduzir JOINs e uso de caches para diminuir a carga no banco.
Quarta Rodada: Testes e CI/CD
Entrevistador: Você escreve testes unitários?
Candidato: Sim, com JUnit 5 e Mockito. Também faço testes de integração usando Spring Boot Test para validar camadas como controladores.
Entrevistador: E pipelines de CI/CD?
Candidato: Usamos GitHub Actions para builds automatizados, testes e implantações após cada commit.
Quinta Rodada: Front-end e Ferramantas
Entrevistador: Vite ou Webpack?
Candidato: Vite para desenvolvimento rápido com hot reload; Webpack para empacotamento em produção.
Entrevistador: Bibliotecas de UI?
Candidato: Ant Design Vue em um sistema de gerenciamento de conteúdo, por sua riqueza de componentes.
Entrevistador: Como você organiza o código front-end?
Candidato: Por módulos funcionais, com Vue Router para rotas e Pinia para gerenciamento de estado.
Exemplos de Código Refatorados
1. API REST com Spring Boot
@RestController
@RequestMapping("/api/customers")
public class CustomerController {
private final CustomerService customerService;
public CustomerController(CustomerService service) {
this.customerService = service;
}
@GetMapping("/{customerId}")
public ResponseEntity<Customer> getCustomer(@PathVariable Long customerId) {
return customerService.findById(customerId)
.map(ResponseEntity::ok)
.orElseGet(() -> ResponseEntity.notFound().build());
}
@PostMapping
public ResponseEntity<Customer> createCustomer(@RequestBody CustomerData data) {
Customer newCustomer = customerService.create(data);
URI location = URI.create("/api/customers/" + newCustomer.getId());
return ResponseEntity.created(location).body(newCustomer);
}
}
Este exemplo demonstra um controlador REST simplificado com injeção de dependência por construtor e tratamento de resposta mais robusto.
2. Comunicação entre Componentes Vue 3
<template>
<div>
<UserProfile :current-user="userData" @profile-updated="refreshData" />
</div>
</template>
<script setup>
import { ref } from 'vue';
import UserProfile from './UserProfile.vue';
const userData = ref({ nome: 'Ana Silva', idade: 30 });
function refreshData(newProfile) {
userData.value = newProfile;
}
</script>
Aqui, o componente pai passa dados via props e escuta eventos do filho para atualizar o estado local.
3. Mapeamento com MyBatis
<mapper namespace="com.projeto.mapper.ClienteMapper">
<select id="buscarPorId" resultType="com.projeto.dominio.Cliente">
SELECT * FROM clientes WHERE id_cliente = #{identificador}
</select>
<insert id="inserirCliente">
INSERT INTO clientes (nome, telefone) VALUES (#{nome}, #{telefone})
</insert>
</mapper>
Esta configuração XML mapeia operações CRUD para a entidade Cliente, com consultas personalizáveis.
Conclusão da Entrevista
Entrevistador: Agradecemos sua participação. Entraremos em contato sobre os próximos passos.
Candidato: Obrigado pela oportunidade.