Programming is the start not the end: let’s develop computational thinking and problem solving skills

(N.B. This is the original unedited version of an article published online today in The Telegraph)

I wholeheartedly support the high-profile initiatives to get more children programming, especially as part of the rethinking of the ICT curriculum in UK schools. The publication of the Royal Society’s report Shut down or restart? in January highlighted the unsatisfactory state of ICT education in the UK, recommending that every child should have the opportunity to study the rigorous academic discipline of computer science. With the disapplication of the existing ICT Programmes of Study and the development of a new programme of study as part of the National Curriculum Review in England, we are at an exciting crossroads, with a real opportunity to make computing and technology a key focus of our education system. But if there’s one lesson we should take away from the problems of the past 15 years it is that we must not focus on transient and superficial technology skills. Computer science is not programming (and vice versa) and we should be wary of teaching programming just for the sake of teaching programming, without thinking about why we want to get kids to program.

publicclassfoopenis2

When Michael Bloomberg, Mayor of New York City, tweeted in January that he was going to learn how to program, there were strong opinions expressed implying that programming is not for everyone. This is untrue. One of the reasons that programming is increasingly perceived to be a 21st century literacy in our technology-dependent society is because it is ultimately empowering, developing the ability to manipulate and control your digital world. But the key message is that learning how to program is not the endpoint, but part of the journey of equipping children with the necessary digital skills to solve problems. Our high-level aim should be to develop technology-independent skills and techniques, such as data literacy and computational thinking.

Computational thinking is a way of solving problems, designing systems and understanding human behavior that draws on concepts fundamental to computer science. Computational thinking includes a range of mental tools that reflect the breadth of the field of computer science. Computational thinking means creating and making use of different levels of abstraction, to understand and solve problems more effectively; it means thinking algorithmically and with the ability to apply mathematical concepts to develop more efficient, fair, and secure solutions; it means understanding the consequences of scale, not only for reasons of efficiency but also for economic and social reasons. And this is why it is important to teach computer science in schools: we need to embed principles and theory to develop a deeper conceptual understanding of how technology works and how it can be leveraged to solve problems. There is a quote commonly misattributed to Edsger Dijkstra: “Computer science is no more about computers than astronomy is about telescopes.” — this is where computational thinking fits in, abstracting away the technology.

Hence, there is an important balance to strike between focusing on developing practical programming skills (i.e. being able to write code for a specific task) and embedding a deeper understanding of languages and constructs: principles of programming. We know technology changes quickly, so we need to make sure that when “Technology X” appears, we have transferable knowledge and a deeper conceptual understanding of how it works and how it can be used.

But there are significant challenges ahead in changing the status quo and enthusing and engaging children in schools. Programming is a creative endeavour and offers a tangible way for children to express themselves by hacking, making and sharing. We now have the hooks to use in schools e.g. Raspberry Pi, Arduino, .NET Gadgeteer, LEGO Mindstorms, etc, offering opportunities for embedding computing across the curriculum. But we also have to recognise the importance of developing this deeper conceptual understanding, the problem solving and analytical skills, as well as knowledge of the underpinning theoretical foundations of computing.

So let’s change the focus from just writing code to developing the crucial thinking skills and the ability to solve problems. To quote Jeannette M. Wing, Professor of Computer Science at Carnegie Mellon University: “Computational thinking is a fundamental skill for everyone, not just for computer scientists. To reading, writing and arithmetic, we should add computational thinking to every child’s analytical ability.

29 thoughts

  1. Hi Tom. You’ll know from the discussions we’ve had that I agree with you on how fundamental a programming education is, especially for persons that go on to work in science, technology, and business, but I wonder whether the current model of “IT” is emblematic of deeper problems in education more generally.

    Specifically the “teach kids how to use Word” model for IT education is based as much on creating future consumers for IT products, be they the computers themselves, printers, etc or software like Microsoft Office as it is on teaching them how to use products they will encounter in their daily life.

    It’s like being taught to drive but not how the car works. (And of course, given the design of cars now, it is actually *the same as* with your car). It’s like being taught how to use a microwave but not how food is prepared.

    Now, not everyone needs to know how to change the oil in their car and not everyone has to know how to write a printer driver or code up an ODE solver. The benefits of teaching these things is the opportunities for experimentation and play that can be offered by these subjects. The opportunity to break things should not be ignored (and it’s less damaging/expensive to break the rules of a programming language compared to applying the same philosophy to a laser printer). Nor should the opportunity to subvert things be ignored, as the wonderful hero image to your post so clearly shows (attribution?).

    My point is that we don’t have don’t have to focus on the end benefits of kids being taught mechanics or programming (or home economics) because while this no doubt helps in presenting the case to politicians, the real-time benefits of challenging children to make and break things will have a profound effect on their educational development, both in the classroom and beyond it.

    I hope that makes sense, it’s just my intuition and obviously I’ve not supported it with any references (for all I know there may be studies showing that children are 76% more likely to become serial killers if they are encouraged to write a program that randomly selects a swearword and prints it to the screen in 72pt Helvetica Bold Oblique). Great to see you taking the message to the tories and the torygraph though!

    1. Indeed we have spoken about this before! It is an interesting point you raise about whether this is indicative of a deeper issue within the education system. Are we creating consumers rather than creators? More specifically (paraphrasing Douglas Rushkoff) is it a case of Program or Be Programmed?

      Alongside the recent developments in CS education in the UK, you should have a look at Nesta’s Digital Makers initiative: “…we want to equip our young people to be confident contributors and makers, able to harness and control digital technology to positively engage socially and economically with their communities.

      p.s. This also links to my Academia vs. Industry post from June.

  2. While I agree that computational thinking is the grand end-goal, I’m not sure it is the base skill that should be put alongside reading, writing and arithmetic. Each of those is a base skills which are relied upon to be able to develop other learning objectives. Reading is the base skill for comprehending and analysing a piece of literature, writing is the base skill for creating new prose and arithmetic is the base skill for performing calculus.

    I see programming as one of these base skills for being able to describe and reason computationally. While computational thinking is necessary, it is an ability that should develop later on, once a language for talking about it has been established (programming).

    As long as programming principles are taught early (primary school), then that prepares the space well for computational thinking later (secondary school). It mustn’t be left until too late!

    1. While I agree that reading, writing and arithmetic can be seen as more elementary skills, I would say that computational thinking is more fundamental than programming (for some of the reasons outlined in the main article above).

      In fact, problems can arise when introducing programming early because the focus is very much on the technology and the syntax rather than the thinking and problem solving skills. And these are exactly what we want to develop early and embed e.g. abstraction, decomposition, pattern recognition, etc. You can teach computational and algorithmic thinking in primary schools!

      Programming is hence a concrete example of real-world problem solving, so making sure we have developed the underpinning skills and understanding is crucial.

  3. Perhaps it would to give some near-synonyms for “computational thinking” : rational thinking, clear thinking, ordered thinking.

    Near-antonyms might help too: woolly thinking, unordered thinking, disordered thinking.

    With that in mind, it seems clear to me that computational thinking needs to be one of the very first things we teach everybody.

      1. Tom has pointed to my confusion about the place of algorithms and computational thinking in the revised National Curriculum for ICT (from September 2014).

        If we were talking about learning to solve problems effectively rather than ‘computational thinking, then I think there would be more agreement about its importance. As often happens, unfamiliar terminology is skewing the debate.

        The real challenges we face are about how to assess such ‘knowledge age skills’ – until we have confidence in scalable ways of doing this the school curriculum will remain focused on information regurgitation.

  4. “let’s change the focus from just writing code to developing the crucial thinking skills and the ability to solve problems” fine words, agree entirely; I was having this very conversation at the pub on Thursday night with a mate who’s involved in the coder dojo in South Wales, explaining that I believe the problem-solving skills are of greater importance than knowing the syntax of javascript. Learning to code seems to be one vehicle to learn computational/algorithmic thinking, but is it the best way? Any studies to cite on that?

  5. (Disclosure: I’m a college instructor, and I teach all manner of web programming to adults/students looking to build a career in web development/design)

    Let’s consider, for a moment, exactly what “computational thinking” is supposed to actually offer a developing child.

    It’s all well and good to develop a strong mathematical understanding (as we know, many people learn algebra, and indeed, calculus in high school/early college), but I have to wonder at the utility of such in the “real world”.

    While I will grant that such analytical power is undeniably useful in the world of CS( and in the broader sense of taking more/better control over your computer), as a “life skill”, I trend towards thinking that the mathematical/computational focus will not lend much in the way of “getting things done” as is so often used as a rallying cry.

    The fact is that in terms of what computers actually offer, which increasingly becomes nothing more than rapid and accurate information retrieval as evidenced by the plethora of ads and the consumer focus on things like tablets, and better/easier to use software, learning to actually code is the kind of thing that sounds wonderful on paper, but in practice is hard to enforce. I think this is because programming is regarded as a necessary evil that one must endure in order to achieve an outcome (much like how most people view math).

    I say this based on my own experience in the last 3 weeks. In the last 3 weeks, I’ve had a couple of students quite literally shine with their skill, one of whom is so stellar in his execution, it would almost be a crime for him to not utilize his talent…and yet, he chooses not to, because he doesn’t want to. It’s not that he’s incapable. He simply doesn’t want to be bothered. He simply doesn’t have the interest. He’s only taking my class because it’s part of his curriculum.

    The end run is that I can’t force any student to WANT to learn, or become proficient with javascript/php/mysql/html/css/coffeescript/. They either do, or they don’t. I can try to excite them with the problem solving aspects of it, but their interest isn’t in learning programming as an art…to them it’s the means to an end, NOT an end unto itself.

    I’d say: Offer the class. If kids aren’t interested…they aren’t interested.

    1. I still maintain that the educational value of computation thinking is much broader than you imply; for example, see the examples listed in this CSTA article from last year on embedding CT into K-12 — they are core skills applicable to all domains and disciplines!

      Also, I would say that your last point is not just a problem specific to computer science — you could say that about a number of subjects at school (especially mathematics)! Perhaps we are not finding the right range of exciting and engaging applications and real world examples?

  6. I fear you may be putting the cart before the horse in pushing “computational thinking” over programming. you need to engage kids. Try asking for games where the cheats must be applied via programming skills. If good programming skills could make a cheap football team on Fifa win against the Man U’s and Barcelona’s due to the (unique) programming abilities of the person playing the game then maybe programming could become cool and we would produce more young programmers who apply computational thinking intuitively. They can learn the frumpy Computational Science nomenclature later.

    1. I wholeheartedly agree that enthusing and engaging is crucial (especially at primary school). However, the central argument of this post is based around the problems of just getting kids coding without aiming to do anything more significant i.e. hacking together code without any focus on developing problem solving skills or a deeper understanding of what can be done. I recognise that terminology can be a problem, but we don’t necessarily have to use words like “computational thinking”, “abstraction”, “decomposition”, etc — as long as there is a focus on developing these transferable skills.

      We should be encouraging playing, breaking and creating; but without introducing these concepts and key skills early, it makes it much harder to retrofit them later on.

  7. Agreed, and we need to do the educational research to map the diversity of conceptual development. This can be informed by interviewing teachers’ for tacit knowledge, analysing curricula and then confirmed by diagnostic testing. We know a lot about this for mathematics, but little for computational thinking.

  8. A lay person’s view here, so I may be missing the point entirely and not a computing education practitioner so can only draw on personal experiences….

    Programming was a “necessary evil” for me as a software developer. Where I really got my kicks was user requirements analysis and UI design. My main role within the team was to work with users to understand their methods of working, conceptualize it and then communicate with the rest of the developers. Usability was also a passion. Both of these roles required computational thinking (at least, in the sense that I understand the term) but, in reality, programming was only a very small aspect of my work.

    Despite being exposed to various languages from a fairly young age I never grew to love it. It just wasn’t in me and so I was an average programmer in terms of competence but I was a good interface designer and analyst.

    The problem solving skills I learned in computing were and still are, invaluable to me. I don’t work in CS any more, although I have started to teach myself some Java because I encounter it from time to time through my job & I’m curious. But the mentality hasn’t left me. I still approach problems in a certain way and I’ll still analyse the design of lift buttons, coffee machines, etc. In my Earth Science/Astronomy teaching and studies, I’ve encountered situations where some scripting/programming is required and I’m not afraid to dabble even if I don’t get as far as I would like.

    I do have some limited experience of working in outreach at schools (Astronomy, Mindstorms) and, I think Tom has a point with the playing, taking things apart, etc. approach. I had a go at a couple of the programming environments used in schools at the CAS Wales conference. It was great to see different tools are being used within schools now but, if I’m being honest (and no offence intended), some of the exercises felt a bit dry and prescriptive and I felt turned off from the start. It was programming for programming’s sake instead of being presented with a problem and then trying to address it (although I appreciate you need to learn the language first!!!!!!). Whilst I don’t doubt that some school children would very much enjoy it, I am not sure it would have changed my mind at that age and I think the approach is in danger of alienating pupils who might otherwise have been engaged. If pupils understand the thought processes involved BEFORE they are introduced to a programming environment, they are much more likely to recognize its potential as a tool for making a difference. This can be done from a very early age.

  9. Do you know of any good curriculums or books or online tutorials on ‘computational thinking’ without programming?

    This idea makes sense to me, and in the domain area I work (as a programmer) there are many people who don’t work as programmers but could be better at what they do understanding/undertaking computational thinking better and are interesting in doing so; but I have yet to find anything to refer them to.

  10. @tom – interesting post … it put me in mind of some of our students who want to study computer science, but can’t program (or can’t engage with programming). In principle we could think of talking about all sorts of abstractions and levels of modelling, but in practice it’s very difficult to engage with that without building artefacts of some sort, and these artefacts are usually programmed. An analogy: could we do mathematics without numeracy?

  11. Re “An analogy: could we do mathematics without numeracy?”

    A lot of what a mathematician might call mathematics (let’s say “maths” for short) is very different to what others might call maths: geometry, integral and differential calculus, calculus in general (so, for example, propositional and predicate calculus) might not come to mind immediately when you talk of maths.

    With this wider-than-usual definition, could we do maths without numeracy? It depends on what exactly we mean by numeracy: if we mean the ability to add, subtract, multiply and divide numbers up to a few hundred using decimal form, then yes, I can easily imagine that one could do lots of maths while unable to do the kind of mental arithmetic that many people would think of as maths.

    But I think that the underlying principle here is that without the ability to think clearly and concisely, one would have trouble doing maths, anything but trivial mental arithmetic, or programming: all of these things are improved when they’re based on a sound footing of clear, rational, (here it comes …) computational thinking.

  12. You said: “When Michael Bloomberg, Mayor of New York City, tweeted in January that he was going to learn how to program, there were strong opinions expressed implying that programming is not for everyone. This is untrue.”

    Are you sure about that? I thought the same until several months back, when I read this paper that has forced me to re-evaluate my assumptions:

    Click to access paper1.pdf

    To summarize: 30-60% of computer science students fail to learn programming; more importantly they seem unable to learn consistent logical mental models of how a program executes, without which they can presumably never learn to program. Different techniques have been tried for teaching programming for years now and none have made any real impact.

    It’s probably safe to assume that computer science students probably do better at this than the general population, which raises the question of whether making it a mandatory school subject is really sensible. I’d certainly like to see more schoolkids taught programming, but I’m not sure that teaching it to everyone is really a feasible goal.

Leave a reply to Dave Donaghy Cancel reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.