How is this a case for a degree? It's really a case for being educated, a case for studying your field and understanding concepts like "finite state machine". You don't have to go to college to get that, and lots of people seem to get through college CS degrees without gaining that understanding.
Depends on the kind of person you are. Under the pressure of a deadline, and the mantra of 'get things done', will you be able to step back and say, 'hey, what's the meta problem here?' 'Is there a better way?'
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.
Many, many people who get degrees from CS programs won't step back to think about the problem, will solve the same problems over and over again, will not really understand the theoretical underpinnings of what they are doing, and so on.
> 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.