Agree with most here.
First, you need to start small. Very small. Space invaders is a good example. Build it, learn from it, go back and continually improve it. Gradually increase the difficulty of what you're developing.
Be aware though, that "increasing the difficulty" doesn't mean "improving the graphics". So many times people go "okay I've made space invaders and r-type and want to make a 3d game! What do you suggest?"
I suggest you rethink what makes something more difficult ;)
For example;
Let's say you have your R-Type clone. It's a perfectly good 2D shooter and you're happy with what you've written. If we prescribe to the reasoning that 3D = more difficult, then the next step would be to make your R-Type clone 3D...
What do we now need to change to make your clone 3D.
1. Switch from using sprites to 3D textured models.
2. Add the Z axis.
Not exactly what you'd call difficult. Everything is pretty much the same, the mathematics might be a tad more complicated, but essentially you have the same game just in three dimensions. Not all that hard.
So instead, what could we add to your 2D game that would be difficult.
Artificial Intelligence - Maybe add some "intelligent" enemies that avoid fire or find the best missile paths. This is an entire subject by itself ;)
Multiplayer Networking - Fairly straightforward but some difficult challenges to overcome (such as synchronisation, packet ordering, and bandwidth limitations …