Learning to Learn (to program): Mental Models Matter

Here is the next in our series of tips about learning to learn (to program).

TIP 5 :  Focus on mental models.

Paul Curzon, Queen Mary University of London

To get the best out of practice, when learning a skill, you need to have the right mental models. That is where knowledge and skill can work together in tandem. The right sort of knowledge can be used both to base skills on, and to hone them. Practicing the right skills can develop the right kind of knowledge. What you need are good mental models, good understanding, of what you are trying to do.

You must focus on developing the right knowledge, the right mental models, if you are to get the most out of practice.

As a novice programmer, the first and most important mental models are those of the different programming constructs.  How does a variable work? What does a while loop do?

People often think syntax (spelling, punctuation) is what you have to learn first to program and they focus on that and worry most about missing semicolons or whether things should be in capitals or not. Actually far more important to get right first is semantics (what the constructs do) and structure (how programs are organised). Worrying about trying to remember the words and symbols turns programming in to a rote learning task with no real understanding – and nothing to base the right sort of practice on. That’s the wrong thing to do.

It is vital to avoid this trap. Instead practice should be based on understanding the concepts. This has to be the big, early focus to learn the deep skills of programmers. If you do not understand what a programming construct does, you won’t be able to write programs using it…and it is really, really easy to misunderstand if all you have is a basic technical explanation.

Luckily, there are a series of ways to build the right mental models. The first step is to have good explanations, and then make sure you can explain those things in your own words. Explaining is a skill too. As a learner you can practice explaining yourself either in writing or to others. If in a group everyone can then benefit. We will talk about more good explanations in a later blog. You can also draw concept maps that show the way concepts link. More on that later too. For now though actively read explanations. Make notes of some kind as you go, then take a blank sheet and without the original try and write your own explanation.

Another important way to build accurate mental models is to practice reading programs and fragments of programs based on what understanding you do have, and try and predict what they do (then see if you are right). Treat programs as a mini-scientific experiment. Closely related to this is to trace (or dry run) programs. Here you act like a computer stepping through the program. More on this later too.

Notice these are skills too – the sub-skills we identified earlier – so you can practice them.

When you are stuck and do not understand a construct, when you cant write a program, can’t do the dry run and can’t predict what a program will do, it is easy to be dispirited. It doesn’t mean you can’t program though … it means you have just learnt something important – you have learn’t something you do not understand (yet). You’ve found something to work on. It just means you need to get a little bit of help. That might be from a teacher, from a good book or video, or another student (needing to practice their ability to explain), or possibly even the right, simpler exercise to try. You can understand and when you do you will have made another big step forward.

With the right mental models in place then you are in a much stronger position to practice all the programming sub-skills (including writing programs). You are also much more able to learn from your future mistakes.

It is absolutely vital you do focus on getting a clear understanding of the semantics. Then all your other practice will be so much more effective.

If you are a:

  • student
    • Focus on making sure you understand what each new construct does, then do lots of practice of all the sub-skills around until until you have mastered it.
  • teacher:
    • Make sure you make it clear to your students that understanding meaning matters, not memorising syntax.

More on Learning to Learn (to program)

IoC logo on white




Identify the sub-skills

Paul Curzon, Queen Mary University of London

Here is the next in our series of tips about learning to learn (to program).

TIP 4: Know the sub-skills and practice them.

Paul Curzon, Queen Mary University of London

To learn a complex skill you need to practice, and so master, the right things a little at a time. That means you need to break it into sub-skills that you can work on separately. This is the idea behind deliberate practice too. What sub-skills have experts mastered? Practice those.

What are the sub-skills to practice to learn to program effectively? It is not just to write programs. For a novice there are a whole series of sub-skills that matter and that you can practice separately:

  • Being able to explain the basic programming concepts (like variables, loops, etc).
    • This matters as it is closely linked to the idea of mental representations of deliberate practice. This is building the basic mental representations.
    • Being able to compare and contrast related concepts is a useful extension to this.
  • Being able to read / trace simple programs and program fragments using each concept.
    • Reading a program doesn’t just mean read the words but being able to work out what the program does.
    • This helps ensure you have the right mental representations the skills are based on
  • Being able to think logically and focus on detail
    • This is actually a foundation to all the others
  • Being able to debug a program. There are two completely different skills here:
    • Being able to interpret compiler messages and correct compile time errors
    • Being able to find and correct run-time errors.
  • Being able to choose the right programming concept to do a task.
  • Being able to modify a program to do something slightly different, including
    • using the same constructs in a slightly different way, and
    • incorporating a new programming construct into an existing program so that it has a little more functionality
  • Being able to take simple problems and write simple programs that solve them using the appropriate concepts.

Bearing in mind the need to do things a little at a time, and the need to practice a lot, you should practice all these sub-skills on fairly small bits of code to start.

This does NOT mean that you shouldn’t be writing programs at all. It is in writing programs that you get the motivation to do the practice. Its also where you practice putting it all together. A tennis player still plays matches, but in between they practice serves, and hitting the ball to precise places, as well as general fitness, and so on. Similarly a programmer needs to both practice and write interesting programs.

It’s a bad idea to start on a large, complex programming project though, that may then be way beyond your current skill level. Instead master the skills for individual constructs and then build a small program gradually in to a larger project as you master each level of skill.

Once you have mastered the basic concepts and skills, then there is another level of skills to master. These are essentially what people talk about as computational thinking. There are lots of sub-skills involved (which is why academics argue a lot about what it actually is) but here is one list used:

  • algorithmic thinking
  • decomposition
  • generalisation including pattern matching
  • abstraction
  • evaluation

Much of this is applying advanced versions of the earlier set of skills, and you certainly do need to practice more complex versions of the original set including:

  • Reading real programs
  • Writing more complex programs

If you are a:

  • student
    • As a novice, practice all the above novice skills separately, focussing on one construct at a time.
    • Exercises to read/trace programs are especially important to practice.
  • teacher:
    • Set exercises that practice each of the skills separately, for each programming construct.
    • Exercises to read/trace programs are especially important to provide.

Mastering (programming) skills

Paul Curzon, Queen Mary University of London

Here is the next in our series of tips about learning to learn (to program).

TIP 3: Master skills a small step at a time

Working hard, putting in the time and effort is important … but it is NOT enough. You could jog every day for years and NOT get any faster or be able to run ever further. Similarly, you could spend hours trying to write programs but not get any better.  It isn’t just putting in the hours. You have to put in the right kind of hours.

You need to do the right kind of practice. The ideas behind deliberate practice suggest you should aim to master skills a small step at a time – but make sure you do master them before moving on.

(Sometimes you also need help to correct misunderstandings or just help you understand something critical. We will look in more detail at that in a later tip.)

Hours of jogging won’t improve your speed because you are not stretching yourself.  Switch to interval training where you run as fast as you can for a short distance and then recover for a short time, then do that again and again and again. Each session you are pushing yourself to your current limit… and you will improve. You are pushing your muscles and your brain just beyond what they can comfortably do at the moment. That’s the secret to improving.

Programming is the same. If you just spend hour after hour writing similar programs that you already know how to do, and never anything new, then again you won’t improve even if you do it for 10,000 hours. You need to practice what you are already capable of, but also push yourself to the things that you just can’t comfortably do (yet), programs you can’t comfortably write (yet). However this comes with a big BUT!

Don’t push too far beyond what you can do to quickly or you will just get hopelessly stuck and dispirited (the equivalent of collapsing on a run when you are a long way from home).

This is a mistake many students learning to program make. They are so keen to learn,  that having written a program that works, they rush straight on to the next concept. They are trying new things before they have actually mastered the current ones. You do need to write lots of programs with the simpler concepts to master them. If you move on too quickly you will start to struggle as you get more and more out of your depth, and the practice you do will be less and less effective.

There is no point trying to write programs that use while loops if you have not mastered the simpler if statements and so understand boolean expressions. And don’t move on to boolean expressions before you have mastered simple integer expressions and variables…

If you are told to try harder, don’t. Instead try smarter. That might mean stepping back to something simpler and make sure you have mastered it.

We will look in more detail what the right kind of practice is in future tips.

If you are a:

  • student
    • Practice lots, but master simple things before you move on to harder ones.
    • Do push just out of your comfort zone in your practice once you have mastered something.
    • Identify something just beyond what you can currently do and practice that until you can do it easily. Only then move on to the next thing. 
    • Don’t think that doing it once means you have mastered it!
  • teacher:
    • Set activities that gradually increase in difficulty with lots of exercises to practice at each stage.
    • Identify a progression in concepts to introduce.
    • Don’t let students rush on to writing ever more difficult programs to write before they have fully mastered the concepts in the previous ones.

More on Learning to Learn (to program)

IoC logo on white




Paul Curzon, Queen Mary University of London

Here is the next in our series of tips about learning to learn (to program).


10,000 hours of practice is often given as a rule of thumb to become an expert. However, if it is the wrong kind of practice then all those hours may not help. An effective kind of practice is “deliberate practice”. This is one of the top 10 or so educational approaches known to be effective as a way to improve learning, and is based on research in a lot of areas from elite sportspeople, virtuoso violinists, top medics and more. It is what elite people do to become one of the elite. It can help with learning to program too.

Some skills are more appropriate to apply deliberate practice to than others. However, even an incomplete version may make practice more effective.

Deliberate practice involves:

  • Identify the sub-skills that experts have; the ones that make them better than everyone else and practice those skills.
  • Aim to build accurate versions of the same “mental models” as the experts have for those sub-skills (early).

  • Practice doing things just beyond your current comfort zone until you have mastered them. Then move on.
  • Practice in a way that gives you immediate feedback on whether you are doing it right or wrong.
  • If you get it wrong (that’s good, its a chance to improve), focus on why you got it wrong (based on that accurate mental model) and practice until you can do it.

We will look at the separate elements of this in subsequent tips.

To learn to program you need not just to write program, but to do deliberate practice of the sub-skills.

If you are a:

  • student
    • Learn about deliberate practice and put it into practice when you learn, including as you learn to program.
  • teacher:
    • Set up learning resources and situations to support deliberate practice of programming skills.

Further reading: Ericsson, A & Pool, R, 2016, Peak: Secrets from the new science of expertise. The Bodley Head.

More on Learning to Learn (to program)

IoC logo on white

Learning to learn: Anyone can learn to …(program)

Paul Curzon, Queen Mary University of London

Tip 1: It is about effort not talent

So you want to learn (to program). The first and most important thing to realise is that with enough of the right kind of practice anyone can improve (and keep improving) at any skill (including programming). Our brains are amazing, they can just keep getting better if we do the right things.

Learning to program is not about talent. It is about effort and practicing enough in the right way.

There has been lots of research across lots of skills whether chess, violin playing, football, maths, english, swimming, memorising lots of random numbers… and the same result is found. Improving is not about innate talent. We all have wonderful brains. Genetics doesn’t stop anyone learning to be better. You can learn to program and you can get better and better.

Understanding this and putting it in to practice is called having a growth mind-set. Once you truly believe this and shake off the idea that some people are more talented than you, you have the keys to a new world of learning.

There is a rough rule. If you put in 10,000 hours of the right kind of practice then you too will be an expert – a wizard programmer. That is a lot, but then do that and people will call you a genius. Take it a step at a time. Practice for 10 hours and you will get better. Put in 10 more hours and you can improve more. Then put in 10 more and you can improve again. And so on. Put in 100 hours and you can be noticeably better. Then put in 100 more.

Shaking off the idea that other people are more talented is hard, especially when the person next to you seems to find it so much easier. Ignore them. They may have started before you; or done something previously that gave them a head start; or done more practice that you don’t know about, or have been practicing learning for longer, or … Don’t let them put you off. What they can do has no bearing on what you can do.

Also if other people tell you you have no talent, don’t let it get to you. They are just ignorant.  One day you can be great at it if you want to be badly enough and practice in the right way.

As a teacher, instilling a growth mind set in those you teach can help them do better too. Believe in every last student and research has shown they will do better, and improve more than if you don’t.

Learning is a skill to – so you can get better at it too with practice.

However, while working hard, putting in the time and effort matters, it is not enough. You need the right kind of practice. We will talk more about that in later tips.

If you are a:

  • student
    • Get in to the habit of whenever you find yourself saying “I cant …” or “I don’t understand…”, add on the end “…yet”. Practice doing it…
    • Constantly remind yourself that with practice you can get better, however hard it is now.
  • teacher:
    • Every time a student says “I cant …” or “I don’t understand…”, add on the end “…yet”.
    • Constantly remind your students: “It is not about talent. Anyone can learn to program. You can get better with practice.”

Further reading: Dweck, C, 2006, Mindset: How you can fulfil your potential: Constable & Robinson Ltd London

Watch out for more blog tips or …

get ahead with more on Learning to Learn (to program)

IoC logo on white

Learning to learn (to program)

Paul Curzon, Queen Mary University of London

We all learn naturally but some ways of learning are more effective than others. Whether it is a skill or knowledge you want to learn there are good ways and bad ways. This blog series is about how to learn effectively.

Programming is a skill based on knowledge. Everyone in the digital age needs to learn at least a little of how to program. (If you want to you can learn a lot.) We will therefore use it as a source of examples, but the tips here are also about learning in general.

Learn to learn and you can be more effective at anything you put your mind to.

If you are a:

  • student: learn more effectively
  • teacher: help ensure you get the best of your students