Guia de Entrevista Stefanini: Perguntas e Dicas
Guia de Entrevista Stefanini: Perguntas e Dicas
(\ (\
( • •)
━∪∪━━━━
ᵇʸ ᴬˡᵉᶠᵘᵉⁿᵗᵉˢ
DICA FINAL: Ao explicar o código, mova o mouse pelas pastas (domain, application,
infrastructure). Mostre que você sabe navegar na sua própria estrutura. Boa sorte, você tem
tudo para vencer!
1 of 19 1/4/2026, 7:34 PM
Firefox about:blank
Teórica: Permite o desacoplamento entre o núcleo do negócio e as tecnologias externas (DB, API, UI).
Verbal: "Olha, embora seja um To-Do List, o projetei com mentalidade empresarial. Queria
demonstrar que posso proteger o código de negócio. Se amanhã a Stefanini me pedir para trocar o SQL
Server por um banco de dados NoSQL, o coração do sistema não fica sabendo. É investir agora para
economizar custos de manutenção depois".
Teórica: Para desacoplar o Domínio (lógica de negócio) da Infraestrutura (detalhes técnicos como SQL
Server ou Angular), seguindo o princípio de Portas e Adaptadores.
Verbal: "Embora o requisito seja simples, o abordei com mentalidade corporativa. A Arquitetura
Hexagonal garante que, se a Stefanini decidir trocar o banco de dados ou migrar para outra tecnologia,
o coração do negócio permanece intacto. É um investimento em manutenibilidade a longo prazo."
Verbal: "A Porta é o que o domínio diz: 'preciso salvar uma tarefa'. O Adaptador é o cabo que
conectamos: 'aqui está a implementação com JPA e SQL Server'. É como um plugue universal".
Teórica: A Porta é uma interface (contrato) definida pelo domínio. O Adaptador é a implementação
técnica externa.
Verbal: "A Porta é o 'buraco' que o domínio deixa para se conectar ao mundo. O Adaptador é o 'cabo'
real. Por exemplo, minha porta de saída diz 'preciso de persistência', e meu adaptador JPA com SQL
Server é o cabo que conecto ali."
Teórica: Para aplicar a Regra de Dependência: as camadas internas não devem conhecer nada das
externas.
Verbal: "Para que o negócio seja puro. Minha pasta domain não tem nem uma anotação do Spring ou
Hibernate. Isso me permite testar as regras de negócio sem precisar levantar bancos de dados ou
servidores, o que torna o desenvolvimento muito mais ágil e seguro."
2 of 19 1/4/2026, 7:34 PM
Firefox about:blank
Verbal: "Busquei um modelo rico. Minha entidade Task não é só um saco de dados; ela mesma
gerencia suas mudanças de estado e valida suas regras de negócio básicas. Evito que os serviços se
transformem em 'scripts' gigantes, distribuindo a responsabilidade corretamente."
8. Por que você cria DTOs (TaskRequest/Response) e não devolve a Entidade de Domínio diretamente?
Teórica: Para proteger o contrato da API e evitar o acoplamento entre o cliente e o domínio.
Verbal: "Para ter controle total sobre o que exponho ao Frontend. Ao usar DTOs (Java Records), posso
mudar a estrutura interna do meu banco de dados ou do meu domínio sem quebrar a interface que o
time de Angular consome. É uma camada de segurança e estabilidade."
3 of 19 1/4/2026, 7:34 PM
Firefox about:blank
Teórica: @MockitoBean é a nova anotação no Spring Boot 3.4 que substitui a obsoleta @MockBean.
Verbal: "Quis manter o projeto dentro dos últimos padrões. O Spring Framework 6.2 introduziu um
novo sistema de 'Bean Overriding', e @MockitoBean é a forma recomendada agora. Demonstra que não
só uso o framework, mas sigo sua evolução técnica."
Teórica: É a nova anotação no Spring Boot 3.4 para substituir a obsoleta @MockBean.
Verbal: "Como usei Spring Boot 3.5, quis seguir as últimas recomendações. @MockBean está se
tornando obsoleto e @MockitoBean é a forma moderna de injetar mocks no contexto do Spring.
Demonstra que estou atualizado com o framework".
Teórica: Os métodos @PostConstruct não são executados em testes unitários com @InjectMocks.
Verbal: "Tive que lidar com isso com cuidado. Como as métricas do Prometheus são inicializadas em
um @PostConstruct, nos testes unitários optei pela instanciação manual no setUp. Isso me permitiu
injetar um SimpleMeterRegistry real e garantir que os contadores não fossem nulos, assegurando testes
robustos."
4 of 19 1/4/2026, 7:34 PM
Firefox about:blank
5 of 19 1/4/2026, 7:34 PM
Firefox about:blank
Verbal: "Significa que o Angular já não tem que vigiar cada clique ou movimento do mouse para ver
se atualiza a tela. É muito mais leve e rápido porque só se atualiza quando os Signals avisam
explicitamente".
Verbal: "Zoneless é o futuro do Angular. Ao remover [Link], a aplicação fica mais leve e rápida. Não
há mais um processo global revendo toda a DOM sempre que um evento ocorre; agora o Angular só
atualiza o que os Signals indicam, otimizando a experiência do usuário."
Teórica: Os Signals oferecem reatividade granular; RxJS é para fluxos de eventos assíncronos.
Verbal: "Os Signals são mais simples de ler e mais eficientes para o estado da UI. O Angular sabe
exatamente qual pedacinho do HTML mudar sem revisar toda a página. Deixei o RxJS apenas para as
requisições HTTP com HttpClient".
Teórica: Signals oferecem reatividade granular e síncrona; RxJS é melhor para fluxos assíncronos
complexos.
Verbal: "Os Signals tornam o código muito mais legível e previsível. O Angular sabe exatamente qual
pedaço do HTML deve mudar sem re-renderizar o componente todo. Reservo o RxJS apenas para as
requisições HTTP, onde seu poder para gerenciar fluxos assíncronos ainda é imbatível."
*3. Por que você usa o novo Controle de Fluxo (@for, @if) em vez das diretivas antigas (ngIf)?
Verbal: "É muito mais limpo. Você já não precisa de *ngIf. Por ser nativo do compilador, é mais
rápido e me permite usar o bloco @empty que é ótimo para mostrar uma mensagem quando não há
tarefas".
Verbal: "É muito mais limpo e tem desempenho superior. O que mais gosto é o bloco @empty; me
permitiu lidar com o estado de 'sem tarefas' de forma elegante e sem lógica extra no componente."
Verbal: "Evito o uso de any. Por exemplo, na listagem de tarefas, exponho os Enums do Java
diretamente para o componente do Angular. Assim, o compilador me avisa se tento usar um estado que
não existe, evitando erros em produção."
6 of 19 1/4/2026, 7:34 PM
Firefox about:blank
Verbal: "Configurei um proxy no Vite. Assim, quando o front pede /api, o navegador acredita que é o
mesmo site e não tenho problemas de CORS, redirecionando tudo para a porta 8080 do Java".
7 of 19 1/4/2026, 7:34 PM
Firefox about:blank
2. Por que você usa Flyway e não deixa o Hibernate criar as tabelas?
Teórica: Usando Pageable do Spring Data JPA no backend para realizar consultas com OFFSET e FETCH.
Verbal: "Implementei paginação de ponta a ponta. O backend só traz os 5 registros que o usuário está
vendo. Isso economiza memória no servidor e largura de banda na rede. No front, uso um Computed
Signal para gerar a navegação dinamicamente com base no que o servidor me reporta."
7. Como você assegura que o Enum seja salvo como String no banco de dados?
8 of 19 1/4/2026, 7:34 PM
Firefox about:blank
9 of 19 1/4/2026, 7:34 PM
Firefox about:blank
2. Quais dificuldades você teve com o SQL Server no Docker e como as resolveu?
Verbal: "O maior desafio foi a latência de inicialização. O SQL Server leva alguns segundos para ficar
pronto. Resolvi implementando um Side-car Script no Docker Compose com um loop de retentativa.
O script espera o motor estar 'saudável' antes de tentar criar o banco de dados, garantindo que a
inicialização seja sempre bem-sucedida."
Verbal: "Para separar os dados do ciclo de vida do contêiner. Se paro ou deleto o contêiner, minhas
tarefas criadas não são perdidas. Além disso, no Windows, os volumes nomeados têm um desempenho
de leitura/escrita superior às pastas compartilhadas."
Teórica: Que o resultado seja sempre o mesmo não importa quantas vezes seja executado.
Verbal: "Meu pipeline recria tudo do zero em contêineres. Não importa se você roda hoje ou em um
ano, o ambiente do SQL Server será idêntico. Isso me dá a segurança de que o código que passou nos
testes no GitHub Actions funcionará igual em produção".
Teórica: Por velocidade e cobertura. Os unitários testam lógica; os de integração testam a "fiação".
Verbal: "Os unitários são rápidos e testam minhas regras de negócio com Mockito. Os de integração
são mais lentos porque levantam o Spring e o banco de dados, mas são vitais para assegurar que os
JSONs e as consultas SQL funcionam de verdade".
8. Para que serve o Health Check que você colocou no Docker Compose?
10 of 19 1/4/2026, 7:34 PM
Firefox about:blank
Teórica: Para que os serviços dependentes esperem até que o banco de dados esteja pronto.
Verbal: "O SQL Server leva alguns segundos para inicializar. Sem o Health Check, o script de
inicialização falharia por 'conexão recusada'. Com isso, o Docker espera até que o motor esteja
'saudável' antes de tentar criar o banco de dados".
11 of 19 1/4/2026, 7:34 PM
Firefox about:blank
Verbal: "Sincronizar a paginação de ponta a ponta. Assegurar que o objeto Page do Spring fosse
mapeado corretamente para minha PaginatedResponse de domínio e que o Angular atualizasse os
Signals sem perder a integridade. Foi um desafio de design de contratos".
Verbal: "No backend usaria Virtual Threads do Java 21 para o I/O. No banco de dados adicionaria
índices aos campos de busca e talvez um cache com Redis. No front, o Angular 20 Zoneless já está
preparado para gerenciar milhares de nós no DOM sem se abalar".
Verbal: "Porque este código não é apenas uma solução para um problema; é uma demonstração de
padrões de engenharia. Domino desde o pipeline de DevOps até a reatividade moderna do frontend,
sempre priorizando a manutenibilidade e a arquitetura limpa. Estou pronto para contribuir com
qualidade desde o primeiro dia na Stefanini".
12 of 19 1/4/2026, 7:34 PM
Firefox about:blank
Verbal: "A utilizei como um Senior Copilot. Ela me ajudou a acelerar a criação da estrutura de pastas
e o CSS do Tailwind. Entretanto, cada linha de código gerada passou por minha revisão manual para
assegurar que cumpria com SOLID, Clean Code e as restrições da minha Arquitetura Hexagonal. É
uma ferramenta para ganhar produtividade, mas o critério técnico é 100% meu."
Verbal: "Através de Pull Requests no GitHub. Mesmo neste desafio, não fiz merges diretos. Publiquei
minhas branches de feature e deixei o pipeline de CI validar o código antes de integrá-lo. É a única
forma de garantir a qualidade total."
Verbal: "Implementei um bloco try-catch com log no serviço. A prioridade é o negócio (salvar a tarefa
no banco de dados). Se a notificação assíncrona falhar, logamos o erro para que o Suporte aja, mas não
bloqueamos o usuário. Isso é projetar para a Resiliência."
Verbal: "Poderíamos migrar para microserviços reais. Como o backend já usa Arquitetura Hexagonal,
o 'Domínio' já está isolado. Seria simples extrair a lógica de tarefas para seu próprio repositório. O
monorepo foi uma decisão inicial para manter a consistência do contrato API-Front."
Verbal: "Não é só que o app funciona. É que é uma solução Enterprise-Grade. Está documentada
com diagramas Mermaid, monitorada com Prometheus, desacoplada com Kafka e protegida com um
pipeline de CI/CD automático. Está pronta para ser colocada em produção hoje mesmo."
13 of 19 1/4/2026, 7:34 PM
Firefox about:blank
Vejo que você usou Arquitetura Hexagonal. Não acha que é complexidade demais para um To-Do List?
Resposta Sênior: "Se o objetivo fosse apenas um CRUD rápido, sim. Mas para a Stefanini, projetei
uma solução Enterprise-Ready. A Arquitetura Hexagonal assegura que, se amanhã o cliente pedir
para trocar o SQL Server pelo CosmosDB ou migrar de uma API REST para gRPC, 80% do código (o
Domínio) não muda. É um investimento em manutenibilidade e escalabilidade."
Resposta Sênior: "Utilizei os Java Records para garantir a imutabilidade dos DTOs e facilitar o
mapeamento nas portas da arquitetura. Além disso, o projeto está preparado para Virtual Threads, o
que permitiria escalar para milhares de requisições concorrentes de forma eficiente sem sobrecarregar a
memória do servidor."
Por que você escolheu o modo Zoneless em vez do padrão com [Link]?
Resposta Sênior: "Porque o Angular 20 foi projetado para ser eficiente. Ao usar Signals, a detecção
de mudanças é granular: o Angular sabe exatamente qual parte da DOM atualizar. Ao ser Zoneless,
eliminamos a sobrecarga de interceptar todos os eventos assíncronos do navegador, o que resulta em
uma aplicação mais leve e com uma resposta muito mais rápida para o usuário."
Resposta Sênior: "Utilizo Service Containers do Docker no GitHub Actions. Isso me permite
levantar uma instância real do SQL Server durante o pipeline. A criação do banco de dados
stefaninidb está automatizada por meio de scripts
Teoria: O padrão busca desacoplar a lógica de negócio (Domínio) dos detalhes técnicos
(Infraestrutura).
Verbal: "Olha, embora um To-Do List pareça simples, o projetei pensando em escalabilidade
empresarial. A Arquitetura Hexagonal me permite que o negócio não seja 'escravo' da tecnologia. Se
amanhã a Stefanini decidir migrar do SQL Server para o MongoDB, 80% do meu código não muda. É
um investimento em manutenibilidade."
14 of 19 1/4/2026, 7:34 PM
Firefox about:blank
Teoria: O modelo rico inclui lógica de negócio; o anêmico só tem getters e setters.
Verbal: "Busquei um modelo rico. Minha entidade Task tem lógica para mudar seu estado e se validar.
Não é apenas um objeto que transporta dados; tem comportamento próprio, o que facilita a manutenção
e evita serviços gigantes de 500 linhas."
Como você garante que o domínio não se contamine com Spring ou JPA?
Teoria: São classes projetadas exclusivamente para transportar dados de forma imutável.
Verbal: "Usei-os para os contratos de entrada e saída (DTOs). Por serem imutáveis, garanto que os
dados não sejam modificados acidentalmente enquanto viajam entre o controlador e o serviço. É
segurança e legibilidade ao mesmo tempo."
Teoria: É a nova anotação no Spring Boot 3.4 para substituir a obsoleta @MockBean.
Verbal: "Usei @MockitoBean porque é o novo padrão do Spring Framework 6.2. Como desenvolvedor
Sênior, me mantenho atualizado com a evolução do framework. @MockBean está se tornando obsoleto e
quis que o projeto da Stefanini nascesse com as melhores práticas atuais."
15 of 19 1/4/2026, 7:34 PM
Firefox about:blank
Teoria: Os Signals oferecem uma reatividade granular e síncrona mais eficiente para o estado da UI.
Verbal: "Os Signals tornam o código muito mais legível. O Angular sabe exatamente qual pedacinho
da tela mudar sem revisar toda a árvore de componentes. Reservei o RxJS apenas para as requisições
HTTP, onde seu poder para gerenciar fluxos de dados assíncronos continua sendo o melhor."
Teoria: Uso estrito de interfaces TypeScript e Enums que coincidem com o Backend.
Verbal: "Evito o uso de any. Por exemplo, exportei os Enums de status para usá-los nos templates.
Assim, o compilador do Angular me avisa se tento atribuir um estado que não existe. Se o código não é
seguro em tipos, não é código profissional."
16 of 19 1/4/2026, 7:34 PM
Firefox about:blank
Teoria: Para executar testes de integração sobre infraestrutura real em vez de mocks.
Verbal: "Porque não confio em 'mocks' para o banco de dados. Usar um contêiner real do SQL Server
no pipeline me assegura que minhas consultas SQL e minhas migrações do Flyway funcionam de
verdade antes de chegar à produção."
17 of 19 1/4/2026, 7:34 PM
Firefox about:blank
Como você gerencia a persistência dos dados se o contêiner do SQL Server for apagado?
18 of 19 1/4/2026, 7:34 PM
Firefox about:blank
ÚLTIMAS PALABRAS
Has demostrado una gran capacidad para resolver errores de configuración, manejar divergencias en Git y
aplicar patrones de diseño complejos.
¡Mucho éxito! Tienes todo para conseguir esa vacante. ¡Estás listo! Tienes un proyecto de nivel
10/10. ¡Mucho éxito en Brasilia!
19 of 19 1/4/2026, 7:34 PM