Fase 5: Sincronização de progresso com UUID
Objetivo: Mantenha o status de conclusão de cada aluno e repinte a barra lateral ao recarregar, tudo sem contas de usuário.ACU burn: 2,7 (planejado 2-3).Resultado: Um pequeno gancho do React agora armazena um UUID gerado pelo navegador, chama a API do GraphQL em cada passagem de teste e pré-carrega o progresso sempre que o playground é montado.
O que Devin realmente fez
Para a quinta fase, Devin:
- Cliente Apollo integrado para comunicação GraphQL entre o front-end e o back-end
- Implementação do gerenciamento de sessões anônimas com UUIDs armazenados no localStorage
- Dados de progresso sincronizados em tempo real e indicadores visuais nos níveis de categoria e exercício
- Detectou a conclusão do exercício ao se conectar ao executor de testes Vitest no navegador
- Adicionado suporte off-line, atualizações otimistas e tratamento robusto de erros com lógica de repetição (que eu nunca solicitei).
Uma das vantagens é que Devin adicionou a atualização otimista da UI para que os emblemas mudem para ✅ instantaneamente. Isso é importante porque mantém a interface ágil mesmo em conexões de alta latência.
Lições aprendidas
Minhas conclusões são as seguintes:
- Um escopo pequeno significa erros mínimos: Essa foi uma tarefa pequena e de escopo restrito, portanto Devin a executou bem e dentro de um bom prazo.
- Diga o que você quer, mas também o que você não quer: Percebi que Devin tem uma tendência a tentar ampliar o escopo e, mais uma vez, ele me deu mais do que eu pedi. Nesse caso, não me importei, mas se houver algo que você realmente não quer que ele faça, diga explicitamente. Por exemplo, em todos os avisos, especifiquei "nenhuma funcionalidade de login" porque achei que ele tentaria ir até lá.
Agora temos a prova de que nosso pipeline de sessão anônima funciona de ponta a ponta. É hora de dar uma boa aparência na fase final de polimento.
Fase 6: Polimento da interface do usuário e painel de progresso
Objetivo: Transforme a interface utilitária em uma experiência pastel e "arejada" e adicione um painel que visualize a sequência de cada aluno, a escala de dificuldade e a atividade semanal.ACU burn: 11 (planejado ≈ 3).Resultado: Temas em tons pastéis claros/escuros, cartões de exercícios redesenhados e um painel de controle ao vivo que mostra anéis, barras e contadores de sequência. Devin conseguiu os traços gerais, mas eu entrei em cena para resgatar as incompatibilidades de nomes e as trocas de dependências desonestas.
Nessa fase, ampliei deliberadamente o escopo para ver como o Devin lidaria com um conjunto maior de solicitações. Na verdade, achei que seria muito mais fácil para o Devin lidar com isso do que com a fase 3, com toda a implementação de back-end. Alerta de spoiler: Eu estava errado.
O que Devin abordou desde o início
Este é o detalhamento de meus requisitos e do resultado de Devin:
|
Requisito |
Produção de Devin |
|
Sistema de design Pastel |
Foram adicionadas variáveis CSS do Tailwind para o primário em azul suave, sucesso em menta e acentos em lavanda. Defina |
|
Tipografia e espaçamento |
Introduziu uma classe |
|
Painel de progresso |
Nova rota
|
|
Cartões aprimorados |
Você substituiu |
|
Expansão do catálogo |
Gerou mais 10 exercícios de esboço com nomes narrativos e modelos de espaço reservado. Os metadados incluem dificuldade, tempo estimado e categoria. |
Onde Devin errou
As coisas não saíram perfeitamente - Devin:
- Nomes de arquivos de pacotes de exercícios alterados sem atualizar o wrapper ou resolver → tempo de execução 500s; correção +1 ACU.
- Substituiu discretamente o Postgres pelo SQLite "para facilitar o desenvolvimento local" sem pedir minha autorização. Eu não saberia se não estivesse assistindo.
- Deixei dezenas de declarações
console.logem componentes React, e as verificações de lint continuaram tentando novamente.
Lições aprendidas
Minhas conclusões:
- A lógica do painel ainda precisa ser trabalhada: Devin conectou contadores de tempo e de sequência, mas os deixou não funcionais. As métricas de back-end devem ter pelo menos um teste de integração para que a interface do usuário do "caminho feliz" não seja mesclada prematuramente.
- O uso da ACU acelera em sessões longas: Depois de aproximadamente 8 ACUs, a sessão ficou visivelmente mais lenta. Sessões curtas e limitadas (< 5 ACUs) mantêm o contexto apertado e o agente responsivo.
- Devin trocará as dependências de forma "útil": Ele substituiu o Postgres pelo SQLite sem perguntar. Fixe os serviços essenciais em seu prompt: "Não mude o mecanismo do banco de dados; permaneça no Postgres."
- As tarefas de design acionam a rotatividade de carga quente: Cada atualização do Tailwind/Vite conta como tempo de agente. Talvez a melhor maneira de fazer isso seja pausar a sessão antes de editar estilos em massa e, em seguida, ativar o Devin quando o projeto for compilado de forma limpa.
Essa tarefa foi longa e cara, em comparação com o restante do trabalho que fizemos. Pelo menos Devin está ciente de onde as coisas deram errado:

Temos algo bonito, mas levou um pouco de tempo e não está totalmente funcional. Algumas das métricas do painel são codificadas - dois exercícios em nossa categoria de opções? Temos 10. As métricas de sequência e tempo gasto também não estão conectadas a nada, e a interface do usuário nas páginas de exercícios individuais é muito ruim.
Retrospectiva de custo e tempo
Como ficaram os números
Aqui está um resumo de como tudo aconteceu:
|
Fase |
UACs planejadas |
UACs reais |
Delta |
Notas |
|
1 - Espaço de trabalho e andaime |
1 - 2 |
3.66 |
▲ ≈ 1.7 |
Loops extras no site |
|
2 - Pacote de exercícios |
2 |
0.60 |
▼ 1.4 |
Movimentação simples de arquivos, sem instalações pesadas |
|
3 - API e Prisma |
4 |
4.20 |
▲ 0.2 |
Configurar rugas (falta |
|
4 - Playground e testes |
3 - 4 |
7.20 |
▲ ≈ 3.5 |
Ciclos de recarga a quente, paralisação do editor de mesclagem |
|
5 - Sincronização de progresso |
2 - 3 |
2.70 |
▼ ≈ 0.3 |
Gancho simples + consultas |
|
6 - Polimento da interface do usuário e painel de controle |
2 - 3 |
11.00 |
▲ ≈ 8 |
Reinstalações, troca silenciosa de banco de dados, grandes recargas de CSS |
|
Total |
18 - 24 |
29.36 |
▲ ≈ 6 – 11 |
Aproximadamente 35 % acima da estimativa inicial |
|
Custo: 29,36 ACUs × US$ 2,25 ≈ $66 | ||||
Economia de tempo em relação ao trabalho manual
Essa é a minha estimativa de tempo economizado:
|
Tarefa |
Estimativa humana |
Devin (+ correções) |
Líquido |
|
Bootstrapping NestJS + GraphQL + Prisma |
4 horas |
1 hora (incluindo consertos) |
-3 horas |
|
Fiação do navegador Sandpack + Vitest |
3 horas |
1 hora e 20 minutos |
-1 h 40 min |
|
Redesenho completo em tons pastéis e painel de controle |
6 horas |
2 horas (mas ainda não está funcionando) |
−4 h |
|
Tempo total |
~13 horas |
~4 horas e 20 minutos |
-8 horas e 40 minutos |
Principais conclusões
Essas são as coisas que eu recomendo:
|
Tema |
O que você deve fazer |
Por que isso é importante |
|
Mantenha as sessões curtas |
- Limite cada execução em ≤ 5 ACUs. - Divida as grandes metas em bilhetes pequenos. |
As sessões > 8 ACUs são lentas, e as taxas de erro saltam para ≈35%. As rajadas curtas permanecem ágeis e mais baratas. |
|
Incentivar com antecedência, fazer pausas com frequência |
- Observe a guia Timelapse; se Devin fizer um loop, digite "Continue" ou "Sleep". - Faça uma pausa enquanto você edita em massa o CSS ou os documentos e, em seguida, desperte o Devin quando o código for compilado. |
Os loops ociosos ainda fazem o contador funcionar; a agitação de carga quente durante o trabalho de projeto é pura queima de ACU. |
|
Tratar a configuração como trabalho manual |
- Você mesmo pode mover/renomear árvores de arquivos grandes (arrastar e soltar supera os scripts ACU 0.8). - Corrija manualmente os erros de pacote da primeira vez; as novas tentativas são um desperdício de ACU. |
A E/S de arquivos e as instalações repetidas são responsáveis por cerca de 30% dos créditos desperdiçados. |
|
Verificação de tipo e fiapos localmente |
- Sempre execute seus scripts de teste (no nosso caso, lint e typecheck) antes de mesclar. - Adicione esses comandos ao seu CI (mais sobre isso no próximo tutorial!). |
Devin declarará sucesso mesmo quando o pipeline falhar. |
|
Tecnologia crítica de pinos |
- Diga o que você não deve mudar: "Fique no Postgres, sem login, mantenha o Tailwind." - Liste as variáveis de ambiente necessárias em |
Devin "ajudará" a trocar o Postgres pelo SQLite ou adicionará novos executores de teste, a menos que você seja solicitado a não fazê-lo. |
|
Você mesmo deve lidar com os segredos |
- Remova os arquivos - Planeje uma etapa de gerenciamento de segredos para tutoriais posteriores. |
Devin não distingue necessariamente credenciais fictícias de credenciais reais. |
|
Eliminar os impasses do editor de mesclagem |
- Entre em contato para ajudar com commits de mesclagem e saídas de processos. |
Os travamentos do Vim desperdiçam minutos e ACUs. |
|
Excluir código morto antecipadamente |
- Após as mudanças, |
Arquivos redundantes confundem o agente e aumentam o tempo de compilação. |
|
Adicionar testes de unidade para a nova lógica |
- Contadores de sequência, cronômetros ou métricas precisam de testes de back-end, não confie apenas na interface do usuário. Novamente, espere um pouco, pois abordaremos esse assunto no próximo tutorial. |
Devin conectou o painel, mas deixou os contadores não funcionais até que os testes expusessem a lacuna. |
|
Diga o que você quer e o que você não quer |
- As negativas explícitas ("No auth yet") impedem o aumento do escopo. - Analise o plano proposto por Devin e corte os extras. |
O agente gosta de entregar em excesso, o que é ótimo para demonstrações, mas ruim para orçamentos. |
O que vem a seguir?
Agora você tem:
- Um playground com acabamento em tons pastéis que executa testes fp-ts no navegador
- Uma API NestJS + PostgreSQL que lembra o progresso com nada mais do que um UUID
- Um painel de progresso que realmente parece divertido
Em próximo tutorialmudaremos o foco dos recursos para o fluxo de trabalho e a colaboração com você:
- Testes contínuos: Adicione as suítes Jest e Playwright e deixe que Devin mantenha ambas verdes a cada RP.
- Pipeline de CI/CD: Gere GitHub Actions que criam os aplicativos da Web e da API e executam os testes no Chrome sem periféricos.
- Integrações de equipe: Conecte o Devin ao Jira para atualizações de tíquetes, envie resumos de compilação para o Slack e experimente o novo recurso Wiki do Devin no produto para obter uma documentação leve.
Se você estiver pronto para continuar, clique no terceiro item da lista abaixo para ir para o próximo tutorial:
- Configuração e primeira solicitação pull (parte 1)
- Enviando uma fatia vertical com Devin (Parte 2)
- Integrações, testes e CI/CD (Parte 3)
- Segurança, implementação e manutenção (Parte 4)



Bem-vindo de volta! No primeiro tutorial desta série, Devin tirou a poeira do meu antigo repositório fp-ts-exercises e abriu um PR de atualização de dependências. Nesta segunda parte, aumentaremos a dificuldade e criaremos recursos de pilha completa.
Você pode acessar todos os tutoriais da série Devin aqui:
Quando chegar ao final desta segunda parte, você terá:
Ao longo do caminho, permitiremos que o Devin gere sua própria lista de tarefas, observe-o fazer malabarismos com tíquetes de front-end e back-end e intervenha quando ele tropeçar em problemas de configuração. Mostrarei a você onde gastei (e economizei) ACUs, o que consertei manualmente e como manter as sessões eficientes.
Recapitulação e pré-requisitos
Ao longo desta série de tutoriais, estamos trabalhando no meu repositório de exercícios fp-ts (anteriormente) abandonado.
O projeto é uma coleção de pequenos desafios destinados a ensinar conceitos de programação funcional (como Option, Either, etc.) em TypeScript. No momento, é um repositório de clonagem e execução: os alunos o baixam, editam os arquivos localmente e executam os testes em seu próprio terminal.
O objetivo é transformar esses exercícios em um playground interativo baseado em navegador, no qual as pessoas podem ler uma explicação, ajustar o código em um editor na página e ver os testes serem aprovados (ou reprovados) instantaneamente. Os alunos também terão a oportunidade de fazer login para salvar seu progresso.
O que realizamos na primeira parte
Lembre-se de que no primeiro tutorial, nós:
Ferramentas locais que você precisa para a segunda parte
Para este segundo tutorial, precisaremos de você:
Configurações recomendadas do Devin
Recomendo as seguintes configurações para o Devin:
Deixe Devin escrever o plano de jogo
Achei que seria interessante começar testando as capacidades de planejamento de Devin. Criei um prompt e pedi a Devin, usando o recurso "Ask" (atualmente gratuito na versão Beta), que me ajudasse a planejar o trabalho que faríamos hoje.
Sugestão:
Quero transformar meu repositório fp-ts-exercises Node + TypeScript existente (atualmente, exercícios CLI de clonagem e execução) em uma plataforma de aprendizado baseada em navegador que programa o progresso.
Experiência alvo:
- Os alunos abrem um aplicativo da Web Next.js, escolhem um exercício, editam o código no navegador e veem os testes Vitest serem aprovados ou reprovados instantaneamente.
- O progresso (slugs concluídos) é armazenado no lado do servidor e recarregado em visitas posteriores, mas ainda não estamos adicionando contas de usuário (use um UUID anônimo armazenado no navegador).
Escolhas técnicas para as quais estou inclinado:
- Frontend: Next.js 14 (React 18, App Router)
- Editor e executor de código: Sandpack + @vitest/browser
- API: NestJS 13 com @nestjs/graphql (driver Apollo)
- Banco de dados: Prisma 5 com PostgreSQL
- Workspace: workspaces npm simples (apps/web, apps/api, packages/exercises)
Proponha um plano de implementação passo a passo (lista de tarefas) que dê vida a essa fatia vertical. Faça uma estimativa do custo relativo da ACU para cada tarefa e sinalize as etapas de longa duração (por exemplo, grandes migrações ou instalações de dependências pesadas).
Devin, de forma útil, retornou uma lista de tarefas de seis fases com estimativas de ACU para cada uma delas e sinalizou as etapas de "instalação de dependência pesada".
Resposta de Devin:
Fase 1: Configuração do espaço de trabalho (2-3 ACU)
Fase 2: Migração de pacotes de exercícios (3-4 ACU)
Fase 3: API de back-end (4-5 ACU)
Fase 4: Recursos principais de front-end (5-6 ACU)
Fase 5: Programa de progresso (2-3 ACU)
Fase 6: Polonês e implantação (2-3 ACU)
Custo total estimado: 18-24 ACU
No geral, o plano foi muito bom. Mudei algumas coisas, principalmente na fase seis, já que abordaremos a implantação no quarto tutorial.
Fase 1: Espaço de trabalho e andaime frontal
Objetivo: Crie espaços de trabalho npm, mova os arquivos herdados e inicie um shell Next.js 14 em branco.ACU burn: 3,66 (planejado 1-2).Resultado: O repositório agora tem
/apps/web,packages/exercisescompartilhado e um aplicativo Next.js pronto para o Tailwind em execução emlocalhost:3000.O prompt
Pedi a Devin que criasse o plano que ele fez para a primeira fase. O Agentic Devin não tem contexto do que você poderia ter perguntado anteriormente no recurso "Ask Devin", portanto, você precisa criar um prompt separado e fornecer o contexto.
Não vou colar todos os prompts neste artigo, mas aqui está o primeiro:
Sugestão:
Tarefa: Inicialize a estrutura do espaço de trabalho npm e o front-end Next.js para a plataforma do navegador fp-ts-exercisesContext:
Estou convertendo meu sistema de aprendizado baseado em CLI fp-ts-exercises existente em uma plataforma baseada em navegador. O sistema atual tem exercícios organizados em 10-from-either.exercise.ts:1-3 com a configuração do TypeScript em tsconfig.json:88 e a configuração do Vitest em vitest.config.ts:7 .
Requisitos:
Entregáveis:
Pilha tecnológica:
Submissão:
Todos os prompts que escrevi posteriormente seguiram o mesmo padrão: destaque da tarefa, contexto, requisitos, resultados, pilha de tecnologia e detalhes de envio.
O que Devin realmente fez
Demorou bastante tempo para decidir seu curso de ação (cerca de quatro minutos), mas conseguiu:
packages/exercises/src.Por que o custo da ACU aumentou
O custo da ACU aumentou porque:
npm installtentativas após um tempo limite do espelho.qno Vim e, em seguida, comCtrl-C, e ambos falharam. Dei a ele um pouco de tempo para tentar consertá-lo sozinho, mas acabei intervindo manualmente e encerrando os processos nas duas vezes. Cada minuto extra significava ACUs extras, e eu não teria detectado esse problema rapidamente se não estivesse acompanhando de perto as ações de Devin.Intervenções humanas e lições aprendidas
Aqui está um resumo das correções que precisei fazer:
Consertar
Tempo
Como eu fiz isso
Tarefa de observação de nó suspenso encerrada
15 s
Processo encerrado no shell da VM.
Reinstalação do Tailwind
90 s
npm install tailwindcss postcss autoprefixer --workspace=apps/web e reiniciei o tailwind init.
Adicionado .next/ a .gitignore
10 s
Comprometido manualmente para evitar PRs inchados.
Mover grandes árvores de arquivos é mais rápido manualmente e muito mais barato, pois Devin cobra por tempo/tarefa. Arrastei as pastas, fiz o commit e deixei que o agente pegasse a nova estrutura. Ele conseguiu extrair minhas alterações sem problemas e fazer uma mesclagem sozinho!
Dito isso, tive que solicitar que ele executasse os scripts lint e typecheck, mesmo que eu tivesse especificado isso em meu prompt inicial. No final, os dois funcionaram, mas falharam. Mesmo assim, Devin considerou o evento um sucesso e seguiu com as relações públicas.
Corrigi os dois problemas localmente, executei os scripts e executei o novo servidor de desenvolvimento da Web para garantir que ele iniciasse como pretendido e enviei o commit.
Fase 2: Empacotamento dos exercícios
Objetivo: Extraia todos os arquivos de desafios em um pacote reutilizável
packages/exercisese gere metadados para cada exercício.ACU burn: 0,6 (planejado 2+).Resultado: O pacote compartilhado exporta metadados digitados que o aplicativo da Web e a futura API podem importar comimport { exercises } from '@exercises/registry'.O que Devin realmente fez
Devin criou:
fp-ts.exercise.tse.solution.tsoption-01)getExercises(),getExerciseBySlug(),getExercisesByCategory(),getCategories(),getCategoryBySlug()Por que Devin terminou abaixo do orçamento
A Devin conseguiu manter o custo da ACU baixo - eis como ela fez isso:
git mv(barato) em vez de copiar e colar e diffIntervenções humanas
Desta vez, você não terá nenhum!
Aprendendo com a última vez, verifiquei a ramificação do Devin e executei os scripts localmente. Tudo foi compilado e o registro exporta definições de tipo limpas, o que o torna o material de entrada perfeito para a interface do usuário e a API que criaremos em seguida.
Fase 3: NestJS + GraphQL API
Objetivo: Monte um serviço NestJS 13 que exponha o progresso do exercício via GraphQL e persista os dados no PostgreSQL com Prisma.ACU burn: 4.2 (planejado 4).Resultado:
apps/apiboots onlocalhost:4000/graphql. Você pode consultar e alterar os registros de progresso com a chave de um ID de sessão anônimo.O que Devin realmente fez
Para a terceira fase, Devin:
apps/apicom TypeScript e Apollo GraphQLSessioneCompletedExercisepackages/exercises) para descoberta de dadosOnde Devin tropeçou
Estes são os problemas que encontrei durante a terceira fase e as correções que tive de fazer:
Problema
Consertar
Tempo
Você esqueceu de importar
reflect-metadata→ o aplicativo travou ao iniciarSolicitou Devin: "Estou encontrando este erro ao tentar executar o
"npm run dev":A metapropriedade 'import.meta' só é permitida quando a opção
--moduleé 'es2020', 'es2022', 'esnext', 'system', 'node16', 'node18' ou 'nodenext'."1 ACU, 5 minutos
Falta o script Lint
Solicitou Devin: "Adicione o script lint ao pacote api e certifique-se de que ele seja aprovado."
1 ACU, 4 minutos
Acidentalmente cometido
.envgit rm --cached apps/api/.env && echo '.env' >> apps/api/.gitignore20 s
Lições aprendidas
Estas são minhas conclusões:
npm run devtravou até que oreflect-metadatafosse adicionado..envcom uma variávelDATABASE_URL, que continha um nome de usuário e uma senha fictícios. Depois de extraído localmente, alterei o nome de usuário e a senha para os identificadores do meu banco de dados local e me certifiquei de remover o arquivo do sistema de rastreamento git e adicioná-lo ao site.gitignore. Nos próximos tutoriais, você verá como lidar com segredos com segurança.Fase 4: Playground do Sandpack e testes ao vivo
Objetivo: Ofereça aos alunos um editor de navegador que executa soluções fp-ts e verificações Vitest em tempo real.Queima de ACU: 7.2 (planejado 3-4).Resultado: Ao acessar
/exercises/option-01, você abre uma exibição dividida: O editor do Sandpack à esquerda, o túnel de teste à direita, e uma mensagem de sucesso é exibida no momento em que todas as especificações são aprovadas.O que Devin realmente fez
Aqui está o que Devin fez na quarta fase:
Onde Devin queimou ACUs extras
Devin queimou mais ACUs do que o esperado para essa fase - aqui está o motivo:
Causa
Como corrigi / mitiguei
Deixei o código do executor da CLI desatualizado em
apps/web- o Sandpack tentou compilar as duas cópias e falhou.Excluí o site
pages/index.tsxdo scaffold original, confirmei e refiz o Devin.Esperou por feedback, mas não perguntou explicitamente → loop ocioso.
Digitei "Parece bom, continue." no bate-papo após três minutos de silêncio.
Lições aprendidas
Minhas conclusões desta vez são:
Devin demorou um pouco aqui. Ele entrou em loop e entrou em loop, tentando salvar os mesmos problemas, não conectando o backend e o frontend corretamente, fazendo alterações, reiniciando os servidores, verificando no navegador se funcionava etc. Foi como um trabalho de desenvolvimento normal, suponho...
Agora você tem um aplicativo funcional. Consegui iniciar os servidores da API e da Web, navegar até localhost, editar a função stub, pressionar Save e ver o painel de teste passar de vermelho para verde. Então, percebi que ele só fazia o trabalho até a metade e codificava o teste e a solução do primeiro exercício em todas as páginas de exercícios. Apontei o problema e, depois de mais loops, ele conseguiu corrigi-lo e enviar suas correções.