Je commencerais par la citation:
"si le seul outil dont vous disposez est un marteau, vous traitez tout comme un clou". (Abraham Maslow)
Le principe le plus important, IMO, est de connaître de nombreux paradigmes de programmation, de langages et de bien vous informer sur les outils à votre disposition. Tout problème peut être résolu dans presque toutes les langues de votre choix, qu'il s'agisse d'un langage grand public complet avec son énorme bibliothèque par défaut ou d'un petit langage spécialisé comme AutoHotKey. Le premier travail du programmeur est de déterminer ce qu'il faut utiliser en fonction de la spécification du problème. Certains concepts offrent une meilleure approche du sujet, quel que soit votre objectif principal - sophistication, obscurcissement, performances, portabilité, maintenance, petite taille de code ...
Sinon, vous finirez comme certains programmeurs qui essaient désespérément de faire quelque chose dans un langage 1 qu'ils se sont spécialisés, alors que le problème pourrait être trivial à résoudre dans différents contextes de programmation.
Ce conseil va de pair avec la tendance actuelle pour les projets multilingues (prenez les applications web par exemple, qui peuvent impliquer plusieurs langages dans une seule application, comme C #, JS, CSS, XPath, SQL, XML, HMTL, RegExp .... et même différents paradigmes de programmation (par exemple, C # a récemment introduit des concepts issus de paradigmes de programmation fonctionnelle, lambdas).
Donc, la chose de base est un apprentissage constant, pour toujours :)