---
title: Mauricio Zaffari — Lead / Staff Software Engineer | Rails & AI Systems
description: Dezoito anos construindo sistemas em Ruby on Rails, e ainda escolho Rails de propósito.
canonical: https://mauricio.zaffari.casa/pt-BR
last-updated: 2026-10-07
locale: pt-BR
---

# Mauricio Zaffari — Lead / Staff Software Engineer | Rails & AI Systems

Dezoito anos construindo sistemas em Ruby on Rails, e ainda escolho Rails de
propósito. Até setembro de 2026 liderei a engenharia de uma plataforma SaaS de
analytics usada por Disney, Warner Bros, Sony e NBCUniversal, onde terminei
como o maior contribuidor de todos os tempos do código principal. Estou
aberto a posições de lead e staff de engenharia.

A maior parte do meu trabalho se parece com uma de três coisas: deixar um
sistema lento rápido o bastante para as pessoas pararem de contorná-lo, quebrar
um monolito em partes sem parar o negócio, ou ser a pessoa que decide qual vai
ser a arquitetura e depois convive com essa decisão. Levei aplicações Rails da
versão 2 até a versão 8, o que significa que migrei a maior parte dos erros que
o framework desde então corrigiu.

Também construo e opero meu próprio produto, sozinho. O Inscripto é uma
plataforma multi-tenant de eventos esportivos que lida com inscrições reais e pagamentos
reais para ligas de kart e de tênis, o que me mantém honesto sobre a diferença
entre um sistema que vai bem em uma demonstração e um sistema que sobrevive a
uma manhã de sábado.

## Resultados

- **31%** — Maior contribuidor de todos os tempos. de todos os commits do código principal de analytics da Looper Insights em toda a história da empresa, e 81,7% dos commits de 2025

- **720.000+** — Downloads da gem. de mongoid_search, a gem de busca full-text que criei e mantive

- **R$ 482.800+** — Pagamentos processados. em 109 eventos esportivos e 3.603 cobranças no Inscripto, a plataforma que construí e ainda opero

- **18** — Anos entregando Rails. em produção, passando por todas as versões maiores, de Rails 2 a Rails 8

- **99,1%** — Cobertura de testes. cobertura final do código principal de analytics da Looper Insights quando eu saí em setembro de 2026, aproximadamente 244.000 linhas de Ruby

## Experiência

### Lead Software Engineer, Looper Insights (2018-07 – 2026-09)

A Looper Insights é uma plataforma global SaaS de analytics para estúdios e
serviços de streaming. Estive lá em três passagens: desenvolvedor full-stack em
2018, desenvolvedor sênior a partir de 2020 e tech lead de março de 2022 até
setembro de 2026. Terminei como o maior contribuidor de todos os tempos do
código principal, que atende Disney, Warner Bros, Sony e NBCUniversal e
responde por 55% da receita da empresa. Liderei a troca de plataforma do
Webstores 2.0 e a migração de autenticação de toda a empresa para o AWS
Cognito.

### Solo Founder, Arquiteto de Produto e Lead Engineer, Inscripto (2018 – atual)

O Inscripto é uma plataforma multi-tenant de gestão e inscrição em eventos
esportivos que construí e ainda opero como sua única pessoa — produto,
arquitetura, engenharia e operações de ponta a ponta —, substituindo fichas de
papel e pagamentos manuais em ligas de kart e de tênis. Já processou 109
eventos, 3.603 cobranças e mais de R$ 482.800 em pagamentos online. A stack é
Rails 8, PostgreSQL, Hotwire, Tailwind e um frontend PWA, com Stripe,
MercadoPago e PIX para pagamentos, e usa a API do Gemini para transformar
resultados de partidas enviados soltos pelo WhatsApp em classificações
atualizadas.

### Fundador e Engenheiro Principal, Develoz (2013-10 – atual)

Fundei a Develoz em 2013. Há treze anos ela desenvolve software, integra sistemas
e automatiza processos para operações no Brasil e no exterior. Hoje trabalha com IA aplicada — identificar onde a IA vale
a pena em um processo, construir o piloto de integração e definir a governança e
a revisão humana em volta dele. Entre os clientes anteriores estão ArtistSignal,
NY Water Taxi e Explica Fácil.

### Tech Lead de Desenvolvimento, Kinscape (2018-06 – 2020-03)

Liderei a modernização técnica de uma rede social privada para famílias,
desacoplando um monolito legado em Rails e AngularJS em um frontend Vue.js que
consome uma API JSON em Rails.

### Tech Lead Full-Stack, StudioBridge (2018-01 – 2018-03)

Migrei o motor de cobrança de assinaturas do produto de Stripe para CardConnect
ao longo de mais de 100 commits, sem downtime para os estúdios de dança e de
música em atividade.

### Consultor Sênior de Software, Atlantic Coast Conference (2017-09 – 2018-01)

Construí um motor dinâmico de modelos de avaliação multiesportiva em Node.js,
AngularJS e PostgreSQL, usado nas avaliações de árbitros e de instalações da
conferência da NCAA.

### Engenheiro Full-Stack Sênior, Habit (2016-11 – 2017-09)

Construí software de operação de cozinha e de logística em Rails, React e
PostgreSQL para uma startup de nutrição personalizada, transformando resultados
de exames de DNA e de sangue em fluxos diários de preparo e entrega de
refeições. A empresa foi depois adquirida pela Viome.

### Engenheiro de Software Sênior, Decisiv (2016 – 2016)

Construí um motor de recomendação de manutenção em Rails e MySQL para uma
plataforma de gestão do relacionamento de serviços de frotas comerciais que
processava mais de 4 milhões de eventos por ano em 74.000 frotas.

### Engenheiro Full-Stack Sênior, Alldayeveryday (2015 – 2016)

Reduzi o tempo de carregamento das páginas de uma revista digital de 5-10
segundos para menos de um segundo, com ajuste de consultas e cache. Também
integrei a cobrança via Chargebee e introduzi a primeira suíte de testes em
RSpec.

### Engenheiro Full-Stack Sênior, Everwise (2013-01 – 2016-11)

Em duas passagens, ajudei a construir a terceira geração do motor de pareamento
entre mentores e mentorados em Rails e PostgreSQL, atendendo mais de 60.000
relacionamentos, e desenvolvi uma biblioteca reutilizável de componentes de
interface em React. A empresa depois se fundiu com a Torch.

### Engenheiro de Software Sênior, Toptal (2012 – 2013)

Passei pelo processo seletivo de cinco etapas e depois ajudei a construir a
própria plataforma de pareamento e de gestão de projetos da Toptal.

### Desenvolvedor Ruby on Rails, Stack Builders, Bit Zesty e BlockShopper (2008 – 2012)

Onde minha carreira profissional com Rails começou, em 2008. Liderei o MiMo,
uma aplicação de pagamentos no estilo PayPal para a Nigéria; construí o
Feesability, um produto de controle de horas em Rails 3, Mongoid e Resque; e
construí um CMS de notícias do mercado imobiliário que cobria mais de 32 sites.

## Trabalhos selecionados

### Colocando os primeiros recursos de IA em uma plataforma de clientes — Looper Insights (2026)

## Problema

A empresa queria recursos de IA no produto voltado aos clientes, e tinha seis
engenheiros em quem confiava para descobrir onde a IA realmente se paga. Dentro
da engenharia, assistentes de código com IA já estavam mudando a forma de
trabalhar, sem padrões compartilhados: cada engenheiro inventava seu próprio
workflow.

## Abordagem

Eu era um dos seis no piloto de IA da empresa, e assumi as duas metades do
problema — como construímos com IA, e o que entregamos com IA.

Para a primeira metade, escrevi o padrão de workflow AGENTS.md do time e o
compartilhei com toda a organização, de modo que o desenvolvimento guiado
por assistentes saiu de hábito pessoal para uma forma de trabalho
documentada e revisável. Publiquei avaliações de modelos que informaram a
escolha de ferramentas da organização.

Para a segunda metade, fui delivery lead da iniciativa de IA no produto
principal: páginas de IA voltadas aos clientes, incluindo uma autenticada
pelo single sign-on de um estúdio, e a arquitetura de segurança de dados
multi-tenant que permite um recurso de chat com LLM responder a partir dos
dados de um cliente sem que os dados de outro cliente estejam ao alcance. O
isolamento foi projetado antes do recurso ser aprovado, não retroajustado
depois.

## Resultado

Padrões adotados por toda a organização; páginas de IA no ar na frente de
clientes cujos nomes todos reconhecem; uma arquitetura de chat cujo modelo
de segurança foi revisado antes de entrar em produção.

_Tecnologias: Ruby on Rails, Integrações de LLM, ClickHouse_

### Reduzindo uma importação de 46 minutos para 16 minutos — Looper Insights (2026)

## Problema

As importações de merchandising da Amazon US levavam cerca de 46 minutos. As
entregas para clientes ficavam na fila atrás delas, então uma única importação
lenta atrasava os relatórios que as pessoas realmente estavam esperando. O
volume era a parte difícil: aproximadamente 273.000 posições de título por
scan, contra 12,5 a 13 milhões de títulos processados por semana.

## Abordagem

O gargalo não era a busca dos dados, era o caminho de escrita — cada linha
pagava por durabilidade e manutenção de índice de que não precisava enquanto
ainda estava em trânsito. Movi a ingestão para tabelas de staging UNLOGGED no
PostgreSQL, de modo que as linhas em andamento não passam pelo write-ahead log,
e depois promovi essas linhas para as tabelas reais quando a importação
terminava. Junto com isso, paralelizei a etapa de busca e passei a transmitir
os resultados por Redis em vez de acumulá-los na memória do processo.

As tabelas de staging são seguras aqui justamente porque o dado é
reconstruível: uma tabela UNLOGGED não sobrevive a uma queda do banco, e essa é
uma troca aceitável quando a ação de recuperação é rodar a importação de novo.

## Resultado

De 46 minutos para cerca de 16 — uma redução de 65%, confirmada de forma
independente por um colega que mediu o mesmo pipeline. As entregas para
clientes deixaram de ficar na fila atrás da janela de importação.

_Tecnologias: Ruby on Rails, PostgreSQL, Redis_

### Uma página que levava quatro minutos, e os cinco motivos — Looper Insights (2026)

## Problema

A principal página de scan levava mais de quatro minutos para carregar. Para um
cliente era pior: de dez a quinze minutos, tempo suficiente para as pessoas
deixarem de usar o recurso e pedirem a outra pessoa que mande uma planilha no
lugar.

## Abordagem

Não havia uma causa única, e essa é a parte interessante. Cinco coisas
distintas se acumulavam: um `COUNT DISTINCT` se espalhando sobre um join, um
scope que varria a tabela inteira em vez da fatia daquela requisição, um
sequential scan sobre 16,7 milhões de linhas, um join contra uma tabela de
aproximadamente 1,5 bilhão de linhas e a falta de cache em um agregado agrupado
caro.

Corrigi uma por vez e medi depois de cada correção, porque causas que se
acumulam mascaram umas às outras — corrija a segunda pior primeiro e a melhora
parece desprezível, o que tenta você a concluir que ali não estava o problema.
Duas das cinco pediam desnormalização em vez de ajuste de consulta: um booleano
levado para a linha que precisava dele, o que fez o join de um bilhão de linhas
desaparecer, e um agregado JSONB em cache, atualizado por um worker dedicado em
vez de calculado a cada requisição.

Para o cliente mais afetado, a correção foi mais estreita e saiu no mesmo dia:
uma verificação de existência que fazia trabalho linear passou a ser uma busca
O(1).

## Resultado

De quatro minutos para menos de um segundo. O caminho específico daquele
cliente saiu de dez a quinze minutos para praticamente instantâneo, entregue
como hotfix no mesmo dia. Um filtro relacionado na mesma página saiu de 322
segundos a frio para 25,5 segundos, ancorando uma subconsulta sem escopo para
que ela pudesse usar um índice que já existia.

Depois fiz essa classe inteira de regressão falhar de forma ruidosa,
habilitando `strict_loading` em toda a suíte de testes, para que um N+1
acidental quebre o CI em vez de chegar silenciosamente à produção.

_Tecnologias: Ruby on Rails, PostgreSQL, ActiveRecord_

### Trocando a plataforma do produto principal sem pará-lo — Looper Insights (2024 - 2025)

## Problema

O produto principal tinha acumulado a década habitual de decisões: um frontend
React embutido dentro do monolito Rails, de modo que os dois não podiam ser
implantados nem testados de forma independente, e uma parcela grande do código
anterior aos padrões que o time depois adotou. Reescrever tudo de uma vez não
era opção — ele atende Disney, Warner Bros, Sony e NBCUniversal e responde por
55% da receita da empresa.

## Abordagem

Conduzi a troca de plataforma como uma sequência de passos entregáveis, e não
como um branch que vivesse por seis meses. Em 261 commits sobre 844 arquivos,
reescrevi mais de 20% de uma base de código de aproximadamente 244.000 linhas,
elevando a cobertura de testes conforme avançava, porque eram os testes que
tornavam o passo seguinte seguro.

Em paralelo, extraí o frontend — cerca de 138.759 linhas de React — do monolito
para um repositório próprio, o que permitiu que frontend e backend passassem a
ser construídos, testados e implantados em cadências próprias.

## Resultado

Entregue de forma incremental, com a cobertura de testes saindo de 72% para 80%
ao longo do trabalho e continuando a subir depois. O product manager descreveu
o resultado como um release transformador. A extração do frontend é o que
tornou o trabalho de frontend seguinte independente dos ciclos de release do
backend.

_Tecnologias: Ruby on Rails, React, PostgreSQL, RSpec_

### Sessenta releases e um botão de release — Looper Insights (2022 - 2026)

## Problema

Os releases eram manuais e tribais: quem conhecia os passos os executava, e
os passos viviam na cabeça de alguém. O produto atende Disney, Warner Bros,
Sony e NBCUniversal, então um release ruim não é um inconveniente interno —
é um incidente visível para o cliente. Dois repositórios viraram três quando
o frontend foi extraído, o que triplicou a cerimônia.

## Abordagem

Eu conduzia o trem de releases de ponta a ponta nos três repositórios: um
code freeze quinzenal que eu instituí, gating de QA, deploys em produção,
hotfixes e um plano de rollback para cada release. Depois transformei as
partes que uma máquina consegue fazer em uma máquina fazendo: um workflow
automatizado de release que builda, roda os gates de qualidade, faz deploy e
verifica a saúde. O gate são nove linters mais a suíte end-to-end de Cypress
ligada aos deploys e aos merges de pull requests, então as verificações que
dependiam de alguém lembrar agora são o pipeline se recusando a continuar.
Os templates de plano de teste e checklist de rollback que escrevi se
tornaram os que PM e QA reproduziram para cada release seguinte.

Por um período também fui release manager de um código frontend que eu não
desenvolvia, porque conduzir o trem é uma habilidade separada de escrever o
código que ele entrega.

## Resultado

Mais de sessenta releases e hotfixes entregues ao longo de quatro eras de
nomenclatura do produto, sem o processo de release ser o gargalo. Os releases
pausavam quando eu estava de férias — a evidência mais forte que posso dar de
que o processo funcionava e de que eu ainda não tinha terminado de torná-lo
independente de mim.

_Tecnologias: Ruby on Rails, RSpec, Cypress, GitHub Actions_

### Levando todos os usuários para uma autenticação gerenciada — Looper Insights (2021 - 2022)

## Problema

A autenticação era feita em casa, e os clientes corporativos começavam a pedir
coisas em que autenticação feita em casa é ruim: identidade federada, o single
sign-on deles e um tratamento de tokens que pudéssemos mostrar durante uma
revisão de segurança.

## Abordagem

Liderei a migração de toda a empresa para o AWS Cognito ao longo de cerca de
dois meses: integração OIDC, verificação de tokens bearer, tratamento de
refresh e sessões guardadas em Redis com persistência em banco, para que um
restart não desconectasse todo mundo.

A parte que exige cuidado não é o sistema novo, é a transição. Todo usuário
existente tinha de continuar funcionando o tempo todo, o que significou rodar
os dois caminhos contra tráfego real antes de o código legado poder ser
removido — e então removê-lo de verdade, em vez de deixar um ramo morto para
confundir quem fosse ler depois.

## Resultado

Um único provedor de identidade gerenciado para toda a plataforma, com o SSO de
cliente passando a ser um exercício de configuração e não um projeto de
engenharia. Depois construí sobre essa base as páginas voltadas ao cliente,
autenticadas pelo próprio single sign-on de um estúdio.

_Tecnologias: Ruby on Rails, AWS Cognito, OIDC, Redis_

## Como eu trabalho

Liderei um time pequeno de engenharia e nunca parei de escrever código.
Permaneci o maior contribuidor da base de código que liderei, e essa combinação
foi deliberada, não uma falha em delegar: revisava código que eu mesmo poderia
ter escrito, e não impunha uma arquitetura que eu não estivesse disposto a
construir. A alavancagem funcionou nas duas direções — pelas decisões que as
outras pessoas herdam e pelo trabalho que eu entrego.

**Encontro a causa antes de escrever a correção.** Uma página lenta normalmente
tem mais de um motivo para ser lenta, e o primeiro que você encontra raramente
é o mais caro. Eu faço profiling, leio o plano de execução da consulta e
corrijo a coisa de verdade. Uma página que herdei levava mais de quatro minutos
para carregar por cinco motivos que se acumulavam; corrigindo um por vez, com
uma medição depois de cada um, ela ficou abaixo de um segundo. Adivinhar teria
corrigido um dos cinco.

**Um teste de regressão que passa antes da correção não vale nada.** Já
rejeitei testes meus por isso. Um deles inseria um valor em branco por um
caminho de escrita do ActiveRecord que silenciosamente o convertia em `nil`,
então o teste nunca exercitava o bug que dizia cobrir. Isso é falsa confiança,
e é pior do que não ter teste, porque impede que alguém volte a olhar.

**A integridade fica no banco de dados quando pode ficar.** Verificações de
unicidade na aplicação perdem corridas. Se uma duplicata nunca pode existir,
prefiro deduplicar uma vez, criar o índice único e deixar o sistema falhar de
forma fechada a partir dali.

**Code review é onde os padrões de fato se propagam.** Comento sobre rigor de
teste e formato da arquitetura, não sobre formatação — formatação é trabalho do
linter. Um princípio ao qual sempre volto: um controller sem um model
correspondente é um mau sinal, porque uma mudança de estado em um registro é
quase sempre o `update` daquele registro, e não um controller novo.

**Releases precisam de um plano de rollback que alguém realmente pensou.** Eu
cuidava dos checklists de release: reversibilidade das migrações, drenagem das
filas, uma referência registrada do último estado bom conhecido. Quando nossa
ferramenta de release encontrou um padrão de merge que tornava o rebase
inseguro, corrigi a ferramenta e escrevi o motivo, para que a próxima pessoa
encontre um modo de falha documentado em vez de um mistério.

**Eu registro as coisas por escrito.** Decisões de arquitetura, notas de
domínio sobre os subsistemas que surpreendem as pessoas e os padrões de agentes
de IA que as organizações que liderei seguem. Uma decisão que vive apenas em uma
thread do Slack precisa ser rediscutida cada vez que alguém novo pergunta.

**Eu ensino o sistema que lidero.** Construí um currículo interno de
treinamento e conduzi as sessões "Webstores Unlocked" que percorrem com o time
como cada parte da plataforma funciona. Essas sessões gravadas se tornaram o
material de onboarding para os novos engenheiros — os que eu contratei,
integrei e avaliei.

## Código aberto

### [mongoid_search](https://github.com/mongoid/mongoid_search) — Criador e mantenedor
720962 downloads

Busca full-text para Mongoid, e a gem que a maioria das aplicações Rails sobre
MongoDB usava antes de o Atlas Search existir. Já passou de 720.000 downloads.

Acabei transferindo a gem para a organização oficial do Mongoid, que é o
desfecho que eu queria: ela sobreviveu à minha própria necessidade e agora está
onde quem procura por ela realmente vai encontrar.

### [mongoid_activity](https://github.com/mauriciozaffari/mongoid_activity) — Criador
5216 downloads

Registro de atividade para documentos do Mongoid, extraído de uma aplicação que
precisava de uma trilha de auditoria e de um feed de mudanças sem um segundo
datastore.

### [Ecossistema Ruby e Rails](https://github.com/mauriciozaffari) — Contribuidor

Correções e manutenção em gems das quais eu dependia em produção, incluindo o
próprio Rails, `active_admin`, `active_model_serializers`, `cancan`,
`carrierwave`, `administrate`, `blueprinter`, `cardconnect` e
`cognito_token_verifier`.

Quase nada disso foi contribuição planejada. É o que acontece quando você
encontra um bug no trabalho, descobre que a causa está em uma dependência e
decide corrigir upstream em vez de contornar com um monkey patch.

## Competências

- **Sistemas de IA e LLM**: Integrações de LLM em produção, OpenAI, Anthropic Claude, Google Gemini, Pipelines assíncronos de LLM, Padrões de fluxo de trabalho para agentes, Isolamento de dados multi-tenant em recursos de LLM
- **Backend e arquitetura**: Ruby on Rails (v2 a v8), Ruby, APIs REST, GraphQL, Microsserviços, Sidekiq, ActiveJob, Máquinas de estado, Modelagem de domínio
- **Bancos de dados e performance**: Ajuste de consultas no PostgreSQL, Tabelas de staging UNLOGGED, Migrações de dados sem downtime, MySQL, Redis, OpenSearch, Elasticsearch
- **Entrega e testes**: Docker, AWS (Cognito, ECS, S3), GitHub Actions, RSpec, Capybara, Cypress, Quality gates com múltiplos linters, Administração de Linux
- **Liderança de engenharia**: Liderança de times técnicos, Governança de arquitetura, Code review, Contratação e entrevistas, Gestão de releases, Mentoria, Agile e Shape Up
- **Engenharia de frontend**: Hotwire (Turbo e Stimulus), React, Vue.js, TypeScript, JavaScript, Tailwind CSS, Propshaft, esbuild, Progressive web apps

### Formação

- **Tecnólogo em Sistemas para Internet**, Faculdade Dom Bosco (2011)
- **Técnico em Eletrônica**, Instituto Anglicano Barão do Rio Branco (2005)

## Contato

- [LinkedIn](https://www.linkedin.com/in/mauriciozaffari)
- [GitHub](https://github.com/mauriciozaffari)
- [RubyGems](https://rubygems.org/profiles/mauriciozaffari)
- [Email](mailto:mauriciozaffari@gmail.com)
- Baixar o currículo em inglês (PDF, 2 páginas): https://mauricio.zaffari.casa/resume-short.pdf
- Baixar o perfil completo (PDF): https://mauricio.zaffari.casa/pt-BR/resume.pdf
