My take, for what it's worth:
I was a major nerd through high school. We got a great teacher my Sophomore year who taught us all the basics of algorithms, and gave us enough freedom to pursue our own interests. I taught myself 8086 assembly language, and thereby grasped pointers in a way my classmates couldn't.
Fast forward to college. I wasted my time for four years. The most memorable CS things I learned were i, j, and k as iterators (in other words: some accepted formatting which makes reading each others' code easier), SQL (not well, and how hard would it be to pick this up on my own?), and finite automatons.
The memorable non-CS things are vastly more numerable. Anthropology, physics, philosophy, and mathematics.
Ten years down the road, I've found that most of my career has consisted of a) finding and fixing bugs and b) gluing code together. I have devised precisely one original algorithm (I don't mean simply writing fresh code, but writing an original algorithm). An awareness of computational complexity has been necessary, but a deep understanding of algorithms has not.
Here's the kicker: getting a job without a lot of algorithm and puzzle talent proves difficult. Of course, I find this hilarious in the face of my career experience. If I were brilliant at algorithms and puzzle solving, I would have been terribly, terribly bored for virtually all of my career. It's been my experience that interviewers tend to overestimate the complexity of the tasks their team faces each day.
So, I would advise a young'un who already has substantial computer talent to pursue education in a different area. You'll meet more interesting people, develop your character, and have the option of a very different career path if you tire of software or vice-versa.
Of course, all of this goes out the window if you truly want to be a computer scientist. But it seems to me there are at least ten well-paying "code gluing" jobs for every one research scientist position, so I hardly see this as defining necessity for a career.