/projects/dietbox

Todos os projetos

Dietbox

Software de nutrição para profissionais e seus pacientes.

Engenheiro de Software Sênior, depois Head de Tecnologia · 2020–2024

.NETAzureAzure AD B2CPostgreSQLRedisSocket.IOAzure DevOps
WebsitePrivado
Captura de tela de Dietbox

Visão geral

Um SaaS brasileiro usado por nutricionistas para montar dietas e por seus pacientes para segui-las. Dois públicos com quase nada em comum dividem um produto, um sistema de identidade e uma plataforma — e essa plataforma vai de um monolito de dez anos a uma geração mais nova de serviços rodando ao lado dele.

O que eu fiz

Arquiteto principal por quatro anos — defini os padrões da plataforma e configurei o ambiente Azure, inclusive para serviços escritos por outras pessoas. Depois, toda a área de tecnologia passou a se reportar a mim.

  • A saída do .NET Framework no Windows para .NET 6 no Linux.
  • Identidade de ponta a ponta: as políticas customizadas de Azure AD B2C por trás dos dois públicos.
  • O serviço de portal e os blocos compartilhados dos quais os serviços mais novos partem.
  • O serviço de tempo real e o CI/CD no Azure DevOps.
  • Disponibilidade em produção e resposta a incidentes.

A maior base de código do produto foi trabalho de time — cerca de um sexto dos commits daquele repositório são meus.

O problema

A nutricionista vive na ferramenta o dia inteiro; o paciente abre para ler um plano alimentar. Mesmo produto, mesma base de identidade, expectativas opostas. E em 2020 um monolito .NET Framework carregava os dois no Windows App Service, com deploy uma vez por dia, de madrugada, porque era a única janela que parecia segura.

Em números

Os números de commit vêm dos repositórios. O resto é meu próprio registro do período.

13pessoas na áreaengenharia, QA, UX e suporte
~1,7 milcommits em seis serviçosmeus, de ~5,8 mil no total
1 mês → 1,5 semanaslead timedepois de Scrum e trunk-based development
−21%custo mensal de nuvemdepois de uma revisão de custos no Azure

Arquitetura

Duas gerações do mesmo produto, dividindo uma única base de identidade.

  1. Legacy platformO monolito .NET Framework em que o produto cresceu, e ainda sua maior base de código.
  2. IdentityAzure AD B2C com políticas customizadas, um conjunto por público, sobre um único diretório.
  3. Portal serviceA geração mais nova: um domínio em camadas sobre blocos compartilhados, com event sourcing onde as perguntas são históricas.
  4. RealtimeUm servidor de sockets dedicado, escalado horizontalmente atrás de um adaptador Redis.
  5. AzureO ambiente que configurei, com entrega via Azure DevOps.

O que faz

  • Montagem de plano alimentar para a profissional, e o mesmo plano no app do paciente.
  • Dois caminhos de cadastro sobre um único sistema de identidade — a profissional que assina e o paciente convidado por ela.
  • Atualizações em tempo real enviadas a clientes abertos, sem recarregar.
  • Assinaturas e cobrança recorrente.

Decisões de engenharia

  • Políticas de identidade customizadas em vez de um login pronto

    Dois públicos dividem um produto, mas não um caminho: a profissional que assina, o paciente convidado por ela. Políticas customizadas de B2C deram a cada um seu próprio fluxo de cadastro, login e senha, com marca própria, sobre uma única base de identidade em vez de duas bases de usuários para manter sincronizadas.

  • Blocos compartilhados antes de serviços compartilhados

    Os serviços mais novos partem de uma camada comum de domínio, infraestrutura e identidade em vez de cada um inventar a sua. É o que permitiu a um time pequeno adicionar um serviço sem que cada novo chegasse num estilo novo.

  • Event sourcing no portal, não em tudo

    As perguntas do portal são históricas — o que mudou, quando e por quem —, então seu estado é derivado de eventos. O resto da plataforma não é, porque o resto da plataforma não faz essa pergunta, e event sourcing tem um custo de manutenção em todo serviço que o adota.

  • Tempo real como serviço próprio

    Conexões de longa duração escalam num eixo diferente do tráfego de requisições, e atrás de um adaptador Redis qualquer instância consegue enviar a um cliente conectado em outra. Mantê-lo dentro do monolito teria amarrado os dois ao mesmo deploy — e o monolito subia uma vez por madrugada.

O que mudou sob minha direção

  • De um deploy noturno a vários por dia

    Trouxe Scrum e trunk-based development. Deploy em horário comercial deixou de ser evento.

  • Uma migração de pagamentos que ninguém notou

    Planejei e conduzi a migração de milhares de assinantes ativos de Iugu para Pagar.me. A receita não parou em momento nenhum — o tipo de mudança cuja medida de sucesso é não ter acontecido nada.

  • Custo de nuvem como problema de engenharia

    Fiz uma revisão de custos no ambiente Azure — sem congelar entregas para bancar a economia.

  • Reportar engenharia na língua da diretoria

    Passei a levar métricas DORA e um roadmap à diretoria, para que o investimento em tecnologia fosse defendido com evidências, não com convicção.