Comincerei con la citazione:
"se l'unico strumento che hai è un martello, tratti tutto come un chiodo". (Abraham Maslow)
Il principio più importante, IMO, è conoscere molti paradigmi e linguaggi di programmazione diversi e informarsi bene sugli strumenti a disposizione. Qualsiasi problema può essere risolto in quasi tutte le lingue che scegli, sia che si tratti di un linguaggio tradizionale in piena regola con la sua enorme libreria predefinita o di un piccolo linguaggio specializzato come AutoHotKey. Il primo lavoro del programmatore è determinare cosa usare in base alle specifiche del problema. Alcuni concetti forniscono un approccio migliore all'argomento, qualunque sia il tuo obiettivo principale: raffinatezza, offuscamento, prestazioni, portabilità, manutenzione, dimensioni del codice ridotte ...
Altrimenti finirai come alcuni programmatori che cercano disperatamente di fare qualcosa in un linguaggio da loro specializzato, mentre il problema potrebbe essere banale da risolvere in diversi contesti di programmazione.
Questo consiglio va di pari passo con la tendenza odierna per i progetti multilingue (prendi ad esempio le applicazioni web, che possono coinvolgere più linguaggi in una singola applicazione, come C #, JS, CSS, XPath, SQL, XML, HMTL, RegExp ... e persino diversi paradigmi di programmazione (ad esempio, C # ha introdotto recentemente alcuni concetti dai paradigmi di programmazione funzionale, lambda).
Quindi, la cosa fondamentale è l'apprendimento costante, per sempre :)