Construí uma Plataforma de $2M com Um Arquiteto e IA — Veja Como
No ano passado, entregamos uma plataforma avaliada em $2 milhões. O time de engenharia inteiro? Um arquiteto sênior e Claude Code. Sem time offshore. Sem exército de contratados. Apenas uma pessoa que sabia o que estava construindo, emparelhada com uma IA que podia realmente escrever código de produção.
Não estou escrevendo isso para fazer hype em IA. Fui queimado pelo ciclo de hype muitas vezes. Estou escrevendo isso porque o que aconteceu neste projeto mudou fundamentalmente como penso sobre composição de times, estimativa de projetos e o que é realmente possível quando você emparelha conhecimento arquitetural profundo com desenvolvimento assistido por IA. Os números não mentem — atingimos marcos que teriam levado um time tradicional de 6-8 engenheiros aproximadamente 18 meses, e fizemos em menos de 5 meses.
Deixa eu te guiar através exatamente de como.
Índice
- O Projeto: O Que Estávamos Realmente Construindo
- Por Que Um Arquiteto Em Vez de Um Time Completo
- Como Claude Code Realmente Se Encaixa Em Um Fluxo Real
- A Stack de Tecnologia e Decisões Arquitetônicas
- O Que Claude Code Fez Bem
- Onde Claude Code Falhou e O Que Fizemos Sobre Isso
- A Economia: Breakdown de Custos e ROI
- Lições para Times Considerando Desenvolvimento Acelerado por IA
- FAQ
O Projeto: O Que Estávamos Realmente Construindo
Não posso nomear o cliente — questão de NDA — mas posso descrever a plataforma. É um produto B2B SaaS no espaço de logística. Arquitetura multi-tenant. Dashboards de rastreamento em tempo real. Controle de acesso complexo baseado em papéis abrangendo organizações, times e usuários individuais. Integração com 14 APIs de terceiros diferentes (transportadoras, processadores de pagamento, bases de dados de alfândega). Um portal voltado para o cliente e um sistema administrativo interno.
O tipo de projeto que, em um cenário típico de agência, você escalaria com um tech lead, 2-3 desenvolvedores sênior, alguns níveis médios, uma pessoa dedicada a DevOps e talvez um engenheiro de QA. A estimativa original do cliente de outra agência era $3.2M ao longo de 20 meses com um time de 9.
Propomos $2M, 5 meses, um arquiteto. Eles acharam que estávamos loucos. Honestamente? Eu também, um pouco.
Por Que Um Arquiteto Em Vez de Um Time Completo
Aqui está a coisa contraintuitiva sobre times pequenos: a sobrecarga de comunicação em um projeto de 9 pessoas é enorme. Fred Brooks escreveu sobre isso em 1975 e ainda é verdade. Com 9 engenheiros, você tem 36 canais potenciais de comunicação. Reuniões se multiplicam. Conflitos de merge se tornam um ritual diário. Alguém sempre está bloqueado esperando pela revisão de PR de alguém.
Com um arquiteto, todo o estado do sistema vive na cabeça de uma pessoa. Não há custo de troca de contexto explicando sua abordagem em um pull request. Sem design por comitê. Sem reuniões de planejamento de sprint de duas horas.
Mas uma pessoa só consegue digitar tão rápido. Uma pessoa só consegue manter tantos arquivos na memória de trabalho. Uma pessoa fica cansada às 6pm e comete erros às 8pm.
É aí que Claude Code entra. Não como um substituto para o arquiteto, mas como um multiplicador de força. O arquiteto toma todas as decisões. Claude Code executa em uma velocidade que exigiria 4-5 desenvolvedores de outra forma.
O Papel do Arquiteto
Nosso arquiteto — vamos chamá-lo de Marcus — tem 15 anos de experiência. Ele já construiu sistemas nesta escala. Seu trabalho neste projeto era:
- Decisões de design de sistema e arquitetura
- Definindo limites de módulo e contratos de dados
- Escrevendo o código do caminho crítico (auth, processamento de pagamento, orquestração de pipeline de dados)
- Revisando e refinando tudo que Claude Code produzia
- Arquitetura de infraestrutura e deployment
- Auditorias de segurança
O que ele não fez: escrever endpoints CRUD boilerplate, construir componentes UI a partir de designs, escrever testes unitários para lógica direta, criar migrations de banco de dados ou scaffoldar novos serviços. Claude Code cuidou de tudo isso.
Como Claude Code Realmente Se Encaixa Em Um Fluxo Real
Deixa eu ser específico sobre o que "usar Claude Code" realmente parecia dia-a-dia, porque os materiais de marketing não capturam a realidade.
Marcus começava cada manhã definindo o trabalho do dia de forma estruturada. Não prompts vagos como "constrói pra mim um sistema de gerenciamento de usuários". Em vez disso, ele criava o que começamos a chamar de "architecture briefs" — documentos detalhados que especificavam:
- A responsabilidade do módulo e limites
- Modelos de dados com tipos de campo exatos e relacionamentos
- Contrato de API (endpoints, formatos de request/response)
- Regras de negócio e casos extremos
- Expectativas de manipulação de erros
- Quais módulos existentes precisava integrar
Depois ele alimentava estes para Claude Code em pedaços. Uma sessão típica parecia assim:
# Marcus trabalharia no diretório do projeto com Claude Code CLI
# Primeiro, estabelecendo contexto
claude "Read through /src/modules/shipment/ and /src/lib/database/schema.ts.
I need you to understand the existing patterns before we build the
invoicing module."
# Depois, a instrução de construção real com o architecture brief
claude "Build the invoicing module following the architecture brief in
/docs/briefs/invoicing.md. Follow the exact same patterns as the
shipment module for service layer, repository layer, and route handlers.
Use the existing error handling middleware. Write tests for all
business logic in the service layer."
Claude Code geraria então o módulo — tipicamente 15-30 arquivos incluindo tipos, schemas, serviços, repositórios, route handlers, middleware e testes. Marcus revisaria a saída, faria correções e iteraria. Todo o ciclo para um módulo de complexidade média levava cerca de 2-3 horas em vez de 2-3 dias que levaria um desenvolvedor sênior.
O Loop de Iteração
Aqui está o que ninguém te diz sobre desenvolvimento assistido por IA: a primeira saída raramente é pronta para produção. Está talvez 70-80% lá. Mas aqueles 20-30% restantes são onde a experiência do arquiteto mais importa.
Marcus desenvolveu um ritmo:
- Gerar — Claude Code produz a implementação inicial
- Revisar — Marcus lê através de cada arquivo, sinalizando problemas
- Refinar — Correções específicas alimentadas de volta para Claude Code
- Enrijecer — Marcus manualmente cuida de seções críticas de segurança
- Testar — Rodar os testes gerados, adicionar casos extremos que Claude perdeu
Este loop tipicamente passava por 2-3 ciclos por módulo. Pelo terceiro mês do projeto, Claude Code estava produzindo código de primeira passagem que estava mais próximo de 85-90% pronto para produção, porque a codebase tinha padrões suficientes estabelecidos para que ele seguisse.
A Stack de Tecnologia e Decisões Arquitetônicas
Escolhemos a stack deliberadamente para maximizar a produtividade assistida por IA:
- Next.js 14 (App Router) — para o portal do cliente e dashboard administrativo
- Node.js com Fastify — para a camada de API (separada do Next.js)
- PostgreSQL — banco de dados primário
- Redis — caching, gerenciamento de sessão, pub/sub em tempo real
- Drizzle ORM — acesso de banco de dados type-safe
- Turborepo — gerenciamento de monorepo
- Vercel — deployment do frontend
- AWS (ECS Fargate) — API e workers em background
Fomos com Next.js especificamente porque os padrões são bem estabelecidos e Claude Code tem dados de treinamento profundos em convenções do App Router. Isso importa mais do que as pessoas pensam. Se tivéssemos escolhido algo exótico como um backend baseado em Rust com HTMX, a qualidade de saída da IA teria caído significativamente. Você pode aprender mais sobre como nos aproximamos do desenvolvimento Next.js em escala.
Drizzle ORM foi uma escolha deliberada sobre Prisma para este projeto. Claude Code gera schemas Drizzle melhores porque são apenas TypeScript — sem DSL customizado para acertar errado. Além disso, a história de migração é mais simples quando você está gerando muitas mudanças de schema rapidamente.
// Exemplo: Claude Code gerou este schema de invoice
// na primeira passagem com mudanças mínimas necessárias
import { pgTable, uuid, varchar, decimal, timestamp, pgEnum } from 'drizzle-orm/pg-core';
import { relations } from 'drizzle-orm';
import { shipments } from './shipments';
import { organizations } from './organizations';
export const invoiceStatusEnum = pgEnum('invoice_status', [
'draft', 'pending', 'sent', 'paid', 'overdue', 'cancelled', 'refunded'
]);
export const invoices = pgTable('invoices', {
id: uuid('id').primaryKey().defaultRandom(),
organizationId: uuid('organization_id').notNull().references(() => organizations.id),
shipmentId: uuid('shipment_id').references(() => shipments.id),
invoiceNumber: varchar('invoice_number', { length: 50 }).notNull().unique(),
status: invoiceStatusEnum('status').notNull().default('draft'),
subtotal: decimal('subtotal', { precision: 12, scale: 2 }).notNull(),
taxAmount: decimal('tax_amount', { precision: 12, scale: 2 }).notNull().default('0'),
totalAmount: decimal('total_amount', { precision: 12, scale: 2 }).notNull(),
currency: varchar('currency', { length: 3 }).notNull().default('USD'),
dueDate: timestamp('due_date', { withTimezone: true }).notNull(),
paidAt: timestamp('paid_at', { withTimezone: true }),
createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),
updatedAt: timestamp('updated_at', { withTimezone: true }).notNull().defaultNow(),
});
export const invoiceRelations = relations(invoices, ({ one, many }) => ({
organization: one(organizations, {
fields: [invoices.organizationId],
references: [organizations.id],
}),
shipment: one(shipments, {
fields: [invoices.shipmentId],
references: [shipments.id],
}),
lineItems: many(invoiceLineItems),
}));
O Que Claude Code Fez Bem
Vamos ser específico. Aqui está onde Claude Code genuinamente acelerou o desenvolvimento:
Boilerplate e Operações CRUD
Este é o óbvio. Gerar endpoints REST, schemas de validação de request (usamos Zod), serializadores de response, métodos de serviço básicos — Claude Code despachou esses em minutos. Através do projeto, estimamos havia aproximadamente 180 endpoints de API. Talvez 140 deles foram operações CRUD ou query padrão que Claude Code gerou com revisão mínima.
Geração de Testes
Claude Code escreveu aproximadamente 2.400 testes através do projeto. Eram todos perfeitos? Não. Cerca de 15% precisaram de revisão significativa. Mas ter 85% de sua suite de testes gerada e funcionando é uma economia de tempo massiva. Marcus focou sua energia de testes em testes de integração e os casos extremos complicados que Claude Code não conseguia antecipar.
Desenvolvimento de Componentes UI
O portal do cliente teve cerca de 60 views de página únicos. Para cada um, Marcus forneceria a referência de design do Figma e o contrato de API, e Claude Code geraria os componentes React, hooks para busca de dados (usamos TanStack Query), manipulação de formulários com React Hook Form + Zod, e estados de carregamento/erro. A saída foi consistentemente boa — talvez 75% pixel-accurately na primeira geração.
Migrations de Banco de Dados e Evolução de Schema
Como os requisitos evoluíram (e sempre evoluem), Claude Code manipulou migrations de schema suavemente. Descreva a mudança que você precisa, e gera o arquivo de migration, atualiza o schema, atualiza queries afetadas e ajusta os tipos TypeScript. O que costumava ser uma sessão cuidadosa de refatoração de 45 minutos se tornou um ciclo de revisão-e-aprovação de 10 minutos.
Documentação
Claude Code gerou documentação de API, comentários de código inline, arquivos README, e até documentos de runbook para operações. Marcus revisaria e ajustaria, mas a saída baseline era genuinamente útil. Terminamos com melhor documentação do que 90% dos projetos que vi, simplesmente porque o custo de gerar era tão baixo.
Onde Claude Code Falhou e O Que Fizemos Sobre Isso
Esta seção importa mais do que as histórias de sucesso. Se você está planejando usar IA dessa forma, você precisa saber onde as paredes estão.
Lógica de Negócio Complexa Com Múltiplas Dependências
O mecanismo de roteamento de shipment — que precisava considerar disponibilidade de transportadora, otimização de custo, requisitos de alfândega, janelas de entrega e restrições de capacidade simultaneamente — estava além do que Claude Code conseguia manipular bem. Geraria algo que parecia plausível mas tinha erros lógicos sutis que poderiam custar dinheiro real.
Marcus escreveu este módulo à mão. Levou cerca de duas semanas. Este é exatamente o tipo de trabalho que justifica ter um arquiteto sênior em vez de tentar IA seu caminho através de tudo.
Código Crítico de Segurança
Nunca confiamos Claude Code com fluxos de auth, processamento de pagamento ou criptografia sem revisão linha-por-linha. E com razão — ocasionalmente gerava validação de JWT que era tecnicamente funcional mas perdia casos extremos como clock skew de expiração de token, ou não sanitizava propriamente inputs antes de queries de banco de dados apesar de usar uma ORM.
Regra de ouro: se um bug neste código pode perder dinheiro ou expor dados, um humano o escreve e outro humano revisa.
Consistência Arquitetônica de Longo Alcance
Pelo mês três, a codebase era grande o suficiente que Claude Code às vezes "esquecia" padrões estabelecidos anteriormente, mesmo com contexto fornecido. Poderia usar uma abordagem diferente de manipulação de erro em um módulo versus outro. Marcus teve que estar vigilante sobre pegar essas inconsistências.
Atenuamos isso mantendo um documento de "conventions" vivo que era incluído em toda sessão de Claude Code. Pense nisso como um guia de estilo, mas para padrões arquitetônicos.
Otimização de Desempenho
Claude Code gera código que funciona mas não sempre gera código que é rápido. Queries de banco de dados que fazem fetches N+1. Componentes React que reprocessam desnecessariamente. Endpoints de API que carregam mais dados do que precisado.
Marcus gastou aproximadamente 20% de seu tempo de revisão em otimização de desempenho. Não é um dealbreaker, mas algo para orçar.
A Economia: Breakdown de Custos e ROI
Aqui está a parte que todos querem ver. Números reais.
| Categoria de Custo | Time Tradicional (Est.) | Acelerado por IA (Real) |
|---|---|---|
| Salários de engenharia (18 mo / 5 mo) | $1.890.000 | $175.000 |
| Claude Code API / subscription | $0 | $12.400 |
| Infraestrutura (dev/staging) | $48.000 | $8.200 |
| Gerenciamento de projeto | $216.000 | $0* |
| QA / Testing | $180.000 | $22.000** |
| Design (contratado) | $120.000 | $95.000 |
| DevOps / Configuração de infraestrutura | $96.000 | $35.000 |
| Total | $2.550.000 | $347.600 |
Marcus auto-gerenciou usando Linear para rastreamento de tarefas. Sem overhead de PM.
*Contratou um especialista em QA pelas últimas 6 semanas.
Os custos do Claude Code decompõem para aproximadamente $2.500/mês. É o plano Max ($100/mês pela subscription) mais custos de API para sessões estendidas. Alguns dias Marcus queimaria $150-200 em chamadas de API durante sessões de geração pesada. A maioria dos dias era $40-80.
O projeto faturou em $2M. Nosso custo total de entrega foi sob $350K. Vou deixar você fazer a matemática de margem.
Comparação de Velocidade
| Marco | Timeline Tradicional | Timeline Acelerado por IA |
|---|---|---|
| Arquitetura & Design | 6 semanas | 3 semanas |
| Plataforma Principal (auth, multi-tenancy, API base) | 10 semanas | 3 semanas |
| Desenvolvimento de Features (todos os módulos) | 32 semanas | 10 semanas |
| Integrações (14 APIs de terceiros) | 12 semanas | 4 semanas |
| Testing & QA | 8 semanas | 3 semanas |
| Deployment & Hardening | 4 semanas | 2 semanas |
| Total | 72 semanas | 25 semanas |
Lições para Times Considerando Desenvolvimento Acelerado por IA
Depois deste projeto, tenho pensado muito sobre o que isso significa para como construímos software daqui para frente. Aqui está o que eu diria para qualquer time ou agência considerando esta abordagem.
Você Ainda Precisa de Um Arquiteto Sênior. Talvez Mais Do Que Nunca.
IA não elimina a necessidade de experiência — amplifica qualquer experiência (ou falta dela) que você traz. Um desenvolvedor junior usando Claude Code enviará código de qualidade junior mais rápido. Um arquiteto sênior usando Claude Code enviará código de qualidade sênior em uma velocidade que era previamente impossível.
O pior cenário possível é um desenvolvedor mid-level que pensa que é sênior usando IA para gerar código que não consegue avaliar propriamente. É assim que você consegue uma codebase que parece boa na superfície mas desmorona sob carga.
Convenção Sobre Configuração, Em Todo Lugar
Quanto mais previsíveis são os padrões de sua codebase, melhor IA funciona. Usamos a mesma estrutura de arquivo, convenções de nomeação e organização de código em cada módulo. Esta consistência pagou dividendos massivos enquanto Claude Code aprendia a combinar padrões existentes.
Se você está trabalhando com uma arquitetura headless CMS, ter convenções rígidas para tipos de conteúdo, rotas de API e estruturas de componentes torna código gerado por IA dramaticamente mais confiável.
Invista em Architecture Briefs
A qualidade da saída do Claude Code estava diretamente correlacionada com a qualidade dos architecture briefs de Marcus. Instruções vagas produziram código vago. Briefs detalhados com modelos de dados explícitos, regras de negócio e requisitos de integração produziram código que estava próximo de pronto para produção.
Estimamos que Marcus gastou cerca de 30% de seu tempo escrevendo architecture briefs e revisando saída, e 70% do tempo que um time tradicional teria gasto em implementação real foi manipulado por Claude Code.
Desenvolvimento Assistido por IA Muda Modelos de Precificação
Se você é uma agência, essa é a conversa desconfortável. Quando um arquiteto consegue entregar o que costumava exigir um time de 8, como você precifica? Acreditamos em precificação baseada em valor — o cliente paga pelo resultado, não pelas horas. A plataforma vale $2M independentemente se levou 1 pessoa ou 10 para construir.
Se você está interessado em como este tipo de abordagem poderia funcionar para seu projeto, nossa página de pricing decompõe como pensamos sobre scoping de projetos nesta nova realidade.
Nem Todo Projeto Se Encaixa Neste Modelo
Isso funcionou porque:
- Os requisitos eram bem-definidos (logística é um domínio maduro)
- Tínhamos um genuíno arquiteto sênior disponível
- A stack de tecnologia era mainstream (ótimos dados de treinamento de IA)
- O cliente nos confiava entregar sem microgerir o tamanho do time
Projetos com requisitos ambíguos, componentes R&D pesados, ou domínios especializados (dispositivos médicos, instrumentos financeiros com requisitos regulatórios) precisam de mais julgamento humano e devem ser staffed apropriadamente.
Para projetos construídos com frameworks como Astro onde o ecossistema é mais novo e dados de treinamento de IA são mais finos, você verá menos aceleração de ferramentas de IA comparado a projetos React/Next.js.
FAQ
Quanto Claude Code realmente custa por mês para uso pesado de desenvolvimento?
Neste projeto, a média foi $2.500/mês all-in. A subscription Claude Max é $100/mês (ou $200/mês pelo tier mais alto a partir de início de 2025), e uso de API para sessões agentic do Claude Code se adiciona dependendo de quanto código você está gerando. Dias pesados atingem $150-200 em custos de API. Dias leves de revisão-e-refine eram $40-80. Anthropic também introduziu o plano Max em $200/mês que inclui uso significativo que poderia reduzir custos variáveis.
Um desenvolvedor junior consegue usar Claude Code da mesma forma?
Não, e isso é importante. Claude Code amplifica seu nível de skill existente — não substitui conhecimento arquitetural. Um desenvolvedor junior usando Claude Code gerará código mais rápido, mas não pegará bugs sutis, problemas de segurança, problemas de desempenho ou inconsistências arquitetônicas que um engenheiro sênior avalia imediatamente. Você precisa de alguém que consegue avaliar a saída, não só aceitá-la.
E sobre qualidade de código — código gerado por IA é mantível?
Depende inteiramente das restrições que você dá. Nosso código gerado passou nas mesmas regras de linting, type checking e padrões de code review que código escrito por humanos. O truque é estabelecer padrões fortes cedo no projeto para que a IA tenha bons exemplos para seguir. Mantínhamos um documento de convenções que era incluído em toda sessão de Claude Code. Seis meses pós-launch, o time mantendo a plataforma não reportou nenhuma carga de manutenção incomum.
Esta abordagem funciona para projetos front-end pesados?
Sim, com ressalvas. Claude Code é excelente em gerar componentes React, manipulação de formulários, hooks de busca de dados e código de gerenciamento de estado. É menos confiável em produzir layouts CSS pixel-perfect a partir de designs — você precisará de mais ciclos de iteração para polish visual. Encontramos que era cerca de 75% acurado na primeira passagem de geração de UI comparado a 85-90% para código de backend.
Como você manipula code review quando há apenas um desenvolvedor?
Marcus revisou cada linha de código gerado por IA por si mesmo. Também trouxemos um especialista em segurança contratado para duas sessões de auditoria focadas durante o projeto (semana 12 e semana 22). Para a fase final, um especialista em QA se juntou pelas seis semanas. A falta de revisão de código por pares é um risco genuíno — atenuamos com ferramentas automatizadas (modo strict de TypeScript, ESLint com regras agressivas, Vitest com thresholds de cobertura) e auditorias externas.
O que acontece quando Claude Code gera código bugado?
Acontece regularmente. A primeira passagem raramente é perfeita. Construímos essa expectativa no fluxo de trabalho — gerar, revisar, refinar, enrijecer. A maioria dos bugs foi pega durante o ciclo de revisão de Marcus. A suite de testes automatizados (também largamente gerada por IA mas revisada por humanos) pegou problemas de regressão. A insight-chave é que debugar código gerado por IA é mais rápido do que escrever código correto do zero, porque você está começando a partir de algo que é principalmente certo.
Isso é viável apenas para projetos greenfield, ou funciona com codebases existentes?
Claude Code realmente funciona bem com codebases existentes porque consegue ler e entender padrões existentes. Neste projeto, os módulos posteriores se beneficiaram de ter módulos anteriores como referência. Desde então usamos Claude Code para adições de features em projetos de cliente existentes com bons resultados. A chave é dar contexto suficiente sobre convenções e padrões existentes. Se sua codebase é inconsistente ou mal documentada, adições geradas por IA herdarão essa inconsistência.
Você faria isso novamente?
Absolutamente. Já estamos fazendo. Dois mais projetos estão rodando com este modelo agora — um com um arquiteto único, outro com dois engenheiros para um sistema mais complexo. A economia é muito atraente para ignorar. Mas quero ser claro: isso não é sobre substituir desenvolvedores. É sobre mudar a proporção de arquitetos sênior para saída. Você ainda precisa da experiência humana. Você só precisa de menos do typing humano. Se você está considerando um projeto e quer explorar o que este modelo poderia parecer, nos contacte — estamos felizes em conversar através de se é um encaixe.