Eu começaria com a citação:
“se a única ferramenta que você tem é um martelo, você trata tudo como um prego”. (Abraham Maslow)
O princípio mais importante, IMO, é conhecer os mais diversos paradigmas de programação, linguagens e informar-se bem sobre as ferramentas à sua disposição. Qualquer problema pode ser resolvido em quase qualquer idioma que você escolher, seja em uma linguagem mainstream completa com sua enorme biblioteca padrão ou em uma pequena linguagem especializada como AutoHotKey. A primeira tarefa do programador é determinar o que usar de acordo com a especificação do problema. Alguns conceitos fornecem uma melhor abordagem ao tópico, seja qual for o seu objetivo principal - sofisticação, ofuscação, desempenho, portabilidade, manutenção, tamanho de código pequeno ...
Caso contrário, você terminará como alguns dos programadores que tentam desesperadamente fazer algo em uma linguagem que eles se especializaram, embora o problema possa ser trivial de resolver em diferentes contextos de programação.
Este conselho vai junto com a tendência atual para projetos multilíngues (tome os aplicativos da web, por exemplo, que podem envolver várias linguagens em um único aplicativo, como C #, JS, CSS, XPath, SQL, XML, HMTL, RegExp .... e até mesmo diferentes paradigmas de programação (por exemplo, C # introduziu recentemente alguns conceitos de paradigmas de programação funcional, lambdas).
Então, o básico é o aprendizado constante, para sempre :)