JavaScript → TypeScript → Node.js → NestJS
Roadmap Backend Node.js
Este é o caminho que estou seguindo, de cima para baixo, em três fases e com projetos do segmento industrial. O projeto é o fio condutor: cada etapa ensina o que o próximo projeto pede, e só termina quando o critério de saída dela está cumprido, não quando os tópicos estão marcados. Clique em um tópico para ver o que estudar e na bolinha para marcá-lo como concluído; o progresso fica salvo só neste navegador.
Fase 1 · Reaprender a programar
Do zero ao P3. Nesta fase a IA não escreve código: desligue o autocomplete e use o chat só para explicar conceitos, nunca para resolver o exercício.
Fase 2 · Backend empregável
Do P4 ao P6, todos no ar, testados e com CI. A IA pode revisar o que você escreveu e explicar erros, mas não escreve o que você não saberia escrever sozinho. A partir do P5, escreva os requisitos antes de ler os da lista.
Marco
A partir daqui, comece a se candidatar a vagas júnior, sem parar de estudar
Fase 3 · Profundidade de pleno
Enquanto você se candidata. Do P7 ao P9, com IA aplicada, arquitetura e system design, até o projeto final do portfólio.
Agrupados por prioridade. Marque o que você já leu.
Pagos · prioridade alta
Entendendo Algoritmos
PagoNode.js Design Patterns
PagoDesigning Data-Intensive Applications
PagoUnderstanding Distributed Systems
PagoUse a Cabeça! Padrões de Projeto
PagoO Programador Pragmático
Pago
Pagos · prioridade média
Código Limpo
PagoRefatoração, 2ª ed.
PagoEffective TypeScript
PagoUnit Testing Principles, Practices, and Patterns
PagoSQL Antipatterns
PagoSystem Design Interview, vol. 1
PagoFundamentals of Software Architecture
PagoArquitetura Limpa
PagoLearning Domain-Driven Design
PagoRelease It!
PagoEnterprise Integration Patterns
PagoAI Engineering
Pago
Pagos · prioridade baixa (depois)
Redes de Computadores e a Internet
PagoA Philosophy of Software Design
PagoSystem Design Interview, vol. 2
PagoKafka: The Definitive Guide
PagoObservability Engineering
PagoBuilding Microservices
PagoAPI Design Patterns
PagoA Common-Sense Guide to Data Structures and Algorithms
PagoDatabase Internals
PagoSoftware Architecture: The Hard Parts
PagoWorking Effectively with Legacy Code
Pago
Gratuitos
Guia de HTTP da MDN
GratuitoPro Git
GratuitoJavaScript Eloquente
GratuitoYou Don't Know JS Yet
GratuitoOperating Systems: Three Easy Pieces
GratuitoTypeScript Handbook
GratuitoDocumentação do Node.js
GratuitoUse The Index, Luke
GratuitoDocumentação do PostgreSQL
GratuitoArtigo da Stripe sobre APIs idempotentes
GratuitoMQTT Essentials (HiveMQ)
GratuitoMongoDB University
GratuitoRedis University
GratuitoTutoriais do RabbitMQ
GratuitoOWASP Top 10 (geral, API e LLM)
GratuitoDocumentação do OpenTelemetry
GratuitoDocumentação do NestJS
GratuitoDocumentações da Anthropic e da OpenAI
GratuitoGuia de code review do Google
Gratuito
Todos do segmento industrial e encadeados: um alimenta o outro. Os projetos P7 e P8 usam IA, e o P9 junta os anteriores. A partir do P5, você escreve os requisitos antes de ler os da lista.
P1Calculadora de OEE (CLI)
Objetivo
Ler um CSV com os turnos de produção e calcular disponibilidade, performance, qualidade e OEE de cada máquina, direto no terminal.
Requisitos mínimos
- Ler um arquivo CSV passado como argumento, com colunas como máquina, turno, tempo planejado, tempo parado, ciclo ideal, peças produzidas e peças boas.
- Calcular disponibilidade, performance, qualidade e OEE (o produto dos três) para cada linha.
- Agrupar por máquina e mostrar uma tabela legível no terminal.
- Avisar com uma mensagem clara quando uma linha do CSV for inválida, sem encerrar o programa.
- Separar a leitura do arquivo dos cálculos, em funções pequenas e puras.
- Escrito sem IA, versionado com Git desde o primeiro commit e publicado no GitHub.
Desafios extras
- Filtrar por período ou por turno com argumentos de linha de comando.
- Gerar um ranking das máquinas do melhor para o pior OEE.
- Exportar o resultado em JSON ou CSV.
- Destacar as máquinas abaixo de um OEE mínimo configurável.
- Escrever testes para os cálculos, mesmo antes de aprender um framework de testes.
Etapas que pratica
P2Simulador de sensores
Objetivo
Gerar leituras de temperatura, vibração e RPM de várias máquinas, com falhas aleatórias, em TypeScript. Ele alimenta os projetos seguintes e também recebe a conversão do P1 para TypeScript.
Requisitos mínimos
- Simular ao menos 5 máquinas, cada uma com leituras de temperatura, vibração e RPM em intervalos regulares.
- Modelar máquinas e leituras com tipos e interfaces, em modo strict.
- Injetar falhas aleatórias (por exemplo, pico de temperatura ou vibração anormal) com uma probabilidade configurável.
- Rodar várias máquinas de forma concorrente, sem bloquear o programa.
- Converter o P1 (calculadora de OEE) para TypeScript.
Desafios extras
- Gerar leituras com ruído realista, em vez de valores totalmente aleatórios.
- Simular paradas e retomadas de produção, para alimentar o cálculo de OEE.
- Permitir configurar as máquinas por um arquivo, validado com Zod.
- Aceitar uma semente para reproduzir a mesma sequência de leituras.
Etapas que pratica
P3Coletor de telemetria em Node puro
Objetivo
Um servidor com o módulo http, sem framework, que recebe as leituras do P2 e grava em arquivo. Também processa arquivos grandes com Streams e dispara alertas com EventEmitter.
Requisitos mínimos
- Receber leituras por POST e gravá-las em arquivo, usando apenas o módulo http.
- Processar um arquivo grande de leituras com Streams, sem carregá-lo inteiro na memória.
- Emitir um evento de alerta com EventEmitter quando uma leitura passar de um limite.
- Reproduzir uma race condition em escritas concorrentes no arquivo e corrigi-la, explicando a causa.
- Configurar porta e caminho do arquivo por variáveis de ambiente.
- ESLint e Prettier configurados, commits no padrão Conventional Commits e README explicando como rodar e as decisões tomadas.
Desafios extras
- Usar worker threads para processar os arquivos grandes sem travar o servidor.
- Aplicar backpressure de forma explícita e medir o efeito.
- Rotacionar o arquivo de saída por tamanho ou por dia.
- Comparar o consumo de memória com e sem Streams.
- Fazer profiling do coletor sob carga e documentar o gargalo encontrado.
Etapas que pratica
P4API de ordens de produção e rastreabilidade de lotes
Objetivo
Uma API REST com PostgreSQL para gerenciar ordens de produção e rastrear lotes de matéria-prima. Ela deve responder: quais lotes de matéria-prima entraram neste produto?
Requisitos mínimos
- Modelar ordens de produção, produtos, lotes de matéria-prima e o vínculo entre eles no PostgreSQL, com migrations.
- Autenticação com papéis: o operador registra, o supervisor aprova e consulta tudo.
- Apontamento de produção idempotente com o header Idempotency-Key.
- Lock otimista, com coluna de versão, em ordens atualizadas ao mesmo tempo.
- Transações para que um apontamento e a baixa de material aconteçam juntos ou não aconteçam.
- Rota que responde quais lotes de matéria-prima entraram em um produto.
- Testes de integração com banco real e documentação Swagger.
- Revisado contra o OWASP API Security Top 10: consultas parametrizadas, senhas com argon2 ou bcrypt e nenhum segredo no código.
- PostgreSQL e API rodando com docker-compose, CI no GitHub Actions rodando lint e testes, e deploy com uma URL pública.
- Datas sempre gravadas em UTC e exibidas no fuso da fábrica.
- ESLint e Prettier configurados, commits no padrão Conventional Commits e README explicando como rodar e as decisões tomadas.
Desafios extras
- Rastreabilidade no sentido inverso: dado um lote de matéria-prima, em quais produtos ele foi usado.
- Paginação e filtros nas listagens.
- Rate limiting nas rotas de escrita.
- Testes de carga para comprovar que a idempotência funciona com requisições repetidas.
- Webhook que avisa um sistema externo quando uma ordem de produção é concluída.
Etapas que pratica
P5Monitoramento de máquinas em tempo real
Objetivo
Receber leituras do simulador por MQTT, passá-las por uma fila, gravá-las em um banco de séries temporais e mostrar o status das máquinas em um painel em tempo real.
Requisitos mínimos
Antes de ler os requisitos abaixo, escreva os seus a partir do objetivo. Depois compare: o que faltou na sua lista é o que você ainda não enxerga sozinho.
- O serviço de ingestão e o backend do painel são feitos em NestJS.
- O simulador (P2) publica as leituras por MQTT.
- A ingestão passa por uma fila (RabbitMQ ou Kafka).
- Os consumidores são idempotentes: processar a mesma leitura duas vezes não duplica o dado.
- Mensagens que falham repetidamente vão para uma dead letter queue.
- Os dados são gravados no TimescaleDB.
- Um painel mostra o status das máquinas atualizado por WebSocket.
- ESLint e Prettier configurados, commits no padrão Conventional Commits e README explicando como rodar e as decisões tomadas.
Desafios extras
- Alertas visuais quando uma máquina sai da faixa normal.
- Cálculo do OEE em tempo real por máquina.
- Agregações contínuas no TimescaleDB para gráficos históricos.
- Comparar RabbitMQ e Kafka no mesmo fluxo e anotar as diferenças.
Etapas que pratica
P6Controle de estoque de matéria-prima
Objetivo
Várias ordens de produção reservam o mesmo material ao mesmo tempo. Você reproduz a race condition, corrige de três formas e compara os resultados.
Requisitos mínimos
Antes de ler os requisitos abaixo, escreva os seus a partir do objetivo. Depois compare: o que faltou na sua lista é o que você ainda não enxerga sozinho.
- Feito em NestJS.
- Reservar matéria-prima para ordens de produção sem deixar o estoque negativo.
- Reproduzir a race condition com um teste de carga em k6 ou autocannon.
- Corrigir de três formas: lock pessimista, lock otimista e lock distribuído com Redis.
- Comparar as três em um relatório: corretude, vazão, latência e complexidade.
- Cache-aside com Redis nas consultas de saldo.
- Transactional Outbox para publicar o evento 'estoque baixo' sem perder nem duplicar.
- ESLint e Prettier configurados, commits no padrão Conventional Commits e README explicando como rodar e as decisões tomadas.
Desafios extras
- Usar fencing tokens no lock distribuído e mostrar o problema que eles resolvem.
- Simular falha do Redis no meio da operação e observar o comportamento.
- Proteger a chamada ao Redis com timeout, retry com backoff e circuit breaker.
- Reproduzir e tratar um cache stampede.
Etapas que pratica
P7Assistente de manutenção com RAGIA
Objetivo
Indexar manuais de máquinas e o histórico de ordens de manutenção com embeddings no pgvector. O técnico descreve o sintoma e recebe passos de verificação, citando o trecho do manual usado.
Requisitos mínimos
Antes de ler os requisitos abaixo, escreva os seus a partir do objetivo. Depois compare: o que faltou na sua lista é o que você ainda não enxerga sozinho.
- Dividir os manuais em trechos e gerar embeddings, guardando tudo no pgvector.
- Indexar também o histórico de ordens de manutenção.
- Receber um sintoma em texto (por exemplo, 'prensa 3 com vibração alta') e buscar os trechos mais relevantes.
- Gerar passos de verificação com um LLM, baseando-se apenas nos trechos recuperados.
- Citar o trecho do manual usado em cada resposta.
- Incluir uma avaliação da qualidade das respostas, com um conjunto de perguntas de teste.
- ESLint e Prettier configurados, commits no padrão Conventional Commits e README explicando como rodar e as decisões tomadas.
Desafios extras
- Responder 'não sei' quando nenhum trecho for relevante o bastante.
- Combinar busca vetorial e busca por palavra-chave.
- Comparar tamanhos de trecho e modelos de embedding usando a avaliação.
- Proteger contra prompt injection dentro dos documentos indexados.
Etapas que pratica
P8Classificação de paradas e relatório de turnoIA
Objetivo
Um LLM classifica o motivo da parada a partir do texto livre do operador e gera o relatório do turno, com OEE e as principais ocorrências.
Requisitos mínimos
Antes de ler os requisitos abaixo, escreva os seus a partir do objetivo. Depois compare: o que faltou na sua lista é o que você ainda não enxerga sozinho.
- Classificar o texto livre do operador em categorias de parada, com saída em JSON validada por Zod.
- Tratar saída inválida do modelo, com nova tentativa ou erro claro.
- Gerar um relatório do turno com OEE e as principais ocorrências.
- Usar tool calling para consultar dados reais da API, e não deixar o modelo inventar números.
- Rodar a geração do relatório em segundo plano, por uma fila.
- Relatório de turno respeitando o fuso horário e os horários de troca de turno da fábrica.
- ESLint e Prettier configurados, commits no padrão Conventional Commits e README explicando como rodar e as decisões tomadas.
Desafios extras
- Medir a precisão da classificação contra exemplos rotulados à mão.
- Registrar custo e latência de cada chamada.
- Enviar o relatório por e-mail ou mensagem ao fim do turno.
- Sugerir uma nova categoria quando o texto não se encaixar em nenhuma.
Etapas que pratica
P9Mini-MES em NestJS (portfólio final)
Objetivo
Juntar P4, P5, P6, P7 e P8 em um monólito modular com arquitetura hexagonal e DDD. É o projeto que mostra tudo que você aprendeu.
Requisitos mínimos
Antes de ler os requisitos abaixo, escreva os seus a partir do objetivo. Depois compare: o que faltou na sua lista é o que você ainda não enxerga sozinho.
- Monólito modular em NestJS, com módulos de produção, estoque, monitoramento, manutenção e relatórios.
- Arquitetura hexagonal e modelagem com DDD.
- Comunicação por eventos entre os módulos.
- Observabilidade com OpenTelemetry: logs, métricas e traces.
- Docker, CI no GitHub Actions e deploy funcionando.
- Documento de system design e ADRs registrando as decisões.
- README com as decisões, o diagrama da arquitetura e instruções para rodar.
- ESLint e Prettier configurados, commits no padrão Conventional Commits e README explicando como rodar e as decisões tomadas.
Desafios extras
- Painel no Grafana com as métricas de negócio e de infraestrutura.
- Teste de carga com um relatório de gargalos encontrados.
- Extrair um módulo para um serviço separado e documentar o que mudou.
- Gravar um vídeo curto (até 5 minutos) apresentando o projeto e as decisões de arquitetura, para usar em candidaturas.
Etapas que pratica