the first foundation that you really want to learn for programming is logical progression.
where do you start,
is there a deciscion to be made.
where do you go when a user answers yes to a question, what about if they answer no.
do you need to perform an action several times, (is it easier to write print hello ten times or write a loop to do that for you?)
Don't worry about the language, learn the logic first, how do you need your program to work!
My advice and this is purely based upon how i learn best would be to have an idea in your head of what you want to be able to do.
If you want to build windows based applications you might want to look at WPF / Winforms and either C# or Vb.
But either way come up with a project first, so say i'm going to build . . . . i dunno a calculator app! Then go about google etc.
I think you've both hit some important notes here Not only that, but I think there is a distinction which makes both entirely valid too.
Root's post (the top quoted section) is very much the method to adopt when wanting to learn the theory of programming, what sort of constructs form the basis of all programs and computer science undergraduate courses.
Conversely, ssc456's approach is what I would take if I had a particular 'thing' which I wanted to do and learn 'on the job' as it were. However, there are a couple more things which you need to consider prior to taking this approach:
1) Have you read around the subject matter relating to your 'thing' sufficiently to know that a) it's possible to emulate in a program and b) that it isn't overly ambitious for a starter project. The latter here is not as
important as the former because compromises can be made at this stage until you are sufficiently experienced to address these issues.
2) 'On the job' learning will appear to be the more productive route, however it can easily
lead to bad habits and misunderstandings. This will be no reflection on your ability, potential ability or misunderstanding of the specific information
you use to solve any particular problem - however because you will inevitably find answers to issues from a multitude of sources, you will not know what assumptions and/or coding primitives each source uses. This will inevitably result in a 'hodge-podge' program which may well function correctly, but will undoubtedly be either overcomplicated or utilise superfluous codeblocks - both of which will impede the clarity of your code and hence your understanding of it.
I hope that adds a little extra information for you to consider, ultimately I would strongly recommend both
approaches and make sure that after you've solved a problem using google or any other authoritative source, that you understand the theory behind exactly how the language features that you've used work - and more importantly, in which scenarios they are suitable and which they aren't.
---- Extra, unnecessary but background context and example of scenario 2) above ---
I studied CS at university and worked as a software engineer specialising in network software applications since, as such I'd like to think I have a very good understanding of exactly what every line of my code does and what the memory and program profiles look like as it runs.
Like most developers, I enjoy the odd bit of web programming etc. outside of work - but I can certainly say with conviction that I do not
have anywhere near the same level of understanding of exactly what a page will look like when combining HTML, CSS and PHP despite understanding exactly what various documentation says - it seems like there are always edge-cases which don't match the spec, but this is simply because I've only seem snippets and as such my understanding of the 'spec' is incomplete. This is what I meant in 2) by no reflection on your misunderstanding of the specific information
you use to solve a particular problem.