Histórico de Revisões

Data

Versão

Descrição

Autor

Revisora

08/06/2025

1.0.0

Criação do documento

Cédric Fabrice Lamalle

Renata Cardoso de Oliveira

1. Desenvolvedores Java

1.1. Nível Júnior

1.1.1. Perguntas

  1. Qual é a diferença fundamental entre o operador == e o método .equals() ao comparar objetos em Java?

    1. == compara o valor dos objetos, enquanto .equals() compara se eles ocupam o mesmo espaço na memória.

    2. Não há diferença prática, mas a convenção é usar .equals() para objetos.

    3. == compara a referência de memória dos objetos, enquanto .equals() (quando sobrescrito) compara o conteúdo ou valor.

    4. O método .equals() só pode ser usado para comparar String, enquanto == é para todos os outros tipos de objeto.

  2. Qual é a principal função da JVM (Java Virtual Machine)?

    1. É um Ambiente de Desenvolvimento Integrado (IDE) usado para escrever código Java, como o Eclipse ou IntelliJ.

    2. É um compilador que converte código-fonte Java (.java) diretamente em código de máquina para um sistema operacional específico.

    3. É uma biblioteca padrão do Java, responsável por criar interfaces gráficas (GUI).

    4. É uma máquina virtual que executa bytecode Java, gerenciando memória e garantindo a portabilidade entre diferentes sistemas.

  3. Em uma coleção Java, quando é mais apropriado usar ArrayList em vez de LinkedList?

    1. Quando a principal operação é adicionar ou remover elementos do meio da lista.

    2. Quando a principal operação é acessar elementos por seu índice de forma rápida e frequente.

    3. LinkedList é sempre mais performático, então ArrayList raramente é usado.

    4. Quando é necessário garantir que a coleção seja "thread-safe" sem usar outras classes.

  4. Qual método HTTP é idempotente e usado para solicitar a representação de um recurso específico?

    1. POST

    2. GET

    3. PATCH

    4. UPDATE

  5. No JavaScript (ES6+), qual declaração de variável cria uma variável de escopo de bloco que não pode ser reatribuída?

    1. var

    2. let

    3. const

    4. static

  6. Em um banco de dados relacional, o que uma chave primária (primary key) garante?

    1. Que a coluna seja criptografada.

    2. Que cada linha na tabela seja unicamente identificada e não nula.

    3. Que a tabela possa ser acessada mais rapidamente, independentemente da consulta.

    4. Que a coluna pode ter valores duplicados, mas não nulos.

  7. No Spring Boot, qual anotação combina @Controller e @ResponseBody, sendo ideal para criar endpoints de API REST?

    1. @Component

    2. @Service

    3. @RestController

    4. @Entity

  8. Para que serve o Git no ciclo de vida de desenvolvimento de software?

    1. Para compilar o código Java em bytecode.

    2. Para automatizar o processo de build e deploy da aplicação (CI/CD).

    3. Para gerenciar e rastrear mudanças no código-fonte, facilitando a colaboração.

    4. Para executar testes unitários e de integração.

  9. (Soft Skill) Ao se deparar com um bug em um código que você não conhece, qual seria a abordagem mais eficaz?

    1. Reescrever imediatamente a parte do código que parece estar com problema.

    2. Pedir imediatamente para um desenvolvedor sênior resolver o problema para você.

    3. Fazer pequenas alterações aleatórias no código até que o bug desapareça.

    4. Isolar o problema, tentar replicá-lo, usar ferramentas de depuração e pesquisar antes de pedir ajuda, se necessário.

  10. (Soft Skill) Você recebe um feedback construtivo sobre seu código durante uma revisão (code review). Qual é a melhor atitude?

    1. Justificar cada ponto do seu código, defendendo suas escolhas originais a todo custo.

    2. Aceitar as sugestões sem questionar para acelerar o processo.

    3. Ignorar o feedback se não concordar e aprovar a tarefa mesmo assim.

    4. Analisar o feedback, fazer perguntas para entender a perspectiva do colega e aplicar as mudanças que melhoram a qualidade do código.

1.1.2. Gabarito - Nível Júnior

  1. c

  2. d

  3. b

  4. b

  5. c

  6. b

  7. c

  8. c

  9. d

  10. d

1.2. Nível Pleno

1.2.1. Perguntas

  1. Qual princípio SOLID afirma que uma classe deve ter apenas um motivo para mudar?

    1. Princípio Aberto/Fechado (Open/Closed Principle)

    2. Princípio da Substituição de Liskov (Liskov Substitution Principle)

    3. Princípio da Responsabilidade Única (Single Responsibility Principle)

    4. Princípio da Inversão de Dependência (Dependency Inversion Principle)

  2. Qual das seguintes opções descreve melhor uma vantagem do uso de Java Streams sobre laços for tradicionais?

    1. Streams sempre executam mais rápido que laços for em qualquer cenário.

    2. Permitem um código mais declarativo e funcional, facilitando operações como filtro, mapeamento e paralelização.

    3. Streams são a única maneira de iterar sobre coleções em Java 8 e versões posteriores.

    4. O código escrito com Streams consome significativamente menos memória.

  3. No Spring, qual é a principal diferença de semântica entre as anotações @Service e @Repository?

    1. Não há diferença, são apenas aliases para @Component.

    2. @Service é para controladores REST e @Repository é para clientes SOAP.

    3. @Service indica a camada de lógica de negócio, enquanto @Repository indica a camada de acesso a dados e habilita a tradução de exceções.

    4. @Service cria beans do tipo Singleton, enquanto @Repository cria beans do tipo Prototype.

  4. Qual das opções a seguir NÃO é um dos princípios fundamentais de uma API RESTful?

    1. Stateless (Sem estado)

    2. Comunicação Cliente-Servidor

    3. Interface Contratual Forte (Schema-based)

    4. Interface Uniforme

  5. Em uma aplicação Spring Boot, qual é a melhor abordagem para tratar exceções de forma centralizada para todos os controladores?

    1. Usar um bloco try-catch em cada método de cada controlador.

    2. Criar uma classe anotada com @ControllerAdvice e métodos com @ExceptionHandler.

    3. Configurar um Interceptor para capturar e tratar todas as exceções.

    4. Fazer com que todas as exceções sejam do tipo RuntimeException, pois o Spring as captura por padrão.

  6. Qual é uma das principais desvantagens da arquitetura de microsserviços?

    1. Baixa escalabilidade, pois cada serviço é pequeno.

    2. Forte acoplamento entre os serviços.

    3. Complexidade operacional elevada (deploy, monitoramento, resiliência).

    4. Impossibilidade de usar diferentes tecnologias para cada serviço.

  7. Qual problema o Docker resolve primariamente no fluxo de desenvolvimento?

    1. A necessidade de escrever código em diferentes linguagens de programação.

    2. A lentidão da compilação de código Java.

    3. A falta de um sistema de controle de versão distribuído.

    4. O problema de "na minha máquina funciona", garantindo consistência entre ambientes.

  8. O que é o problema de consulta "N+1" em um ORM como o JPA/Hibernate?

    1. É quando uma única consulta SQL retorna N+1 resultados inesperados.

    2. É um erro que ocorre ao tentar persistir N+1 entidades em uma única transação.

    3. É um problema de performance onde o ORM faz 1 consulta para a lista de entidades e depois N consultas para buscar dados associados a cada entidade.

    4. É uma vulnerabilidade de segurança que permite N+1 usuários acessarem um recurso simultaneamente.

  9. (Soft Skill) Durante uma discussão técnica, um colega discorda veementemente da sua solução proposta. Qual é a melhor forma de proceder?

    1. Ignorar a opinião dele, pois você tem mais certeza sobre a sua solução.

    2. Escalar a discussão para o gerente imediatamente para que ele decida.

    3. Ouvir atentamente os argumentos dele, apresentar os seus com base em dados ou fatos e buscar um consenso focado no melhor resultado para o projeto.

    4. Aceitar a solução dele para evitar conflito, mesmo que você acredite que a sua é melhor.

  10. (Soft Skill) A equipe precisa entregar uma nova feature com prazo curto, mas o código existente na área a ser modificada tem alto débito técnico. Como você agiria?

    1. Ignoraria o débito técnico para entregar no prazo, deixando para resolver "depois".

    2. Negociaria com o Product Owner/Manager, explicando os riscos do débito técnico (bugs, lentidão futura) e propondo alocar um tempo para uma refatoração mínima.

    3. Recusaria-se a fazer a tarefa até que todo o débito técnico seja pago.

    4. Faria a nova feature e a refatoração completa, mesmo que isso atrase a entrega em várias semanas.

1.2.2. Gabarito - Nível Pleno

  1. c

  2. b

  3. c

  4. c

  5. b

  6. c

  7. d

  8. c

  9. c

  10. b

1.3. Nível Sênior

1.3.1. Perguntas

  1. Em uma arquitetura de microsserviços, qual dos seguintes padrões é mais recomendado para gerenciar autenticação de forma centralizada e segura?

    1. Cada microsserviço ter sua própria tabela de usuários e senhas para garantir o desacoplamento.

    2. Usar um serviço de identidade centralizado (Identity Provider) que emite tokens (JWT) via OAuth 2.0/OpenID Connect.

    3. Passar o nome de usuário e senha em cada requisição entre os serviços usando HTTP Basic Authentication.

    4. Armazenar as informações de sessão do usuário em um banco de dados compartilhado acessado por todos os microsserviços.

  2. Ao projetar a comunicação entre microsserviços, quando a comunicação assíncrona (usando um Message Broker como RabbitMQ/Kafka) é preferível à síncrona (REST)?

    1. Quando uma resposta imediata é necessária para o usuário final.

    2. Para aumentar o acoplamento entre os serviços, garantindo que um não funcione sem o outro.

    3. Quando se busca maior resiliência e desacoplamento, permitindo que os serviços operem mesmo que outros estejam temporariamente offline.

    4. Em tarefas simples de CRUD que não envolvem lógica de negócio complexa.

  3. Qual ferramenta ou técnica é mais eficaz para diagnosticar um vazamento de memória (memory leak) em uma aplicação Java em produção?

    1. Aumentar a quantidade de memória RAM disponível para a JVM.

    2. Adicionar mais logs (System.out.println) para verificar onde os objetos estão sendo criados.

    3. Analisar um heap dump, gerado em um momento de alto consumo de memória, com uma ferramenta como JVisualVM.

    4. Reiniciar a aplicação periodicamente para limpar a memória.

  4. Segundo o Teorema CAP, um sistema distribuído que tolera partições de rede (P) deve escolher entre:

    1. Escalabilidade (Scalability) e Performance (Performance).

    2. Consistência (Consistency) e Disponibilidade (Availability).

    3. Durabilidade (Durability) e Isolamento (Isolation).

    4. Monolitismo (Monolith) e Microsserviços (Microservices).

  5. Qual das seguintes medidas é a mais importante para prevenir ataques de Injeção de SQL (SQL Injection) em uma aplicação Java com JPA/Hibernate?

    1. Criptografar todos os dados sensíveis no banco de dados.

    2. Usar exclusivamente Stored Procedures para todo o acesso ao banco de dados.

    3. Usar APIs parametrizadas (como a Criteria API ou JPQL com setParameter) em vez de concatenar strings para montar as consultas.

    4. Implementar um Web Application Firewall (WAF) na frente da aplicação.

  6. O que significa o termo "Infraestrutura como Código" (IaC)?

    1. Escrever o código da aplicação diretamente em linguagens de baixo nível, como Assembly.

    2. Gerenciar e provisionar a infraestrutura de TI (servidores, redes) por arquivos de configuração versionáveis, como Terraform ou Ansible.

    3. Uma metodologia onde a infraestrutura de hardware é projetada para ser fisicamente idêntica ao código-fonte.

    4. O processo de armazenar o código-fonte da aplicação diretamente na infraestrutura de nuvem, sem um repositório.

  7. Qual problema o padrão de resiliência "Circuit Breaker" (Disjuntor) resolve em uma arquitetura de microsserviços?

    1. Impede que senhas sejam enviadas em texto plano pela rede.

    2. Garante que uma transação seja completada em múltiplos bancos de dados.

    3. Evita que um serviço faça chamadas repetidas para outro serviço que está falhando, prevenindo a cascata de falhas.

    4. Controla a taxa de requisições que um cliente pode fazer para uma API (Rate Limiting).

  8. Em um banco de dados relacional, qual é o principal propósito de se criar um índice em uma coluna?

    1. Garantir que os valores na coluna sejam únicos.

    2. Reduzir o espaço de armazenamento utilizado pela tabela.

    3. Criptografar os dados da coluna para segurança.

    4. Acelerar a performance de consultas que filtram ou ordenam por aquela coluna.

  9. (Soft Skill) Como líder técnico, você percebe que um desenvolvedor pleno da equipe está com dificuldades para evoluir em suas habilidades de arquitetura. Qual a melhor abordagem?

    1. Retirar as tarefas complexas dele para não arriscar o projeto.

    2. Recomendar ao gerente que o desenvolvedor seja transferido para outra equipe.

    3. Criar oportunidades de aprendizado, como sessões de "pair programming" em tarefas de design, delegar responsabilidades com mentoria e fornecer feedbacks construtivos.

    4. Esperar que ele aprenda sozinho, pois um desenvolvedor pleno já deveria ter essas habilidades.

  10. (Soft Skill) Você precisa apresentar uma decisão técnica de grande impacto (ex: migrar de um Monólito para Microsserviços) para diretores não-técnicos. Como você deve comunicar?

    1. Focando nos detalhes técnicos da implementação, linguagens e frameworks que serão usados.

    2. Explicando a decisão em termos de impacto para o negócio: agilidade, redução de risco, escalabilidade para atender mais clientes, e tempo de lançamento no mercado (time-to-market).

    3. Enviando um documento técnico detalhado de 50 páginas e pedindo que eles leiam.

    4. Dizendo que é uma necessidade técnica e a decisão não precisa ser compreendida por eles.

1.3.2. Gabarito - Nível Sênior

  1. b

  2. c

  3. c

  4. b

  5. c

  6. b

  7. c

  8. d

  9. c

  10. b

2. Líder Técnico

2.1. Perguntas

  1. Qual é a abordagem mais eficaz para um Líder Técnico gerenciar o débito técnico de um projeto?

    1. Parar o desenvolvimento de novas funcionalidades até que todo o débito técnico seja pago, para garantir a qualidade máxima.

    2. Ignorar o débito técnico para focar exclusivamente na entrega de novas funcionalidades solicitadas pelo cliente.

    3. Criar um projeto de refatoração separado para ser executado somente após a conclusão do projeto atual.

    4. Negociar e alocar uma porcentagem da capacidade de cada sprint para pagar o débito, priorizando os itens de maior impacto e risco.

  2. Ao definir um novo padrão de arquitetura para a equipe, qual é a melhor estratégia que um Líder Técnico pode adotar para garantir sua adoção?

    1. Impor o novo padrão de forma unilateral e revisar o código de todos para garantir que estão seguindo.

    2. Deixar que cada desenvolvedor decida se quer ou não adotar o novo padrão, promovendo a autonomia total.

    3. Documentar a decisão (ex: em um ADR - Architecture Decision Record), discuti-la com a equipe para obter feedback e consenso, e depois automatizar sua verificação.

    4. Discutir a decisão verbalmente em uma reunião e esperar que todos se lembrem e apliquem o padrão.

  3. Dois desenvolvedores sêniores na sua equipe têm opiniões fortes e conflitantes sobre qual tecnologia usar em um novo serviço. Como um Líder Técnico deve mediar a situação?

    1. Deixá-los debater até que um deles desista, para não se envolver no conflito.

    2. Escolher imediatamente a tecnologia com a qual você tem mais familiaridade para acelerar a decisão.

    3. Escalar o problema para o seu gerente, pedindo que ele tome a decisão final.

    4. Facilitar uma reunião onde ambos apresentam prós e contras com base nos requisitos do projeto, e guiar a equipe para um consenso ou tomar a decisão final se necessário.

  4. Qual é a responsabilidade principal de um Líder Técnico no desenvolvimento de carreira dos membros da sua equipe?

    1. Nenhuma, pois o desenvolvimento de carreira é uma responsabilidade exclusiva do departamento de RH e do próprio indivíduo.

    2. Focar apenas no desenvolvimento dos desenvolvedores sêniores, pois eles trazem mais impacto para o projeto.

    3. Identificar proativamente oportunidades de crescimento, delegar tarefas desafiadoras com mentoria e fornecer feedback regular e construtivo.

    4. Garantir apenas que as tarefas sejam entregues no prazo, pois esse é o principal indicador de performance da equipe.

  5. Um gerente de produto (Product Manager) pergunta por que uma funcionalidade aparentemente simples levará três semanas para ser desenvolvida. Qual é a melhor forma de responder?

    1. Dizer "porque é tecnicamente complexo" e não dar mais detalhes para não confundir.

    2. Usar jargões técnicos complexos para justificar o tempo, mostrando a profundidade do seu conhecimento.

    3. Explicar os passos necessários e os riscos em uma linguagem de negócio (ex: "precisamos garantir a segurança dos dados, o que exige testes extras"), traduzindo o esforço técnico em impacto.

    4. Aceitar um prazo menor para evitar conflito, mesmo sabendo que isso resultará em baixa qualidade e débito técnico.

  6. Qual é o papel de um Líder Técnico na promoção de uma cultura DevOps na equipe?

    1. Contratar uma equipe de "DevOps" separada para cuidar de toda a automação, isolando os desenvolvedores do processo.

    2. Promover a responsabilidade de ponta a ponta ("you build it, you run it"), incentivando a automação de testes/deploys (CI/CD) e a colaboração entre as áreas.

    3. Focar apenas na velocidade de desenvolvimento, deixando as responsabilidades de deploy e monitoramento para a equipe de operações.

    4. Implementar o maior número possível de ferramentas de DevOps, independentemente de elas resolverem um problema real da equipe.

  7. Durante o planejamento de um projeto, a equipe sugere usar uma tecnologia nova, mas que ninguém tem experiência. Qual a atitude mais prudente do Líder Técnico?

    1. Vetar imediatamente a ideia para evitar qualquer risco ao cronograma do projeto.

    2. Aprovar a tecnologia sem ressalvas, confiando que a equipe aprenderá durante o desenvolvimento.

    3. Propor a criação de uma Prova de Conceito (PoC) ou um "spike" para avaliar a tecnologia em um escopo limitado, identificando os riscos e tendo um plano B.

    4. Delegar a tarefa de aprender a nova tecnologia para o membro mais júnior da equipe, como um desafio.

  8. Quando é o momento ideal para começar a se preocupar com os requisitos não-funcionais, como performance e escalabilidade?

    1. Somente quando os clientes começarem a reclamar da lentidão do sistema.

    2. No final do projeto, em uma fase de "otimização" pouco antes do lançamento.

    3. Desde o início do projeto, incorporando-os ao design da arquitetura e aos critérios de aceite das funcionalidades.

    4. Esta é uma preocupação exclusiva da equipe de infraestrutura (SRE/Ops), não da equipe de desenvolvimento.

  9. Qual é a forma mais eficaz de um Líder Técnico delegar uma tarefa complexa?

    1. Manter todas as tarefas complexas para si mesmo para garantir a máxima qualidade e evitar riscos.

    2. Delegar a tarefa com um passo a passo detalhado de como ela deve ser implementada, fazendo microgerenciamento para garantir que saia como o esperado.

    3. Definir claramente o resultado esperado ("o quê"), dar autonomia sobre "como" implementar, e garantir que o desenvolvedor tenha o contexto e suporte necessários.

    4. Delegar a tarefa para o primeiro desenvolvedor disponível, sem fornecer muito contexto para não influenciar sua criatividade.

  10. Do ponto de vista de um Líder Técnico, qual é o objetivo principal de se estabelecer um processo de revisão de código (Code Review)?

    1. Apenas encontrar o máximo de bugs possível no código dos outros para garantir a qualidade.

    2. Servir como um ponto de controle para culpar desenvolvedores por erros e medir a performance individual.

    3. Garantir a qualidade, compartilhar conhecimento, manter padrões de código e criar oportunidades de mentoria na equipe.

    4. Criar uma burocracia necessária para o processo de desenvolvimento, mesmo que atrase as entregas.

2.2. Gabarito

  1. d

  2. c

  3. d

  4. c

  5. c

  6. b

  7. c

  8. c

  9. c

  10. c

3. Arquiteto de Software Java

3.1. Perguntas

  1. Conforme o Teorema CAP, ao projetar um sistema distribuído que deve tolerar falhas de rede (Tolerância a Particionamento), qual é o principal "trade-off" que um arquiteto deve fazer?

    1. Entre alta performance de escrita e alta performance de leitura.

    2. Entre baixa latência e alto throughput (vazão).

    3. Entre Consistência forte (todos os nós leem o dado mais recente) e alta Disponibilidade (o sistema sempre responde).

    4. Entre o custo da infraestrutura e a facilidade de manutenção do código.

  2. Em uma arquitetura de microsserviços, qual padrão é mais indicado para gerenciar uma transação de negócio que abrange múltiplos serviços, sem o uso de um protocolo de two-phase commit (2PC)?

    1. Utilizar um banco de dados monolítico compartilhado por todos os microsserviços para garantir atomicidade.

    2. Implementar o padrão Saga, que orquestra a transação por uma sequência de transações locais e eventos de compensação.

    3. Exigir que todos os serviços envolvidos na transação estejam sempre 100% disponíveis.

    4. Realizar chamadas REST síncronas em cadeia, tratando exceções em cada passo.

  3. Qual estratégia de cache envolve a aplicação verificar primeiro o cache e, em caso de "cache miss", buscar os dados na fonte primária (ex: banco de dados) e só então popular o cache?

    1. Write-Through (Escrita Direta)

    2. Write-Back (Escrita Posterior)

    3. Cache-Aside (Cache de Lado)

    4. Refresh-Ahead (Atualização Adiantada)

  4. Ao otimizar uma aplicação Java para baixa latência, como um sistema de negociações financeiras, qual tipo de Coletor de Lixo (Garbage Collector) é a escolha mais moderna e apropriada devido ao seu foco em pausas muito curtas?

    1. O coletor Serial, por ser o mais simples de todos.

    2. O coletor Parallel (Throughput), pois visa maximizar a quantidade de trabalho feito pela aplicação.

    3. O coletor ZGC (Z Garbage Collector) ou Shenandoah, projetados para pausas de baixíssima latência (na ordem de milissegundos).

    4. Desabilitar o Garbage Collector para evitar qualquer tipo de pausa na JVM.

  5. Em qual cenário um arquiteto deveria preferir o uso de GraphQL em vez de uma API REST tradicional?

    1. Para expor operações simples de CRUD (Create, Read, Update, Delete) sobre um único recurso.

    2. Quando a aplicação cliente (ex: um app móvel) precisa buscar dados complexos de múltiplos recursos em uma única chamada, especificando os campos exatos que deseja receber.

    3. Quando o principal requisito é aproveitar ao máximo o cache HTTP nativo dos navegadores e CDNs.

    4. Para comunicação interna, de servidor para servidor, onde a performance e um contrato rígido são essenciais.

  6. Qual é o princípio fundamental por trás do padrão de arquitetura CQRS (Command Query Responsibility Segregation)?

    1. Unificar os modelos de leitura e escrita para simplificar o acesso aos dados e reduzir a duplicação de código.

    2. Usar sempre um único banco de dados para todas as operações, tanto de comando quanto de consulta.

    3. Segregar as responsabilidades, usando modelos e, potencialmente, armazenamentos de dados diferentes e otimizados para operações de escrita (Commands) e de leitura (Queries).

    4. É um padrão de design que se aplica exclusivamente à camada de interface do usuário (UI) para separar ações de visualizações.

  7. No contexto de segurança de aplicações, qual é a diferença essencial entre Autenticação e Autorização?

    1. São termos sinônimos para o processo de login de um usuário.

    2. Autenticação determina o que um usuário pode fazer, enquanto Autorização verifica sua identidade.

    3. Autenticação é o processo de verificar a identidade de um usuário (quem você é), enquanto Autorização define quais ações ele pode executar (o que você pode fazer).

    4. Autenticação se aplica a usuários humanos, enquanto Autorização se aplica apenas à comunicação entre serviços.

  8. Um arquiteto precisa de um message broker para um sistema de event streaming cujo requisito principal é ter um log de eventos durável, imutável e com alta capacidade de reprocessamento (replay). Qual tecnologia é mais adequada?

    1. RabbitMQ

    2. Redis Pub/Sub

    3. Apache Kafka

    4. Amazon SQS (modo padrão)

  9. Em qual situação a escolha de uma arquitetura Monolítica pode ser mais vantajosa do que uma arquitetura de Microsserviços?

    1. Para uma grande empresa com dezenas de equipes que precisam trabalhar de forma independente.

    2. Quando diferentes componentes do sistema possuem requisitos de escalabilidade e tecnologia muito distintos.

    3. No início de um novo produto (MVP), com uma equipe pequena, onde a baixa complexidade operacional e a velocidade de desenvolvimento são cruciais.

    4. Quando se deseja utilizar diferentes linguagens de programação para diferentes módulos do sistema.

  10. Qual problema o padrão de resiliência "Circuit Breaker" (Disjuntor) resolve em um sistema distribuído?

    1. Garante a consistência de dados em transações que envolvem múltiplos serviços.

    2. Balanceia a carga de requisições entre múltiplas instâncias de um serviço.

    3. Impede que um serviço continue tentando se comunicar com outro que está falhando, evitando uma falha em cascata e permitindo que o serviço dependente se recupere.

    4. Criptografa a comunicação entre os serviços para garantir a segurança dos dados.

3.2. Gabarito

  1. c

  2. b

  3. c

  4. c

  5. b

  6. c

  7. c

  8. c

  9. c

  10. c

4. Arquiteto de Software (Java + Kubernetes)

4.1. Perguntas

  1. Em uma arquitetura de microsserviços rodando em Kubernetes, qual é o principal problema que um Service Mesh (como Istio ou Linkerd) visa resolver?

    1. Gerenciar o provisionamento de volumes persistentes (Persistent Volumes) para aplicações stateful.

    2. Abstrair a lógica de comunicação entre serviços (observabilidade, resiliência, segurança com mTLS, roteamento) do código da aplicação para uma camada de infraestrutura.

    3. Substituir o Ingress Controller para gerenciar o tráfego de entrada no cluster.

    4. Automatizar o processo de build e deploy das imagens de contêiner no cluster (CI/CD).

  2. Ao containerizar uma aplicação Java para rodar em Kubernetes, qual desafio comum relacionado à JVM um arquiteto deve considerar para evitar problemas de instabilidade?

    1. A JVM se ajusta automaticamente aos limites do contêiner, não sendo necessária nenhuma configuração adicional.

    2. Versões mais antigas da JVM não reconhecem os limites de recursos do contêiner (cgroups), podendo alocar memória em excesso e serem terminadas pelo Kubernetes (OOMKilled).

    3. Aplicações Java não podem ser containerizadas eficientemente devido ao seu alto consumo de memória.

    4. É obrigatório reescrever a aplicação em outra linguagem, como Go ou Rust, para obter boa performance em contêineres.

  3. Qual objeto do Kubernetes é o mais indicado para implantar uma aplicação que requer identidade de rede estável e armazenamento persistente garantido, como um banco de dados?

    1. Deployment

    2. DaemonSet

    3. Job

    4. StatefulSet

  4. Frameworks como Quarkus e Micronaut são populares no ecossistema Java cloud-native. Qual é a principal vantagem arquitetural que eles oferecem em um ambiente como Kubernetes?

    1. Possuem um modelo de programação muito mais simples para desenvolvedores júnior.

    2. Oferecem maior segurança, pois não permitem o uso de bibliotecas de terceiros.

    3. São otimizados via compilação Ahead-of-Time (AOT), resultando em startup extremamente rápido e baixo consumo de memória, ideais para contêineres e funções serverless.

    4. Fornecem melhor integração com bancos de dados legados do que o Spring Boot.

  5. O que é um "Operator" no contexto do Kubernetes?

    1. Um software de monitoramento que coleta métricas e logs das aplicações.

    2. Um padrão de software que estende a API do Kubernetes para automatizar o gerenciamento de ciclo de vida de aplicações complexas, codificando conhecimento operacional.

    3. Um tipo especial de StorageClass para provisionamento dinâmico de volumes.

    4. Um profissional certificado responsável por operar manualmente um cluster Kubernetes.

  6. Qual é a principal diferença de responsabilidade entre um Kubernetes Ingress e um API Gateway?

    1. Não há diferença, API Gateway é apenas um nome comercial para um Ingress Controller.

    2. O Ingress gerencia o tráfego interno (cluster-to-cluster), enquanto o API Gateway gerencia o tráfego externo.

    3. O Ingress lida apenas com o roteamento de tráfego L7 (HTTP/S), enquanto um API Gateway adiciona funcionalidades como autenticação, rate limiting e transformação de requisições.

    4. O Ingress é um recurso nativo do Kubernetes, enquanto o API Gateway deve sempre ser executado fora do cluster.

  7. Como um arquiteto pode garantir que um contêiner dentro de um Pod rode com o mínimo de privilégios necessários (Principle of Least Privilege)?

    1. Executando todos os contêineres com o usuário root para evitar problemas de permissão.

    2. Utilizando NetworkPolicy para restringir o acesso à rede do Pod.

    3. Criptografando a imagem do contêiner antes de enviá-la para o registry.

    4. Configurando o securityContext do Pod/Contêiner para definir um usuário não-root, um sistema de arquivos raiz somente leitura e remover capabilities desnecessárias.

  8. Em uma arquitetura de microsserviços, como um arquiteto pode viabilizar o rastreamento de uma requisição que passa por múltiplos serviços para depurar latências e erros?

    1. Aumentando o nível de log em cada serviço e correlacionando os timestamps manualmente.

    2. Implementando health checks (liveness e readiness probes) em cada serviço.

    3. Adotando uma solução de Rastreamento Distribuído (Distributed Tracing) com OpenTelemetry, que propaga um ID de correlação através dos serviços.

    4. Usando um APM (Application Performance Monitoring).

  9. Ao projetar um consumidor de eventos de um message broker que garante entrega "at-least-once" (pelo menos uma vez), por que é crucial que o endpoint consumidor seja idempotente?

    1. Para garantir que o consumidor processe as mensagens mais rapidamente.

    2. Porque a garantia "at-least-once" implica que uma mensagem pode ser entregue múltiplas vezes, e a idempotência evita efeitos colaterais (como duplicar uma cobrança).

    3. Para diminuir o tamanho da mensagem e economizar banda de rede.

    4. A idempotência não é necessária, pois o padrão é usar entrega "exactly-once".

  10. Ao escolher entre orquestração e coreografia para a comunicação entre microsserviços, qual é a principal característica da coreografia?

    1. Um serviço central (orquestrador) dita o fluxo de execução e as chamadas para os outros serviços.

    2. Os serviços reagem a eventos emitidos por outros serviços de forma autônoma e descentralizada, sem um controlador central.

    3. Todos os serviços se comunicam diretamente uns com os outros através de chamadas síncronas.

    4. A comunicação é feita através de um banco de dados compartilhado que centraliza o estado do fluxo.

4.2. Gabarito

  1. b

  2. b

  3. d

  4. c

  5. b

  6. c

  7. d

  8. c

  9. b

  10. b