Iteracy: Reading, Writing and Running Code
Mark Marino posed a very interesting question on Twitter yesterday, asking:
Who has a good alternative to "literacy" when it comes to programming or reading code? (Marino, 2011).It is something that I have been thinking about too with the concept of digital Bildung and computationality (see Berry 2011). However, I would like to suggest that iteracy might serve as the name for the specific skills used for understanding code and algorithmic culture – as indeed literacy (understanding texts) and numeracy (understanding numbers) do in a similar context. That is, iteracy is specifically the practice or being able to read and write code (as a practice), rather than the more extensive notion of digital Bildung (see Berry 2011: 20-26).
In short, Bildung is still a key idea in the digital university, not as a subject trained in a vocational fashion to perform instrumental labour, nor as a subject skilled in a national literary culture, but rather as subject that can unify the information that society is now producing at increasing rates, and which understands new methods and practices of critical reading (code, data visualisation, patterns, narrative) and is subject to new methods of pedagogy to facilitate it (Berry 2011: 168).So digital Bildung would include the practices of iteracy and would build on them to facilitate a broader humanistic or critical education what we might call a Critical Digital Humanities. Here, then, iteracy is defined broadly as communicative competence in reading, (re)writing and executing computer code (so including debugging, tracing, testing, and reimplementing code as part of this practice). But iteracy is also a method for understanding code (and used by programmers who often rewrite things to learn about them, although they try not to "reinvent the wheel" they inevitably often do).
Iteration itself, is a term used in computing to refer to the repetition of a command, code fragment, process, function, etc. Understanding iteration is a crucial skill for developing programming skills as it is a means of re-using existing processes (looping structures). But also, iteration itself, combined with constant improvements, is a key way of developing software/code (very much associated with agile programming and other methods that rewrite code in tight programming repetitions, for instance). An example of iteration in C++ code is:
int loop = 1;
while (loop <= 10)
cout << "Iteration #" << loop << endl;
Here though I want to broaden the meaning of iteracy beyond mere looping structures in programming code. What skills, then, might be associated with this notion of iteracy?
- Computational Thinking: being able to devise and understand the way in which computational systems work to be able to read and write the code associated with them. For example abstraction, pipelining, hashing, sorting, etc. (see Wing 2011).
- Algorithms: understanding the specifically algorithmic nature of computational work, e.g. recessions, iteration, discretisation, etc.
- Reading and Writing Code: practices in reading/writing code require new skills to enable the reader/programmer to make sense of and develop code in terms of modularity, data, encapsulation, naming, commentary, loops, recursion, etc.
- Learning programming languages: understanding one or more concrete programming languages to enable the student to develop a comparative dimension to hone skills of iteracy (to create and recreate code and implement software patterns), e.g. procedural, functional, object-oriented, etc.
- Aesthetics of Code: developing skills related to appreciating the aesthetic dimension of code, here I am thinking of 'beautiful code' and 'elegance' as key concepts (see Oram and Wilson 2007).
- Data and Models: understanding the significance and importance of data, information and knowledge and their relationships to models in computational thinking.
- *Critical Code Studies: critical approaches to the study of computer source code. Marino argues: 'that we no longer speak of the code as a text in metaphorical terms, but that we begin to analyze and explicate code as a text, as a sign system with its own rhetoric, as verbal communication that possesses significance in excess of its functional utility... In effect, [Marino proposes] that we can read and explicate code the way we might explicate a work of literature in a new field of inquiry' (Marino 2006).
- *Software Studies: critical approaches to the study of software (as compiled source code), particularly large-scale systems such as operating systems, applications, and games. Alternatively this also includes the use of software to study other things, like culture (see Manovich 2008), which Manovich calls Cultural Analytics (Williford 2011). It might also entail the study of the use of software historically (see Ensmenger 2010). One important aspect of this is to focus on computer/technical systems within society and culture - for example the Internet, the email system, mobile data, the HTTP protocol, etc.
I therefore see iteracy as developing the ability to reason critically and communicate using discourse to discuss, critique and study the medium of computer code. Although I have kept critical code studies and software studies within the domain of iteracy I am tempted to place these approaches within the broader definition of digital Bildung, more specifically as methods and approaches related to critical inquiry of computationality (Berry 2011) or the post-digital society more generally (hence the 'scare stars'). For example, Douglass (2007) poses the question:
So how do Software Studies and Critical Code Studies relate... Both are larger critical perspectives (on software and source code, respectively) that aim at a deeper understanding of digital, computational art and culture. How do they relate to each other? That is a thornier question, and perhaps unproductive at this early stage in the game when each term is a flag to rally round rather than a nation with well-defined borders. Each could arguably be defined as a subfield of the other, although I suspect what we have here is a classic Venn diagram arrangement with a high degree of potential overlap. The question will be easier to resolve when we move from proposed themes to formal definitions of methodologies. If software studies is centered around the phenomena of computation, and critical code studies is centered on the ephemera of uncompiled source, what are the distinctions (and hence advantages) that each perspective offers the other? (Douglass 2007).
One last thought: although I make the link between iteracy and looping/repetition, I think it is probably more accurate to think of iteracy (as repetition) not as a circle but as a spiral. That is, that learning builds on previous learning and skills in a virtuous upward spiral that transforms understanding, competence and capabilities (e.g. as an Aufheben).
Update: See this attempt to turn the discourse into code
 These are offered as a first draft of the kinds of skills iteracy might require. They remain very much a work in progress.
 Of course computers read and write code too. We could therefore say that non-human entities have delegated iteracy.
 Here I am bracketing the question over the boundaries between software studies and critical code studies but Douglass attempted a definition as '[f]or simplicity in these examples I’m imagining “the domain of software” as “computation, its penumbra as pre-computation, post-computation, imagined computation, representations of computation” and so-forth. “Code,” in the sense Mark uses it in his writings on Critical Code Studies, are something like “human-readable and writeable representations relating to software.”' (Douglass 2007). Whist being fully aware of the difficulties of these definitions and acknowledging that they are still under contestation, this has some heuristic value in appreciating the general positions of the two camps. There is an interesting question about whether we can read code without any recourse to notions of computation. Personally I do not see any reason why code cannot be read as a self-standing or even historical text. Reading within the horizon of the program itself might be very productive, particularly for large scale systems that are extremely self-referential and intertextual.
 Naturally this reminds me of Hegel's notion of History as a spiral. It also is evocative of notions of dialectics as a means of learning and education.
Berry, D. M. (2011a) The Philosophy of Software: Code and Mediation in the Digital Age, London: Palgrave Macmillan.
Douglass, J. (2007) Joining the Software Studies Initiative at UCSD, accessed 16 Sept 2011, http://writerresponsetheory.org/wordpress/2007/12/04/joining-the-software-studies-initiative-at-ucsd/
Ensmenger, N. L. (2010) Computer Boys Take Over, Cambridge: MIT Press.
Marino, M. C. (2006) Critical Code Studies, Electronic Book Review, accessed 16 Sept 2011, http://www.electronicbookreview.com/thread/electropoetics/codology
Manovich, L. (2008) Software Takes Command, accessed 16 Sept 2011, http://lab.softwarestudies.com/2008/11/softbook.html
Oram, A. and Wilson, G. (2007) Beautiful Code. London: O’Reilly.
Williford, J. (2011) Graphing Culture, Humanities Magazine, March/April 2011, accessed 16 Sept 2011, http://www.neh.gov/news/humanities/2011-03/Graphing.html
Wing, J. (2011) Research Notebook: Computational Thinking—What and Why?, accessed 16 Sept 2011, http://link.cs.cmu.edu/article.php?a=600