I'm very new to operating system development and ASM, but I've been programming end-user applications for a long time. So I will share a bit of what I've learned and my advice to the newcomer looking to make something serious out of programming.
To begin with, before you ever write a single line of code, you need to know the basic terminology of the computing world. If you don't know that 0x14 = 10100 = 20, or if the terms "API", "native" and "managed" sound foreign to you, you're not ready to start programming. Go learn this terminology and the basics of how computers, operating systems and programming works. Otherwise, you will be terribly confused when you read a tutorial or book. Many people want to jump into writing commercial software when they can do nothing more than browse the web and a play a video game.
That's a BAD footing to get started on. You need to know what the point of programming is before you try to do it.
So now you're ready to start your quest to becoming a famous, super-duper Matrix hacker! Well, no... You have to be R-E-A-L-I-S-T-I-C. You're
NOT poised to write the next World of Warcraft, Windows/MacOS/Linux, or even anything another human being will want to use. This is not going to be a walk in the park. You have to realize how incredibly time consuming, challenging and tedious this is. Sure,
writing cool software is loads of fun; but LEARNING how to program in the first place is particulary dull and frustrating. DON'T put the cart in front of the horse. This cannot be stressed enough. If you think I'm just being negative, then you're in for a heartbreaking surprise,
trust me...
So where do you start? Well, start with the small, (deceptively) 'simple' and portable language we know as good ol' C. Mind you, I don't mean it's 'simple' to master and write useful software with; I only mean it has few keywords, a clean syntax and strong standardization. C is ubiquitous in the technological world and can accomplish nearly anything with a good programmer behind it. You have to learn how programming works; inside and out. Embrace the language and stick with it. Here you must learn about the concepts of memory, addresses, pointers, objects and what actually goes on behind the scenes when you compile and run your code. You have to learn how APIs, file systems and the user-realm of your target operating system(s) work. When you finally become comfortable with this, you can move on to something more fun!
By now, we'll assume you haven't quit and want to do something serious with this. C has a tendency to wipe out those who are in it just for show and build-up those who are truly willing to be programmers. Now you're ready to move into a high-level language and try to write some software someone will want to use (and of course, you can stick with C too, or use both together!). I strongly recommend this next language be either C# or Java, but preferably C# (*flame shields on*). But DON'T permanently tether yourself and your work to Windows and the MS implementation (*flame shields off*). Be sure to get involved with Mono, dotGNU and other free/open-source implementations. Contribute to open-source projects and learn from the masters. Learn how to interop with native libraries, write networking code, develop your own GUI/controls and make solid object-oriented designs. This alone is not enough; learn how the .NET CLR and Java JRE internals work and how they managed memory and tasks. That knowledge will be invaluable to you whether you stick with high-level GUI programming or try to implement your own virtual or physical systems. By the time you get here, you should have well defined dreams and a clear direction; you should know exactly what you want to do with this and accomplish. P-L-A-N ahead and make friends with like-minded people who you can work and learn with. Buy books, videos, take classes and do whatever it takes to prepare yourself for your dream. Create a team, make a design outline and work together to pursue it. Again, don't put the cart before the horse!
Some other tips for the absolute beginner:
1) Do NOT copy code from tutorials that you don't understand. You are cheating yourself badly and WILL regret it.
2) When you ask a question, NEVER ask someone to give you code (or even more noobishly "plz give me codes", lol).
3) Stay AWAY from BASIC and Visual BASIC (aka VB). YUCK! It's nothing but a verbose and ugly hindrance which will slow you down and hold you back.
4) NEVER start a project without a clear goal and design plan. You will waste hundreds of hours and your team members will probably quit on you.
5) Never "move on" from something you don't fully understand or skip over mysterious bugs. That always comes back to bite you in the ...