Meus dois centavos para tal e velha pergunta
Algumas pessoas já mencionaram, praticam e refatoram. Acredito que a ordem certa para aprender sobre padrões é esta:
- Learn Test Driven Development (TDD)
- Aprender refatoração
- Aprenda padrões
A maioria das pessoas ignora 1, muitas acreditam que podem fazer 2 e quase todo mundo vai direto para 3.
Para mim, a chave para melhorar minhas habilidades de software foi aprender TDD. Pode levar um longo tempo de codificação lenta e dolorosa, mas escrever seus testes primeiro certamente o faz pensar muito em seu código. Se uma classe precisa de muito clichê ou quebra facilmente, você começa a perceber cheiros ruins muito rapidamente
O principal benefício do TDD é que você perde o medo de refatorar seu código e o força a escrever classes altamente independentes e coesas. Sem um bom conjunto de testes, é doloroso demais tocar em algo que não está quebrado. Com a rede de segurança, você realmente se aventura em mudanças drásticas no seu código. Esse é o momento em que você pode realmente começar a aprender com a prática.
Agora chega o momento em que você deve ler livros sobre padrões e, na minha opinião, é uma completa perda de tempo tentando demais. Eu só entendi muito bem os padrões depois de perceber que fiz algo semelhante, ou poderia aplicar isso ao código existente. Sem os testes de segurança ou hábitos de refatoração, eu teria esperado até um novo projeto. O problema do uso de padrões em um projeto novo é que você não vê como eles afetam ou alteram um código em funcionamento. Só entendi um padrão de software depois de refatorar meu código em um deles, nunca quando introduzi um novo no meu código.