Q&A para Entrevistas
Frontend e Backend
Este é um questionário direto do Plano de Estudos voltado para engenheiros Full-Stack e Front-end, cobrindo React, Node.js, TypeScript e DevOps.
1. Padrões TypeScript
Os padrões em TypeScript combinam Design Patterns clássicos com recursos da própria linguagem:
- Padrões Clássicos (GoF): Factory, Singleton, Observer, Decorator (amplamente usado com classes em Angular/NestJS).
- Tipos Utilitários: O uso de
Partial<T>,Omit<T, K>,Pick<T, K>para manipular tipos dinamicamente sem repetição. - Tipos Genéricos (Generics): Componentes ou funções reutilizáveis (
function useFetch<T>(url: string)). - União Discriminada (Discriminated Unions): Usar uma propriedade literal comum (como
type: 'SUCCESS' | 'ERROR') para estreitar o tipo (type narrowing) de forma segura noswitch, comum em Redux e State Machines.
2. Code-Splitting em React SaaS
Para reduzir o bundle inicial e aumentar a performance:
- Por Rota: Uso de
React.lazy()eSuspense. O código da página de “Configurações” só é baixado se o usuário acessar essa rota. - Nível de Componente: Lazy loading de componentes pesados que não aparecem de imediato (ex: modais complexos, gráficos).
- Por Utilidade: Usar
import()dinâmico para carregar bibliotecas pesadas de cálculo ou exportação de PDF apenas quando a ação ocorre. - Vendor Chunking: Configurar Webpack/Vite para separar
node_modulesdo código da aplicação, melhorando o cache do navegador.
3. Versionando uma Biblioteca de Componentes
Para garantir adoção segura em micro-frontends:
- SemVer (Semantic Versioning): Respeitar estritamente (MAJOR.MINOR.PATCH).
- Peer Dependencies: React e ReactDOM devem ser
peerDependenciespara evitar múltiplas instâncias do React rodando em paralelo, o que quebra a aplicação. - Ferramentas: Lerna, Turborepo ou Bit para gerenciar versões e changelogs num monorepo.
- Formatos de Saída: Fazer build gerando formatos ESM e CJS, exportando as tipagens TypeScript (
.d.ts).
4. Pipeline CI/CD com Azure DevOps
Estrutura básica de um azure-pipelines.yml:
- Instalação:
npm cipara instalar dependências fielmente ao lockfile. - Qualidade: Scripts de linting (
npm run lint). - Testes: Executar testes (
npm test) configurados para gerar relatórios Cobertura/JaCoCo. - Gates (Relatórios): Tarefas
PublishTestResults@2ePublishCodeCoverageResults@1. Usar Branch Policies para barrar PRs com cobertura abaixo da meta. - Build e Artefatos:
npm run builde publicar usandoPublishBuildArtifacts@1. - Deploy: Pipelines de release com aprovações manuais antes de enviar para Produção.
5. Ordem de Middlewares no Express
A ordem de execução é sequencial e crítica:
- Globais/Segurança:
helmet(),cors(), e parsers do body (express.json()). - Rate Limiting: Barrar abusos ou ataques DDoS cedo.
- Autenticação: Extrair e validar o JWT (se falhar,
401 Unauthorized). - Validação (Zod/Joi): Validar
req.bodye parâmetros. Se falhar, retorna400 Bad Requestantes de bater no banco. - Controlador: Lógica de negócio e acesso a dados.
- Handler Global de Erros: O middleware
(err, req, res, next)obrigatoriamente no final para capturar crashes e retornar erro500formatado.
6. Testando Data Fetching no React no Mount
Uso do React Testing Library (RTL) e Mock Service Worker (MSW).
- Mocking com MSW: Em vez de mockar o Axios ou Fetch, intercepta-se a rede diretamente (ex: retornando status 200 com mock data).
- Loading State: Usa-se
expect(screen.getByTestId('spinner')).toBeInTheDocument()na primeira renderização. - Success State: Usa-se query assíncrona (
await screen.findByText('Dado Mockado')) para aguardar a resolução e verificar a UI. - Error State: Força-se o MSW a retornar um erro 500 no escopo do teste, garantindo que a mensagem de erro (ex:
await screen.findByText('Falha ao carregar')) aparece na tela.
7. Alta Concorrência no Node.js (Sem Bloquear o Event Loop)
- I/O Assíncrono: Nunca usar métodos como
fs.readFileSyncem rotas (bloqueiam toda a thread principal). - Tarefas de CPU Intensivas: Mover cálculos pesados (criptografia, exportação de CSV/PDF) para Worker Threads ou enviar para Message Queues (ex: Redis + BullMQ) sendo processado por um microsserviço à parte.
- Connection Pooling: Otimizar as conexões de banco de dados.
- Caching: Usar Redis para servir dados quase-estáticos, poupando CPU e chamadas ao banco.
Relacionadas: Plano de Estudos · react-code-splitting · express-middleware-chain