|Do you know where your variables are?|
Update: I see that social_mandog is getting downvoted for /h(er|is)/ post. I can understand why, but I want to explain why I gave it a ++.
social_mandog, from what I read in the above post, seems to be suggesting that a CS degree is useless (at least, if you accept the anology that critics can't create). So, social_mandog made a post, stated a thesis, and asked for others to comment. Now, if you're downvoting the post because it's off-topic, I can see that. If you're downvoting because social_mandog is apparently stating a view that you don't agree with, then I don't agree with that - though it's your prerogative. An argument was put forward and discussion was asked for. I like that.
You're absolutely correct. Literary criticism can be useful for writing a good story :)
I've definitely met CS majors who couldn't tell you the difference between a global variable and a lexically scoped one -- or why the latter is preferred. I've met CS majors who are programming language bigots and forget that different languages have different strengths. In fact, many of the CS majors that I have met seem clueless about programming.
Programmers that I have met without a CS degree are even worse.
Everyone knows that the bubble sort is useless, right? What, you didn't learn that when you studied algorithmic efficiency? Oh, wait, you did learn about it. Did you know that the bubble sort is often the fastest possible sorting algorithm on nearly sorted data? Do you know the difference between a b-tree and a binary tree? Have you used a heap? What about a linked list, double linked list and the like? Why are linked lists so common in other langauges but seldom used in Perl?¹
It's questions like the ones above that trip up people who aren't CS majors. Personally, I only have an Associate of Science degree. I'm working my tail off trying to make up for it. I think this is the difference between "coders" and "programmers". Many coders can tell you, down to minute detail, why pseudo-hashes were invented, how to implement one, what's wrong with them, and why their apparent performance gain was illusory. Of course, these same coders often can't program their way out of a paper bag (whatever that means). Programmers, on the other hand, won't necessarily know everything about a language (but they often do), but they know how to develop programs. They know when to optimize, when not to optimize, when to break rules, and - more importantly - what the rules are.
Having a CS degree probably means that you have studied algorithmic efficiency. You probably understand how different data structures work² You might just know that the particular graph software that you are working on would be better off using adjacency lists than adjacency matrices. By being exposed (hopefully) to a wider variety of ideas and programming languages, you bring a greater set of tools to any given language. Perl, for example, may be the swiss army chainsaw, but you are the one using Perl, not the other way around; you have to know exactly where Perl has the corkscrew hidden.
This isn't to say that CS majors make better programmers, per se, but they have a much better foundation to build on. People who learn to program but don't study computer science³ have a great knowledge gap but often don't know what they don't know, so they sneer at those who do.
It reminds me of a famous quote by a chess grandmaster (whose name escapes me right now) when he was commenting about Bobby Fisher's brilliance at chess. He said that he could also see the brilliant moves that Bobby Fisher found in any given position, he just couldn't figure out how to get to that position. Many of us see the brilliance in the work of Dominus, TheDamian, or merlyn, but if you read the above post again very, very carefully, you might get a glimmering of how to reach their positions.
1. To be perfectly fair, I'm just learning about many of these things myself. I realized that one of my greatest weaknesses as a programmer is lack of knowledge of algorithms, so I'm trying to make up for. I have Mastering Algorithms with Perl sitting beside me now (as if you couldn't tell :)
2. Knowing about data structures is at least as important as knowing about algorithms. And when I say data structures, I'm not talking about something as trivial as an array of arrayrefs of hashrefs or anything like that. I'm talking about deques, stacks, doubly-linked lists, etc.
3. When I say "study computer science", I don't necessarily mean "at university". There are plenty of excellent programmers out there who know "computer science", but never went to school for it. We can learn anywhere.
Join the Perlmonks Setiathome Group or just click on the the link and check out our stats.