There’s been a lot of nattering about the usefulness, or lack thereof, of a college-level CS degree to a programmer. The most recent of which to cross my transom, is this post, but I think it all started with a post by Joel. The problem with this debate is that it presupposes three things, all of which are patently false, that:
- Computer science and programming are seperate things, and that it’s possible to know one without knowing the other,
- That it is possible, at least in theory, to teach students everything (or most everything) they need to know in “the real world”, in a reasonable amount of time (four years), and
- That the point and purpose of a CS education is to give you those “real world” skills.
The last point is particularly important, as it raises the question: what is the point and purpose of getting a CS education, if not to give you “real world” skills? The point and purpose of a CS education is this: to teach you how to learn the real world skills you need.
Of course, this is not the answer that either the students or the employeers wanted to hear, as it has several disquieting implications for both.
There was an interesting episode from my days as a CS student to illustrate what I mean. I went to college back in the old days, when men were men, and CS departments taught Pascal. For the first several years of my college degree, Pascal stood me in good stead. And then, one day, I had a shock- not one, but two different courses I was taking required me to know C. Here’s the kicker- there was not one class at the college I could take that would teach me C. Not one. How unfair was that? Their attitude, when the issue was brought up, was “we’ve taught you Pascal, we’ve taught you assembly language- here’s a copy of K&R, figure it out.”
Although I was annoyed by it at the time, in retrospect it was one of the most important things they taught me. Back then, the big important languages were (other than C) Fortran and Cobol. Most of the languages considered important now hadn’t even been invented yet- Perl, Python, Ruby, Haskell, Erlang, Ocaml, Java, C#, all of these were still in the future. C++ existed, but not in a form that most C++ programmers would recognize- no templates, no STM, no Boost. Heck, no exceptions. Even if they had wanted to teach me what I need to know today, they couldn’t- because it hadn’t been invented yet.
This is why it’s impossible, even in theory, to teach the students everything they’ll need to know. Even as simple a question as what programming language(s) to teach them- assume you’re going to be in the industry for fourty years. That means the people retiring this year (at age 65) graduated from college in 1968. Consider how far the programming field has moved in the last fourty years. Knowing everything there is to know about Fortran-66 and Algol-68 isn’t as impressive as it once was.
But the problem goes deeper than that. There is a huge difference in the skill sets needed by different parts of the industry. Let’s take an example- Joel recommends that students cooperate on a big project, like a video game. This is a great idea… if the students all go on to get jobs in the video game industry. If they go on to get jobs working on enterprise apps, they have a problem- they spent all that time learning C++ and DirectX, when they should have been learning Java and SQL. And so on. And what development methodology? Extreme programming and Scrum? Great… until the students get a job at a place doing classical waterfall. Hint, as the new kid on the block, you don’t get to change the entire teams methodology just to be similiar to what you learned in school, right or wrong.
On a finer grain level, every programming shop is different. Even if you hire someone with many “real world” years of experience doing what you’re doing, using the same language you’re using, there is going to be a ramp up cost. They’re going to have to learn the code base, the structure of the team, who to go ask which question of, etc. I call it “learning where the restrooms are and where they hide the paperclips.” The difference is that the “pro” is going to have a much shorter ramp up time than the fresh faced kid out of college. At least, you hope so.
There are fundamentals, concepts and ideas that carry across all software projects in all languages. But an education focused only on the common fundamentals is by definition incomplete- it doesn’t teach you all the non-fundamental stuff you need for a particular project, precisely because that stuff isn’t common with all other projects, elsewhen (or even most projects, most times).
Which brings me to my next point, the idea that computer science and programming are two seperate topics, and that it’s possible (even beneficial) to know one but not the other. I seen the attitude go both ways, but by far the most common is the assumption that you can know programming without computer science. Joel, for example, condemns all of computer science on the basis of one class he took, and dropped after a single lecture. It is a mark of true ignorance to hold the opinion “if I don’t know it, than it ain’t important”. Way to encompass the breadth and depth of the discipline before pontificating on the subject, Joel.
One of the dirty little secrets of computer science is that it’s mostly history. No, I’m not kidding. Pcik any CS book you care to- say, this one, or
In “A Deepness in the Sky”, Vernor Vinge introduced the idea of a “programmer-archaelogist”. I love this idea- because half of knowing programming is just knowing the history. And, as the saying goes, programmers who do not understand history are doomed to reimplement it- poorly. Which means that to a large extent it’s possible to learn a lot of computer science the hard way, just by being in the industry long enough to see things invented and then reinvented. Then you too get to shout out “look, kids- Big Ben! Parliment!” as they go by yet again.
People laugh when I saracastically say “yeah, let’s reinvent the wheel- only this time, let’s make it hexagonal, instead of square- I bet we’ll get a much smoother ride that way!” But then someone new comes along with a brand new language, still using reference counting garbage collection because they haven’t read this book yet, and don’t know what’s already been done. Or don’t care- and I’m not sure which of ignorance and apathy is the more damning indictment. The truth of the matter is that the vast majority of programmers are reinventing wheels simply because they don’t know that it’s already been invented (and fire and agriculture!).
Personally, I blame it on Microsoft. In order to sell you a new box of bits every two years, they have to first convince you that the box of bits you already have is somehow worthless (as opposed to two years ago, when it was obviously worth a great deal). This gives rise to the myth of permanent revolution. You’re still using that old, obsolete, two years ago peice of software? Get with the now, baby- that archaic crap is so five minutes ago. It’s all different now- dump that old stuff and buy all new stuff!
True story- a couple of years back, there was a question posted to slashdot. The questioner was taking a course in compilers, which the professor was teaching out of this seriously old and antiquated text book, and what textbook should they be using? I was halfway through a response that the correct textbook to be using was the dragon book, when I noticed that was the book in question. The kid had assumed that since the book had come out 12 years ago, it was completely invalid, and how we’re building compilers these days is completely different.
The truth is that programming advances, when they happen (and we’re not just happily going in circles), is an agglutinative process. New ideas build on old ideas. There is a lot of interesting stuff going on in compilers, but to understand them, you need to know the basics, the history.
The other part of computer science is adding new ideas- in some sense writting new history. This is the point where the hard-nose realist programmers start jumping up and down, screeching, and hurling feces. The ideas the academics come up with are “pointless”, “worthless”, even “academic” (pity the culture that uses “smart” and “wise” as insults). They have no relationship to the real world, and real programmers.
Let’s investigate that, shall we? Over in the Java camp, the big debate is over including closures into the language. The C# people, meanwhile, are congratulating themselves over following SPJ’s advice and ditching the scary M-word when introducing Linq, and starting to look at transaction memory. And so on. Where do these ideas come from? Academia. To the extent I’ve been able to determine, that the industry as a whole has managed to make any progress at all (as opposed to just continually reinventing the same bad ideas), is due primarily due to the academics.
Yeah, there have been a lot of bad ideas academics have come up with over the years. So? Two words for those who beleive that industry isn’t guilty of exactly the same problem: Microsoft Bob.
No, the academics don’t productize their work. And maybe, just maybe, that’s a good thing. Maybe that isn’t their job. Think back to the question I raised earlier, as to what language you could have taught students in 1968 (the one retiring now) that’d still be relevent today. There is one- Lisp. The least pragmatic, most theoretical, most academic language of the era. When garbage collection became the “in thing” back in the 90’s, the people who knew Lisp weren’t surprised. They’d been using garbage collection for decades at that point. And closures aren’t foreign to them either. It seems to take a couple of decades for the academic idea to become sufficiently distanced from it’s academic origin for it to be acceptable to “real world” programmers. Studying computer science now gives you a several decade leg up.
All you have to lose is your ignorance.
50 Comments
Bravo. (Rises from his seat.) Bravo, Sir!
Admit it, Reg- you’re just happy I’m wailling on someone else for a change. :-)
Thank you for writing this. I could not agree more completely.
Joel accidently stumbled kinda close to the answer actually. We don’t need a BFA in programming, we need a community college “java developer” course (or C#, or whatever). The fact is, a serious portion of the companies hiring developers do not want them to be competant programmers, do not want them to know computer science, and just want replacable java monkies (again, or C#, VB.net, etc).
Right now, many of these companies require a degree in CS because they don’t have any other piece of paper to try to filter people on. Give them a “certified blub developer” to use instead, and then we could leave CS to people who are actually interested in it.
And I also have to point out, you can get a great CS education without ever going to university. Education and degrees are only marginally related. You can also get a degree without getting an education.
Thank you. Finally someone is standing up for CS.
Beautifully summerized. Couldn’t have agreed more.
Joe: Its highly debatable, but don’t they already have a “Certified Blub Developer” course. Think its called IT something…
There should be a better understanding between the distinction between CS and IT. If CS is _academic_ then IT would be more _industrial_ . If students, companies and universities understood the scope and market for each these subtly different courses, maybe this whole debate (or misunderstanding… ?) wouldn’t exist.
Joel gave some facts in today’s industry but he suggested wrong solution. CS education matters. However, history can’t save people if the people does not _learn_ from it. How to learn? By practice. Knowing GC is a thing, implement a GC module is another thing. CS students need practice a lot before claim “learned”. History is never an easy course, if the people only can recite the words “In 1637, William the Stupid invaded western Fraconia…” and passed the midterm, they never learned. So as to CS.
I haven’t had a formal instruction on CS; I’m self taught, having worked for the past 10 years in programming. These days, though, I’m finishing a CS degree. I can only agree with you: I could not have learnt more about software engineering than following this path. There’s only so much you can do by yourself. This being said, I would have loved to have a good mentor to help me through the way. I would love to become such a mentor myself! Thanks for this excellent post!
In reply to Joe:
Perhaps things are different here in New Zealand from Canada (where Joe appears to be from). Here numerous polytechnics and even some universities provide Bachelor of Technology or B.IT courses, as opposed to the B.Sc’s in Computer Science from the more traditional universities. The B.Tech / B.IT courses are aimed at producing coders for industry. From what I’ve seen they do a pretty good job of it.
A comment on Brian’s original post:
One of my pet peaves is the concept that “we don’t teach you what you’ll need to know, we teach you how to learn what you’ll need to know”. Actually, it’s perfectly sensible as far as it goes. However, when I was at university it was used as an excuse to teach totally useless rubbish. My Bachelor of Engineering course seemed to be aimed solely at the students who were going to continue onto post-graduate degrees. In our final year class that was 5 or 6 out of 97 students. I have never used anything I learnt in the final 2 years at university, it has never even been useful background information. It was incredibly de-motivating to be taught such stuff, knowing it was useless. Note that I’m not arguing for fun, exciting or easy course material, just material that is relevant.
Of course it’s important to cater to students who will go on to do research, as well as those who will leave after doing a Bachelor’s degree. However, the core subjects should be relevant to everyone and the more esoteric subjects can be included in elective courses.
Hi, very nice post. Just an additional observation:
Universities are society’s tools with which they improve themselves. This simply means that the assumption underneath universities is that the way things are done in the real world is flawed and only provisional. But who will show you how things should be done? This is the work of universities.
Universities must teach how things in the world should or can be done, not how they are actually done. Would such higher level institutions teach you how things are really done, this would undermine their own existence having the effect of establishing the provisional practices rather than improve or abolish them. In such case, no progress would be possible.
Dude:
Small point… You graduated in 1964 if you’re retiring today at age 65. If you’re 61 (as I am), you probably graduated college in 1968 and you’ll be retiring at age 66.
Kids coming into the workforce today do expect that their new employer will change their methodolgies, and programming languages to what the kids were using in college. That’s been going as long as I remember.
bd
Wonderful post.
I graduated with a B.S. in Computer Science in 2005, and looking back, I wish they would have made me learn functional programming.
And…I probably shouldn’t have passed up that compilers course. Hindsight is 20/20 indeed…
It’s important to note that schools, universities, technical colleges, etc. are IN IT FOR THE MONEY at the end of the day. So, they will not necessarily do what is best for the “good of the world” they will pander to whatever they think will bring in the most cash. We are all responsible for ourselves, we can choose to go to school, or learn something ourselves, it doesn’t do any good to blame educators. They are led by market forces and will tend to supply whatever is in demand. We are our own educators, in the end, whether we choose to pay money to sit in a class or read a book on our own.
I couldn’t have put it better. Great post. One of the issues I’ve seen is that most CS students who go into industry feel like they already know enough and don’t have to continually learn. If you work on any serious project though, an academic background certainly helps a lot. In my undergrad program I was required to take algorithms and math classes, but didn’t appreciate them, desperately wanting just to program. It is only now after being in industry for a few years that I would really love to retake those classes. Instead, I’m just re-reading the textbooks and trying to learn new languages in my spare time. The fact is though, a lot of people aren’t motivated to do this, and those who are don’t necessarily have jobs where this would be worthwhile to them.
“Admit it, Reg- you’re just happy I’m wailling on someone else for a change. :-)”
My experience is that anything expressing a definite opinion is going to attract some waling. I wrote a piece about how business programming is hard:
http://weblog.raganwald.com/2006/04/why-do-we-resist-idea-that-programming.html
And people waled on me as not appreciating the routine nature of programming. Yesterday I wrote a piece wherein I said that people taking easy CS courses are headed for jobs as clerks:
http://weblog.raganwald.com/2008/01/no-disrespect.html
And people are waling on me for looking down at the profession. So I say unto you: If you want to wale, get in line :-D
Bravo. (Another one joins Reg’s standing ovation). Bravo, sir!
About the IT degree thing: yeah, some universities here offer those, but they have little to nothing to do with programming. They are more like an expensive MCSE class, in theory they want to be turning out sysadmins, network admins, etc.
Reg: I think your no disrespect post is exactly spot on.
Nice post. I am not going to dissect it, in general i tend to agree. A couple of points though:
1- Don’t put too much emphasis on what Joel says. I do read all of his work and agree to a lot of his ideas, but a lot of other ideas are flawed too. So it really doesn’t matter what Joel says…there are a lot of people that are MUCH MUCH smarter than him that tend to say the opposite. As a programmer(with a CS degree), i don’t agree with Joel but do tend to listen when Peter Norvig speaks.(as an example…or Bill Joy, or ….)
2- The dragon book is indeed old. And you can’t really expect to build a commercial grade compiler after reading just the dragon book. Its true that we build compilers differently today, but the theory behind them is still the same. Which is what the dragon book tries to teach…so for example, you cannot dream of writing something like gcc on your own, but after reading the dragon book..you would certainly what it means when somebody talks about a bottom up parser or an LALR grammar for example.
3- The whole point of a CS degree is not to stuff a lot of data in your brain. Because as you pointed out, the field moves so fast that by the time that you graduate, most of what you would have learned would already be out of date. So it doesn’t do that. Instead, a CS degrees sort of explains the “why” instead of the “how”. So you don’t learn any actual language except as a tool to solve a particular problem. Languages will come and go but the need and the approach to solve a problem is what is constant.
4- I always said that some CS programs need to change. At least the one i studied does. So something teaching Java as a first language is a bad idea. Not because i don’t like it..it just another language, but because having to memorize “static void main(String[] args)” without knowing what it means or does is certainly a bad idea(and this is just for a hello word application).
In conclusion, when people ask me what i do. I tend to answer that i am a programmer, i solve problems using a computer. And my CS degree is invaluable even if Joel says otherwise.
I dance happy with my lead pipe cause you hit this topic right on the head with lead pipe correctness
The main problem I find is that regardless of schools, most people simply don’t keep learning in their spare time. After working a few years, there is quite a lot of material I’m forgetting. I remember it vaguely, but not definitively. So I read a wide range of books, relearning material I had forgotten, diving deeper in those subjects, and learning subjects never covered.
I think the debate is pure garbage, pushed on by those who need to fuel their ego. Most people stop learning and if you stop before or after college it doesn’t matter. The problem is that people stop and are therefore not taking their profession seriously.
Just in case people didn’t know what to make of the trackback, Brian posted his responses over here.
Can’t agree more. I have the same opinion with you when I heard some non CS degree people bashing against computer science degree.
In spite of all the adulation here, I’m going to disagree. You posit that CS is useful because you will learn from the mistakes of others and you will learn how to learn what you need to know when you get into the real world.
Regarding the first point, I just don’t see that really happening. A perfect example is the data layer in Java. Every project I go to, there’s this big discussion about how we’re going to access data in the database and what the approach will be for the transaction management around it. Why are we still having this discussion? I’ve been solving this fuggin’ problem for over 20 years, back when I was doing C programming. It’s apparently still not solved. Not to say there’s a one-size-fits-all solution but there’s should be a few well defined approaches for various problems that makes this a trivial decision.
Regarding the second point…I don’t disagree in the sense that I think it’s helpful but I also don’t think it’s a big factor. In my experience, the only thing that seems to separate the really good developers from the average ones is that the really good ones just have a knack for software. The bit is flipped in their brains and they “just get it”. This simply never happens for some people regardless of whether they have a CS degree. I’ve found that someone listing a CS degree is in no way indicative of a developer being more or less likely to be a good developer. Some of the best developers I’ve met have had degrees in Music, Philosophy or no degree at all. They “just get it”. I remember having to teach three people straight out of CS school that is well thought of how pointers work in C. Mind you, these people were all taught C in college, and C was all the rage at the time. They “just didn’t get it”. I had to sit there and explain L and R values. How could they have possibly passed a data structures class? These are CS grads? Yikes.
In truth, most of the people getting a CS degree will never get to apply the things they learned in college to the real world simply because an extremely small number of developers actually do anything remotely related to “computer science” anymore. Hell, most of these folks will never ever even write a linked list or hash map. That’s something I use to have to do on a daily basis. Writing your own data structures is considered insanity nowadays. Instead of teaching CS people useful stuff, like how to write maintainable code or how to design code and refactor it, they teach them how to write compilers. Are you kidding me?? How many people need to really know that? Perhaps what I’m suggesting is that people need more of a Computer Programming degree and less of a Computer Science degree but the world needs 100 times more programmers that scientists.
Finally, I’m not saying someone who spent 4 years of their life to get a CS degree wasted their time. I’m just saying that it probably wasn’t as well spent as it could have been and it certainly won’t determine your fate or quality as a programmer.
I find it humorous that in one paragraph you go (paraphrasing here) “how could they call themselves developers when they didn’t even know the difference between l-values and r-values?” and in the next paragraph you go “what good is learning to write a compiler, when I’m never going to write a compiler?” My answer is that it’s good to know how to write a compiler because, among other things, it teaches you what l-values and r-values are, and why they exist. Among other skills which are useful even if you’re not writing compilers. One obvious example of these other skills is how to parse an input. Which is useful even if you’re not writing a compiler, but just reading a configuration file, and communicating via a protocol over a network socket, while accepting commands typed in from the user…
I too know a number of good developers who didn’t get degrees in CS- but in my experience they learned CS anyways, just not in college. And I’ve known people who (supposedly, I never checked) had PhD.s in CS who were unfamiliar with for loops. It’s not the sheepskin receipt that’s worthwhile, it’s the knowledge that’s important.
“I find it humorous that in one paragraph you go…”
It was different back then. At that time you needed to know that stuff. C was king and you weren’t going to get anywhere if you didn’t know how memory management worked. However, most business apps these days are written where the memory management is handled by the language for you (like in Java, Scala, Groovy, Ruby, etc.) The trend is to move away from all that low level stuff. There’s people still writing C, and heck, there’s people still writing assembler but it’s just not used that much anymore because there’s easier ways to do it.
What I was trying to say in the earlier paragraph is how even though they were getting a CS degree, they weren’t learning what they needed to know to do the job in those days and I’m not sure it’s any different now. I would argue that it would be far more useful for a student to learn how to write a DSL or understand how ORM works than to learn how to write a compiler. Of course we still need compiler writers but I guess I’d leave that to people getting advanced degrees and leave it out of a CS undergraduate program. There’s easily years of material to learn about writing modern software that is far more useful to know than things like low level memory management and how to write a compiler.
Of course, this all gets into the age old argument about whether colleges are meant to prepare people for real jobs (like they do for doctors and lawyers) or whether they should just give you “how to think” and give a well rounded education…or a bit of both.
Computer science is more than just algorithmics, but algorithmics is more than just quick sort. What they’re (trying to) teach you when they’re talking about quick sort and bubble sort is not so much just how to sort a list- if that was the point, you’d be right. What they’re (trying to) teach is how to evaluate/compare, implement, and use an algorithm. So that when the time comes and you’re trying to decide between Bellman-Ford or Dijkstra’s algorith, you have some grounding to make the comparison.
When you say students should spend their time learning to write a DSL instead of learning to write a compiler, I realize what a conceptual gap there is between us. What the heck do you think implementing a DSL is? It’s writting a compiler as far as I can see. That’s what a compiler is- it translates from one language to another. Maybe the output is assembler, but maybe not. And you hit all the same problems wether your target language (that you’re compiling into) is assembler or Java.
More so than any other job or profession, programming should be the least “mechanical”. Anything mechanical, repitious, or predictable should be done by the computer- and the programmer has the least excuse for why the computer isn’t doing the grunt work. The only stuff that should be left for the human to do is the stuff that requires knowledge, insight, wisdom, and/or imagination (i.e. the fun bits). The stuff that requires the human to think. There is no difference, then, between “teaching you what you need to know to be a programmer” and “teaching you to think”, the two are one in the same.
“When you say students should spend their time learning to write a DSL instead of learning to write a compiler, I realize what a conceptual gap there is between us. What the heck do you think implementing a DSL is? It’s writting a compiler as far as I can see.”
You and I view DSLs entirely differently. Compilers parse syntax and convert that into machine instructions or bytecode or whatever else you want. DSLs don’t parse anything and they’re intimately connected with the problem domain whereas compilers have nothing to do with that — they’re general purpose machines. DSLs are highly specialized interfaces for performing specific types of operations in a natural, intuitive and efficient way.
We can agree to disagree and I don’t pretend to have the answer to this problem but I’m just tired of seeing kids coming out of college not knowing basic things they should know before they show up for day 1 of their job. On the other hand, maybe my concern isn’t worth having anymore (I rarely see fresh comp sci grads these days) since nobody seems to care about comp sci anymore anyway. We’re working awfully hard to give all this work to our friends in Asia (so that we can speed our way to a full conversion into a service-oriented economy).
Marc:
“I’m just tired of seeing kids coming out of college not knowing basic things they should know before they show up for day 1 of their job.”
No disrespect intended, but perhaps what you would like is a vocational program for programming?
http://weblog.raganwald.com/2008/01/no-disrespect.html
Here in Toronto, you can get an undergraduate degree in English Literature. Or in the English Language. Or in Journalism. The latter is a vocational degree, intended to prepare the student for a job actually writing English for a living.
Likewise there is a Physics program. And an Engineering program. And an Architecture program. Nobody pretends that a degree in Physics prepares you for day 1 on a job relying on any of the properties of physics.
I happen to think that an education with a focus on the timeless foundations of what I would call the Mathematical properties of Computers (like Combinatorial Logic and the Lambda Calculus) will serve you well for a *career* in software development. So will a focus on systems programming (such as the construction of compilers and operating systems). And much more that I will not enumerate here. But the point I wish to make is that the vast majority of employers are not interested in these subjects on day 1 or any day.
Do not pretend otherwise: Employers do not think Joe Java programmer needs to understand the mathematical properties of hash algorithms. He will be expected to use the one that comes “out of the box” and nothing more. Anything to do with parsing anything will be done using existing libraries that work on an established standard format such as XML.
That being said, Joe Java needs to think about Joe and not about his employer. If he mindlessly gos along with what his employer thinks he needs to know, one day he will find himself–like so many others in this society–tossed out when his very temporary skills are no longer required.
Joe’s career is Joe’s business to manage. What I take from this post is that it is in Joe’s interest to obtain that foundation. Liek so many things, it means a trade off. The time Joe spends learning about compilers is time Joe could have been spending learning the details of a language or framework business is using every day. This would make him more employable as long as those specific technologies are in demand.
Inclonclusion, I think you and Brian are arguing about two different things. You argue from the perspective of “How can I get a job right now” where Brian argues from the perspective of “How can I become a better programmer.”
These are two very different things.
Actually, Reg, I think employers do want programmers who know about compilers and operating systems and graph theory and etc., they just don’t know that they do.
The value a programmer brings to the table is the ability to solve problems. Which is what differentiates a programmer from a Clerk/Typist.
This is about not having your job shipped to India as well. There are about three times as many Indians as there are Americans. Now add in the Chinese, Russians, Bulgarians, and whoever else. Knowing how to call List.sort simply isn’t that hard- when it was rare, there was a value to it. When it becomes common, it’s value drops enormously. What you want is to be able to create large amounts of value (i.e. more than it costs to employee you), then it’ll be worthwhile to employee you even if your skills are common (for some loose definition of common).
We saw this with Web Developers. There was one point where I knew of companies willing to pay $90,000/yr to hire web developers- when they were scarce and hard to find. They’re common now, and make a lot less money. Note that there are still some web designers who can (and do) pull down good salaries- but notice that they’re generally bringing more to the table than simply knowledge of HTML and maybe Javascript.
Also note that this isn’t an Us vr.s Them position either- there is basically an unlimited demand for value. If I’m creating more value than I cost, and you’re creating more value than you cost, then it’s profitable to hire both of us. And if Fred shows up capable of creating more value than he costs, he’ll get hired too, without either of us losing our jobs. The Americans, the Indians, the Chinese, the Russians- everyone gets to make a lot of money making a lot of value writing software.
@Reg and @Brian
My experience has been that technicians are desperately needed in business. Most coding these days isn’t about solving problems — it’s about plugging the parts together in the framework, and making sure the boxes are in the right place, and knowing how to not fight with the framework, but to work with it. And, quite frankly, paying “senior developer” rates for that kind of stuff is bogus.
(Check out my rant two years ago when I first realized this.)
The person who designs the languages and the algorithms and architects the business solutions is in an entirely different place, requiring an entirely different skill set. There is a lot of value in having feet-on-the-ground experience, and day-to-day work seems to be the best way to evolve a new system (e.g. Perl, Spring, and Rails all evolved from practical systems), but there is a whole additional skill set at the level of architecture. So we need someone near the practical stuff, but with a whole additional skill set.
Worse, the kind of person who is going to be interested in studying algorithms and programming languages probably isn’t the kind of person who wants to keep up on which XML parser you need to use to parse RSS.
@Reg
I’m not sure Joe Java is really in a bad place. We’ve still got lots of COBOL jobs kicking around — and those slots are filled by people with dozens of years of experience in the field. So Joe Java’s got time.
Plus, there’s always becoming a BA or management if things really do go south.
I strongly disagree with you. A computer science degree is an absolute requirement for doing any job in software development.
The strange thing which distinguishes the software industry from other most other industries is that you can work in it without having a relevant degree. Compare it to the airline industry: would you board a plane designed by an engineer without a degree in aeronautical engineering but by somebody who taught himself to build planes?
Or compare it to the medical industry: would you want to be treated in a hospital which hired doctors without a degree in medicine?
With computer hardware going towards multi-core architectures, having a computer science degree is even more important. Programming multi-threaded software without understanding deadlocks, race conditions and monitors will result in a disaster. These are exactly the things you learn in a computer science program.
I have recently resigned from a c++ developer position because I was the only computer scientist on the team. The others were all physicists still programming with goto statements, global variables and not understanding object orientation. I didn’t do anything but clean up and debug the code that my physicists colleges produced.
This is almost the only reason why so many software projects get delayed or fail altogether. The lack of qualified people in the industry and the acceptance of companies and managers to hire people without the right education caused by the shortage of skilled people in computer science.
John:
If you are a computer scientist and you credit your abilities to your education, I congratulate you. I’m sure I would be delighted to work with you.
Now just for fun, I give you the following challenge: do a search on a job board for candidates with degrees and experience in any language you like, say monster.com, B.Sc., and C++. Select 100 at random. How many of them are skilled?
What does your trained scientific mind conclude about the observed correlation between a degree and skill?
Great reply, Reg. Let me add to it: yes, if only I could find that hospital, I would definitely patronize it exclusively. Not having a state license to extort money from me, they’d have to actually be worth something. Right now, if I don’t like a doctor’s behavior I can crawl back and die. Or sue him and die, depending :)
As for the airplane constructor – sure, if he was willing to deposit a large amount of money as a guarantee that nothing will happen to me. In fact, this is exactly what I do when I actually go in a plane, only without that amount of money :P — I have yet to see someone asking to check the airplane designer’s credentials first…
John:
You refer to people like doctors as if they are something like CS majors. They are trained to perform in the real world and deal with real world health problems. CS majors are taught a bunch of stuff that are not required in 99% of real world software development and they are not taught a bunch of stuff that is. CS is more about theory than it is about the real world.
I will also say that I’ve been in plenty of doctor’s offices where they have degrees and certs plastered all over the wall and it’s clear they have no idea what they’re doing. A fancy piece of paper with latin words on it != somebody who knows what they are doing. It just means they passed a bunch of tests. I have a friend who’s an expert at passing exams and he can get an A or B in almost anything by cramming for about two days for the entire course. That’s how he got his CS degree. It just doesn’t mean anything. What means something is the student himself and what he makes of his education (wherever that may come from).
The big difference between doctors/architects and computer programmers is that medicine and architecture are ancient disciplines which have been perfected over millennia; whereas computer science has only existed as a discipline for around 60 years or so, and the environment in which it exists (e.g. the hardware on which the software runs) has been changing so rapidly that it is having trouble establishing much forward momentum. The problem with your argument that CS courses are teaching history is that (relatively speaking) there just isn’t that much history to teach. We just don’t know enough yet that someone who has gained the sum total of the available knowledge is that far ahead of someone who has knows nothing about the subject.
I have a four year computer science degree from a school which was originally founded as an engineering school. I can confidently say that I learned very little from my coursework that I couldn’t have learned just as easily in less time (and for a whole lot less money) with a few good books and some practice. Moreover, of the couple dozen professional programmers that I have worked with directly, the best one, in terms of application design and code quality, was a guy with a theology degree who taught himself C#.
I completely agree with Marc: the biggest differentiating factor among professional developers is the degree to which they “grok” programming. It has next to nothing to do with their education. I didn’t need computer science courses to spend weeks teaching me the difference between an array and a linked list, or what a pointer is. What I needed them to teach me were the things that I can’t teach myself in a few minutes with a decent programming book; things that, without being taught, only come with long experience. Things like writing maintainable code and refactoring. But I never even heard the word “refactor” until after I graduated.
Unfortunately, things like refactoring and writing maintainable code don’t have a definitive set of “best practices” yet, because we just haven’t been doing them long enough. Certainly we have come a long way in the last few decades, and there is a lot of good advice out there. But it just hasn’t come far enough that we feel comfortable teaching it to students yet. So we teach how to write compilers instead, despite the fact that an extraordinarily small percentage of programmers will need to know how to do that (for the record, I have never written a compiler, and I don’t consider myself any worse off for it; I know enough about how compilers work to know how they affect my code, which is all I need to know, although I am considering writing a compiler just for fun).
Maybe in a few centuries we will have built up enough expertise as a discipline that it will be worth it for new initiates to spend four years of their lives and ungodly amounts of money sitting at the feet of those who have gone before and absorbing their wisdom. But right now, I will take a quick learner with raw talent who has never seen a line of code over a code monkey with a degree.
Now *this* (David Nelson’s comment) is worthy of a standing ovation :)
The thing of it is, even if CS just taught history, that in and of itself would be valuable. Yeah, CS has only been around for ~60 years now, but in that time we’ve built up a lot of history- at least in the form of “we tried this idea, it didn’t work, here’s why”. The reason why software engineering hasn’t “arrived” yet is because it’s a young discipline- but the reason it’s not making any forward progress is that it’s not learning from history. There’s more to CS than that (there is, in fact, a large body of “here’s what works, and why”), but that in and of itself is sufficiently valuable.
For example, I doubt you’d ever hear a Doctor say something as mind-blowingly stupid as “The science experiments done back in the fifties have nothing to do with modern medicine- I’ve never heard of these Crick and Watson guys, and don’t see what they discovered as having anything to do with modern medicine”. And yet you hear such statements about programming routinely.
Of course, during the course of this thread, I’ve started coming to the conclusion that the problem we have is a huge number of people thinking of themselves as programmers who seem incapable of generalizing a problem domain. Take, for example, the repeated use of compilers as one of the “stupid” things CS degrees force you to learn. Compilers, I’m informed up thread, turn C code into assembler, and maybe Java code into JVM bytecode. They certainly don’t turn latex into DVI, or XML into postscript, or comments into HTML. And compilers certainly have nothing to do with parsing configuration files or network protocols. If you’re not writing a program to turn C into assembler, you have absolutely no use what so ever to all that stupid stuff they made you learn in compiler class.
Even when confronted with the same problem, since it’s in a slightly different context, it’s not recognized as the same problem. So even if they knew the history, and knew the historical solution, they wouldn’t be able to apply it in any sort of new context- because they won’t recognize the new context as being similar to the old context.
I can only show you the box- you are the one who has to think outside of it.
“Of course, during the course of this thread, I’ve started coming to the conclusion that the problem we have is a huge number of people thinking of themselves as programmers who seem incapable of generalizing a problem domain.”
Please tell me you didn’t just accuse the people who disagree with you that they’re not real programmers.
Marc:
I’m being selfish, I know, but I must say I’m far more interested in reading what you think of the objective issues Brian has raised than reading two people debate who is and who isn’t fit to be a programmer.
Maybe Brian is right, maybe wrong, maybe he is way off base with that line. But I would be flabbergasted if anybody will learn anything from reading the two of you debate that point, whereas I suspect that I will learn a lot more from reading what you think of whether a knowledge of the history of computing is or isn’t valuable, whether ‘esoteric’ subject like compilers can or cannot be generalized into skills that are useful in day-to-day programming jobs, and so forth.
Again, I am speaking from my own, selfish point of view.
I think this discussion boils down to either having studied computer science or not having studied computer science. The people not having studied cs claim you don’t need a cs degree for working as a software developer whereas the people actually having studied it claim you do need it.
I am giving my point of view from my own experience, yours may be different. I have a cs degree and 5 years of working experience since then. I have had many colleagues without a relevant degree and have found them to function poorly and difficult to work with, without any exceptions.
The problem is that the fundamental understanding of compilers, multi-threading, design-patterns, logics, searching and sorting, algorithmic complexity, networking protocols and operating system internals is missing and this leads to poorly written software. Usually with no design in the first place at all.
Of course, some years of working experience are important but only then when the rest of the team and especially the group leader are qualified people(with the right education) as well.
Besides the lack of qualification, on multiple occasions I have experienced another difficulty in working with non-cs people that are working on software. They are trying to conceal their lack of education/skills with well, let me call it “sub-optimal behavior” for the project/team because they somehow feel intimidated by people with a cs degree. Actually, I consider hiring people like this an anti-pattern.
Another anti-pattern more common among managers / group leaders without a cs degree is the incorrectly assumption that knowledge of a certain set of tools is the key to successfully finishing a software project. Like it doesn’t matter that you can’t code C++ or Java, if you know how to use an UML tool like Rhapsody that would solve all of your problems. I have seen this on multiple occasions.
Me, as a computer scientist, would never switch industries. I have no knowledge of whatever field besides cs and am willing to admit that. So why can everybody switch to cs as he or she wants?
It is just such as shame that an interesting, high-tech industry got flooded by gold-diggers and people having read “Java for Dummies” considering themselves software developers.
There is an ancient saying in Dutch, liberally translated as “once you are a shoemaker, the only thing you should be doing is repairing shoes”
@Brian,
You make excellent points about the need to take specific skills, understand the general concepts, and apply them to similar but not identical situations. The problem is, a Computer Science degree does not teach you how to do this (nor, do I believe, do most college degrees). The ability to generalize useful concepts from specific skills is something that generally speaking cannot be taught; people are either capable of it, or they are not. The fact that someone has a Computer Science degree only tells me that they were able to demonstrate sufficient mastery of the specific skills they were taught; it doesn’t tell me whether or not they understand the principles underlying those skills and are capable of translating them to the problems I need them to solve.
Marc: no, that isn’t what I said. Reread what I said. And this is the last comment I’m going to make on it.
David: I completely agree that universities don’t teach generalization, and that it probably isn’t teachable. Especially not in the current structure of our educational system, with classes and schedules and semesters and tests. So a college education isn’t sufficient- but neither, I comment, is the ability to generalize. You need something to generalize from. Both sides are necessary, neither is sufficient. Actually, both together are probably insufficient, as the pragmatic real-worl experience of when the generalization is usefull (and also, when to stop solving the meta-meta-meta problem, and just solve the problem).
I’m just finishing up my CS degree now… time and time again I’ve said “this is crap”, or “when will I ever use this?”… but I guess I see now that it isn’t so much the content but the learning process. But even in that regard, I guess my school has done a half-decent job at keeping it fairly current. Hopefully all this “knowledge” will guide in my future.
Great read. I’ve got a BS in Computer Science myself and cannot stress how important it is to have your CS degree in the world of computing. It may be a piece of paper, but the work that you’re required to do to get that paper has significantly improved over the years. Many schools do focus on real-world experience, so you don’t waste your time learning subjects you will never need. Many schools also provide a variety of different fields of computer science, such as AI, Game Development, Bioinformatics and etc. Many schools also work toward building relationships with well-known corporations to expose students to new technologies and real-world problems. Meaning your last 1-2 years of school actually count as real-world experience. You can say all you want, but a CS degree has its worth and it’s got a hell of a lot more kick than a MS certificate or a 2-year degree in game development, whatever the hell that means.
As student of CS and Mathematics(graduate year) I really appreciate this text. I must admit that this is not the first time to read/hear about this dispute. I have heard it from my professors, friends, read about it etc… From the looks of it, this will stay as long as there are computers. I wonder, is there similar problem in other areas?
I’m 17 years old now. 2 years ago when I was at the Gymnasium (something like grammar school) they told us: “Oh you kids don’t need any practical experience. You just go off from here study in the universities breading about the theory and get then your Jobs, right away.” The thing was ,and still is, that employers these days want young AND(!) experienced people who know the matter they will be working at. And the problem with this is that you just don’t get a shit fucking bit of it if u get stuck with the theory of the old alone.
Of course knowing the history is important to not reinvent something over and over but you also have to have the SKILLS doing so and know what your doing.
As long as this doesn’t get into their heads our students will be doomed as soon as they get onto the market.
This was a main reason for me to cancel that grammar school and go to a school that where its possible to get into that where you will be after the school. Practice and experiencing the hard core of the market where u want to get to is the most important thing.
Lots and lots of examining these days will discover this and will stuck in a cycle of unexperiency and unemployment without a trace back to what their goal was.
The same applies not only at the market of economy but also in IT where its a musthave to be informed and trained onto the newest tracks of the business.
My conclusion is that without any practical skill or experience in a mass market your DOOMED.
Well, I hesitate to join this interesting debate, but here goes anyway.
I am one of those ignorant dolts without a CS degree (well, I was until I recently took time out to get an MSc in GIS – not sure if that even counts as CS) but I’ve been working mainly as a database programmer for about 20 years. I got into IT on the back of a few CS classes at university in the 1980s, plus an aptitude test that alleged I might be able to write programs. But my major degree was in languages. Go figure.
So far, I’ve had a pretty good run, enjoyed the work, learned a lot, and worked with a lot of interesting people, some with and some without CS degrees. And with all respect to those of you who are real CS experts, I have to say that most IT jobs (even careers) really don’t need a CS degree, and I’ve seen no correlation at all between successful programmers and CS graduates in the places I’ve worked. Some CS grads are great and I’ve learned a lot from them. Others are simply too academic in orientation to grasp the practical needs of their clients/customers. Equally, some of the best developers I’ve worked with are people who got into IT simply because they loved it or discovered to their surprise that they were good at it, rather than via the academic sausage-machine.
Of course, there are important areas of IT where the detailed understanding of computing theory provided by a CS degree is invaluable e.g. I’d never get a job at Google because I don’t have the paper (or the brains). But most IT jobs are not like that – most of us are not “computer scientists”, we’re just software developers of various kinds, perhaps with a background in CS, perhaps not, and maybe some of us need to recognise that we should take pride in our work for its own sake, rather than trying to cast it – somewhat awkwardly – into the class of “Science”. Software development is at least partly a practical craft, albeit one informed by science.
But what everybody in IT needs is the ability to go out and figure stuff out for themselves, resorting to colleagues, books, online material, whatever they need to keep learning their craft, because the pace of change will wipe you out otherwise. And it’s fun anyway.
Dipping back into my language background, I see most programmers as being a bit like translators, whose job is to translate the user’s requirements as best they can into elegant, accurate and efficient computer code, using whatever tools and knowledge they can find to make that job easier.
True, there is also a need for the equivalent of academic linguistic scientists – people who can analyse language itself and give us more insight into what we do, and perhaps point us towards ways of doing it better. But I’m not convinced you need a detailed academic understanding of e.g. tranformational grammar in order to translate elegantly, accurately and efficiently from Userese into Computerese.
Of course, unlike most working linguists, we have to be ready to become literate in a new language every year or two at least, learn new grammars, new vocabularies, new ways of thinking about what we do. A CS degree is one way to gain a headstart on that process, but it’s the process itself that makes you a better programmer, not the paperwork.
But don’t get me started on the inane buzzword-bingo approach of many employers, who would rather recruit somebody with a grand total of 1 year’s experience, all of it with version 9.9.9.9 of some fashionable software package, than recruit an “old-timer” who has 20 years’ experience of IT but has only used version 9.9.9.8 of the damned “must-have” package. Your CS degree doesn’t make any difference at all to these people – as Andreas says, in this market it’s all about having the right buzzwords on your application form. Bah.
Anyway, that’s my very biased low-level view from the trenches. Now I’d better get back to learning some new stuff!
I, for one, think theory is important to know, even if you don’t think you’re using it. I know a lot of CS majors who complain about theory classes, but they really don’t get much out of the classes. If you try to understand some of this stuff, you start seeing how it relates to things in the real world.
If, on the other hand, you pig-headedly decide that everything you taught yourself out of “C++ in a Weekend” is enough to get you going for life and that anything they say at a University that doesn’t conform to your pre-conceived notions of how to do things is worthless… in that case, a CS degree is a complete waste of time.
I think the big problem with CS that you don’t get with a lot of other fields is that it’s so easy to start writing code when you’re a dumb little kid, and you grow up thinking you’re so awesome because it’s a fun and ego-boosting experience… and then when old people try to tell you that there’s a better way, you just can’t handle it.
IMHO, one of the most important parts of a CS degree is the math. Not just the math classes, but the math you get in the CS classes. In my eyes, a person who can write a decent proof is in a different league than someone who cannot. I know many CS majors who cannot write decent proofs. I know several who can. I wonder whether or not the people who say that college is unimportant for CS think that mathematical ability is worthwhile for software development.
(and Physicists are terrible programmers, but good problem solvers. I, for one, would restrict a physicist to coming up with algorithms, rather than doing any implementation or architecture at all. Jeez…)
My opinion on this subject is that a CS degree is generally a good idea (even though I never actually graduated as I changed my major a few times and then got a job (math, systems science, computer generated imagery and finally CS)) but that it’s not the only thing that matters.
Just as I’ve seen incompetent developers without a CS degree I’ve also seen quite a few developers with degrees who have either simply not had “it” when it came to understanding computers, had never really bothered to learn the subject matter while in school (and had little interest in it outside of work/school even if they had potential) and finally those who seemed to think that their degree made them infallible (these would be the guys Joel refers to as “architecture astronauts” and who tend to love premature optimization).
Sure, there may be plenty of incompetent non-degreed developers out there who couldn’t explain the difference between a linked list, an array and a binary tree if their lives depended on it but there is no shortage of incompetent developers with degrees either.
10 Trackbacks
[...] Update 22:01: This topic seems to be one that’s growing in popularity around the web. If this is of interest to you, also check out Reg’s No Disrespect and then track back for Why You Need a Degree to Work For BigCo. And then I recommend What good is a CS degree?. [...]
[...] effect it is having on the computer industry as a whole. A number of other bloggers have responded in support of this article, and now I’d like to throw my hat into that ring as well, if for nothing else [...]
[...] FasterLet Me Save You $40: Here’s How to Be HappyWhat are you trying to prove?C++ and ThreadingWhat good is a CS degree?Thoughts on ParallelismThe “Hole in the middle” patternOcaml’s DebuggerThe Functional-Relational [...]
[...] science, as an academic discipline, has been the subject of a great deal of scrutiny lately. Of particular interest has been the worth of a CS degree to us, the [...]
[...] What good is a CS degree? [...]
[...] program hadn’t switched to using Java as the initial language when I started. I agree with Brian Hurt and Chris Cummer about the value of a computer science [...]
[...] a sobering feet-on-the-ground reminder of the heady “CS degree” conversation going on (1, 2), and it has some quality charts a la my “Brief Reality Check on Ruby Jobs” [...]
[...] of tangential note, this is an aspect of being a full-time practicing physician that worries me. In a linked article to the one above, he speaks about the role of academics in progressing the field, citing that most [...]
[...] XML; or, Ruby’s Problem Is Its Type System, and Don’t Try to Tell Me OtherwiseMarc on What good is a CS degree?Brian on What good is a CS degree?Brian on NullPointerExceptions Are Not HelpfulMarc on What good is [...]
[...] What good is a CS degree? [...]