Mark Marino, Critical Codes Studies (MIT Press, 2020)
In 2009, leaked emails from the Climate Research Unit (CRU) of England’s Univer- sity of East Anglia seemed to hand a smoking gun to climate change deniers, proof positive that climate change is a fabrication. These emails included code used to model climate change, and the comments in that code seemed to indicate a manipulation of the…
…this code was not written as the final word in climate change but to label and investigate a problem observed in the recorded data, in which latewood density (the measured density of tree rings) did not correlate to changes in temperature. The programmer wrote in this fudge factor temporarily while trying to account for the discrepancy, only to rewrite the code in the same year in a way that addresses the divergence more systematically.
Regardless of the reader’s training or comprehension, code had become a means of public debate.
Without access to the code, whether because it is proprietary or generated on the fly, as in the case of some machine-learning algorithms, analysts can only comment on the apparent operations of the code based on its effects. The operations of the code are left in the hands of those who can access it, usually those who have made or maintain it, and those who can read it. If code governs so much of our lives, then to understand its operations is to get some sense of the systems that operate on us.
Its meaning is determined not only by the programmer’s i tion or by the operations it triggers but also by how it is received and recirculated. The history of the misinterpretations of the Climategate code becomes part of its overall meaning.
Rather, the meaning of code is contingent upon and subject to the rhetorical triad of speaker, audience (both human and machine), and message.
In the process of its c tion, the meaning of code changes beyond its functional role to include connotations
and implications, opening to interpretation and inference, as well as misinterpretation and reappropriation.
As code reaches more and more readers and as programming languages and methods continue to evolve, we need to develop methods to account for the way code accrues meaning and how readers and shifting contexts shape that meaning. We need to learn to understand not only the functioning of code but the way code signifies. We need to learn to read code critically.
Simply put, code in this test proves again to be more than a f tional tool: it is a means of expression between humans through communication with machines.
The meaning of the code goes beyond the functioning of the program because both programs perform the same task—a task which itself seems to have little significance for either party, though so much (i.e., employment) is at stake. Instead, the code itself is located within a broader communication exchange, one that is bound to time as marked by developments in programming paradigms, languages, hardware, and networks.
Unpacking the m ing of these programs locked in their technosocial context is the job of critical code studies (CCS).
Code holds a meaning beyond, and growing out of, what it does. That meaning does not necessarily depend on code authors intending to communicate something to an audience beyond themselves, as in the case of code comments.
To focus on the code of this sign, its competencies and whether it would compile, rather than its meaning in context, is to demonstrate the way the centrality of the machine, the need to make code utterances legible to the unambiguous processing of the compiler, takes prece- dence from and in turn deprecates other explorations of mea…
Style and technical validity clearly take priority in this coding community, at once identifying both the centrality of functionality in this unambiguous form of expression and the way that emphasis obscures other aspects of its communication. Critical code studies seeks to explore making these secondary meanings primary.
…although the protestor is using code-like language, this sign has more in common with codework, a style of creative writing that uses code and code-like orthography to create poetic art, than it does with programming in the context of software development.
We have to be mindful of a kind of chauvinism
that creeps into discussions of programming, what I call encoded chauvinism (see chapter 5), 26whereby we assert a hierarchy based on an arbitrary judgment of what is “real” or “good” or “right” code.
I juxtapose these examples to model one kind of code-re practice (code read by comparison to other code) and to argue that speaking in code does not require programmers to make code behave like spoken language or to create puns with code.
Critically reading code does not depend on the discovery of hidden secrets or unexpected turns, but rather examining encoded structures, models, and formulations; explicating connotations and denotations of specific coding choices; and exploring traces of the code’s development that are not apparent in the function- ing of the software alone. As with all texts, the discovery and creation of meaning grow out of the act of reading and interpretation. As the product of creative processes carried out over time by human and machine collaborations, code offers details and foundations for those interpretations. Even very ordinary code designed to achieve some everyday purpose, some practical goal, to produce some output or process, car- ries with it meaning beyond what it does. I argue that computer source code since its inception has been a means of communication (and hence ideological), but that we are only beginning to discover the methods of explaining that ideology or, more broadly, th…
Critical code studies names a stance toward code as a unique semiotic form of discourse, the meaning of which requires specific techniques that are still being developed, even as the natures of code and programming are rapidly evolving. In other words, code is a unique expressive milieu that operates like, but is still distinct from, other forms of communication primarily due to its relation with hardware and other software systems.
Code had also been taken up by a handful of other scholars, specifically Adrian MacKenzie (2005, 2006), Florian Cramer (2005), Loss Pequeño Glazier (2006), Alan Liu (2004), and Alexander Galloway (2004).
Around the same time, Noah Wardrip-Fruin, Matthew Fuller, and Lev Manovich were beginning to theorize software studies, while Nick Montfort and Ian Bogost were launching platform studies.
I argued (and continue to argue) that rather than bracketing the code, we should read it, beginning with the tools of semiotic and cultural analysis and continuing by devel- oping new methods particularly suited to code. We had to get past the understanding of code as meaningless math (also, as it turns out, a false conception) and instead approach it as a culturally situated sign system full of denotations and connotations, rendered meaningful by its many and diverse readers, both human and mach…
Over ten years after it began, the movement to develop critical code studies is well on its way as a field. Much of the initial pushback has dissipated because scholars have become more aware of the pitfalls and possibilities of this field. The idea of literary scholars or what we call digital humanists interpreting code is no longer novel but is now accepted and so can do what I hoped it would do—supplement other projects of cultural and media analysis.
To read and interpret code does not necessarily mean to discover secret content or to uncover its unconscious bias or even to reveal unusual functioning. Instead, to read code critically is to explore the significance of the specific symbolic structures of the code and their effects over time if and when they are executed (after being compiled, if necessary), within the cultural moment of their development and deployment. To read code in this way, one must establish its context and its functioning and then examine its symbols, structures, and processes, particularly the changes in state over the time of its execution.
The first thing I look for when analyzing a piece of code is the context. Who wrote the code and why?
Certainly, for every line of flight from one reading of the code, one could present an alternative reading or response. For example, consider Berry’s remark about gender in the code. If code comments are essentially distinct from operational code, does the use of the male pronoun in the documentation have any real implications on the code itself? Are there other ways in which the voter/user has been gendered? Such ambigu- ity, such indeterminacy, such uncertainty may produce unease in more empirically minded positivists. However, uncertainty is fundamental to the search for meaning. Code may have unambiguous effects on software and the state of the machine, but the implications of those effects are anything but. Exploring and making meaning from symbols requires a letting go of the need for right answers, for that which is empirically verif…
To explore code, a scholar should first read the code and its documentation to determine what the code does. If the scholar is not very familiar with the programming language or architec- ture, a guide with more fluency may assist.
The meaning of symbols in communication is never an individual affair. Code’s meaning is communal, subjec- tive, opened through discussion and mutual inquiry, to be contested and questioned, requiring creativity and interdisciplinarity, enriched through the variety of its readers and their backgrounds, intellectually and cultu…
Reading code is not like examining other texts because software contains assemblages of processes with changing states (Vee 2017). Nonetheless, this emphasis on reading more complex software does not exclude the reading of code-like artifacts through CCS.
Throughout my readings, I have found some basic questions to be useful: How does the implementation of the code (inside) reflect or contrast the functioning of the soft- ware (outside) or vice versa? How typical is this code within its more general class of software or algorithms? Where do its core ideas lie? What is anomalous about this code (for so much code is reused from similar code found elsewhere)? What methods or other sections of the code seem to capture the central idea of the software, its key contributi…
It is crucial to explore context. Who wrote the code? When and why? In what language was the code written? What programming paradigm was used? Was it written for a particular platform (hardware or software)? How did the code change over time? What material or social constraints impacted the creation of this code? How does this code respond to the context in which it was cre- ated? How was the code received by othe…
Even in literary studies, at the start of the twenty-first century, interpretation is not that search for what the author secretly meant, that subjective hunt that computer programmers probably recall with dread from their English literature classes. Instead, interpretation is the systematic exploration of semiotic objects for understanding cul- ture and systems of meaning. The subtle difference is that though many scholars still focus their attention on specific sets of authors, authorial intent and absolute mean- ing are not the ends of interpretation. Rather, more like the artifact examined in archaeology, the cultural object acts as an opening to a discussion of its significance within the culture that for…
Cultural studies examines every object, every artifact, as a text for study. The distance between the haiku and the can of Coca- Cola as “texts” marks the shift from the study of artistry, on the one hand, to the broader study of signification and the manner in which objects acquire meaning on the other.
CCS emerges as a close-reading practice at the very time when other scholars are advocating “distant” and “surface” reading. At this early stage in the interpretation of code, we still need to develop methods that make sense for and of code.
Meaning is something on top of materiality, and its pursuit is deeply subjective, but that makes it no less valuable to the pursuit of understanding our world.
Critical code studies names the applications of hermeneutics to the interpretation of the extrafunctional significance of computer source code.
Critical Code Studies: A Manifesto
… could have been any set of characters in the programming language, the choice of the language designers in choosing PRINT reveals a central notion: code exists not for machines but for humans who need to communicate with the machine and with other humans.
…the computer may be one recipient of the code, but there is also the programmer, other programmers, managers, and at times even users who have access to its text. In fact, the audiences for code have expanded as judges and lawyers, politicians and pundits, and even poets bring code into their discourse…
…with regard to coding we do just the opposite and strip the code of its human significance, imagining that it is a sign system within which the extensive analyses of semiotic systems and significa- tion, connotations that lead to denotations, do not apply?
In fact, the debate over the use of “Hello, World” as an i ductory exercise offers a glimpse into the ways that the how and the why of even simple programs can become the object of discourse and analysis in the social life of source code.
As a new media scholar trained in literary theory, I would like to propose 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 semiotic commu- nication that possesses significance in excess of its functional uti…
In effect, I am proposing that we can read and explicate code the way we might explicate a work of literature or other texts in a new field of inquiry that I call critical code studies (CCS).
Critical code studies is an approach to code studies that applies critical hermeneu- tics to the interpretation of computer code, program architecture, and documentation within a sociohistorical context. CCS holds that the lines of code of a program are not value-neutral and can be analyzed using the theoretical approaches applied to other semiotic systems, in addition to particular interpretive methods developed specifically for the discussions of programs. Critical code studies follows the work of other critical studies, such as critical legal studies (Fitzpatrick and Hunt 1987; Tushnet 1991) and critical race studies (Delgado and Stefancic 2001; West 1995), in that it applies critical theory to a functional document (legal document or computer program) to explicate meaning in excess of its functionality and claims that this meaning warrants analy- sis on more than an aesthetic o…
Rather than creating a language separate from the work of programmers, critical code studies will build on preexisting terminology and analysis used within the pro- gramming community.
Only through close attention to the specific details of the code will CCS be able to articulate what we might call the connotation of the code.
Fundamental to CCS is the assumption that code is a social, semiotic system employ- ing grammar and rhetoric.
Resistant to loose, associative i tion, Kittler traces the derivation of the word back to codex and farther to codicilla, “the small tablets of stripped wood coated with wax in which letters could be inscribed.” In its later form, codex, the word signifies “simply the name of the bound book of law” (41). Code thus becomes the means and medium of long-distance control. Kittler fol- lows the term from classical empires to nation-states to the moment when it becomes synonymous with cipher (4…
Interpretation is not limited to compiling or porting. Interpretation in the humani- ties sense is more akin to porting a program from one language to another, where a pro- grammer has to make conscious choices about how to represent one system in another and the porting requires a subjective assessment of what is the essence of the…
Yet interpretation in the humanities goes beyond compiling and porting because it asks, “If x represents y, what is being communicated about both systems?” It asks, “How does one realm of meaning inform or affect another?” In other words, interpre- tation in the humanities sense is neither deciphering nor translating, but instead uses those techniques (and other hermeneutics) to get at meaning beyond the isomorphic systems. Interpretation then is not merely decoding but the production of another kind of knowledge:
However, it is important not to think that reading assembly or machine language or binary code is reading a truer code.
The first practice is the a edgement that code is an entry point to an investigation rather than an end in itself.
The lesson is clear: every piece of source code is only ever partial.
Authorship is a much more complex issue in interpreting code than in traditional writing.
Code is at once what it is and what it does. That is not necessarily the same as saying that code is performative language in Austin’s sense, but rather to say that the static code represents a form of its existence before it is processed by the machine, whether it is compiled or not.
One of my early experiences with CCS may serve as a cautionary tale. When I pro- posed an incipient version of CCS to a group of programmers, one of them asked if I could prove CCS by applying these methodologies to a program with low natural language content, even in terms of input and output. The reviewer suggested Quick- sort, an algorithm used for quickly ordering groups of numbers through a divide and conquer approach. In my early attempts at what Wardrip-Fruin would equate to inter- preting a stop sign, I suggested Quicksort as a metaphor for social organization in com- munities, drawing out an analogy for the way a neighborhood street or even highway may serve to divide and conquer a demographic, for example through redlining. How- ever, though my analysis said something about neighborhood hierarchies, it offered little insight on Quicksort itself, nor did it draw from Quicksort a lesson about the society from which it came. Here Hofstadter’s appeal to isomorphic analogies returns. My main error was analyzing Quicksort aside from its historical, material, and social context. For an algorithm such as Quicksort, the code meets the social realm at the site of its implementation and in the context of the application in which it is used. I was not engaging the cultural origins of Quicksort within the history of computation or even a particular incarnation of Quicksort in a language (I was using pseudocode). Without discussing the human context of the Quicksort code in terms of authorship, use, development, circulation, or operations, I was left with little more than a…
8Thus, a simple looping subroutine, say, might remind one of the eternal
return of the repressed, but unless that metaphor has significance with respect to the particular, material context of the script itself, the interpretation will seem more of an imposition, a projection.
…though these computer programs are quite meaningful, like any cultural text, they yield meaning to the extent to which we interrogate their material and socio- historical context, both immediate and more broad, and read their signs and systems against this bac…
The Transborder Immigrant Tool
rather than situating this poetry and code as theatrical scripts, I read this project through a metaphor embedded in its code: ritual. A ritual is a process that when enacted con- veys valued cultural knowledge through participation. The human readers of the code experience the process, or participate, through their imagination, following a mean- ingfully contextualized procedure. Whether in code or poetry, these instructions for an imagined journey are embedded with cultural imagery, resonant with customs of affiliated cultures, and address a set of possible stories, or use cases, about a traveler who is about to perish while crossing the desert. To read the code, to trace its function- ing as an imaginary border crosser is either sustained by water and poetry or perishes, is to engage with a counternarrative of the border that disrupts the popular rhetoric of pundits a…
…disruption is at the heart of these tactics. For example, by focusing the appli- cation not on the overcoded moment when the illegal immigrant crosses the border but on the moment the border crosser is dying in the desert, the project disrupts con- temporary neoliberal narratives about th…
This project overturns the border binary by rephrasing the question, What should be done about those national subjects who cross illegally? as, What should be done about those humans who have already crossed but are now about to die in the desert?
EDT’s message is clear: this tool is an aesthetic object, resonating through artistic interventions even while providing for fundamental physical needs.
Code is routinely conceptualized as abstracted procedure. However, I am setting that conventional term aside for a more culturally situated formulation. Procedure calls to mind a series of steps aimed at a goal; ritual is a performance aimed at cultural con- nectivity, at instilling community, of signifying allegiance, of remembering. The code, like the text of the oral performance, is more of a transcript of a performance to be real- ized in the mind, either by the mind of the reader or by the processes of the co…
…would argue that to engage with the Transborder I grant Tool through the code is to engage in a ritualistic imaginary performance of the software, a speculative deployment, an engagement that has many parallels with folk practice of ritual, song, and tale.
To read the code is to engage in what Dominguez calls a speculative deployment, or imag- ined execution, of the code (UCSBLitCultureMedia 2010a).
Although the Transborder Immigrant Tool relies on high-tech navigation equipment, the story of the code does not champion the potential for a technological rescue but instead reverts to folk knowledge, material bodies, and natural environs. Both kinds of scientific knowledge might be considered folk knowledge, but the Transborder Immi- grant Tool draws upon the wisdom of Death Valley rather than Silicon Val…
Code changes its meaning when it is recontextualized. To be clear, I am not argu- ing that code means what people say it does or that anyone can decide the meaning and even function of code. Rather, I am arguing that like other semiotic forms, when code is recontextualized for a new audience, its meaning changes. It is once again more than what it does. It is an object of analysis and interpretation and, in this case, fuel for deb…
Here is another sign of the hardware shaping the code.
Yet what makes this program and its programming language, FLOW-MATIC, interesting is its own internal contradiction.
On the one hand, the language was created to give business people, meaning nonprogramming managers and nonprogramming military officers, an accessible language for programming newly arrived business and tactical machines.3 On the other hand, the very symbols that make this language (potentially) easier to read for some make it cumbersome for others, especially those more comfortable with mathematical symbols who would feel more at home in other languages of the time, such as FORTRAN or MATH-MATIC…
…because language, culture, and epistemologies are so closely intertwined, to choose one specific natural language for a base language has significant implications for those who will use it, particularly for those who come from different linguistic backgrounds. That choice can have colonizing effects…
Language, to put it mildly, is the fabric of a community, tribe, and modern nation-state. On the one hand, to make a program- ming language is to create a means of communication for a community of users. On the other hand, to make a programming language similar to any one language makes it potentially more accessible to some, yet less hospitable to …
…spread- sheets have become the most accessible of the business programming environments with their formulas, pivot tables, and built-in functions, a site of programming that often goes unnoticed in discussions of programming languages because of their ubiq- uity and perhaps because of their interface, which produces an IDE that seems more distant from a modern language, such as Python, than FLO…
…encoded chau- vinism, the name I give denigrating expressions of superiority in matters concerning programming, which I see as a foundational element of the toxic climate in program- ming culture, a climate which often proves hostile—particularly to women and other minority groups—and is a kind of technological …
To address the preferences of these two audiences, early developers created two of the most pervasive languages of the mid-twentieth century: COBOL and FORTRAN. FORTRAN (for formula translation) language was designed by IBM for those who preferred or had to process more mathematical symbols, and COBOL (common business-oriented language) was developed for those who preferred, or, perhaps more accurately, needed, words in their programming languages.
0), FLOW-MATIC used English-like tokens even for arithmetical operations (e.g., EQUAL for =).
Because FLOW-MATIC was built for the UNIVAC II, understanding this mainframe computer is key to understanding the language. First, there is no terminal for the UNI- VAC II. Without a terminal, the programmer must wait until all the code is processed to determine if the program functioned properly. There was no screen interface. Program- ming was input via ninety-column punch cards (Walker 1996). Second, the machine had no direct access storage, but rather used magnetic tape that would be physically moved forward and backward and had to be rewound when the end wa…
FLOW-MATIC was a language born out of the frustration of trying to teach managers and other supervisors these daunting new sym- bolic forms. It stands as a memorial to efforts to make programming languages more readable on the surface level, even when their symbols obscure some of the flow of the program itse…
FLOW-MATIC uses English-like tokens and a syntax that resembles English sentences in an imperative structure.
Due to memory l tions, the language uses all caps (which again will show up in BASIC and other lan- guages) and so cards and key punches did not even support lowercase.
Note, too, the verbosity of the language, which requires the word OPERATION before each line number.
Of course, line numbers would also disappear from l guages, which arguably also led to greater legibility and flexibility with the advent of object-oriented languages and other paradigms.
The legibility of programing is subjective.
Whether using OTHERWISE or ELSE, the question persists: Is FLOW-MATIC’s for- mulation actually easier to read?
Ultimately, the legibility of code does not depend primarily on the symbols but rather on the ease of tracing its functioning. One element that makes FLOW-MATIC especially difficult to read to contemporary eyes is its omission of a basic trait of pro- gramming languages…
This example illustrates the ways legibility is not dependent on similarity to natu- ral language but overall clarity of expression. That is to say, legibility grows not out of just the syntax but also the phrasing, indentation, and, in many languages, other uses of white space; not in individual tokens but from their use in a sys…
This example also underscores the way affordances of programming languages, such as loops, offer not just a means of expression but organizational and architectural concepts. Which is to say that a pro- gramming language’s clarity grows not from its similarity to spoken languages but its ability to render its operations obvious at a glance against the backdrop of symbolic representation (including written language and mathematical notations), as well as the prevailing programming languages and paradig…
READ-ITEM here means “get the value of.” On the surface of it, the command identi- fies the action of checking a value with the human activity of reading.
interview, June 23, 2018) points out, this activity is actually quite distinct from the more common human notion of reading: “If you asked someone to look up a value on a table, you wouldn’t consider that reading,” she explains.
By that logic, READ-ITEM is much more analogous to “look up the value of” than “read,” or perhaps “read” in the limited meaning “to draw input from data storage,” such as a tape in the case of the UNIVAC II. Other computer languages use the token get instead.
In this case, the use of read in READ-ITEM anthropomorphizes the process, but in a way that obscures the operation.
The selection of natural language tokens for c tional operations offers a clarification of one aspect of the operation that at the same time obscures or even obfuscates others.
Not all the words are so metaphorically employed, as some of these reserved words are tied to actual material contexts—for example, REWIND, which is connected to tape storage.
In many ways, FLOW-MATIC is not using English. Instead, as Todd Millstein (pers. interview, June 14, 2018) puts it, FLOW-MATIC “pretends” to use English. In other words, FLOW-MATIC does not parse the English words for their meaning, but
instead uses English words for discrete operations, reducing the word to one mean- ing, changing these ambiguous signifiers into more limited, simple symbols. However, because the readers of the language use those same symbols as words in spoken and written language, they can conflate the two. In fact, these are not words in the same sense at …
What makes FLOW-MATIC deceptively legible to someone who knows English are the use of what linguists call false cognates.
Arguably, almost all English tokens in programming languages are false cognates because words in code simply do not behave the way they do in spoken or written language, except perhaps through the use of metaphor, as in the case of performative language as…
COBOL has since grown to become one of the most pervasive languages, if not the most widely used language, today thanks to legacy systems (Allen 2018, 18–19). Even in the early twenty-first century, despite great advances in language design, mas- sive amounts of software written in COBOL drive key operations—particularly in the world of finance, in which programmers must continually be trained to mainta…
…the initial move toward higher-level languages had its resisters. Famously, John von Neumann, creator of the eponymous computer architecture ubiquitous today, called developing these programming languages a waste of time and resources. When he heard about the development of FORTRAN, von Neumann was reported to have said, “Why would you want more than machine language?”
At the time of Hopper, program designers had high status, while those who had to encode instructions into the machine had low status (a division that still persists in the industry). However, once programming and coding became more deeply intertwined through higher-level languages, then programming became a higher status and more lucrative job, which historically coincides with when the gender divide favoring men emerges.
This example highlights the difference between understanding and parsing and processing, and the sheer amount of ambiguity toler- ated in natural language exchanges.
All these movements toward natural language seem like progress, except when your native tongue is not being included. Through that perspective, the colonizing force of natural languages embedded in programming languages becomes clear.
Higher-level languages were not the first to introduce English; assembly language already had English-language mne- monics, such as MOV for move.
For the decades to follow, to the present day, the majority of higher-level languages would be built around English-like tokens, making English, along with, of course, Ara- bic numerals (or rather, Hindu-Arabic numerals), the de facto lingua franca of pro- gra…
Because early languages had English-like tokens, new p gramming languages adopted similar attributes to render themselves legible. However, of the non-English programming languages registered by the online Historical Encyclo- paedia of Programming Languages (HOPL; http://hopl.info), many of them are either pedagogical languages, primarily designed to introduce beginners to programm…
localizations of languages that are at root in English—for example, Chinese localiza- tions of C++ or the Russian localization of Python.
…ntemporary programming languages represents more than a legacy of who came first and instead operates as a form of digital postcolonialism, or the manifestation of a colonizing force beyond the forms of historical, geographical, or territorial colonialism.
…ess of the effects of basing programming lan- guages on any one spoken language, more researchers have been turning their energies to creating programming languages in mother tongues, resisting a pervasive technoco- lonialism spread through global English.
If programming is thinking, then the programming language is the medium of thought. Being able to program in one’s mother tongue and more importantly in an indigenous language in this postcolonial moment is to be able to compute through one’s own cultural paradigms.
…the tokens affect one aspect of programming, while the underlying conceptual logic determines another. Although the tokens can be translated into different languages, they are not necessarily informed by the cultural perspective of that language community …
Could a programmer engage that level of logic to write code in a d nant language to express concepts or worldviews from another culture—for example, an indigenous one?
Corbett characterizes his desire to program in Cree as an attraction to ethnoprogram- ming, which Outi Laiti coined to name “a cultural approach to computer programming,” calling the practitioners “ethnoprogrammers” (2016, 9).
Inherent in this formulation is the idea that culture is embedded in language, so to create in a form of that language is to engage with cultural production and preservation.
Rather than trying to make ambiguous language behave according to the systematic standards of programming languages, critical code studies seeks the ambiguous (and unverifiable) connotations of programming languages as they interact with and travels through other systems of meaning read by humans and machines, or what Bruno Latour calls actor-networks.
Furthermore, I will argue that for Kittler, p ming was a kind of theorizing, an activity of philosophical labor, involving interfacing with a machine and tracing ideas by expressing them in code.
E ing his C and assembly code in his raytracer leads to a more complex understanding of Kittler’s critical positions and demonstrates the way critical making informs his theory. In this chapter, I will identify ways writing this raytracer seems to have informed his own sense of the models, metaphors, and machinery operationalized in the processes he would interpret. By coding to understand, Kittler engages in a kind of epistemologi- cal programming, thinking through media and its relationship…
More importantly, this chapter will bring together the techniques of critical code studies, software, and platform studies, along with, of course, media archaeology, of which Kittler can rightfully be called a father, to demonstrate the interdependence of all these approaches. Here is a preeminent media archaeologist writing code with attention to platform—creating software that combines high and low languages to cre- ate, through algorithms, a medium (on the medium of all media, the computer) that models the physics of visi…
What is important for future critical code studies is to resituate authorship not as something that necessarily emerges out of whole cloth from the genius poised at the computer but instead as an act of reading and writing, cutting and pasting, patching together and reworking.
Unlike these higher languages, because it deals with assigning material registers, assembly language is a direct linguistic exten- sion of the machine.
As a media theorist dedicated to understanding these a priori technological media, Kittler desires access to the inner workings of the machine and sees the denial of that access as a stupefying manipula- tion of Silicon Valley and Seattle.6
Accessing the machine through code and through hardware was a way for Kittler to free himself from this subjectivity to the lords of Silicon Valley. Programming, especially at the level of the hardware, was a means of achieving agency.
He described the process: “Kittler always spoke about coding in assembler as a deep psychological and analytical process. He would enter a kind of trance. Afterward, he couldn’t really tell you how he came to write it that way. He would mostly work on it at night” (ibid.).
A close reading of assembly requires an identification of the hardware on which the assembly operates because the assembly directly manipulates registers. Kittler preferred a thirty-two-bit processor. This code is written in GNU assembly for an x86 family of Intel processors with an x87 family floating coprocessor.
As Kittler explains, because Intel CPUs have become an international standard, high- level programming languages running on these machines are ultimately translated into assembly language to address the original eight registers. To do otherwise would have the computational postal delivery worker arriving at an address only to find the house demolished and perhaps even the street replaced with an entirely new one. In other words, on the level of electronics, messengers would never arrive. To write code in assembly, from this point of view, seems like a return to a communication moment practically unimaginable after our fall with Derrida, who pointed out language’s fundamental separation between the signifier and what it sig- nifies. In assembly, language seems once again tied to a material referent, albeit arbi- trarily. Could we say, to continue our divine code comedy, paradise recovered? If only you don’t have to de…
In the computer science sense, interpretation refers to a kind of translation that seeks out one-to-one cor- respondences. One who has entered the world of assembly language programming, in which the code addresses not just a machine but a very particular machine, in which symbols are written for a family or, thanks to backward compatibility, families of pro- cessors, this person has entered a world of very strict communic…
…even though this code is conventional to the point of being largely unremarkable, reading the code offers a sense of the understanding of the person who implemented it, even if they did not design it. Again, we need to move away from the idea that critical code studies is a kind of treasure hunt and instead, following the models of cultural, bibliographic, and textual studies, move toward recognizing the treasures in the everyday ordinariness of code being used in context.
The title for Gramophone, Film, Typewriter, as Kittler notes in a lecture (2011b), and presumably the notion of this tripartite structure of the book, was chosen to parallel the three-part structure of the von Neumann computational architecture. This is the same architecture that has informed computer design for much of its development so far, containing the CPU, memory, and the bus that shuttles information back and forth. Kittler argues, in that lecture, that this tripartite structure replaces the long-held ancient Greek notion of “matter and form” with the media theoretical trinity of “processing, addressing, and storing”—or, in other words, “data, commands, and addresses.” In so doing, the media determinist has performed for us a subtle illustration of his theory as he looks back upon these technological developments and conceptualizes them as the inside of a computer.
It is not the representational symbols that qualify code as language, but the system that allows us to use them in meaningful ways. In fact, such a reading is par- ticularly Kittlerian, in as much as it sees the structures of languages all the way up and down the hierarchy. I am arguing that the electronic signals have been placed within a system of language and in this way have been rendered meaningf…
The challenge they placed before the community of electronic artists
was to create code objects such as ELIZA that were simple, yet elegant enough to insti- gate this flurry of activity, both creative and critical.
To understand how this code becomes an aesthetic object, one has to stop think- ing about code as something purely functional (such as the plumbing in your house) and instead as something both functional and aesthetic (like the bright pink and blue pipes used in construction projects in Ber…
Code is written not merely for machines to process but as a form of c cation between programmers, especially those who must later maintain and develop the code. Montfort values concision highly in his coding aesthetic.
Code is also an expression of thought. A c erly designed algorithm has the force of a novel poetic conceit. Though some lines of code can be as functionally alike as two nails, they are not necessarily formally or aesthetically equivalent.
This same code is published in #! (Montfort 2014), leading John Cayley (2015) to argue that it is the code that is the poem because the code can be read by humans, whereas the infinitely generated content cannot, a state that again points more toward the regenerating landscape of the national park that inspired the work: its fruits can be experienced only ever as the blossom of a moment.
Although Taroko Gorge would become a subject of many adaptations, the artists who would remake the project mostly changed the data, rather than the rules of the code.
A closer examination of Carpenter’s and Rettberg’s code reveals a sense of what they consider the data and what they consider the form.
…culture—the generators can hardly be called versions of Montfort’s original. They are unique poems in their own right. Or, to return to the beginning of this chapter, they are generators in the new poetic form of Taroko Gorge generators. Each continues to play on Montfort’s original title, mostly keeping to the original verse structure but at times varying, and mostly using his code. What Montfort has cre- ated, then, is not so much an infinite poem as a genesis of a chain of poetic action, of engagement with poetic elements mostly as data. His generators are generative, and his poetic meditation on nature leads to electronic reflections on pop culture, human vice, and other nuances of being, which we might sum up as the stuff of poet…
Taroko Gorge stands as an example of this new literary moment, one in which poet programmers engage with language in and through their code, generating poetry while producing works of art in code that invite exploration whether through reading, execution, or remixing…
Futures of Critical Code Studies
1. Contributing to humanities curricula 2. Informing computer science curricula 3. Supporting research in the digital humanities 4. Inspiring new work in code
The question, ultimately, is not how to get English majors coding or even what the programming world can learn from the arts and humanities—but what would a univer- sity be like without this unnecessary border between two disciplinary clusters that have so much to offer one an…
In other words, a code studies approach can complement a reading of a digital object that includes attention to hardware, other software, and other systems.