A computer science degree doesn’t prepare you to be a programmer. Here’s an excerpt from a blog post I wrote comparing computer scientists and programmers:
I had a conversation yesterday with someone who said he needed to hire a computer scientist. I replied that actually he needed to hire someone who could program, and that not all computer scientists could program. He disagreed, but I stood by my statement. I’ve known too many people with computer science degrees, even advanced degrees, who were ineffective software developers. Of course I’ve also known people with computer science degrees, especially advanced degrees, that were terrific software developers. The most I’ll say is that programming ability is positively correlated with computer science achievement.
How do you bridge the gap between obtaining a computer science degree and becoming a professional programmer? For years I’ve recommended that CS grads read Code Complete. Now I’d also recommend New Programmer’s Survival Manual by Josh Carter. This new book has some similarly to Code Complete. However, Code Complete is about good programming technique, not programming as a profession.
The Survival Manual has four parts:
- Professional Programming
- People Skills
- The Corporate World
- Looking Forward
The first part has the most similarity to Code Complete, though even there the two books are complementary. The second part, people skills, has some great advice, though I imagine most CS graduates will skim over this part because they don’t realize it is important.
CS students may do well to read the Survival Manual, especially parts one and three, to find out whether they want to be programmers. Some who find abstract computer science fascinating will find a typical programming sorely disappointing. See Mike Taylor’s post Whatever happened to programming.
A few of these may be able to find refuge as computer science professors, but not many. If you want to become a professor and think you’ll be able to get an academic job, watch So you want to get a PhD in theoretical computer science and read No, you cannot be a professor.
The Survival Manual assumes the majority programmers will be working in cube farms on enterprise software, which is true. But there is a small middle ground between enterprise development and academia, jobs that will give you a chance to use advanced computer science without having to write papers about it.
One reservation I have about this book is that it may be overwhelming. If you have a friend who is starting a new career as a programmer, maybe you could buy a copy of the Survival Manual and rip it into chapters. Then mail your friend one chapter a week.
Another reservation I have is that new CS graduates may not benefit much from the book because they won’t believe it. They may deny that the real world is as Josh Carter describes.
The people who may benefit the most from reading the Survival Manual are programmers with some experience who want to improve their skills. They may have learned through hard knocks about some of the challenges Carter writes about. Also, Carter describes life in a software shop with fairly high standards. Those who are used to producing lower quality software will do well to read about life in an organization with higher standards.
Related post: Where does programming effort go?
I was having this exact same discussion with several people at work recently. A CS degree does not prepare you to be a software engineer (programmer.. whatever). Most of the CS grads that I’ve interviewed and spoken with lack the most important skills that will make them successful: Good Communication skills, the ability to deconstruct problems, knowledge of useful tools, real-world programming knowledge. There’s a vast gap (even on the technical side) with what is taught, and what is important. I’d also recommend these two books to people going into programming/software: The Career Programmer: Guerrilla Tactics For An Imperfect World (Because grads are WOEFULLY naive when it comes to company politics and manager/employer relations), and The Elements Of Style/How To Speak and Write Correctly – the better your written and spoken communications, the further you’ll go.
I think you’re conflating two separate problems that arise from CS student -> pro programmer. One is technical, most CS programs simply do not have enough programming on the scale that an industry position requires. The other is social: the workplace environment is different from the academic one (at least for a cube farm), less so at small companies I think. These are two very different problems with different solutions and I think it’s better for new graduates not to conflate them.
I solve this problem by just taking CS classes for fun while working on a chemistry degree. >.>
Actually, it would be really nice to see more ‘Programming for non-professionals’ books/classes: You know, those of use who are not going to spend the majority of our time writing code, but will occasionally have to open up emacs and write some C/C++ or Fortran.
So much of what I’ve seen is either basic scripting (Which is very useful, don’t get me wrong) or assumes you are going to be working on massive projects with dozens of other people and thus need a ton of abstraction, error checking, interfaces to commercial libraries, long term support. There isn’t much for the person who is going to be writing non-GUI software by themselves to do one thing.
I have a CS degree and they were never meant to teach you to program. They teach you about complexity and theory. Electrical Engineers on the other hand are taught programming. Hire EE grads to code and CS people to run your processes.
“But there is a small middle ground between enterprise development and academia, jobs that will give you a chance to use advanced computer science without having to write papers about it.”
I’m curious what you’d say about how to find that middle ground.
Most professional code is ugly, inefficient and full of bugs.
It points to important skills that are probably lacking in academia. It is : understand bad code, know what is “good enough” and debugging complex programs.
The biggest problem with programmers is that they are sorely lacking in a lot of areas yet are shining examples of the Dunnings-Kruger effect. I’ve yet to meet a coder who doesn’t have an opinion on a topic they know nothing about, and are willing to inject said opinion even while talking to experts from the field.
This problem manifests itself in development as a concrete solution in their mind to a given problem statement. The prime reason agile is useful is that it makes the coder ship code to someone who can tell them it’s wrong faster than in other methods – the rest is optional guff.
What I wouldn’t give to hire a coder who knows math/stat, and learned computer science in parallel with another field unrelated to software engineering. If you’ve ever had the pleasure of meeting one of these people you know what I’m talking about.
Painters can’t paint by reading books on painting….IMHO.
“Andy 12.14.11 at 08:34
Painters can’t paint by reading books on painting….IMHO.
”
Couldnt agree more, In the past 10 years in IT, the one thing which has stayed consistant in my experiance, is people with CS degress or equivelent, are more often than not, useless in every day scenarios. Where as people who joined the industry and worked up, without academia, are often far superior at real world work, even if they dont know the particulars of CPU architecture etc.
@Ben – “I’ve yet to meet a coder who doesn’t have an opinion on a topic they know nothing about, and are willing to inject said opinion even while talking to experts from the field.”
Amen brother, and it isn’t just coders. Aside from that, I’ve worked in cubicles with other programmers and found among them musicians, Trekkers, World of Warcraft devotees, basketball coaches, fat guys, skinny guys, muscular guys, cartoonists, historians and Renaissance men. Some are arrogant, some are modest. The one thing I found in common was a good sense of humor and resistance to commenting their code. And I know of one company that’s going to colleges and explaining what they are doing wrong.
good point andy…
John, thanks for the thoughtful (and positive!) review. I laughed at the “mail your friend one chapter a week” comment. Your introduction about computer science echoes many, many conversations I’ve had over the years — in fact, my book was largely born from frustration at the gulf between computer science (as taught in school) and computer programming (as practiced on the job).
@Andy: agreed, however the Survival Manual isn’t very much about the painting, it’s more like a book on “painting as a career,” with some tips on light-fastness of various pigments. ;)
As I have slithered out of the academic world into the programmer’s world, I occasionally find myself remarking (to myself), “well, this guy wouldn’t last a minute in the academic world…where assigned self-esteem is king.”
We have coddled students (in all academic disciplines, including the CS courses, and then throw them into the work world (or try to) sorely unprepared with the understanding that programming does not involve what you wear, how old you are, or whether everyone around you is your preferred ethnicity.
While I am having to develop less of a “chatty” demeanor in my questions to Code Project developers (some of those folks thrive on newbie flesh), I am thoroughly enjoying not having to be concerned with whether a student likes me so he/she will do his/her homework.
Will I write about my experiences in becoming a developer? Absolutely. There are holes in resources for those of us who have little CS/IT background (aside from the “teacher designed” computer courses that are dummied down for…well…K12 credentials).
I always wanted to learn how to speak French. Who knew that I would find C# such a delightful second language?
Off I go to Amazon to buy Code Complete and Survivor’s Manual.
I have done CS and in my opinion the problem lies with the university’s expectations as they are more focused on you understanding the theory and getting your code layout right rather then making sure its efficient.
@Deborah Palmer McCain: everybody talks about Code Complete. But this is an old book, targeted at beginners. If you really want to understand something of programming (I mean, ehem, understand that you don’t understand anything), go read Fowler’s book on refactoring, the GoF’s book on patterns (although there are some newer out there, with more patterns, the introductory chapter to the GoF book is IMO invaluable in making you understand what the value of patterns is), and A. J. Riel’s book on OO design heuristics. I assume that since your origin is academia, you don’t need a book on data structures and algorithms – if you don’t now about them, this is also something very important to know.
Code Complete may be useful to transform you from a complete noob into a programmer able to write decently looking code. But if you want to write great code, design the solutions you implement yourself, and be able to solve hard or big programming problems (like designing an application which should scale to millions of users, or one that should support thousands of different use cases without its design crumbling under the weight of thousands of changes), Code Complete is not enough.
And BTW, I liked your comment – that’s why I bothered to respond, I thought you might make some use of my response.
In my opinion, Code Complete has aged better than GoF.
I am an IT instructor but a Certified Public Accountant by profession. The thing is, I know more about programming (been developing programs for 13 years now) and infrastructure than most of the IT guys at work. So I think being good at programming doesn’t necessarily need a degree in CS.
The problem is really our expectations of the education system. We send kids to school to learn how to work in a field that includes everything from data science to systems programming in the cloud to embedded device driver architecture. So we cram them full of highly detailed knowledge along several general axes — knowledge they will DEFINITELY need for some of these careers, but not all of them — rather than preparing them to enter a specific area. And what’s more, we’re teaching without the proper context.
For example: design patterns are a descriptive language for discussing a class of solution. Teaching them before the patterns have been encountered in the wild turns them into a set of recipes that must be used. I find that leads to brittle thinking, where young programmers are scared to employ their own ideas for fear of reinventing the wheel or where they can’t identify Observer unless it’s called XXXObserver.
At the same time we put no focus on what would really make these kids valuable and successful, such as testing acumen and requirements evaluation.
What is the answer to the question: a construction engineer can build a wall better than a mason?
Probabily not…but its responsibilities are very different when is required the safety certification of a complex system.