I often hear that a real programmer can easily learn any language within a week. Languages are just tools for getting things done, I'm told. Programming is the ultimate skill that must be learned and mastered.

How can I make sure that I'm actually learning how to program rather than simply learning the details of a language? And how can I develop programming skills that can be applied towards all languages instead of just one? 

Don't worry about meeting some ridiculous concept of "skill" so commonly heard in such statements like:


All programming languages are basically the same.
Once you pick up one language well you can pick up any other language quickly and easily.
Languages are just tools, there's some overarching brain-magic that actually makes the software.


These statements are all based on a flawed premise and betray a lack of experience across a broader spectrum of programming languages. They are very common statements and strongly believed by a great swath of programmers, I won't dispute that, but I will dispute their accuracy.

This is proved simply: Spend one week (or really any amount of time greater than a couple days) trying to learn the fundamentals of Haskell, Prolog, or Agda. You will soon after start hearing the old Sesame Street song play in your head "One of these things is not like the others...".

As it turns out, there is a whole swath of programming languages, techniques, and approaches which are so foreign from what 95% of us do or have ever done. Many are completely unaware that any of these other concepts even exist, which is fine and these concepts aren't necessary to be an employed and even effective programmer.

But the fact remains: These techniques and approaches do exist, they are good for many different things and can be very useful, but they are not just like what you're used to and people cannot simply pick them up with an afternoon of fiddling.

Furthermore, I would say the majority of cases where people claim they have or can learn such complex things as programming languages so quickly as a week, they are suffering from a bit of Dunning Kruger Effect, Wikipedia (emphasis mine):


  The Dunning–Kruger effect is a cognitive bias in which unskilled
  individuals suffer from illusory superiority, mistakenly rating their
  ability much higher than average. This bias is attributed to a
  metacognitive inability of the unskilled to recognize their
  mistakes.


I would refer people to this more experienced perview on the concept of learning to program by Peter Norvig: Learn to program in ten years.


  Researchers (Bloom (1985), Bryan & Harter (1899), Hayes (1989), Simmon
  & Chase (1973)) have shown it takes about ten years to develop
  expertise in any of a wide variety of areas, including chess playing,
  music composition, telegraph operation, painting, piano playing,
  swimming, tennis, and research in neuropsychology and topology. The
  key is deliberative practice: not just doing it again and again, but
  challenging yourself with a task that is just beyond your current
  ability, trying it, analyzing your performance while and after doing
  it, and correcting any mistakes. Then repeat. And repeat again.




Surely, there is a set of overarching principles that will make all languages easy to learn!

Perhaps, but I would argue this set of principles is so large that there will almost always be languages outside of your one-week reach. As you add new concepts to the list you're familiar and comfortable with, this list of languages outside your immediate reach may shrink, but I have a hard time believing it will ever go away. The list of conceptual computing approaches to things is so broad it's baffling, from concatenative languages to vector based languages to languages specializing in AI or metaprogramming (or languages which exist entirely to support regular expressions).

After ten years you will be able to generally program. This means you can write somewhat decent code in some language or style of languages. So after 10 years you are ready to start tackling these countless broad cross-cutting concepts for the rest of your life, and short of being Edsger W. Dijkstra, Donald Knuth or John D. Carmack, you're not going to get to all of them.
