Viny, algumas vezes eu discordo dessa opnião, por exemplo qual a vantagem de se programar para a interface? Você além de menor acoplamento, vc tem mais segurança na alteração de uma classe, porém o que a gente ve por ai, é o uso de interfaces que não servem para nada, qual a vantagem de se ter uma interface no seu sistema? Abstrair a informação, permitir que você possa alterar sua implementação, por exemplo de um DAO, para Hibernate, JDBC, sei la qualquer outra coisa, mas por exemplo, em um framework como o Spring, para a Interface ClienteDAO, devemos ter única e exclusivamente uma implementação para ser injetada pelo container, c vc quiser alterar, ou vc altera XML, annotations e talz, então ai me pergunto qual a vantagem de se utilizar nesse modo? É logico que com a interface você mantem as duas classes simultaneamente, ou seja metodo novo, deve ser implementado para as duas, mas se eu quiser mudar o new para essa classe? Sobrescreever o objeto concreto pelo novo?
Em se falando em manutenção é mais simples, mas eis que surge a dúvida, dificilmente essa abordagem é utilizada em sistemas reais, o que vemos são um apunhado de interfaces com seus impl e nada mais, somente retrabalho, ou trabalho dobrado, em alguns casos acho que andam abusando disso.
Minha Humilde opnião.