December 20, 2010

...Learn TDD with Codemanship

A Proposed Grading Structure For Programming Practices

With a new year, and a new focus, looming, I just wanted to set out my stall on the topic of software developer apprenticeships - run it up the flagpole and see which way the wind blows.

I've spoken a lot this year about the increasingly desperate need for better software developers in larger numbers. At the risk of sounding melodramatic, our civilisation really does kind of depend on it, as it increasingly grows to depend on software for almost every aspect of its function - from business to science to the arts to everyday human social interaction (remember when you had to turn up to appointments because you had no way of letting them know you weren't going to make it?)

Here in the UK, the dilemma is that as our society grows ever more reliant on software, computing education is in decline. This is not sustainable, and threatens our economy and our way of life. It is evident that successive UK governments have failed to recognise the problem and have no plans to do anything meaningful about it. The recent vote to allow universities to charge much higher fees, saddling students with crippling debts, is quite possibly the final nail in the coffin of our computing future. It's hard enough to persuade the brighter students to take a computing subject without dangling the scythe of increased debt over their heads for their troubles.

Here's the rub. In school, kids don't do programming. GCSE information & Communication Technology teaches them to use software. A-Level Computing teaches them some basic computer science and how to use software in business applications, as well as giving them an appreciation of basic programming techniques, though the amount of actual hands-on programming experience they gain is small in comparison to the amount of hands-on experience, say, an A-Level Music student would be expected to get.

So kids arrive at university with little or no hands-on programming experience, and techniques like unit testing, build automation, refactoring and so on have most likely never been mentioned to them. And are unlikely to be mentioned to them during their degree studies, either. A surprising number of computing graduates leave university still effectively unable to program at anything more than a very basic level.

What's needed is for us to take a leaf out of the musician's book. Sure, there are Music GCSE's and Music A-Levels and degrees in Music, and there is music theory and history and philosophy and technology that can be studied in an academic setting.

But a musician also must demonstrate practical achievement, which is why we have grades for musical instruments which are based on the student's ability to perform music. Whether you intend to go on to study music and gain qualifications and persue a career as a musician, you can chart your achievement as a performer of music with grades. (And, yes, I know, there are grades for music theory, too, but whatever - it's still mostly about your ability to perform.)

So here's what I'm proposing. In 2011, a bunch of us - practitioners, employers, teachers - are going to get together and thrash out Computer Programming Grades. What should a "Grade 1" computer programmer be capable of doing? What should a "Grade 8" computer programmer be capable of doing? And what theory will they need to master to get them from Grade 1 to Grade 8?

These grades would be considered the bottom line for a practitioner. If you don't have all eight, then you're not fit to practice in a professional capacity. They might also serve as entrance requirements for computing degrees, demonstrating a pre-requisite amount of practical achievement and basic theoretical knowledge that guarantees that, at the very least, you won't be dropping out of your degree because you couldn't hack the programming (if you'll excuse the pun).

Just as grades in music are defined by the pieces students are expected to learn and perform, programming grades would be defined by programming problems and challenges. A Grade 1 programming problem might be to write a 50-100 line program that does something fairly simple, like calculate the value of a restaurant order, add sales tax and suggest a tip. A Grade 8 programming problem might present the student with a medium-sized program (10KLOC) that contains common code smells and legacy design problems and ask them to identify them - with the help of static analysis tools - and eliminate them through refactoring. I actually know plenty of professional programmers who would currently fail a Grade 8 examination. Examiners would watch recorded screencasts of the students tackling the problems, and mark them on their ability to solve the problems as well as on the discipline they apply while they do it (e.g., after a refactoring, does the student run the tests?)

I plan that these grades be aimed at children ages 11+, but, of course, anyone could do them at any age. And it would be only fair that those of us who propose what should be in them be among the first to take them.

Think on this. As an employer, if you are one (or just pretend for the sake of argument), would you hire an 18 yr-old apprentice with a Grade 5 in programming, as described above? I would. Definitely. I might even favour it over a computer science or software engineering degree. Would I prefer a candidate with Grade 8 programming AND a computer science degree? You betcha'!

Now, I know the score. As soon as you get more than one software expert in a room, you'll have a debate on your hands on exactly what should go into these grades. I don't deny, this will be a challenge. But I am very much up for it.

After all, something really must be done.



Posted 3 weeks, 2 days ago on December 20, 2010