There is some debate these days about teaching our kids to “code” and integrating software development into the mandatory curriculum along with reading, writing, and arithmetic. Many in our industry feel that this trend is misguided – including our own Dick Selwood, who recently wrote a piece making the case that programming is the wrong thing to be teaching. The arguments range from pointing to some of the very visible recent failures of software-based systems to worrying that programming is a passing fad that could leave our youth prepared for an obsolete profession.
I strongly disagree.
Software-based systems fail because modern software is the most complex creation ever attempted by humans. Programming is a multi-disciplined, massively-collaborative art that stresses every known attempt at complexity management, cooperation, verification, and human understanding. Software fails because nobody has yet figured out a way to make it never fail. And, the problem just keeps getting worse because, every single day, software becomes more complex and more difficult to create and verify.
The use of the term “coding” belies the flaw in the argument against teaching programming. “Coding” is a term derived from the “waterfall” method of developing software systems. That method prescribes development of a requirements document, production of a functional specification, and then “coding” that functional specification into machine-executable software using some programming language. “Coding” implies a process of simple translation – converting human-readable specification into something less accessible by humans but executable by machine.
However, the waterfall method of developing software systems ran out of gas some time ago. The complexity of the systems we are now creating in software is far too great for the specify-develop-test sequence to have any hope of reaching closure. The vastness of the requirements on a modern system would require volumes of specification to address. Our ability to detect flaws, holes, and inconsistencies in such a specification is near zero. Waterfall development is hopelessly reliant on humans’ ability to wrap our brains around the entirety of a problem before proceeding to the next step. We are simply not that smart.
Now, the most complex systems tend to follow something resembling an agile or spiral development model. We assemble software systems by prototyping, evaluating, improving, and aggregating capabilities. We iterate – building successive prototypes until we reach a point of closure where a prototype meets a sufficient fraction of our needs. In these models, “code” is the language of requirements, specification, and implementation, as well as the dialect of choice for the evolution of that specification. Before one can begin to contribute meaning to that dance, fluency in the concept of programming (or “coding” – although I disagree with the use and implications of that word) is essential.
One does not write “King Lear” without first having a solid understanding of how to craft a complete thought into a written sentence, how to conjugate a verb, how to add meaning with expressive modifiers, and how to create rhythm that engages the reader. The basic lessons of spelling and grammar are essential, as are the strategies of storytelling. Before we begin expecting our youth to emulate Shakespeare, we must endow them with the basic skills of written communication.
The same is true for programming.
It doesn’t really matter what programming language we teach, or whether the particular level of abstraction our children learn in grade school will be obsolete by the time they reach higher education. What matters is learning – at an early age – the process of beginning with a single snippet of understandable “code” and building from there into a system whose behavior is more complex than the creator can possibly contain in his mind. What matters is taking a real-world human problem and going through the mental process of turning that into a clear set of instructions for a soulless machine.
Practically everything I learned in college about EE is long obsolete. There is very little call for hand-assembling code for a Motorola 6809 8-bit processor. My mastery of Hollerith constants in FORTRAN 66 never gets put to the test. The uncanny ability I developed to locate bugs in TTL logic by probing a wire-wrap perf board is no longer the least bit impressive. However, the problem-solving skills I garnered by mastering that ancient craft have served me for an entire career. Regardless of what we study, the most important thing we learn is how to learn more.
Our world is increasingly reliant on software. Today, most people in the western world walk around with supercomputers in their pockets, interacting with and depending upon software on a near-constant basis. Software touches just about every aspect of a modern person’s life, and this has never been the situation before in human history. In order to thrive in our world, people need to understand the current best thinking on how software works, when and why it fails, and how to make it better. If they do not comprehend the simplest principles of programming, they have no hope of flourishing in that future.
It does not matter whether these students go on to become programmers. Today, we accept the idea that children should learn reading, writing, and mathematics; arts and social skills – regardless of whether they will eventually become bankers, businessmen, artists, or engineers. These are the skills of surviving in modern society, not training for a trade. In a future world built largely of software, learning programming should most definitely be added to that list.
In the current explosion of the app-based economy, we see software applications for just about everything. The slogan “there’s an app for that” aptly describes an environment where there literally are software apps being created to assist with just about anything one could want to do. The challenge is that programming is a required skill for creating such apps – along with expertise in the application area. I spent years in electronic design automation (EDA) – where one must have extensive knowledge of hardware engineering and software development. People who write apps for photo and video editing must be experts in photography or videography and software development. In fact, people developing applications for just about any field need software development expertise in addition to their core competence.
Not that long ago, “typist” was a valid profession. One could study the craft of typing, become fast and accurate, and make a career typing the work of others. Content creators did their creation and editing with pencil and paper or with dictation machines – then they handed their work off to a professional typist to complete the job. Today, the vast majority of professionals type their own work. Keyboard competency has become a basic skill. In fact, with word processing – our content is normally created, evolved, and edited in typed form. It would be odd indeed today to find a professional who worked out documentation in longhand and then handed it off to a typist.
This same trend may well be happening with software development. The challenge of passing requirements or specifications from a subject matter expert to a “programmer” may be greater than the difficulty of teaching programming to the subject matter expert – particularly if that expert grew up in an education system where software development basics were part of the standard curriculum.
It has long been established that humans have a unique ability to acquire language skills at an early age. That ability declines significantly as we grow into adults. I will venture that programming has similar properties, and that children can acquire an innate fluency with communicating through code that far surpasses what they can learn if they first encounter the concepts as adults. We should teach programming early and universally.
We do need to teach more than just programming, though. The days of the lone programmer sitting in his or her basement and whipping up a world-changing application are rapidly coming to a close. Just about every useful system we will create will be the result of massive collaboration. Our children need to learn, at an early age, the social and management skills required to succeed in a highly-collaborative environment. The ability to work productively as part of a large team will be as important as understanding the programming language of the day. Probably more so.
A society in which children are not taught the basics of programming is one in which most of the citizenry depends on technology they simply think of as “magic.” That lack of contextual comprehension lays the foundation for misleading mythologies, pseudo-religious manipulation of the masses, and general helplessness. It is extremely dangerous to have a situation where the most important concepts in the world are understood only by an intellectual elite. Programming should be ubiquitous, democratized, and embraced by the masses. That means our educational curriculum needs to reflect the essential nature of programming skills at a very fundamental level.
Yes, we should most definitely mandate teaching programming in schools.
You have some good points about waterfall vs more recent methods. Yes, problem solving is key! “Coding” seems to have become a trendy term so lets not get too tied up with definitions – just make the most of the attention while it lasts 🙂
What we really need is a better understanding of systems (in general) because, even if students do not go on to be IT professionals, they are likely to be specifying systems and making key decisions that affect IT projects, e.g. funding. So many projects go off the rails because the end-users are not able to express their requirements and decision makers do not have a clear picture. [Also IT companies may not have helped the situation by taking commercial advantage of these weaknesses but that’s a different story]
There’s actually a counter-example to this. Once upon a time, it was assumed that everyone (ok, in the Day, it was every boy) should learn auto mechanics. You can’t be expected to drive a car without knowing something about how it works and how to solve problems on the side of the road.
But as cars have become more complex, as diagnosis now requires expensive equipment and arcane knowledge, we’ve sort of given up on that. Yeah, you can get some auto stuff in some schools, but mostly not, since you can’t really be a functional mechanic without going a couple years at an expensive school.
Point being, as complexity of the system grew beyond the average person’s ability to do anything about it, we’ve given up on thinking everyone should know how it works. It’s now just “magic” that our mechanic knows how to apply.
Frankly, with a lot of new interface thinking, many also think that computing devices for the average person (non-programmer) should become transparent – they should recede into the background and we shouldn’t have to worry about them. They should “just work.”
It feels that, with these programming classes, we’re still at the “fix your own car – or at least know how to discuss it with the mechanic” stage. But we may move past that.
Kevin,
loved this article and completely agree. I think another argument for your premise is that with the constant distraction level and multi-tasking requirements that kids are subjected to, the ability to concentrate on a complex problem and break it into logical chunks is becoming less and less mainstream. Just read any speech from the 18/19th century and then compare it to modern articles – yours excepted obviously… 🙂 The sentence structure, vocabulary choice and complexity of arguments nowadays is significantly lower. And yet we need kids to be able to think!
One interesting question, if we accept the necessity of going ahead with something like this is, who teaches them? I have the greatest respect for what motivates someone to become a teacher. However, having interacted with many of them through the years of my kids’ education, I have somewhat less respect for the intelligence and ability of many of them, especially their ability to learn and teach something new like this. I’m not talking about newly minted graduates who already learned programming themselves and their ability to pass on their skills but about older, well established teachers being required to learn something new in order to be able to teach all school kids – it would need a lot of teachers. As you point out in your article, they would be learning it late on in their lives and their ability to absorb and digest it is a question.
I hope that resources like Khan Academy and Code Academy will be able to help with this. Either way, the first step is to decide we need to do it. As Engineering and Science give way in the Western world to the sheer numbers of aggressive, motivated graduates from the developing world, it seems to me it’s the only chance for us to maintain the lifestyle to which we’ve become accustomed.
Yours contentiously,
Paul.
My 10 year old plays with Scratch and games on Code.org. She may or may not grow up to be a programmer but I have seen firsthand how it’s transforming the way she thinks. From planning out a process to considering cause and effect.. she is gaining more than simply learning a language.
She is learning how to think, explore possibilities and solve problems.
Absolutely, there is value in at least exposing young minds to coding.
#TEAMKEVIN
-Christina