I've read thousands of job requirements for computer programmers over the years, and written or edited quite a number. I’ve interacted with hundreds of software groups and seen the results of their work. I’ve spent a couple decades cranking out code myself in multiple domains. There are a couple near-universal problems with job requirements that, if changed, would improve the quality of software groups and their productivity.
Of course, it’s not just the job requirements and what the hiring people do – it’s also the managers, from the CEO down. They also have to not just support but champion the changes I describe. If they do, everyone will enjoy better results from the software team.
In this post, I'm going to concentrate on just one of the issues: academic degrees
A near-universal job requirement is an academic CS degree. When analytics, ML or AI is involved, the requirement is often “upgraded” to a Master’s or PhD.
There are many capable programmers who have degrees of this kind. Often it doesn’t seem to hurt or hold them back much. But all too often it does! The more specialized the training, for example in project management or quality, the more likely the “education” the person has received is an active impediment to getting good work done.
Here’s the simple, raw, brutal fact: Getting a degree in Computer Science does NOT train you to become an effective programmer in the real world. All too often, the degree results in the person performing worse than someone with self-training and apprentice experience.
That is the fact. Surprised?
Let’s do a little compare and contrast with medicine. Yes, I know that an MD is a graduate degree, while CS is often undergrad. Medical training has evolved to what it is now after decades and centuries of finding out what it really takes to help make people healthy. By contrast, CS degrees just started being granted 50 years or so ago, and are far from even trying to figure out what kind of training helps create good programmers.
First let’s look at the training and testing:
- You don’t even get into med school without taking the MCAT, a challenging test that takes over 7 hours that few do well on.
- Once you’re in med school you take a four year course to get your MD.
- The first two years are academic, including hands-on labs. Then you take the USMLE-1. If you don’t pass this challenging test you’re out. End of med school.
- The second two years are clinical! You’re in hospitals, clinics and offices seeing patients under supervision. And you’re graded. And then you take the USMLE-2, which is harder than part 1 and has lots of clinical stuff. If you fail, you’re not an MD.
- To practice, even as a general practitioner, you have to apply and be accepted into a Residency. Depending on specialty, this can be 3-7 years of mostly hands-on practice, under close supervision.
- During your first year, you have to take and pass the USMLE-3. Fail and you’re out.
- During your last year you have to take and pass the test specific to your specialty. Fail and you’re out.
Here’s the equivalent of the training and testing in CS:
- There is NO equivalent in CS. No entry testing. No exit testing. Just grades on courses determined by professors who usually pass everyone.
A little compare and contrast between medicine and CS:
- Medicine is taught by doctors who practice medicine
- CS is taught by professors, most of whom have never practiced programming in the real world.
- A large part of medical training is working with real patients with real problems, under the supervision of practicing doctors.
- CS is primarily classroom teaching with textbooks and homework exercises. You have to write programs as exercises, but it’s completely artificial. There is nothing apprentice-like or truly clinical about it.
- Medical training is led by doctors who are incented to produce great doctors.
- CS training is led by academic PhD’s with no real-world experience who are incented to publish papers read by people like them.
- Medical journals publish essential information for practicing doctors, giving advances and new discoveries.
- CS journals are read by the tiny group of academics who publish in them. Practicing programmers pay no attention for good reason.
- Bad doctors are fired for incompetence and barred from practicing.
- CS graduates are rarely fired for incompetence. If CS graduates can’t program well, they usually shift into using their non-skills in “management.”
- In medicine, best practices are increasingly codified. You rapidly fall under scrutiny for deviating.
- CS grads seek out and follow fashions that are the software equivalent of blood-letting, enthusiastically promoting them and getting them adopted with disastrous results.
- Hospitals are compared with each other in terms of results. It’s not hard to find which are the best hospitals.
- Groups of CS grads make it impossible to make comparisons between groups, with the result that huge groups produce major disasters at great expense, while tiny groups of effective programmers perform 10X or more better.
All this doesn’t make things uniformly wonderful in medicine. But it goes a long way towards explaining why software is so bad. It’s awful. The awfulness is so widespread that it’s rarely talked about!. If bridges fell down at 1/100 the rate that software projects fail, there would be a revolt! Instead, everyone in the industry just sighs and says that’s the way things are.
You think things are great in software? Check out a couple of these:
https://www.blackliszt.com/2015/09/software-quality-at-big-companies-united-hp-and-google.html
https://www.blackliszt.com/2014/12/fb.html
https://www.blackliszt.com/2014/02/lessons-for-software-from-the-history-of-scurvy.html
The fact is, CS training leads to horrible results because Computer “Science” is roughly at the same level as medicine was when bleeding patients was the rule. See this:
Conclusion
There are lots of things you can do to improve the results of hiring software programmers and managers. Here's how the usual interview process goes; here is specific advice about interviewing. There is a whole pile of advice in my book on software people. If all you did was drop the CS degree requirement, you would have taken a big step forward in quality improvement.