Lição 3: Decompondo uma tarefa complexa em um fluxo de trabalho
Objetivos de aprendizado:
- Dominar as três estratégias de decomposição de tarefas
- Identificar dependências entre tarefas
- Transformar uma decomposição em um fluxo de trabalho executável
Pré-requisitos: Lição 2: Blocos de construção de um fluxo de trabalho: passos, estado, ramificações e loops | Próxima: Lição 4 >>
De “não sei por onde começar” a passos claros
Uma tarefa cai na sua mesa: “Divida nossa aplicação Rails monolítica em uma arquitetura de microsserviços.” Essa é uma tarefa complexa. Você não sabe por onde começar, quantos passos ela leva nem o que cada passo faz.
Decomposição de tarefas é como você pega uma tarefa vaga e grande demais e a quebra em passos pequenos e claros.1
Uma boa decomposição atende a três critérios:
- Cada subtarefa é pequena o bastante para terminar em uma única chamada de agente ou função.
- As dependências entre subtarefas são explícitas — você sabe quais precisam rodar em ordem e quais podem rodar em paralelo.
- Cada subtarefa tem entradas e saídas claras — a saída de um passo pode alimentar diretamente o próximo.
Decomponha bem e escrever o fluxo de trabalho vira montar Lego. Decomponha mal e você vai descobrir, no meio da execução, que faltam passos, que a ordem está errada ou que os dados não fluem.2
Estratégia 1: decomposição sequencial
Quando usar: a tarefa tem uma ordem clara do início ao fim, e cada passo depende do resultado do anterior.
Como: trabalhe de trás para frente, a partir do fim. Pergunte “de que entrada este passo precisa? De onde vem essa entrada?”
Exemplo: gerar documentação técnica
Tarefa: gerar documentação voltada ao usuário para uma API.
Decomposição de trás para frente:
Transformada em um fluxo de trabalho:
Cadeia de dependências:
O passo 2 pode rodar em paralelo com o passo 1? Não — o passo 2 precisa dos endpoints do passo 1.
O passo 3 pode rodar em paralelo com o passo 2? Não — o passo 3 precisa dos examples do passo 2.
Como é a decomposição sequencial: uma longa cadeia de dependências, poucas chances de paralelizar, mas com lógica clara.3
Estratégia 2: decomposição paralela
Quando usar: a tarefa se divide em várias subtarefas independentes que não dependem umas das outras.
Como: identifique o padrão “faça Y para cada X” — cada X pode ser processado em paralelo.
Exemplo: auditoria de segurança de uma base de código
Tarefa: auditar 100 arquivos em busca de problemas de segurança.
Decomposição paralela:
Formato:
Padrão fan-out-reduce: este é o formato mais comum da decomposição paralela.4
- Fan out: espalhe a tarefa entre muitos agentes paralelos.
- Reduce: junte todos os resultados em uma saída final.
O poder da decomposição paralela: 100 arquivos, 2 minutos para auditar cada um. A execução sequencial leva 200 minutos; a paralela leva 2 (supondo que não haja limites de recursos).
Estratégia 3: decomposição híbrida
Quando usar: na maioria das tarefas reais. Algumas partes rodam em paralelo, outras precisam rodar em ordem.
Como: primeiro encontre as fases de alto nível (que precisam rodar em ordem) e depois encontre as oportunidades de paralelismo dentro de cada fase.
Exemplo: uma refatoração em larga escala
Tarefa: atualizar 50 componentes de Vue 2 para Vue 3.
Decomposição híbrida:
Transformada em um fluxo de trabalho:
Grafo de dependências do híbrido:
O coração da decomposição híbrida: mantenha a ordem de que você realmente precisa, extraindo ao mesmo tempo toda chance de paralelizar.3
Usando um LLM para ajudar a decompor
Você também pode entregar a decomposição a um LLM. Três caminhos funcionam: prompting zero-shot, prompting chain-of-thought e prompting few-shot (guiado por exemplos).1
Zero-shot
Chain-of-thought
Few-shot
A vantagem da decomposição por LLM: ela esboça um primeiro plano rápido e pega passos que você poderia ter esquecido.
A desvantagem da decomposição por LLM: ela pode ficar abstrata demais (dizer “analise os dados” em vez de “calcule a complexidade ciclomática de cada arquivo”), então precisa de um humano para afiar.1
Dicas práticas para identificar dependências
Dica 1: pergunte “este passo poderia rodar antes do primeiro?”
Se a resposta for “sim”, eles podem rodar em paralelo. Se for “não, ele precisa do resultado do primeiro passo”, existe uma dependência.
Dica 2: desenhe o grafo de dependências
Os passos 2 e 3 podem rodar em paralelo? Sim — ambos dependem apenas do passo 1.
Os passos 3 e 4 podem rodar em paralelo? Não — o passo 4 depende do passo 2.
Um grafo em que as setas indicam dependência e nunca voltam para o início tem nome formal: DAG (grafo acíclico dirigido). O passo 1 não depende de nada, então é uma folha que o grafo pode executar primeiro. Ordenar todos os passos de modo a nunca violar a direção de uma seta se chama ordenação topológica.
Dica 3: cheque o fluxo de dados
Liste a entrada e a saída de cada passo:
Se a entrada do passo X vem da saída do passo Y, então X depende de Y.
Erros comuns de decomposição
Erro 1: passos grandes demais
O que “preparar os dados” abrange? Ler arquivos? Fazer o parse da configuração? Conectar em um banco de dados? Vago demais.
Erro 2: nenhum passo de tratamento de erros
E se o passo 2 falhar? O serviço A já está no ar, mas o B não, e o sistema fica em um estado inconsistente.
Erro 3: ignorar oportunidades de paralelismo
Isso processa um serviço por vez. Lento.
Próxima: Lição 4: Gerenciamento de estado e passagem de contexto — aprenda a passar e gerenciar dados corretamente entre os passos de um fluxo de trabalho.