Some people just solve the same problems over and over again without realizing it.
Much of the theoretical underpinnings behind some of the stuff I use, I might not have ventured to look into it were it not for my college degree (nor could I have figured it out by myself). The more basic stuff you know, the easier it is to pick up the harder stuff. Trick is to know which stuff is the basic stuff first. In college you get a shortcut to the basic foundation stuff. If you have a nose for that sort of thing, then good, but it's very hard to do so in the beginning.
CS courses aren't designed to give you practical programming knowledge. It's designed to teach you theoretical underpinnings that you can carry throughout your career, regardless of what the technology du jour is in vogue.
Sometimes, it's just good to have had a brush with something, so you can pattern match and say...I remember seeing something similar before. Or even to know what something's called, so you can look it up later. Hard to search for things when you don't know what they're called.
I tend to disagree. You don't need to search for things by name, you only need to recognize some common cases for the pattern and then look for people talking about those cases, which is pretty easy to do. From there you'll find the pointers to what you need to know.
Most problems in CS (or at least things you'll be solving without moving into postgraduate research) are solved by existing algorithms and patterns that have been used elsewhere for a long time, so there is tons of data to look back on.