
Olá, eu sou
Samuel Mattos
Feed RSSSenior Full Stack Developer e Tech Lead
Desenvolvo software para a web desde 2010 e hoje lidero um time de quatro desenvolvedores. Cuido da arquitetura e da operação de plataformas de atendimento presentes em mais de 300 unidades, no Brasil, na África e no Canadá.
Trabalho de ponta a ponta: modelagem de domínio e de banco, APIs em Laravel, interfaces em Vue.js e TypeScript, e a infraestrutura em Kubernetes na Azure que segura 30 milhões de requisições por mês com 220 ms de resposta média.
Stack
- Backend
- Laravel · PHP · Livewire · APIs REST · Filas e jobs
- Frontend
- Vue.js 3 · TypeScript · Astro · HTML e CSS acessível
- Dados
- MySQL · PostgreSQL · Redis · Modelagem e tuning de queries
- Cloud e containers
- Docker · Kubernetes · KEDA · Microsoft Azure · AWS (ECS, RDS e Lambda) · Cloudflare
- Entrega e operação
- CI/CD · Azure Pipelines · GitHub Actions · Observabilidade · Resposta a incidentes
- IA aplicada
- Extração estruturada com LLMs · Entrada por texto e áudio · Design de prompts · Validação de saída estruturada
Em destaque
Engenharia de contexto: transformando incidentes de produção em regras para agentes de IA
Atualizado em:Um agente de IA com acesso ao código ainda erra, porque a parte cara do conhecimento de um sistema legado não está no código. Como transformei anos de incidentes em um arquivo de contexto que o agente lê antes de tocar em qualquer coisa.
Artigos recentes
Testes lentos no WSL2: a suíte Laravel que o fsync travava
A suíte Pest levava 35 minutos aqui e 8 na máquina de um colega, com o mesmo docker-compose. Paralelizar rendeu 1,5x em vez de 8x, e a CPU ficava ociosa nos dois lados. O tempo não era do banco nem do código: era o fsync do filesystem virtual, cobrado a cada tabela truncada, em cada teste. Com o datadir em tmpfs, 11 minutos.
O join que o MySQL reescreveu sem me avisar
Atualizado em:Um endpoint de relatório começou a dar 502 no mesmo dia em que subiu um join novo. O join novo era inocente: o problema estava numa comparação entre uma coluna varchar e uma bigint, que faz o MySQL converter os dois lados para ponto flutuante e jogar fora os índices.
Os 900 ms que sumiam antes da primeira query
Requisições passavam de cinco segundos, o APM acusava, e o slow query log do MySQL estava limpo. As duas métricas estavam certas: o tempo era gasto antes da primeira query, abrindo conexão. PHP-FPM não tem pool, e cada request pagava o handshake inteiro de novo.
Bem-vindo ao meu blog
O que você vai encontrar por aqui: Laravel, arquitetura de software, performance, cloud, bancos de dados, IA aplicada a código legado e lições de liderança técnica.