Please Don't (Just) "Learn to Code"
You can’t have missed the landslide of articles and campaigns in the past few months encouraging people to “learn to code”, and reporting how easy it really is.
Whilst much of this is just journalism lite — I’m sure they’ll move on to another hot topic soon — I can’t help but fear it is causing a dangerous misconception about what “coding” really is, which might actually discourage people who are genuinely interested in a career in software.
First to come clean… I’m a software developer of 20 years experience, so this article could come across as rather protectionist or elitist, but what I’m really trying to do is to set expectations on where “learning to code” will actually get you, and that it is just one piece in a bigger puzzle that really is worthy of your attention.
I would like more people to learn to code… I really would… and then to consider going on to do everything else required to turn them into software developers, because that’s what the world needs more of; not mere coders, but software developers, architects and engineers all building software products that work and which solve real world problems. There really aren’t enough of those; well, good ones anyway.
Far from discouraging people from dabbling with coding but going no further — maybe through necessity at work, or just for interest — I’m trying to redraw the distinction between pure coding and software development; they really are two different things… despite what “code schools” would have us believe.
I first “learned to code” when I was 7 years old, from a book and with a home computer, but I certainly wasn’t any use as a software developer at that stage, and the things I was building were just entertaining examples. In fact, my growth as a software developer has been continual since then, and you never stop learning. Like any skill, beyond a hobby, it’s more of a journey than a destination.
Some Code
It’s satisfyingly easy to learn to write some code, just as it’s probably easy to learn to speak some French. But to be able to hold a conversation in that language, with some useful aim in mind — and ordering a sandwich doesn’t count — takes a lot longer.
Similarly, to write code for more than just a small hobby project takes much more than a weekend or a short course. To develop a growing code base on a project that tackles a real problem, and to explain and fix and extend that code until it does something reliably useful, takes more than writing “some code”.
Learning how to write performant, scalable, readable, production-ready code — and particularly as part of a team — is a different skill and one that takes a little more time and investment. Some might say an entire career. It also, however, comes with its own sense of reward and satisfaction.
As with many skills, the jump from zero to beginner is tantalisingly achievable: I might safely claim that I can speak French, that I can act, that I am able to sing or to play the piano, with just a weekend exposed to any of those activities,… but I would be a mere beginner.
The road from beginner to mid-level, or from mid-level to expert, is an order of magnitude longer and it is only a certain distance along that road that we start to be able to do useful or appreciable things with that skill, or to be able to contribute to bigger endeavours by combining our efforts with other people.
Abstract Thinking
Beyond small solo projects or writing a few scripts, coding isn’t the only skill required.
Because software is essentially invisible until we see the external effect it has upon the world, what software developers spend much of our day doing is talking about abstract concepts, applying sensible names to things, separating and grouping those concepts, choosing where to draw lines between them and figuring out how they might usefully interact.
We break down business ideas into those concepts, then shape a solution and figure out what we might code at a higher level first. This is all way before, during and after we write any code. We might even occasionally do all of this in our heads… which is where the misconception that coding is easy might come from.
Just like an author structures an article or a book, then writes words, paragraphs and pages to that abstract structure, code is merely the written form of the more complex, abstract ideas that go into building software to perform a useful function.
This article is more than just words (well, I certainly hope so!), and usable software is more than just code, though you might only see the code and the external behaviour of the software.
I am not so sure that abstract thinking can be taught though it can certainly be encouraged and is useful in other disciplines too. Getting people to explain and draw abstract ideas really helps, which is why this should be encouraged alongside learning to code.
One thing is certain: coding without an ability to think in abstract terms doesn’t get you very far.
Learn to Write Software That Works
So perhaps I agree after all… maybe we should encourage everyone to learn to code… and then we should encourage them to try to build something usable by coding from scratch, perhaps in a small team, and release it so that others can use it, and fix the problems, and go round the loop to improve it and to learn what comes next.
Rather than just moving on to the next hobbyist example, this would give a sense of what comes beyond learning to code, and that might genuinely spark the interest of the smaller group of people who want to go on to be software developers.
That journey isn’t quite as short, trivial, appealing or accessible to everyone as popular “code schools” would have us believe, and not everyone will stick it out, but it is a satisfying and rewarding journey for those who want to pursue it.
For the people who truly want to learn to develop software — and I really hope some do — de-trivialising merely “learning to code” in favour of explaining a more realistic career path, might just lead to more talented software developers, which is what the world really needs… not just coders.
Yes. Coding is just one of many skills (and maybe not even the most important one) necessary to build a useful, functioning software but alone it won't make one a software developer. Same as the ability to turn the wheel and change gears won't by itself turn one into a driver. I chose to develop a piece of software to solve a real problem in the real world as my 3rd year college project, and I'm now learning all this myself the hard way (and totally enjoying the ride!).
great article Ian. Wish someone had told me all this before my failed attempt to become a java developer!