# What are "general purpose programming skills"?

The UK introduced its National Computing Curriculum a couple of years ago, which requires all children to study computer science from age 4, and programming from age 10. Children can opt out of the subject aged 16.

Schools are struggling to implement the curriculum, mainly due to a lack of teaching staff that can program, but the hope is that things will improve over time.

The UK National Curriculum defines three key skills (English, Mathematics and Science) that must be studied. Computing is defined as one of the four sciences (along with Physics, Chemistry and Biology), which is why British children must now learn to code.

Some people argue that traditional computer literacy is a specialist skill, and do not think the subject should be mandatory. The counter is that the curriculum is not designed to teach specialist skills, insisting that there is a core subset of programming concepts that every educated person should understand.

The official guidance does not make it clear which programming concepts should be taught, instead offering vague recommendations. This is about as good as it gets:

• use 2 or more programming languages, at least one of which is textual, to solve a variety of computational problems; make appropriate use of data structures [for example, lists, tables or arrays]; design and develop modular programs that use procedures or functions

• understand simple Boolean logic [for example, AND, OR and NOT] and some of its uses in circuits and programming; understand how numbers can be represented in binary, and be able to carry out simple operations on binary numbers [for example, binary addition, and conversion between binary and decimal]

I understand this is not the place for a debate or discussion, so would like to ask if anyone could define what general purpose programming skills are, with any clarity?

• Excellent first question. I thought you were going someplace really open-ended right up until the end. :) Also, welcome to Computer Science Educators. Why in the world haven't we seen more of you until now?
– Ben I.
Apr 12, 2018 at 9:55
• The first clause if from keystage-3 (≈11year old to 14 year old). For keystage2 (< 11year old) “at least on of which is textual” is missing. So I assume that this is about >11 year olds. Apr 12, 2018 at 11:10
• Have a look at cs-unplugged. They have a lot of resources for teaching computer science without a computer, and suitable for specialist and non-specialist teachers. Apr 12, 2018 at 11:12
• Do you really want to focus just on programming or on Computing more generally. There is much more to computing than programming, which is only a tool for a larger purpose. Apr 12, 2018 at 16:28
• Thanks guys. CS Unplugged looks really interesting. Buffy, I was thinking more in terms of programming than computing. I do agree with your comment, but don't expect too many problems establishing which CS concepts should be taught in school. With programming, I'm struggling to define what is and isn't generally useful. I'm also concerned that the Banana Gorilla Jungle Problem will make it difficult to teach a useful subset of any current language, but that's a separate issue. Apr 13, 2018 at 2:13

I don't think that the new UK curriculum is intended to create professional programmers, certainly not among 10 year old students. Perhaps the focus of this question here is too narrowly focused on programming rather than the more general "computing." Certainly, in today's world, where even young people carry mobile devices of exceptional computing power and whose applications can threaten their privacy, everyone need to know something about the details of this world and how a citizen should react to it - and govern it.

The post here by Gypsy Spellweaver already presents a larger framework for thinking that is excellent in every regard. So let me mention another aspect that is often forgotten.

I think programming at some level can be valuable to any "scholar" at any level. If you are studying $X$ then being able to write simple (we hope) scripts that let you automate some of the aspects of $X$ can be very enlightening, not as a programmer, but as a student of $X$. Replace $X$ with any field you like; music, art, philosophy, chemistry, maths.... Literature today has aspects that can only be successfully studied by examining very large data sets. Obviously the same is true of Astronomy. You don't need to be a professional Java programmer to write programs that are useful to you in your work. Even a spreadsheet can be of great use.

Purpose-built (bespoke) programming languages for, say, Psychology research would be valuable to many researchers, but those researchers need at least the background to understand and modify their programs. Otherwise they need to depend on professionals even for relatively simple things.

Even beyond the realm of scholarship, every citizen faces relatively small problems that they could solve with a bit of Python or, dare we say, Scheme. It also, of course, gives insight into the limitations of computing systems and, one hopes, the dangers of misuse.

With the above in mind, it is probably necessary to teach programming in a different way than if you were teaching it to someone with a formal CS focus. Rather than traditional CS topics, such as searching, sorting, optimization, algorithm efficiency, etc., applications can be stressed. And they should be applications in the other fields that the students are beginning to study; their science courses, for example. This also opens the possibility of collaborations with the instructors of those other subjects which can, in itself, be a useful thing for all parties to the collaborations. The physics teacher is a good source of ideas about what physics issues might be informed with a bit of computing.

Biology is an especially fruitful field since students often do field work, tallying up fish and frogs and birds, etc. Some simple programs to help them do the tallying and especially simple statistical analysis is helpful. Teachers can organize multi-year projects in which a new class carries on a study started by earlier students. It has scientific merit as well as generating learning and enthusiasm for the field.

But the question is deeper than programming as I noted at the start. Every citizen needs to be able to digest what is going on in the wider world of captured data as exemplified by the current (early 2018) discussions and debate about Facebook and Cambridge Analytica and the misuse of personal data. These are big questions that require an informed citizenry.

• I think the purpose behind the emphasis given by the UK curriculum isn't programming as such, rather that learning to program creates mental patterns of analysis useful to life, as well as education. Apr 12, 2018 at 17:23
• The idea of focussing on applications is interesting, and I especially like the idea of integrating the stuff students are studying in other subjects. I'm not sure this answers the exact question asked, but I understand it's not a simple question, and that it's difficult to even know where to begin. Other answers wonder quite far from the specific issue, so I'll mark this as correct. Apr 13, 2018 at 2:39

## General Purpose Programming Skills

General purpose programming skills can also be called Computational Thinking. Computational thinking has four cornerstones¹:

• Decomposition - breaking down a complex problem or system into smaller, more manageable parts
• Pattern recognition (data representation) – looking for similarities among and within problems
• Generalization (abstraction) – focusing on the important information only, ignoring irrelevant detail
• Algorithms - developing a step-by-step solution to the problem, or the rules to follow to solve the problem

## Computational Thinking: What It Is, and Isn't

Jeannette Wing, formerly head of the Computer Science at Carnegie Mellon Univ., Pittsburgh, PA, USA published an article in Communications of the ACM where she covers, rather nicely, the ideas of computational thinking, and how it differs from computer programming.²

Conceptualizing, not programming. Computer science is not computer programming. Thinking like a computer scientist means more than being able to program a computer. It requires thinking at multiple levels of abstraction;

Fundamental, not rote skill. A fundamental skill is something every human being must know to function in modern society. Rote means a mechanical routine. Ironically, not until computer science solves the AI Grand Challenge of making computers think like humans will thinking be rote;

A way that humans, not computers, think. Computational thinking is a way humans solve problems; it is not trying to get humans to think like computers. Computers are dull and boring; humans are clever and imaginative. We humans make computers exciting. Equipped with computing devices, we use our cleverness to tackle problems we would not dare take on before the age of computing and build systems with functionality limited only by our imaginations;

Complements and combines mathematical and engineering thinking. Computer science inherently draws on mathematical thinking, given that, like all sciences, its formal foundations rest on mathematics. Computer science inherently draws on engineering thinking, given that we build systems that interact with the real world. The constraints of the underlying computing device force computer scientists to think computationally, not just mathematically. Being free to build virtual worlds enables us to engineer systems beyond the physical world;

Ideas, not artifacts. It’s not just the software and hardware artifacts we produce that will be physically present everywhere and touch our lives all the time, it will be the computational concepts we use to approach and solve problems, manage our daily lives, and communicate and interact with other people; and

For everyone, everywhere. Computational thinking will be a reality when it is so integral to human endeavors it disappears as an explicit philosophy.

1: Source: BBC Bitesize - KS3 Computer Science - Introduction to computational thinking

2: Source: Jeannette M. Wing "Computational Thinking" Communications of the ACM. 49 (3): 33.

• I deleted my last comment as it came across differently to what I'd intended, sorry. I really appreciate this answer, and upvoted it, as it contains a lot of useful, relevant information. That said, the issue really is to do with programming specifically, rather than computational thinking, which is much more general. The issue we're having is that every child will spend five years learning to program (typically with Python or JS), and most will not become professional programmers, and it is not obvious what programming skills they need. We don't really know what an ideal outcome looks like. Apr 13, 2018 at 2:52
• @CarlSmith Don't think of programming as the goal, think of is as the vehicle. Learning to program engages a different mental mode of analysis that is useful in any endeavor. Read the entire paper from Wing, not just my excerpts, and it might help with the "teaching programming to non-programmers" issue. Programming is replacing the now absent courses on rhetoric. Apr 13, 2018 at 3:40

I would assume that when you are saying child, you mean under 10 year old.

Then as @Gypsy Spellweaver says, they would need to know how to break down problems into smaller problems, which would very beneficial for there way of solving problem in the future. That's a very big skill a lot of people are lacking. There's also one thing you need to learn is how to find your way out, this is a very important skill to learn from programming as a child : how to solve the problem using the tool you have.

Theory is fine, but how to achieve that :

I think the programming learning curve will be very deeply related to the child's math curve. So what could be a good way could be to show children how to implement what they are learning in math.

• you're learning addition, then a good problem to give them would be : How to do any addition only using +1 addition and a loop, you'll teach them the understanding of the for loop but also the very deep meaning of the addition
• Same goes with multiplication, how can you do it only using '+' and loops ?
• There's geometry that would be harder to do at the early start, but you can still use math lab and do some easy geometry problem, for instance drawing lines and gives them parameters so that they would find how to make them parallel or perpendicular, then automate that

You can do that technique even at higher stage of the curriculum :

When learning trigonometry, just show them how it's working exactly by having animation where they can move around the trigonometry circle

I think that people needs to reconnect with the very low level approach of science. Most of the time I see students just giving up in front of the problem they are offered, whereas most of time it's just a matter of thinking bigger and resolving problem one at a time with the tools you have. And I believe this is a critical skill in today's world, if you're not a problem solving person I don't see how you can fit in science jobs.

I believe there's a lot of way to learn children the deep meaning of science using programming. You'll be surprised about how older teenager (over 16) don't even know the meaning of things like multiplication, addition and so on. Don't even thing about equations and in-equations. I believe programming will really help them understanding these concept for what they truly are.

Then student would be able to break down all of those problem by using programming, which is very mechanical and that would help I guess with almost all abstraction behind math for at least the early levels. Then it would get more complicated but they will have the tools to cope with those problem.

General purpose skills are just as GPIOs (general purpose inputs outputs) in embedded systems, in a way that it's only tools and skills and way of thinking that will help you deal with problems you're going to face. And programming and math are one of the best way to sharpen your critical way of thinking. In the end that's just teaching you're brain how to take a step back and analyze the situation/problem/project for what it is.

• The question regards children aged between 10 and 16. I was actually corrected on that point though. The children are 11 when they start programming. I don't think this answer really addresses the question. Apr 13, 2018 at 2:17
• I edited my answer to stick a little bit more to the question.
– YCN-
Apr 13, 2018 at 8:25
• "to study computer science from age 4", I don't really see the difference you do between computer science and programming, to me that's only to side of the very same coin.
– YCN-
Apr 13, 2018 at 8:27

There are three basic building blocks of programming: simple sequence, decisions, and iterations (loops).

Any program can be built from these three basic constructs. They are like the six simple machines.

The simple sequence is exactly what it says: statements executed in order. Decisions are (usually) prefaced with the word "if": if it is sunny, I will go to the skate park. Lastly, iterative constructs repeat the same code over and over, stopping based on a certain condition or a number of times: while the driver presses the gas, send fuel to the injectors.

Children can learn and practice these constructs without writing code. For example, they can write directions on how to get from their school to their home. Food recipes are also good practice, to read and to write.

These things, written instructions telling how to do something, are called algorithms. Once children become proficient at writing algorithms (and since they are starting so young, several years could be spent on just that aspect, using the spiral pedagocial model), then they can move to writing code. If they have made the algorithm development part of their thinking, then it will transfer easily to coding.