Computing At School Computing At School

School of Computer Science -- The University of Birmingham

Kinds Of Programming For Learners
Aaron Sloman

This file is

For some time I have been concerned that discussions on the "Computing At School" mailing list, and in the press, in blogs, and radio and television broadcasts about what should be taught in Schools are based on a vision of computing that is too narrow, even if all the different views regularly expressed are combined!

This web page offers a list of important types of programming that should be taught in schools but without making specific recommendations as to which should be taught at what age to whom, or by whom, or why. This is a modified version of the list of programming tasks in the web page on "Thinky programming and other kinds" which includes growing collection of examples, especially "thinky" examples, available here:

Programming tasks

Different sorts of programming task can be distinguished, for which different programming languages and tools may be suitable, and for which different mind-sets are required, all of which can serve educational and practical needs, though the categories overlap to some extent.

Below is a provisional list of such types of programming for learners. Different types may suit learners (and teachers) with different interests and temperaments. No suggestion is made here that some are better or worse than others. They all have potential uses, and all can have some role in education, though not all will be equally useful for all learners. For example, some types may be too intellectually challenging for a minority of learners whose rate of learning is slower or who find mathematical thinking very difficult. Some types may be too intellectually challenging even for the majority of learners. But that's not a reason for not offering them to the small subset of students who could gain great benefit.

Types of programming task

Some of these categories overlap: a task may fall into two or more categories. E.g. "arty" programming may or may not also be "thinky" programming, or "gadgety" programming. The list is not complete and will be extended from time to time.


I have the impression that most teachers, exam boards, politicians, and industry advisers to educational institutions, fail to understand the importance of feeding into the nation's pre-university learners (starting in primary school) all the above kinds of computational thinking supported by practical programming. This is important because of the need to have a wide range of types of knowledge and experience about forms of computation in the culture at large, even if each individual has encountered only a subset. If we focus education on too small a subset of the possible topics that can be taught effectively between the ages of about five and eighteen, we impoverish the "gene pool" of ideas available to the nation for many different purposes for decades to come.

In particular, we risk seriously impoverishing the pool of talent entering many of the higher education and research disciplines (including non-computing disciplines) that are increasingly using computational thinking and modelling as part of their subject matter, rather than merely using tools to format their papers, construct their presentations, or process their empirical data. This impoverishment has already happened in the last three decades and many disciplines are suffering as a result, whether their practitioners know it or not.

Likewise we impoverish our future if we teach only a small subset of programming languages, e.g. the ones based on sequences of instructions organised by loops and conditionals, enhanced by procedures, or even object-oriented programming. There are many other programming paradigms including rule-based programming, neural programming, evolutionary programming, constraint-programming, stochastic programming, logic programming, pattern-based programming, event-driven programming (e.g. interrupt handlers), functional programming, and programming in languages designed for particular types of application domain. Some of the topics above also require learners to think about architectures combining several computational paradigms, and also about the need to understand and model not just what goes on inside a computer (or animal, or device being modelled) but also the environment it interacts with.

It is also important to remember that Computer Science is not merely a programming discipline, as many people discussing the inclusion of more computer science in the curriculum seem to assume. It has rich theoretical content including applications of advanced mathematics to specify the nature of various types of computation, explore their scope and limits, prove or disprove claims about particular programs, investigate similarities and differences between different sorts of programming languages, and many more. Much research on "thinky" programming is concerned with the scientific task of finding out whether computing systems as we know them can do all the things done by brains, for example, and if not whether new types of computer (e.g. chemical computers, quantum computers, or neural computers) and bridge the gap.

Suggestions for improvement are welcome.

I am grateful for discussions with Stuart Wray on these topics. See his related paper

Cynthia Selby kindly read a draft in July 2012 and made useful corrections, comments and suggestions some of which will probably be taken up later, either in this file, or a related web page.

This is part of the Free Poplog Portal
Enquiries to

This file maintained by:
Aaron Sloman
Installed: 8 Jul 2012
Last Updated: 9 Jul 2012; 22 Jul 2012; 23 Jul 2012; 10 Jul 2015 (format)