May 31, 2012

...Learn TDD with Codemanship

Let's Not Call It "Computer Science" If We Really Mean "Computer Programming"

I've probably mentioned this before, but I felt I needed to clarify my thoughts on the question of teaching "computer science" in schools here in the UK.

My first thought is "do they really mean 'computer science'?" Let's be honest, a lot of people who've waded into this debate don't really know what computer science is.

They may talk about how the home computing boom of the 1980's sparked a passion for "computer science" among people my age. It did not. It sparked a passion for computer programming.

Computer programming and computer science are related, of course. But they're not the same thing. Computer programming is like writing and performing music, and computer science is like music theory.

It helps to know some music theory if you write and perform music, but a lot of very successful songwriters and performers get by very happily with just enough music theory.

Some amazingly creative and accomplished musicians have created wonderful works just playing by ear and learning what sounds good and what doesn't. They might not be able to read music, and they might not know that the cool jazzy-sounding chord they're playing is Cmaj7 or that the melody on top is in C lydian, but they know how to play it and they know it sounds cool.

There are limits to how far one can go musically without learning some theory (orchestral works may present a problem, for example), but a great deal of very popular music falls well within those limits. Commercially, I can imagine that the vast majority of music people listen to (and pay money for) is created by people who know just enough music theory to get their message across.

Computing is remarkably similar to music in some respects. Indeed, you might be surprised how many great software developers out there come from musical backgrounds.

The generation of software developers created by the 80's home computing boom are largely self-taught, and are largely "programming by ear" even today. Some will have gone off and studied computer science, but most of us didn't (because, frankly, yawn!)

Of all the mathematical sciences, computer science is unquestionably the dullest. If I had my time again, despite discovering just how much I love writing software, I still wouldn't study computer science. I'd program, for sure. And I'd buy books on CS and learn what I need to make me a better programmer. Which is exactly what I did.

It's my deepest concern that we don't put off a new potential generation of software developers by teaching them stuff that a. they probably won't need to know, and b. will be taught at the expense of things they might actually find useful.

Think of computing as a pyramid. At the base, we have computer users, who will probably make up about 99% of the pyramid. The next level up is people who write software (let's ignore people who make computers - that's electronic engineering, which a CS education won't help you with), and they might account for the next 0.9% of the pyramid. Finally, at the top, are computer scientists - people who advance the concepts, design the programming languages and "push the envelope" for the 0.9% of us who write software day-to-day.

I meet thousands of software developers every year, and the majority are self-taught. I cannot tell the difference by watching them develop software. CS educations, it seems, are of little help if your goal is to write transactional software for banks or to write physics engines for computer games (for that, a physics education comes highly recommended). And most people who study computer science really want to be software developers - not computer scientists. For sure, that's where most of them end up.

The feedback I get from CS graduates who've been working in software (and from their employers) is overwhelmingly that their degree didn't prepare them at all for software development. Time spent learning the UML meta-meta-model and Object Z is, for 99.9% of developers, time completely wasted - time that could have been spent learning something useful like how to write good automated tests or how to write an efficient and robust build script.

Yes, yes, yes - computer science isn't about programming or about unit tests or about build automation. I'll grant you that. My complaint is not that CS degrees are teaching the wrong things, but rather that most CS students are on the wrong course.

The confusion in the educational space regarding computer science I think is best summed up by this blog post about a correspondance between a chap trying to propose a BSc in Software Development and a computer scientist.

Most telling is the paragraph:

"The graduate would be able to write a program, but write a program to do what? With no formal foundation in mathematics and algorithms it's no use being able to program, as you would have no idea how to write a program to solve your problem! You're also missing any work on languages, machine learning, semantics, category theory. No formalisms at all! It's no good being about to program if you don't know anything of how to solve problems."

On display here is a staggering level of both ignorance and arrogance, but sadly this attitude is not entirely uncommon among CS academics, many of whom believe that out here in the real world, we're doing it wrong.

Like someone with an encyclopedic knowledge of music theory who can't play an instrument, CS graduates often begin their careers suffering from the misapprehension that they know a lot, only to quickly discover that they don't know much of anything that really matters if you're writing software for businesses and end users.

I remember in an interview for a very bog-standard tech lead role being asked how I would implement a hash map. I said I believed it had something to do with "hashes, associative arrays and 'buckets'" but freely admitted I couldn't tell them the exact algorithm. I asked them "so we won't be using the collections in the Java framework, then?" I then asked them about the qualities of their code - y'know, unimportant things like how readable it was, or how modular, or whether they had automated unit tests. Apparantly they'd been too busy implementing their own version of java.util to bother with such trivial nonsense.

I'm not going to suggest that there aren't times when it pays to know how a hash map works, or to be able to design a small domain-specific language. But such times are few and far between (if you're not working on compilers or core programming frameworks, which most of us aren't and don't need to be), and for that we have Google (the search engine, not the company).

I've read books on data structures and algorithms, languages and compilers and other jolly CS fare, and I read them because I am interested in being a better software developer. If I really needed a bespoke programming language, I'd hire someone who knows what they're doing. It is enough for me to have an appreciation of the concepts and to "know a man who can" in most cases.

So here's how I see it - in case you hadn't already guessed:

Going back to our pyramid of computing, for the 99% we want better computer users. And for this I think we need not just better computer "driving skills", but an ability to think more logically and 'computationally'. I see this as being something we should cover in maths lessons (logic, set theory, data structures, algorithms), and by extending all kinds of computer use across the entire curriculum, getting kids using apps for a whole host of school and personal projects.

For the 0.9%, it's programming, programming and more programming, with a cherry-picking of theory when it makes the programming easier or better. Computing as a practical skill - making stuff and doing stuff - is where my generation of software professionals has come from. We are self-taught, playing often by ear, and hugely, hugely passionate about what we do. Which is why many of us know more theory than a lot of CS graduates. It just happens to be the most useful theory, since we learned it because we felt we needed it. People who develop a passion for doing something very often develop a need to be better at it, and will develop and learn under their own steam. Try and stop them!

For that 0.1% who are strongly attracted to the mathematical side and get a buzz from discovery and advancing the theory rather than from making and doing, we have computer science. But I'll wager they started as self-taught programmers in many cases.

I believe that what's needed is a much more rounded computing education for the 99%, with IT blending seemlessly and ubiquitously into everyday lessons as well as home life. This should be complemented by a beefed-up maths curriculum that takes kids further in computational thinking. Frankly, school maths has been watered down so much in the last 30 years that there has to be capacity to make it more challenging.

For the remaining 1%, of whom some might become software developers, we need programming in schools (and out of school). Lots of it. Fun, interesting and challenging projects that get progressively more "grown-up" as kids gain experience and confidence, until, by the age of 18, some of them are doing what we might recognise as "software development". We should find a fun and hands-on way to cover sufficient theory as they might need to make them better programmers, and ultimately perhaps, one day, software developers.

I should also probably mention that software developers, unlike computer scientists to some degree, need to have very well-rounded general educations, too. Their ability to communicate - and not just through code - as well as their ability to reason and quickly learn in a wide range of problem domains requires more than just coding skills. It is possible to be a successful computer scientist and not know how the futures market works or how gas propogates through pipelines or what the tax laws are pertaining to international online sales. As a freelance developer, I worked in everything from engineering to corporate law, via retail, TV and banking. Without a good general "classical" education, I think I might have struggled to wrap my mind around some of the domains I've been parachuted in to fast enough to get anything useful done.

A smaller proportion might end up persuing the maths, and the support needs to be there to ensure we don't have to skimp on that for those who really want and need it.

To be clear, I'm not saying CS has no value - you wouldn't be able to read this were it not for advances in computer science. But I do feel that we've been a bit loose with our language (when we say "computer science" but often mean "computer programming"), and a bit too focused on the problem of filling CS degree courses rather than the problem of what we need beyond that. And what we need, for the most part, is not computer science.

As for what happens to kids with a passion for computing but who don't want to be computer scientists once they leave school, I happen to feel very strongly that apprenticeships is the way to go. Software development's something you can only learn by doing, and you need to do a lot to get good at it.

Developers will need some theory, and I'm painfully aware, too, of the degree snobbery that most employers harbour. So I propose that the right course would be a 5+ year apprenticeship with part-time degree study - CS in the classroom 1 day a week, software development in the office the other 4.

I'm also very passionate - being lucky to have had a private education funded by a state scholarship that my parents could never have afforded - about the potential in software development for social advancement. I'm spitting feathers that kids now have to get massively into debt to get a college education that will benefit businesses and society, and I would love to see an option on the table where kids with a talent and a passion for software development can earn a degree while getting thousands of hours of school-of-hard-knocks experience and finish with little or no debt at all.

So, there. I've said it.

You may now start throwing the furniture around.

Posted 10 years, 10 months ago on May 31, 2012