Over the course of the key stage, programming projects should reflect a wide range of different programming genres, those that arise for example from mathematical, literacy, music or gaming backgrounds. Variety helps a broad spectrum of students to realise that programming can be relevant to their lives.
Pupils make real programs that do real things, create games, tell fortunes, move cars, sense what is happening around them etc.
There is a reasonable progression of programming complexity starting with sequence and progressing through repetition, selection and variables in KS2 and lists and functions in KS3. These are all revisited in more complex forms as the key stage progresses.
Depth is built in a core language, so that pupils are able to create something worthwhile, rather than repeating the basics continually.
Over the course of the key stage, there are repeated opportunities to think through the steps or rules of a project (create algorithms), break up complex projects into chunks to help them build their own versions (decompose and recompose), look for the most important part of a project, (abstract), adapt ideas and reuse them in other contexts (generalise) and evaluate algorithms and code that rises out of them (algorithmic evaluation)
Computational doing is valued, the art of debugging promoted and helplessness tackled. I have written in detail about this here.
There is a balance of instruction and exploration in projects. Pupils have opportunity to explore and experiment but teachers also introduce new programming concepts and build on pupils existing knowledge. Too much exploration on its own and pupils don’t have enough concepts and ideas to build interesting projects. Too much instruction without exploration and pupils grasp concepts in a shallow way without internalising them.
Problem solving attitudes such as persistence, the ability to cope with complexity, tolerate ambiguity, deal with open ended problems and communicate effectively which are key parts of programming are capitalised on and made explicit. Recently Chris Stephenson & Joyce Malyn-Smith from Google outlined the need to promote computing dispositions and you can read their blog post here.
Alerted to these dispositions by Mark Dorling* I started to reference these in my computing lessons. I was struck by how many were already implicit but drawing them out, naming them
And making these learning attitudes explicit helps learners to value them and the teacher to capitalise on them in lessons. You can also view an 11 minute video where I look at the anatomy of a programming project through the lens of these wider problem solving attitudes here or after this article.
There has to be struggle, I ask my pupils every lesson to show me who has struggled and I am only pleased if over half the class responds affirmatively. I also ask who has still got things to solve and when lots say they do I tell them good because their brains will work on these between the sessions and there is something worth coming back for. Often they don’t wait to come back and work on the puzzle in their own time.
So my recipe for great programming is a wide range of genres, making real things, a progression of programming constructs, depth of ideas over width in programming languages, computational thinking and doing at the heart of the projects, balance of instruction and exploration, wider problem solving attitudes explicitly valued and a good healthy dash of appropriate struggle. I wonder what your recipe would be?
*Mark Dorling has an excellent document outlining pupil problem solving dispositions which you can find linked here