The relationship between coding and computer science
The two are not, of course, unrelated. Our new found focus on the place of computing in schools encompasses, I think, both. We do want our learners to develop an understanding of computer science, as well as gaining some experience of writing computer programs. Can you have one without the other? The ‘Computer Science is no more about computers than astronomy is about telescopes’ quote (mis)attrubuted to Edsger Dijkstra suggests the relationship may not be as close as many might suppose.
It’s hard though to think of all but the most ivory tower of academic computer scientists not doing some programming from time to time, just as all but the most theoretical of scientists do make use of the occasional experiment. Similarly, the craft of coding demands a reasonably accurate and reasonably comprehensive schema of language, operating system and hardware; isn’t this computer science? At least in the sense of a systematic understanding if not an articulated description. Didn’t those building medieval cathedrals have some grasp of the principles of statics? I’m fairly confident that coders develop an understanding of the most relevant aspects of computer science through the assimilation and accommodation necessitated by the day by day experience of writing software; the same, I’m sure, is the case with proficient artisans in fields where others pursue academic study – cf teachers and educationalists.
The thing is, I don’t think it’s enough just to provide training in craft skills. I see this as one of the big failings with the approach we’ve taken, for one reason or another, to ICT education – we’ve focussed far, far too much on providing learners with the skills they need to use particular applications and not nearly enough on an all-round understanding of how technology works and is made: the sort of understanding which makes it so much easier to sit down in front of an unfamiliar application or gadget and get something useful done; or in computing terms, the sort of understanding which lets someone get the gist of what a bit of source code is doing and how it might be tweaked or repurposed, even if the language isn’t one which they’ve completely mastered.
I don’t think it’s enough just to teach children how an e-mail client works without also explaining what’s happening behind the screen. I don’t think it’s enough just to show children how to assign variables or manipulate lists without providing some way for them to think about these rather than just using them. It’s just this sort of understanding which we’ve come to label as computational thinking: there’s a strong case for this providing a unique way of looking at the world, with wide applications across (and beyond) the curriculum:
With scientific method, we took things apart to see how they work. Now with computers we can put things back together to see how they work, by modelling complex, interrelated processes, even life itself. This is a new age of discovery, and ICT is the gateway.
—Douglas Adams, 1999
That said, when it comes to how children acquire this understanding, I’m fairly confident that direct experience is going to matter more than direct instruction. I suspect that for most coders, and a fair few computer scientists, it’s the process of cognitive accommodation necessitated when the program doesn’t work as expected that lies at the heart of the most meaningful learning experiences. I’m far from convinced that there’s enough opportunity for this in school – a spoon-fed, teaching to the test, learning objective led, waterfall-like approach rarely provides sufficient chance for this experience. A more problem/project/portfolio based, agile approach might well do so though, particularly if teachers give enough thought to structuring the progression and challenge that learners meet in a learning sequence (qv game based learning).
With very young children, we’ve an abundance of evidence to suggest that they learn through play, exploration and experiment: I’m thinking here of Piaget’s notion of the child as lone scientist, making use of the concrete manipulatives around them to develop their own schema of how the world works. With ‘digital natives’ (insert obligatory remarks about this being an unhelpful term), perhaps we have an equivalent notion of the child as lone computer scientist, playing with virtual manipulatives to construct an understanding of how computers and thus, via computational thinking, the world works. The path from Froebel to Piaget to Papert and Logo and then to Resnick and Scratch is one well worth exploring. I’ve argued elsewhere that the purpose of education is, in part, to nurture curiosity, and for CS education an approach which guides learners to discovering the core ideas of computing through the practical experience of coding has much to commend it – we learn through making, but we learn more than just how to make: we come to understand computer science best through the act of programming.
There is still some place for theory in CS education, just as not all science education is, or should be, practically based. We aren’t merely Piagetian lone scientists, we also can use language to draw on the experience of others, both present and past. Nevertheless, for theory to make sense to the learner, for it to become part of their schema, there ought, surely, to be some connection made with existing knowledge, and thus, sooner or later, prior experience. Thinking about other domains, it’s hard (but probably not impossible) to think of academic musicologists, literary critics or theoretical physicists who haven’t at some stage enjoyed making music, writing or experimenting. The academic disciplines have, at their foundation in the lives of the individuals who pursue them, the practical activities, and I’m fairly confident that the same is true for computer science and coding.
An edited version of this post appeared in the Computing at School Newsletter, Switched On, Autumn 2012.Share