
A integração está quase pronta quando alguém abre um arquivo real do fornecedor. O identificador do produto perde zeros à esquerda, algumas linhas se repetem e a quantidade negativa significa devolução em um sistema, erro no outro. A equipe construiu a tela, escolheu o banco e escreveu um agendador sem verificar o significado dos dados que sustentavam o plano.
Esse fracasso fictício ajuda a explicar por que recomendo The Pragmatic Programmer. Seu interesse está em melhorar decisões durante o desenvolvimento: investigar hipóteses, obter retorno do sistema e reduzir o custo de corrigir a direção. O benefício depende de transformar conselhos memoráveis em experimentos específicos. Repetir a palavra "pragmático" não esclarece qual risco foi investigado nem por que uma solução é adequada.
Esta resenha trata de The Pragmatic Programmer: Your Journey to Mastery, de David Thomas e Andrew Hunt, edição de vinte anos, segunda edição, publicada em 2019, ISBN 9780135957059. O catálogo da Addison-Wesley/InformIT a identifica como revisão da obra de 1999, com novos tópicos e exemplos. Não é uma avaliação da primeira edição.
A organização em assuntos relativamente independentes favorece uma leitura acompanhada de trabalho real. Você pode estudar uma ideia, experimentá-la e retornar com uma dúvida mais precisa. Minha recomendação é resistir ao impulso de transformar a sequência de conselhos em uma lista de itens obrigatórios para qualquer projeto. O mérito da variedade está em oferecer perguntas diferentes para problemas diferentes, incluindo ferramentas, testes, requisitos e coordenação.
Entre as ideias discutidas aqui, considero especialmente úteis o cuidado com conhecimento duplicado, a independência entre partes e a distinção entre aprender com um protótipo e construir uma primeira versão que permanecerá no sistema. Elas se conectam por uma preocupação: quanto esforço uma suposição errada nos obrigará a refazer?
O trecho oficial sobre DRY esclarece que duplicação envolve conhecimento e intenção, podendo atravessar código e documentação. Os autores inclusive reconhecem que a formulação anterior permitiu uma leitura restrita a copiar e colar código. Essa precisão é uma razão concreta para prestar atenção à edição revisada.
Considere uma aplicação que aceita lotes com no máximo mil linhas. Se a tela, o importador e o manual registram esse mesmo limite de maneira independente, uma mudança exige lembrar três lugares. Um contrato compartilhado ou documentação gerada pode reduzir inconsistência. A pergunta é qual representação tem autoridade e como as demais são derivadas ou verificadas.
Já dois validadores que hoje aceitam a mesma sequência de caracteres podem ter razões diferentes. Um trata de códigos de produto; outro, de identificadores de clientes. Unificá-los porque o texto se parece pode obrigar as duas áreas a evoluir juntas. Eu manteria a repetição enquanto a identidade do conhecimento não estivesse demonstrada. O custo de uma abstração errada também aparece nas próximas mudanças.
Esse raciocínio alcança testes. Se o teste obtém seu resultado esperado chamando a própria função que deveria verificar, ele pode repetir o erro de forma consistente. Alguns exemplos de aceitação precisam de valores escolhidos de maneira independente. Centralizar a regra não deve eliminar toda oportunidade de perceber que ela foi implementada incorretamente.
A lista de dicas autorizada da edição de vinte anos apresenta independência entre partes, abertura à mudança e verificação de hipóteses. Minha aplicação de ortogonalidade seria observar se trocar o formato de entrada exige alterar decisões sem relação com esse formato. Um novo separador no arquivo de estoque não deveria modificar a autorização de quem importa.
Isso pode justificar separar leitura de arquivo, validação comercial e apresentação do resultado. A separação tem custo, portanto eu verificaria se cada parte realmente esconde uma decisão. Colocar a mesma sequência em cinco classes que compartilham estado global dificilmente oferece independência. O critério é a propagação da mudança, não a quantidade de caixas no desenho.
Reversibilidade também precisa incluir dados e usuários. Trocar um parser antes de importar qualquer lote é diferente de corrigir milhares de registros já publicados. A escolha do banco pode ser revisada, mas a migração cobra trabalho, compatibilidade e risco. Eu traduziria o conselho em preparar amostras, versionar contratos e adiar efeitos difíceis de desfazer até entender melhor o comportamento. Manter opções abertas custa menos quando a equipe conhece o ponto em que elas se tornam caras.
Os autores explicam protótipos e uma estrutura mínima que atravessa o sistema em The Art in Computer Programming, texto de 2001 que antecede a edição avaliada. Uso essa referência para esclarecer uma distinção que também aparece na organização da segunda edição: um experimento para aprender pode ser descartado; um tracer bullet estabelece um caminho que será ampliado.
No exemplo do fornecedor, um script isolado pode verificar se o parser preserva identificadores em arquivos de teste. Uma amostra sintética permite controlar entradas, sem autenticação nem agendamento. Para investigar a codificação e o formato usados pelo fornecedor, seria necessária uma amostra representativa dele ou um contrato confirmado. O resultado útil é registrar o que cada experimento permite concluir. Isso não torna o script candidato automático a serviço de produção.
Uma primeira fatia que permanecerá precisa de outro cuidado. Ela atravessa recebimento, interpretação, validação e apresentação, com escopo estreito e comportamento verificável. Pode aceitar apenas um formato e um tipo de item, mas não deveria depender de atalhos que a equipe pretende esquecer. Confundir pequeno com provisoriamente inseguro é uma maneira de carregar o protótipo para produção sem admitir a decisão.
Eu escreveria no início do trabalho qual dos dois estamos fazendo, o que esperamos descobrir e quem decide o próximo passo. Essa informação evita que uma demonstração visualmente convincente se transforme em promessa de entrega completa.
Produtos gratuitos e pagos para transformar ideias em uma base que você consegue executar.
13 produtos disponíveisContinue explorando tópicos similares

Resenha crítica de The Clean Coder: estimativas, negociação, testes e responsabilidade, com um caso concreto e limites para cobranças individuais.

Uma leitura crítica de Cal Newport sobre concentração, trabalho de engenharia e limites de disponibilidade em equipes reais.

Aplique Michael Nygard a timeouts, isolamento e recuperação com um exercício de falha controlada.
Checklist de 47 pontos para encontrar bugs, riscos de segurança e problemas de performance antes do lançamento.
Templates testados em produção, usados por desenvolvedores. Economize semanas de setup no seu próximo projeto.
O cenário a seguir é original e didático. Um fornecedor envia um CSV para atualizar quantidades. A equipe ainda precisa confirmar se a quantidade representa saldo atual ou variação, se os códigos diferenciam letras maiúsculas e se identificadores repetidos são correções ou erros. Essas perguntas afetam o significado da importação e precisam de resposta do responsável pelo contrato de dados.
A primeira experiência descartável verifica apenas como ler uma amostra sem alterar o texto dos identificadores. Depois, supondo que o contrato confirme saldo atual e códigos exatos, a equipe constrói uma fatia mantida: receber um arquivo pequeno, validar e mostrar uma prévia em uma área de preparação. Ela não publica mudanças no estoque real.
Para esse exercício, combinamos regras explícitas: quantidades negativas são inválidas; um código repetido no mesmo arquivo invalida o lote; uma repetição do mesmo lote não cria outra prévia. São decisões deste cenário, não recomendações universais para importadores.
| Entrada do exercício | Resultado observável esperado |
|---|---|
Uma linha com código 00017 e quantidade 5 | Prévia mostra exatamente 00017, incluindo os zeros, com saldo proposto de 5 |
Uma linha com quantidade -1 | Lote rejeitado com motivo; nenhuma publicação |
Duas linhas com código A-17 | Lote rejeitado por código repetido |
| Reenvio do mesmo lote já preparado | Nenhuma prévia adicional; resultado anterior identificado |
Percorrer esses casos expõe questões que uma tela sem integração não demonstraria: identificação do lote, mensagens de erro, preservação de códigos e local onde fica o estado. O operador pode confirmar se a prévia expressa a decisão que ele precisa tomar. Se o significado do saldo estava errado, a equipe descobre antes de automatizar uma alteração real.
Essa fatia continua longe de um importador completo. Faltam limites de tamanho, concorrência, retenção, autorização de publicação e recuperação após falha, além da validação com volume representativo. A aceitação inicial comprova apenas o recorte combinado. A decisão de expandir deve indicar qual incerteza será tratada em seguida, em vez de adicionar recursos porque já estavam no planejamento original.
Também é útil descobrir que a fatia proposta não responde à pergunta. Um teste local do parser não comprova a confiabilidade da entrega do fornecedor. O experimento precisa alcançar a dependência cujo comportamento importa ou declarar que sua evidência não a cobre.
Eu automatizaria a reprodução desses casos depois de entender o contrato. Um comando de verificação pode carregar arquivos controlados, conferir resultados e terminar com uma falha explícita quando uma expectativa não se cumpre. Outra pessoa precisa conseguir executá-lo com as dependências documentadas. Um comando que só funciona com caminhos privados e dados esquecidos na máquina do autor oferece pouco retorno confiável.
O framework pode ajudar com convenções, ferramentas de teste e geração de código. Adotar essas facilidades pode ser mais simples que criar uma estrutura independente para cada detalhe. Eu verificaria o que é gerado, qual arquivo deve ser editado e como reproduzir a geração. Editar manualmente saídas derivadas costuma criar duas versões de um mesmo conhecimento.
Para efeitos permanentes, automação exige limites próprios. Repetir uma leitura de amostra é diferente de repetir uma atualização de estoque. O fluxo precisa distinguir preparação e publicação, identificar operações e deixar rastros suficientes para investigar falhas. Retorno rápido só é útil quando a equipe compreende o que executou e consegue relacionar o resultado à hipótese que pretendia avaliar.
A forma de apresentar ideias em frases curtas ajuda a lembrá-las, mas também facilita retirar condições do contexto. DRY pode virar uma ordem para unir validadores independentes. Reversibilidade pode parecer uma promessa de troca barata. Automação pode justificar investir dias em uma tarefa rara. Esses resultados seriam aplicações ruins, mas o leitor precisa fazer trabalho adicional para evitá-los.
Minha principal ressalva é a distância entre um conselho geral e uma decisão situada. Qual volume torna o experimento representativo? Qual integração pode ser substituída sem perder semântica? Quem aceita o custo de uma migração? O repertório do livro melhora essas perguntas, mas não entrega suas respostas para uma aplicação específica. Equipes precisarão de conhecimento do domínio e das restrições do ambiente.
Também há limites para a responsabilidade individual. Uma pessoa pode sugerir uma fatia pequena, mas permissões, orçamento, ambiente de teste e prioridades dependem de outras decisões. Eu não usaria o livro para avaliar a dedicação de quem não consegue mudar sozinho esse sistema de trabalho. Recomendações sobre hábitos precisam vir acompanhadas das condições para praticá-los.
Recomendo esta edição para quem já escreve programas pequenos, usa controle de versão e consegue acompanhar testes básicos. Ter uma tarefa em andamento oferece material para experimentar. Quem tem mais experiência pode usá-la para revisar hábitos que se tornaram automáticos. Quem ainda luta com sintaxe provavelmente aproveitará mais ao construir essa base antes de tentar aplicar vários princípios simultaneamente.
Na série, Clean Code concentra a discussão na compreensão do código; aqui, a pergunta também envolve como descobrir que estamos construindo a coisa errada. Refactoring é uma continuação útil quando você identifica a mudança necessária e quer conduzi-la com passos controlados. Accelerate ajuda a ampliar a conversa para capacidade de entrega e condições organizacionais, evitando tratar todo atraso como falha de hábito pessoal.
Escolha dois tópicos ligados ao seu trabalho atual e registre uma pergunta antes de ler. No caso da importação, poderia ser "estamos repetindo conhecimento ou apenas sintaxe?" e "precisamos aprender sobre formato ou estabelecer um fluxo mantido?". Depois defina uma experiência pequena, sua evidência esperada e a decisão que ela deve orientar. Volte ao texto com os custos e as dúvidas que surgiram.
Meu veredito é recomendar o livro pela variedade de critérios que oferece para examinar o próprio trabalho. A edição revisada merece atenção especial pela clareza sobre DRY e pela oportunidade de confrontar conselhos conhecidos com problemas atuais. O ganho aparece quando uma hipótese é exposta antes de um efeito caro, uma abstração desnecessária é evitada ou um resultado fica mais fácil de reproduzir. São consequências que uma equipe consegue observar.