I'm not sure I'd want to work for someone who didn't understand the difference between computer science and programming.
It really is like the difference between a degree in physics and being a car mechanic. You can be a great car mechanic without a degree in physics, but the intent of the physics degree isn't to create great car mechanics.
I was probably a better C programmer at age 15 than most professional programmers I've run across in my career. With that said I didn't know about the Halting problem nor the Chomsky Hierarchy nor even things like amortized cost nor really any asymptotic complexity analysis. Do any of those things help me at my day job... maybe a little, but not much. Certainly I'd be better served reading the .NET Fx docs or Java docs or some JQuery books. But that's not why I got a degree in CS.
In Canada at least, you can get a degree in Software Engineering which is aims to teach you the skills you'll need to develop software (not just programming though).
In most European countries too. You can get a Computer Engineering degree, equivalent to an US MSc in Engineering, with a Software, Hardware, Networking or some other topic focus. Mine was Telecommunications :)
These degrees are a mix of various proportions of traditional Computer Science, Electrical Engineering and software craft, depending upon your focus.
Computer Engineering and Software Engineering are two completely different things. SE is "testing, version control, design patterns", but CE is electrical engineering with a few programming classes. (I was a CE major.)
It really is like the difference between a degree in physics and being a car mechanic. You can be a great car mechanic without a degree in physics, but the intent of the physics degree isn't to create great car mechanics.
But in the case of programming, it's the opposite. Computer Science is a subset of what you need to know to be a programmer.
Frankly I don't think either of them have taken CS, and have no idea what the word subset means.
Though I think pwim may have been pointing that out. There are elements of each discipline that overlap, but you don't need to know any of the physics/mechanics pieces that overlap to get a degree in one, and the same is true of CS/programming.
In fact, you can be an excellent programmer and know no CS, be an excellent mechanic and know no physics, and even be an excellent computer scientist and know nothing that would serve you in a modern programming job. (Obviously you could probably figure it out, but a code monkey would do just as well as some computer scientists.)
But fundamentally they serve different purposes. It's almost conceivable someone could prove P=NP without writing a line of code. Though decreasingly so as computers become so ubiquitous.
Interestingly, one of the most brilliant theoretical computer scientists I know only recently wrote his first computer program. Another very well-known,although now deceased, theoretical computer scientist didn't even use a computer. He would have his secretary print his emails and he would handwrite replies and give them to his secretary. Not sure how he wrote his papers, as he was prolific in his prime... maybe the typewriter?
Not really. You don't need to know about electromagnetism to fix a car.
But you do need to know about data structures, algorithms, computational complexity, and so on, to write software. You also have to know a lot more -- languages, frameworks, libraries, APIs, and good taste.
(I refuse to use the expression "design patterns", because all design patterns are what people with good taste naturally do without thinking. So have taste and you can skip reading about Flyweight Factory Facades.)
I would say there is a part of CS that you need to know to be a programmer. CS is not a proper subset of being a programmer. There is a lot in CS that most programming jobs will never require.
Neither is a proper subset of each other. Computer Science is a huge field, and programmers are rarely competent with more than one or two of those fields:
As a non-programmer I really like your comment but you leave me wanting more. I understand that programming and computer science are different animals, but I guess in terms of your example I don't understand why someone pursuing a profession in programming would want or need the CS background?
Are you getting at the pursuit of higher understanding angle i.e. separating the pragmatic pursuit of workplace advancement from the more selfless or idealistic pursuit of knowledge?
I'm not sure I'd say it is more selfless or idealistic, but I do think that college, at least as I see it, serves a very unique purpose.
It's goal is to take great ideas over time and teach those ideas to new students of the field. And computer science as a field is more about the science of computing, than it is about programming. Generally programming is taught as a way to understand different manifestations of computing.
To answer your first question, pursuing a profession in programming doesn't require a CS degree. And it's probably only marginally beneficial to improving the quality of your work in _most_ programming jobs. I do think we can view programming as more of a vocational skill. There will be some jobs that require CS backgrounds, but for the most part it's a lot closer to writing in that there is a suitable job for almost every level of skill.
I would say that learning for the sake of learning is a far more selfish choice than moving into the work force and being a productive member of society. But that isn't going to stop me from choosing learning and maybe putting it into use in the far less selfish application of research. (I do biotechnology)
I frequently hear that, at the very least, a degree shows that you can finish something. If it's true that smart hackers can give themselves a better-than-university education for the price of the books alone, and they discover this fact early in their college careers, wouldn't finishing actually be a negative indication -- a susceptibility to sunk costs? I know the case can be made that college's real education is social, but it seems like you could get that part cheaper by hanging out around other hackers.
In hindsight, the biggest benefit for me, from going to college was not the CS program. It was that the CS program actually had some really good hackers--still to date the friendliest and smartest lot of hackers I'd met outside a few particularly good Haskell meetups. So it's not mutually exclusive.
The second biggest benefit was that I was introduced to psychology as a science, and not some pseudo-intellectual horsing around as it was made out to be in high school. Ditto for economics. Taken together with the other cultural studies I dropped in on, it was something that's been fairly difficult to replicate now that I'm out of school. I'm actively trying to recreate at least some part of that experience now (using technology of course ;).
The clincher is that my alumni meetups have been nowhere near as enlightening as college was. I sometimes wonder if some people took boring pills during graduation, or if it really was the diversity that brought it out in people.
In all, college is what you make of it, just like real life.
As someone with a CS degree, I agree with you, to an extent. This is more an issue of Baynesian probability. From what I've seen in industry, your run-of-the-mill self-taught hacker is somewhat worse than a high-quality CS graduate--many of them were not making the crafty calculus you describe, they were just too unmotivated to attend college.
You also have to consider that many people do not attend college out of a pure monetary cost-benefit analysis. Besides, even if one did, it's heavily subsidized by Uncle Sam, so until the bubble hits its peak* (like housing), it's still a fairly safe bet.
*I believe humanities and other equally non-vocational degrees have already peaked.
I've worked with people who made a big deal about not having a degree. I've also worked with people who made a big deal about their degree. Neither were as good as they imagined themselves to be.
formal education isn't for everyone. that said, what I look for when hiring people is their independent drive. What have they built on their own for fun. Also how they solve problems. These are things that show their true character and aren't really taught in school (basic processes and theories are, but not the creative spirit).
the whole argument about whether or not school is necessary is ridiculous. each case has its own variables. the zoho case he references, they setup their own academy to TRAIN their people to work the way they needed.
Someone who hires programmers told me that university vs. self-educated were pretty indistinguishable, except for algorithmic problems - which over came up very rarely.
Fred Brooks claimed that education and training for programmers was extremely beneficial - but he was writing in a time when many programmers were writing operating systems and compilers. Additionally, structured programming (ie. without gotos) was a (relatively) new idea. Therefore, I tend to think that today, when the vast majority of programming tasks aren't nearly so difficult and our tools have improved so much, and good practices are generally known, that programming is much easier, and training isn't nearly as important as it was.
Even for creating new ideas and tools (eg. Thompson's regex search; pagerank), it's more a matter of being super-smart, IMHO. Of course, it helps if you know the basis of the idea (eg. what a regular expression is). If you want to prove those ideas, however, I think academic training is very helpful - but in mathematics, not computer science.
except for algorithmic problems - which over came up very rarely
I'd say that depends on what problem one is working on. I see algorithmic problems come up all the time, and I occasionally see a total failure on an algorithmic issue among the (largely college-educated) people I work with.
I think degrees reduce your hiring risk somewhat, at the cost of possibly missing some real gems who dropped out for various reasons. You can achieve the same thing by only hiring people to do X who have done X at their last two jobs. It's a low risk, low reward approach to building a team.
I'd hire people who studied Computer Engineering. Ask the average programmer how data moved around on the motherboard, or what exactly a processor does and he has next to no idea. Computer engineers learn the fundamentals, while computer scientists learn the abstractions.
I'm not sure what's the point of this posting. Having a degree is just one data point. Usually people that make a big deal about success without a degree are those successful people that don't have one.
It really is like the difference between a degree in physics and being a car mechanic. You can be a great car mechanic without a degree in physics, but the intent of the physics degree isn't to create great car mechanics.
I was probably a better C programmer at age 15 than most professional programmers I've run across in my career. With that said I didn't know about the Halting problem nor the Chomsky Hierarchy nor even things like amortized cost nor really any asymptotic complexity analysis. Do any of those things help me at my day job... maybe a little, but not much. Certainly I'd be better served reading the .NET Fx docs or Java docs or some JQuery books. But that's not why I got a degree in CS.