The best advice I can give is to write and read A LOT of code, and work on projects where you know the problem space very well. What helped me early on was writing software that solved problems that I was already intimately familiar with. For example I worked as a bus dispatcher for a time so when I was asked to write a web app for tracking busses, shifts, drivers and driver to shift / bus to shift assignment I could basically just sit down and pund away without having to think much about all of the ancillary aspects of software development.
Also, like a few people have already said, you want to 1) become an expert in a language but 2) become proficient in say pulls number from hat 7 languages.
I think SICP might be a little over your head at this point (btw they stopped using SICP at MIT a few years ago, sigh), but it's a great read once you start thinking you know what you're doing. (at which point, btw, you don't know what you are doing)
Write a memory manager. (or some other very low level component) I think the most progress I ever made as a "programmer" in one week was when I had to swap out the linux memory manager for my own implementation for a project in undergrad. Once you run vim, pine, mplayer, ... etc. on your own memory manager and know what's going on in the background... that's when you start to feel like you actually know what the hell is going on on the inside. Just little things like debugging the fact that ls
ran succeccfuly but ls -l
gave you a seg fault are great learning experiences.
Write an application framework. Given the number of web development jobs out there I would say write a web application framework... from scratch. You probably don't want to use it in a real production application because there are likely a dozen more complete, more secure, more scalable, etc. frameworks out there to chose from, but the exercise is enlightening. Plus when you switch to working with other people's frameworks later their framework will be easier to understand because they wrote it by solving the same problems you had. Believe it or not folks Rails is not actually magic. :-)
Understand the underlying systems and tools you are going to be working with. I have mentored a number of junior developers and the ones who are confortable working with the environment they are working in invariably get off to a better start (by weeks or months, not days folks) than those who don't. I have had an intern who was "stuck" for an entire day while I was out sick because he couldn't get his dev server restarted. Solving the problem took us 20 seconds the next morning. To be fair he was a terrible intern all around, but the fact remains that even if you have an entire department of 30 people dedicated to the support of your development systems you will be a more effective software developer if you are intimately familiar with the operating system and tools required for your code to function.