Craft vs science: thoughts on computer science education.

In a previous job, a large part of my duties was to interview people who applied for a job with us and then write an assessment of those people.  Among the people I interviewed there was a considerable proportion of people who were fresh out of graduate school.

One of the puzzling things about graduate school is that it doesn't really seem to prepare candidates all that well for a life in the tech industry.  It does more to prepare you for a continued career in academia.  I observed two main problems in newly graduated candidates:

  • Most of them can't program.
  • Most of them struggle to apply knowledge to real problems.
And just to be clear:  the people who made it to on-site interviews were the ones that were left after weeding out 90% of the candidates.

I would say that being interviewed by me was a fairly benign affair:  I wanted people to succeed.  Also, I gave people problems that anyone should be able to come up with a working solution for (to get a passing grade), but you would need to be a bit smarter than average to come up with an optimal solution.  But usually not by much.  Of course,  some problems did not have an obvious solution as such, but were designed to observe the thought process more than the final outcome. (I hope I managed to communicate this in most interviews to reduce the angst of the candidate).

In any case, a surprising number of newly graduated people were shockingly bad at writing code.  And what was even more shocking was the degree to which defenders of common academic goal-setting thought this was acceptable.  In fact, in some academic circles it is almost seen as a bit dirty to "waste" time writing code when you could be publishing papers.

I could go on for hours about academic papers and the limited value they have outside academia.  I've probably consumed more scientific papers than most doctoral students and at one point I even went back to school to take some extra math classes to better understand some of the more challenging papers.  (Math is one of those skills that quickly atrophies if not used and although I have some mathematical intuition, most of the mechanics of mathematics and encyclopedic knowledge is just gone).
Believe me:  I have spent a lot of time reading reams of academic papers to find solutions to hard problems and adapt them to the real world.  So much is just relatively trivial deltas in knowledge dressed up to look important and because of the sheer volume of mediocre to bad papers being published it can be really hard to find that one important needle in a haystack of papers.

But I digress.

I wish universities would recognize that not everyone is heading for a PhD.  Some people who choose a computer science degree are actually going to make stuff.  And it would be beneficial if their education would prepare them for this.  Possibly even allow some candidates to discover that they may have chosen a profession they are not suited for or won't enjoy at an earlier stage -- before they've racked up student loans.

After all, if you want to become a surgeon, they don't wait 10 years before they let you interact with a real human being.  You are not going to be hired as a surgeon and be allowed to actually go at people with scalpel, laser, hack-saw, drills and the like unless you have had some training in this first.  You do not go directly from reading about appendectomies or inter-cranial surgery in books to suddenly being handed a scalpel or a high speed saw and told to "figure it out".  Cutting people is a craft.  There are lots of practical skills you need to learn from practitioners,  there are differing local practices you won't find in literature etc.

Why is it that we accept that teaching aspiring surgeons practical skills is an integral part of their education, but that we accept less from, for instance developers?

There is no shortage of people with a computer science background.  There is, however, a shortage of people who are really good practitioners.  I think it is vital that universities start to take this into account and think harder about producing candidates that are better prepared for the real demands their careers will put on them.  Universities do a fairly good job of giving people a solid theoretical basis.  In general they do not seem to be where you go to learn excellence in actually practicing what is, to a larger degree than they would like to admit, a craft.


  1. I've always believed that practical programming skills should be a prerequisite for studying computer science.

  2. a friend of mine described a problem that candidates would be presented with on job interviews for a programming position. the problem was something along these lines:

    for all numbers between 0 and 100, print out all numbers divisible by 3, 5 an both 3 and 5.

    according to him most candidates were unable to produce a program that would do this.