This debate will never end. A lot of it has to do with unrealistic expectation. 4 Years is not enough to learn a field and become good enough to be proficient at it for most people. The good programmers I know started as teenagers. That means they had a head start before going to college. I believe this is representative but I don't know of any studies on this.
As others have pointed out there is now a lot of schools that have Software Engineering as a separate major. It's still debatable if it's a better way to go. I'm not yet convinced that people graduating with Software Engineering degree aren't as bad as Comp Sci major early in their career due to my first point.
Finally there are also those suggesting community colleges giving more vocational training as a way to go. I have one friend who has gone that route and he's a pretty good programmer. He did start very early also. We were hacking code together in middle school.
Finally it's really up to the companies hiring to understand this, I know that it's common practice for engineering firms who hire engineers out of school give them a year of training or have him paired with a mentor. This is important.
I'm hard pressed to find a single job a person with an undergrad in anything could do directly out of college without some training. Good professional jobs usually require graduate school. Even accounting usually require more than 4 years (internship) before being completed (same with engineering.)
Edit: many people here on HN will say that they didn't need school to become good programmers. That is true but how many years have these people been programming for?I bet it's at more than 5 years on average by the time they are 18.
I did some extremely light programming late in high school on my TI-83 calculator (before I knew that gotos were considered harmful and before I would have understood that reference). Soon after high school (graduated in 2005) I decided I wanted to be a programmer, but I didn't really know what programming as a discipline or career entailed, and I honestly didn't know where to go to learn. In 2008 I enrolled at a university, and my first real exposure to programming was my university's intro to CS course, which of course used Java and covered basic OO and some basic data structures. I liked it and learned quickly enough.
Now, a few years later, I love both CS and programming, but obviously I am in no position to judge how good I am at either. Here's what I can say objectively, and maybe someone can give their opinion on how legit I am or how much my CS degree did for me: I took a national standardized CS test for to-be graduates (MFAT I believe it's called) and scored in the highest bracket >95%. I read, comprehended, and loved GEB. I read, mostly comprehended, and loved SICP and The [Little, Seasoned] Schemer. I had to give up on a book about Gödel's incompleteness theorems because I couldn't hang with the math. I did the Grepling challenge a while back in Python without cheating.
I've learned how to learn new languages on my own. I'm decent with Python, and have created some nontrivial web apps with Django. That said, I still make mistakes when programming that are embarrassing when brought to light, and I still discover new things that I feel I should have already known. I've never made a start-up or even contributed to an open source project, so I'm still probably near the bottom in this community.
I definitely needed a CS curriculum to become a programmer at all, and with any luck I'll end up becoming a good programmer.
You're doing exactly what you need to do, you are putting extra effort into it.
My feeling is the "bad" cs grads usually did not put in that extra effort. Reading GEB is rarely a required par of any CS degree but reading it is an incredibly useful thing in my view. It's a thick book and takes commitment to read.
Side note: Check out this book (http://www.amazon.com/G%C3%B6dels-Proof-Ernest-Nagel/dp/0814...) on Godel's proof. It's been updated by Doug Hofstadter the author of GEB. I found it pretty good. Read it slowly, two three time if needed. It will make sense.
As others have pointed out there is now a lot of schools that have Software Engineering as a separate major. It's still debatable if it's a better way to go. I'm not yet convinced that people graduating with Software Engineering degree aren't as bad as Comp Sci major early in their career due to my first point.
Finally there are also those suggesting community colleges giving more vocational training as a way to go. I have one friend who has gone that route and he's a pretty good programmer. He did start very early also. We were hacking code together in middle school.
Finally it's really up to the companies hiring to understand this, I know that it's common practice for engineering firms who hire engineers out of school give them a year of training or have him paired with a mentor. This is important.
I'm hard pressed to find a single job a person with an undergrad in anything could do directly out of college without some training. Good professional jobs usually require graduate school. Even accounting usually require more than 4 years (internship) before being completed (same with engineering.)
Edit: many people here on HN will say that they didn't need school to become good programmers. That is true but how many years have these people been programming for?I bet it's at more than 5 years on average by the time they are 18.