Skip to content

Como fazer perguntas e dar instruções: Falando ao coração do Claude

📚 Navegação da Série: O artigo anterior 14 Interface e Atalhos ensinou onde colocar os dedos — cursor, Enter, Esc e comandos de barra. Este artigo muda de nível: suas mãos já sabem onde apertar, agora sua boca precisa saber como falar. Para uma mesma necessidade, dependendo de como você fala, o trabalho do Claude será muito diferente.

Para falar uma verdade que muitos não gostam de ouvir: a maioria das pessoas, quando começa a usar o Claude Code, o trata como um mecanismo de busca.

Imagine este cenário: uma função no projeto dá erro, e você joga um "conserta esse bug" para ele, sem dizer qual arquivo ou qual é o erro. Você aperta Enter e fica esperando o show. O resultado é que ele "adivinha" o que acha ser o bug, altera três arquivos, e nenhum deles era onde você realmente queria corrigir. Você olha para uma tela cheia de diffs confuso, pensando: "Essa IA é ruim, hein".

Mas, se você pensar bem, não é a IA que é ruim. O problema não está no Claude, está na frase que foi muito pobre: a quantidade de informação é quase zero, então ele só pode tentar adivinhar. Se ele adivinhar errado, de quem é a culpa?

Deixe-me dizer de outra forma: o limite do Claude Code é, em grande parte, determinado pela forma como você faz os pedidos. Com o mesmo modelo e no mesmo projeto, alguém que sabe fazer pedidos resolve tudo em três frases; quem não sabe, vai e volta cinco vezes e acaba se irritando. Hoje, vou explicar profundamente as regras gerais de "como descrever uma necessidade em uma frase" — não é para te ensinar a memorizar modelos, mas para você entender o que o Claude precisa saber para não se desviar do caminho.

Após ler este artigo, você terá:

  • Uma tabela de comparação "Pergunta Ruim vs Boa Pergunta" para usar como guia, diminuindo as idas e vindas
  • Quatro princípios rígidos para fazer pedidos: ser específico, dar contexto, fornecer critérios de aceitação e, para tarefas complexas, planejar primeiro
  • A forma correta de usar a referência de arquivo @ para delimitar escopos
  • Um experimento de "uma necessidade, duas formas de falar" que você pode replicar, para ver a diferença com seus próprios olhos

01 Por que uma pergunta ruim é ruim?

Vamos analisar o desastre mencionado acima. A frase "conserta esse bug", do ponto de vista do Claude, carece absurdamente de informações:

  • Qual bug? Ele tem que adivinhar de que parte você está falando.
  • Qual arquivo? Ele tem que procurar em todo o projeto.
  • Qual o comportamento correto esperado? Ele não tem a menor ideia, só pode basear-se no que "geralmente deveria acontecer".

Analogia: Treinar um estagiário novato. Você chega para um estagiário que acabou de ser contratado e diz "arruma aquilo ali"; seria um milagre se ele fizesse certo. Se mudar para "muda a cor do botão de login no canto superior direito da página inicial, do cinza para o azul da marca #1A73E8", ele poderia fazer de olhos fechados. Quanto mais específica for a instrução, menos o estagiário vai errar; quanto mais vaga, mais ele terá que adivinhar, e a chance de errar aumenta. Com o Claude é a mesma coisa.

Dê uma olhada nesta comparação que a documentação oficial enfatiza repetidamente:

Cenário❌ Pergunta Ruim✅ Boa Pergunta
Corrigir bug"Corrige o erro de login""O usuário reporta falha no login após timeout da sessão. Verifique o fluxo de autenticação em src/auth/, focando no refresh de token. Escreva primeiro um teste que falha e reproduza o problema, depois conserte."
Escrever teste"Adiciona um teste pro foo.py""Escreva testes para o foo.py, cobrindo casos extremos para usuários deslogados, sem usar mock."
Perguntar sobre código"Por que a API ExecutionFactory é projetada de forma tão horrível?""Verifique o histórico do git do ExecutionFactory e resuma como a sua API evoluiu passo a passo até o que é hoje."
Adicionar funcionalidade"Adiciona um componente de calendário""Veja como os componentes existentes na homepage são implementados, HotDogWidget.php é um bom exemplo. Siga este padrão para implementar um componente de calendário, permitindo ao usuário selecionar meses e navegar pelos anos. Além das bibliotecas já presentes no repositório, não traga bibliotecas novas."

Viu qual é o segredo? Uma boa pergunta faz apenas uma coisa: entrega de antemão tudo que o Claude precisaria adivinhar.

💡 Resumo em uma frase: A pergunta ruim é ruim porque "as lacunas de informação são preenchidas pela imaginação do Claude"; a boa pergunta é deixar claro antecipadamente o que ele precisaria adivinhar.

Pergunta Ruim vs Boa Pergunta: Uma mesma necessidade, duas formas de perguntar

Esta imagem Before/After coloca lado a lado duas formas de perguntar pela mesma necessidade: À esquerda, uma pergunta vaga, onde o Claude só pode adivinhar e fazer uma série de perguntas de volta; à direita, entregando o escopo, o contexto (com @arquivo) e os critérios de aceitação juntos, ele acerta de primeira, passa os testes e pronto. A diferença não está no Claude, está em como você fala.


02 Princípio 1: Específico > Vago

Esta é a regra mais importante de todas as quatro.

Há uma frase na documentação oficial que vale muito a pena lembrar:

Quanto mais precisa for sua instrução, menos correções você precisará.

Traduzindo: falar um pouco mais no início economiza três rodadas de retrabalho no final. Você acha que está "poupando esforço" digitando algumas palavras a menos, mas na verdade, essas palavras a menos acabam virando um custo dobrado de idas e vindas.

Quão específico deve ser? Adicione três dimensões:

Primeiro, delimite o escopo — qual arquivo, qual função, qual cenário. Não deixe que ele procure uma agulha num palheiro em todo o projeto.

Segundo, esclareça as restrições — "Não introduza novas bibliotecas", "Mantenha a retrocompatibilidade", "Não toque nos arquivos de teste". Se você não disser, ele agirá conforme as preferências dele, o que pode não ser o que você quer.

Terceiro, dê uma referência — "Siga o padrão do HotDogWidget.php". Na prática, este é o truque que mais poupa preocupações: em vez de descrever o estilo que você quer, jogue para ele um exemplo pronto que você já aprova, se ele copiar, não vai se afastar muito do ideal.

É preciso esclarecer uma exceção que parece contra-intuitiva: perguntas vagas não são absolutamente erradas. Quando você está na "fase de exploração" e ainda não decidiu a direção, uma pergunta aberta como "o que você acha que pode ser melhorado neste arquivo?" pode extrair insights que você nem imaginava perguntar. Nas palavras oficias, "quando você está explorando e capaz de corrigir a direção, prompts vagos podem ser úteis". A regra é: se quiser resultados defina tudo especificamente, se busca inspiração, deixe espaço aberto propositalmente.

Ao criar pequenas ferramentas, é fácil esbarrar neste limite — no início, queria ver como o Claude entendia o código bagunçado e perguntei de forma vaga; os pontos de melhoria sugeridos foram realmente inspiradores. Mas, uma vez que se tem um objetivo claro, usar perguntas vagas é pura perda de turnos, ele terá que adivinhar tudo de novo.

💡 Resumo em uma frase: Se quer um resultado, seja extremamente específico (escopo + restrições + referência); apenas deixe espaços abertos intencionalmente quando buscar inspiração.


03 Princípio 2: Dê o contexto, não o deixe adivinhar

Além de ser específico, o segundo truque é entregar os "ingredientes" diretamente a ele, em vez de descrever com palavras onde os "ingredientes" estão.

Existem duas ações de alta frequência; dominando-as você terá metade do caminho andado:

Primeiro, use o @ para referenciar arquivos. Digitar @ na caixa de entrada mostrará o autocompletar do caminho do arquivo; ao selecionar, o conteúdo completo do arquivo será injetado diretamente na conversa — o Claude não precisará procurar e ler, economizando passos e evitando que ele pegue o arquivo errado.

text
Consulte as definições de tipo no @src/types/user.ts para adicionar anotações de tipo ao UserService

Isto é mil vezes mais seguro do que "há um arquivo de tipo de usuário no projeto, procure lá". A documentação oficial diz explicitamente que a referência @ "lê o conteúdo completo do arquivo antes da resposta".

Analogia: Pendrive. O @ é como plugar um "Pendrive de arquivos" diretamente na mesa de trabalho do Claude — plug and play, a informação chega em um segundo; se você disser "os documentos estão na sala de arquivos do terceiro andar no segundo armário", ele ainda terá que ir lá e, se errar, o trabalho atrasará.

Segundo, cole diretamente blocos de erro. Isso deve se tornar um reflexo muscular — ao se deparar com um traceback, não faça um resumo dizendo "ele deu erro de ponteiro nulo", cole o stack trace completo exatamente como está:

text
Deu este erro em tempo de execução, me ajude a localizar a causa:
TypeError: Cannot read properties of null (reading 'userId')
    at getUserProfile (src/services/user.ts:42:18)
    at async ProfileController.getProfile (src/controllers/profile.ts:15:20)

Por que colar o trecho inteiro? Porque o stack trace contém nomes de arquivo, números de linha e cadeia de chamadas; seguindo user.ts:42, o Claude pode localizar com precisão. Se você resumir, apagará todas essas coordenadas críticas, forçando-o a adivinhar novamente.

Informação a passar❌ Descrever✅ Fornecer diretamente
O conteúdo de um arquivo"Há um arquivo que lida com autenticação no projeto"@src/auth/session.ts
Um erro"Deu um erro undefined"Colar o traceback completo
Um problema de UI"A posição do botão está errada"Colar um screenshot direto (O Claude suporta leitura de imagens)
Uma especificação de API"Siga nossa especificação de API"@docs/api-spec.md

Em uma frase: Tudo que pode ser "colado", jamais deve ser "dito". O Claude ler o material original será sempre mais preciso do que ler a sua interpretação em segunda mão.

💡 Resumo em uma frase: Use @ para apontar arquivos e cole erros ou capturas de tela diretamente na cara dele; não o faça adivinhar baseado nas suas descrições.


04 Princípio 3: Dê um critério de sucesso "verificável"

Isso é facilmente negligenciado, mas tem um poder enorme: você precisa deixar claro para o Claude "o que conta como concluído com sucesso" e, de preferência, de forma que ele mesmo possa verificar.

Por que isso é crítico? A documentação oficial detalha a lógica de base —

Quando o trabalho parecer concluído, o Claude irá parar. Sem uma verificação que ele possa executar, "parece concluído" é o único sinal disponível e você se torna o loop de validação: cada bug está esperando você notá-lo.

O que isso significa? Se você não der um padrão, o Claude vai parar quando "achar que está bom" e você será quem tem que verificar e garantir tudo, caçando cada falha pessoalmente. Mas, ao fornecer um teste que retorne um "passou / falhou", o ciclo se fecha por si mesmo: Ele termina o trabalho → roda o teste → vê o resultado → se não passar, ele tenta consertar sem que você precise supervisionar.

Veja a diferença:

Tarefa❌ Sem critério de aceitação✅ Com critério verificável
Escrever Função"Implemente uma função para validar emails""Escreva a função validateEmail. Casos de uso de exemplo: user@example.com é verdadeiro, invalid é falso, user@.com é falso. Rode testes após terminar."
Ajustar UI"Deixe esse dashboard mais bonito""[Cole o design] Implemente com base nisto, depois tire print do resultado, compare com o original, liste as diferenças e conserte-as."
Consertar Build"O build quebrou""O build deu este erro: [Cole o erro]. Conserte e verifique se o build passa. Resolva a causa raiz, não apenas esconda o erro."

Preste atenção na última frase: "Resolva a causa raiz, não apenas esconda o erro" — isso é algo que aprendi depois de algumas falhas. Sem essa frase, às vezes, por comodidade, ele envolvia o código com um try/except ou adicionava @ts-ignore para apagar as linhas vermelhas. O erro sumia, mas a doença raiz continuava lá.

Uso Avançado: /goal transforma os critérios de aceitação num "só saio quando estiver pronto". (Exige Claude Code v2.1.139 ou superior). Na conversa normal, o critério de aceitação vale para "uma rodada"; com o /goal, ele é fixado como o objetivo de toda a sessão — após cada rodada, um modelo menor (Haiku, por padrão) verificará suas condições novamente. Se não for atingido, ele iniciará outra rodada sozinho, sem devolver o controle para você, até que as condições sejam satisfeitas.

text
/goal todos os testes em test/auth estão passando, e o passo de lint está limpo

Há um detalhe crucial para não se frustrar ao usar /goal: aquele pequeno modelo avaliador apenas analisa o que o Claude "exibe" na conversa; ele não rodará comandos nem lerá arquivos por conta própria. Então, a condição deve ser comprovável pela saída do Claude — "testes de test/auth passaram" funciona porque o Claude realmente roda o teste e o resultado é impresso na conversa para o modelo avaliar. Se você colocar "a qualidade do código é alta", que não pode ser vista em uma saída, ele não terá como julgar.

💡 Resumo em uma frase: Dê a ele uma verificação de passou / falhou (testes, comparação de prints, exit code de builds), o ciclo se fecha sozinho; se quiser que ele "não pare até conseguir", use o /goal.


05 Princípio 4: Tarefas complexas, peça um plano antes de executar

Por último, a regra para o "trabalho pesado": Para mudanças amplas, em vários arquivos, ou onde nem você tem certeza do caminho, não o deixe codificar cegamente logo de cara — peça-lhe para listar um plano e libere a execução só depois que você dar uma olhada.

Fizemos um prelúdio disso no artigo 06 (Planos e Cobranças), e aqui veremos o porquê. A conclusão da documentação oficial é bem direta:

Fazer o Claude pular direto para a codificação pode produzir código que resolve o problema errado.

Em outras palavras, primeiro explore, depois planeje, e só então codifique — separe o "pensar" do "fazer" para evitar que ele corra a toda velocidade na direção errada; quando você notar, ele já terá mexido em dezenas de coisas.

Analogia: Reformas residenciais. Nenhum operário experiente pega o martelo e quebra uma parede de carga sem dizer uma palavra. Ele antes confirma com você: "quebrar essa parede, passar cabos aqui, mudar o encanamento", e só então ele começa a quebrar, após o seu ok. O plano é aquele desenho técnico que o Claude te entrega antes de começar a martelar — descobrir um erro no desenho custa algumas pinceladas, um custo infinitamente menor que refazer uma parede já demolida.

Como pedir para ele entregar o desenho técnico primeiro? Existem duas maneiras:

Método 1: Apenas diga "Não mude nada ainda". Em uma conversa normal, acrescente esta limitação:

text
Quero adicionar uma opção de modo escuro na página de configurações. Primeiro me diga quais arquivos você precisa alterar e qual é a ideia da modificação,
não altere nenhum código neste passo.

Método 2: Mude para o Plan Mode (Modo de Planejamento). Esta é a "marcha de planejamento somente-leitura" do Claude Code — ele lerá arquivos e propõe soluções, mas não salvará nada até você aprovar. Para entrar, pressione Shift + Tab (uma ou duas vezes) e a interface rodará entre default → acceptEdits → plan. Se você quiser o Plan Mode para apenas uma mensagem, não é necessário trocar a sessão inteira: adicione o prefixo /plan na frente da sua solicitação.

Mas a equipe oficial também dá um lembrete importante, não se empolgue planejando tudo:

Para tarefas pequenas com escopo claro (como arrumar erros de digitação, adicionar logs ou renomear variáveis), peça para o Claude executá-las diretamente. Quando não tiver certeza da abordagem, ou a mudança alterar vários arquivos ou quando não conhecer bem o código, o planejamento é mais útil. Se você consegue descrever o diff em uma frase, pule o plano.

O conselho prático final é a segunda metade: "Eu consigo descrever com uma frase como o código ficará depois disso?" Se sim, vai direto ao ponto; se travar, quer dizer que é complexo o suficiente para precisar de um plano primeiro. Usar Plan Mode para corrigir erro de digitação é puro teatro.

💡 Resumo em uma frase: Incerto / Vários arquivos / Código desconhecido → Peça um plano antes ("não mude ainda" ou Shift+Tab p/ Plan Mode); Se o diff der pra ser descrito numa frase, vá e faça logo.


06 Prática: A mesma necessidade, em duas formas diferentes

Não adianta só entender a teoria, vamos fazer um pequeno experimento que mostrará a diferença. Prepare um arquivo de brinquedo de 3 linhas; não dependeremos de um projeto real seu.

Passo 1: Crie um arquivo com uma armadilha (Mac / Linux)

bash
mkdir prompt-demo
cd prompt-demo
echo 'def average(nums):
    return sum(nums) / len(nums)' > stats.py

Usuários do Windows: digite os mesmos comandos mkdir prompt-demo e cd prompt-demo. Depois, abra o Bloco de Notas para criar o stats.py e cole as duas linhas nele.

A função tem uma falha: Ao passar uma lista vazia [], len(nums) será zero, o que dispara um crash "divisão por zero". Usaremos isso como cobaia.

Passo 2: Rode o Claude no diretório do projeto

bash
claude

Resultado Esperado: Surge a tela de boas-vindas com o campo de entrada no final.

Passo 3: Use primeiro uma "pergunta ruim" para ver como ele preenche as lacunas

text
@stats.py me ajuda a arrumar essa função

Resultado Esperado: O Claude muito provavelmente vai "adivinhar" o que você quer fazer — talvez adicionar anotações de tipo ou um docstring, mas não vai saber que a sua verdadeira preocupação é o crash com listas vazias. O rumo dependerá apenas da sorte. Esse é o custo de perguntas vagas: Ele toma decisões por você.

Passo 4: Use uma "boa pergunta" — Específico + Contexto + Critérios de Aceitação

text
A função average em @stats.py tem um bug: ela quebra com divisão por zero quando recebe uma lista vazia.
O comportamento esperado é que listas vazias retornem 0.
Conserte isso e adicione testes: average([]) deve ser 0, average([2, 4]) deve ser 3.
Rode os testes após criar e verifique que passaram.

Resultado Esperado: Desta vez, a cadeia de ações do Claude será cristalina — encontra a ramificação da lista vazia → adiciona checagem para retornar 0 → escreve os dois testes que você especificou → roda os testes → mostra para você que passaram. Ele não adivinha o que você quer porque você delimitou tudo: onde alterar, o que virar e como provar sucesso.

Passo 5: Saia e confirme a alteração no arquivo

bash
cat stats.py

(Windows PowerShell usa type stats.py)

Resultado Esperado: stats.py terá a verificação de lista vazia (algo como if not nums: return 0). Como isso coincide com seu pedido no passo 4 = Você atingiu o domínio de "falar de forma clara".

Colocando os dois pedidos lado a lado, a diferença é brutal:

Passo 3 ❌ Pergunta RuimPasso 4 ✅ Boa Pergunta
Mudar o quêNão dito, chuta o arquivo inteiroApontada função average
Para comoNão dito, inventou sozinhoRetornar 0 se lista for vazia, definido
Como ser sucessoSem métrica, ele decide ao "sentir" que concluiuDois testes + Rodar e testar
A sua experiênciaOlhar para os diffs pensando "não é isso que eu queria"Sabe a direção desde o começo, resolve de primeira

💡 Resumo em uma frase: No mesmo arquivo, no mesmo bug, uma pergunta ruim faz o Claude tomar decisões por você, uma boa deixa tudo bem delimitado (onde, o que, verificação) — Teste você mesmo, a diferença é mais intuitiva do que ouvir os princípios mil vezes.


07 Conclusão

Este artigo abordou apenas um aspecto: como tornar um pedido tão preciso a ponto de o Claude pegá-lo facilmente.

São quatro princípios, e se você não conseguir lembrar de todos, lembre-se desta tabela:

PrincípioResumo de Uma FraseComo Aplicar
Específico > VagoEscopo, restrições e referência claros"Mude average, sem biblioteca nova, no estilo xxx"
Dar ContextoNunca descreva o que puder colar@arquivo, jogar traceback, prints de erro
Critérios AceitáveisPermita que ele avalie "se conseguiu ou não" sozinhoCasos de teste, rodar os testes, testar com /goal
Plano AntesNão deixe que a parede seja demolida sem desenho técnico"Não escreva código ainda", usar Plan Mode

O que você deve saber agora: Você já é capaz de traduzir a requisição frouxa "me ajuda aí a arrumar isso" em um pedido que o Claude pode atender — definindo escopo, preenchendo contexto, dando um objetivo mensurável, e pedir um plano antecipado para ações mais pesadas. Estes padrões são "a sua energia interior" que embasam toda ação do Claude Code a partir de agora. — Ferramentas mirabolantes não farão milagres com solicitações péssimas.

Um pequeno exercício reverso para reflexão: Dado que "explicar com precisão" é tão importante, há certos padrões ou políticas, (por exemplo, "nunca usar nova biblioteca neste projeto" ou "todos os testes vão no diretório tests/"), que deverão ser repetidas toda vez? Haveria um modo de fazer o Claude "lembrar" delas, e poupar o esforço de repetí-las constantemente?


No próximo artigo 16 "Fluxos de Trabalho Comuns" — Você acabou de aprender os padrões universais para "explicar os comandos", e é chegada a hora de testá-los em cenários super frequentes: navegar num projeto desconhecido, refatorar código, corrigir bugs, ou implementar testes. Veremos padrões infalíveis que você pode simplesmente usar para suas necessidades diárias. Tem o princípio, hora do treinamento.


Leitura Recomendada