YAGNI: O princípio que evita código desnecessário e arquiteturas complexas
Durante a evolução de um software, é comum cair na tentação de preparar o sistema para um futuro que talvez nunca aconteça. Criamos interfaces para apenas uma implementação, abstrações para um único caso de uso e arquiteturas capazes de suportar milhões de usuários em uma aplicação acessada por algumas dezenas de pessoas.
É justamente contra esse tipo de desperdício que surge o YAGNI.
Seu nome vem da expressão You Aren't Gonna Need It, que pode ser traduzida como "Você não vai precisar disso". O princípio nasceu dentro da metodologia Extreme Programming (XP), criada por Kent Beck, e defende uma ideia simples:
Implemente apenas aquilo que é necessário hoje. O restante deve esperar até existir uma necessidade real.
Embora pareça um princípio voltado apenas para programação, o YAGNI influencia decisões de arquitetura, design, modelagem de banco de dados e até planejamento de produto.
A origem do YAGNI
O conceito surgiu durante o desenvolvimento do projeto C3, onde Kent Beck frequentemente respondia às sugestões de implementar funcionalidades futuras com a frase:
"You aren't gonna need it."
Com o tempo, essa frase tornou-se um dos pilares do Extreme Programming (XP), incentivando equipes a evitar funcionalidades especulativas e focar na entrega contínua de valor.
O problema da programação especulativa
Imagine que você esteja desenvolvendo um sistema de autenticação.
Hoje, a única necessidade é login utilizando e-mail e senha.
Mesmo assim, você pensa:
- Talvez no futuro exista login com Google;
- Talvez exista login com Microsoft;
- Talvez exista autenticação LDAP;
- Talvez exista autenticação via SAML.
Então você cria uma arquitetura extremamente flexível.
AuthProvider
├── EmailProvider
├── GoogleProvider
├── MicrosoftProvider
├── FacebookProvider
├── LdapProvider
└── SamlProvider
Depois de um ano, o sistema continua utilizando apenas login por e-mail.
Todo o restante do código:
- nunca foi utilizado;
- precisou ser mantido;
- aumentou a complexidade;
- aumentou o tempo de desenvolvimento.
Isso é exatamente o que o YAGNI procura evitar.
Como aplicar o YAGNI
O princípio é bastante simples:
Resolva apenas o problema atual.
Se hoje existe apenas uma forma de autenticação, implemente apenas essa.
Quando surgir uma nova necessidade, evolua a solução através de refatoração.
Em vez de pensar:
"E se um dia precisarmos disso?"
Pergunte:
"Existe algum requisito que exija isso hoje?"
Se a resposta for não, provavelmente essa implementação pode esperar.
Exemplos práticos
Exemplo 1 — Interface desnecessária
Errado:
interface PaymentGateway {
process(): void
}Com apenas uma implementação:
PixGateway
Não existe benefício em criar uma abstração quando há apenas um caso concreto.
Melhor solução:
class PixGateway {
process() {}
}Quando surgir um segundo gateway (cartão, boleto etc.), aí sim faz sentido extrair uma interface.
Exemplo 2 — Microserviços prematuros
Imagine uma startup com apenas dois desenvolvedores.
Mesmo assim, o projeto nasce dividido em:
- Auth Service
- User Service
- Payment Service
- Notification Service
- Inventory Service
Tudo rodando em Kubernetes.
Enquanto isso, o sistema possui apenas cinco telas.
Essa arquitetura provavelmente viola o YAGNI.
Um monólito modular seria muito mais simples, barato e fácil de manter.
Exemplo 3 — React
Você precisa apenas de um botão.
Em vez disso cria:
<Button
variant="primary"
animation
loading
rounded
iconLeft
iconRight
elevation
size="xl"
/>
Mesmo que o projeto utilize apenas:
<Button>
Salvar
</Button>
Esse tipo de excesso aumenta a complexidade sem gerar valor.
YAGNI não significa escrever código descartável
Um erro bastante comum é interpretar o princípio como:
"Faça qualquer coisa, depois você resolve."
Não é isso.
Você deve escrever código com qualidade:
- nomes claros;
- responsabilidades bem definidas;
- testes;
- baixo acoplamento;
- boa legibilidade.
A diferença é que você não implementa funcionalidades ou abstrações sem necessidade comprovada.
O próprio Kent Beck ressalta que o YAGNI é uma questão de timing, não um argumento contra design ou arquitetura.
Benefícios do YAGNI
Aplicar esse princípio gera diversas vantagens:
- código menor;
- menor custo de manutenção;
- menos bugs;
- entregas mais rápidas;
- menos testes desnecessários;
- arquitetura mais simples;
- menor custo de evolução.
Além disso, sistemas menores costumam ser muito mais fáceis de compreender por novos desenvolvedores.
Quando o YAGNI não deve ser aplicado?
O YAGNI não significa ignorar requisitos conhecidos.
Se existe uma demanda aprovada para o próximo mês, faz sentido preparar a arquitetura.
Da mesma forma, requisitos não funcionais conhecidos também precisam ser considerados desde o início, como:
- alta disponibilidade;
- escalabilidade prevista;
- requisitos legais;
- segurança;
- auditoria.
O erro está em desenvolver funcionalidades para cenários puramente hipotéticos.
YAGNI x KISS x DRY x SOLID
Esses princípios são frequentemente utilizados juntos.
YAGNI -> Não implemente funcionalidades antes de elas serem necessárias.
KISS -> Escolha sempre a solução mais simples que resolva o problema.
DRY -> Evite duplicação de conhecimento e lógica.
SOLID -> Produza um software flexível, coeso e de fácil manutenção.
O YAGNI complementa os demais ao impedir que abstrações prematuras tornem o sistema mais complexo do que o necessário.
Conclusão
O YAGNI é um lembrete de que a maioria das previsões sobre o futuro de um software está errada. Em vez de gastar tempo implementando funcionalidades que talvez nunca sejam usadas, concentre-se em entregar valor agora, mantendo o código simples e preparado para evoluir por meio de refatorações.
Arquiteturas elegantes não são aquelas que resolvem todos os problemas imagináveis, mas sim as que resolvem muito bem os problemas atuais e conseguem evoluir conforme novas necessidades surgem.
Como costuma acontecer em engenharia de software, a simplicidade quase sempre é a decisão mais difícil — e também a mais valiosa.
Saiba mais
Martin Fowler — YAGNI — Explicação detalhada do princípio, sua origem e exemplos de aplicação.
Martin Fowler — Extreme Programming — Introdução à metodologia XP e às práticas que deram origem ao YAGNI.
Martin Fowler — Beck Design Rules — As quatro regras de design simples propostas por Kent Beck.