Practice contest programming (e.g. Project Euler to start, but look for other options) while/after studying Introduction to algorithms (CLRS). This will teach you basic “just do it” skills and give ability to solve deep algorithmic problems and feel the outline of computational complexity of any given solution.
After you get a bit of experience with getting things done, read Structure and Interpretation of Computer Programs (SICP). It will teach you to represent complicated ideas in code and not get lost (which includes skills that subsume a lot of what’s referred to by OOP, design patterns, etc., although it’s useful to know that language as well). Together with CLRS it’ll form the basis of theoretical side of your technical competence.
In the beginning, don’t worry about programming languages or APIs. Don’t waste time learning all the tiny details or system-specific coding advice, there is too much of low-hanging fruit in general flexible skills that would apply to any language or system. Just know enough to express whatever you want to express (but do look for standard ways of doing things before reinventing specific wheels), and get a lot of practice.
Work on a big project you didn’t write, using APIs you didn’t know. It’ll teach you to figure out your way around originally unknown territory, and to modify the code in the way that doesn’t disrupt its (always less than optimal) structure and conventions.
In time (but don’t rush it), pick up more things from, for example, books on this list. Getting to that too early is a bit dangerous, since you won’t be able to tell good advice from bad, will waste time and attention developing worthless skills, and the good advice can be over your head, impossible to correctly interpret and benefit from the way you’d be able to after having enough experience.
Also, there is a free online version of the wizard book (which is the nickname for the Structure and Interpretation of Computer Programs based on the cover with the guy in a crazy turban with the lambda symbol in the flash of light next to him).
If you want to jump in directly, my recommendation would be to download a Lisp or Scheme interpreter (like Gauche, for example), fire it up, and then read through the wizard book, typing in all the example code by hand. In my experience, practicing the manual production of code is critical to developing fluency.
Finally, I kind of feel bad about recommending this without a half-warning… Functional programming is beautiful, but depending on where you live and the rest of your educational background, it may be relatively hard to use it to pay the bills and you might be setting yourself up to always be dissatisfied with the tools you actually use day to day. Lisp has a minor reputation for appealing to a certain kind of person who is really smart and technically proficient, but not necessarily the best team player. I’m not sure, but I suspect the rarity of Lisp jobs is related to this.
If you want to earn money from coding, it may be better for you to learn a general programming language like C++, Java, Python, C#, Ruby, or maybe Erlang (which is rare, but has relatively high paying jobs because the coding for it is frequently associated with critical and expensive machinery like telephone networks). SQL is another kind of “code” that isn’t really a full blown programming language, but that can be useful for set processing using a language inspired by predicate logic.
A sensible piece of general advice: How to be a Programmer by Robert L. Read.
Practice contest programming (e.g. Project Euler to start, but look for other options) while/after studying Introduction to algorithms (CLRS). This will teach you basic “just do it” skills and give ability to solve deep algorithmic problems and feel the outline of computational complexity of any given solution.
After you get a bit of experience with getting things done, read Structure and Interpretation of Computer Programs (SICP). It will teach you to represent complicated ideas in code and not get lost (which includes skills that subsume a lot of what’s referred to by OOP, design patterns, etc., although it’s useful to know that language as well). Together with CLRS it’ll form the basis of theoretical side of your technical competence.
In the beginning, don’t worry about programming languages or APIs. Don’t waste time learning all the tiny details or system-specific coding advice, there is too much of low-hanging fruit in general flexible skills that would apply to any language or system. Just know enough to express whatever you want to express (but do look for standard ways of doing things before reinventing specific wheels), and get a lot of practice.
Work on a big project you didn’t write, using APIs you didn’t know. It’ll teach you to figure out your way around originally unknown territory, and to modify the code in the way that doesn’t disrupt its (always less than optimal) structure and conventions.
In time (but don’t rush it), pick up more things from, for example, books on this list. Getting to that too early is a bit dangerous, since you won’t be able to tell good advice from bad, will waste time and attention developing worthless skills, and the good advice can be over your head, impossible to correctly interpret and benefit from the way you’d be able to after having enough experience.
The video lectures for both of the books recommended by Vladimir are available on MIT’s OpenCourseWare:
Introduction to Algorithms
Structure and Interpretation of Computer Programs
Neat online classes! I didn’t know about those.
Also, there is a free online version of the wizard book (which is the nickname for the Structure and Interpretation of Computer Programs based on the cover with the guy in a crazy turban with the lambda symbol in the flash of light next to him).
If you want to jump in directly, my recommendation would be to download a Lisp or Scheme interpreter (like Gauche, for example), fire it up, and then read through the wizard book, typing in all the example code by hand. In my experience, practicing the manual production of code is critical to developing fluency.
Finally, I kind of feel bad about recommending this without a half-warning… Functional programming is beautiful, but depending on where you live and the rest of your educational background, it may be relatively hard to use it to pay the bills and you might be setting yourself up to always be dissatisfied with the tools you actually use day to day. Lisp has a minor reputation for appealing to a certain kind of person who is really smart and technically proficient, but not necessarily the best team player. I’m not sure, but I suspect the rarity of Lisp jobs is related to this.
If you want to earn money from coding, it may be better for you to learn a general programming language like C++, Java, Python, C#, Ruby, or maybe Erlang (which is rare, but has relatively high paying jobs because the coding for it is frequently associated with critical and expensive machinery like telephone networks). SQL is another kind of “code” that isn’t really a full blown programming language, but that can be useful for set processing using a language inspired by predicate logic.