Absolutely definitely. Yes, it's possible. How do I know? Because I did it!
It's difficult. Don't have any illusions about this. With no tutor to go to when things don't work, you have to figure out problems yourself. There's a lot to learn and if you aren't self motivated or aren't dedicated enough, you won't be able to do it. For me, I find it difficult to be motivated about anything, but I enjoy learning and programming so much that I don't have to fight myself.
Some tips:
- Learn by doing! Want to know how binary trees work? Make one.
- Do by learning. Set yourself ambitious projects where you'll have to learn new things in order to complete them. Caution: If you set yourself projects that are too hard then it's easy to become disheartened, but if you set yourself projects that are too easy, then you won't learn very much. You're looking for a butter zone.
- Start with C. High-level languages make you lazy. I'd never had learnt C if I'd learnt python first.
- Wikipedia should be your first point of call for any concepts you need to learn.
- It doesn't matter if you never finish a single project, (after all, what is finished). It's much more important that you learn new things. That doesn't mean to say that you should never try to finish a project. It can be a huge motivational boost to see something you made working. It's easy to get side-tracked, don't worry if you do.
How do you know when you are done? Well, the reason you undertake a degree is so that you will become proficient in programming. When you are sure you could write any software given a reasonable amount of time then you're a programmer, but that doesn't mean you should stop learning.
Incidentally, I'm now suffering from point one. Being far away from any software development companies doesn't help either.