Professional Documents
Culture Documents
Rhetorical Code Studies
Rhetorical Code Studies
org
rhetoric al code studies
Sweetland Digital rhetoric collaborative
Series Editors:
Anne Ruggles Gere, University of Michigan
Naomi Silver, University of Michigan
The Sweetland Digital Rhetoric Collaborative Book Series publishes texts that investigate the
multiliteracies of digitally mediated spaces both within academia as well as other contexts.
www.dbooks.org
Rhetorical Code Studies
discovering arguments
in and around code
Kevin Brock
A CIP catalog record for this book is available from the British Library.
https://doi.org/10.3998/mpub.10019291
The publisher gratefully acknowledges the support of the Sweetland Center for Writing in
making this book possible.
www.dbooks.org
To Erin, my best friend and partner in all things.
www.dbooks.org
Acknowledgments
This project, like so many of the cases discussed in the following pages,
could not have been possible without myriad collaborators, colleagues,
and mentors, all of whom have profoundly impacted my life through their
assistance and friendship. I cannot overstate the gratitude I feel for all the
time, energy, and consideration that has been shared with me. At the same
time, I recognize my words here will be inadequate in acknowledging ev-
eryone who has helped me and in describing the impact they have had on
me and this book.
I want to begin by offering my deepest thanks to Nancy Penrose, who
took a chance on me when I was a struggling master’s student who felt
ambivalent toward writing and its study. At the time, I did not know just
how significantly my life would change by turning my focus toward rheto-
ric and composition. Without Nancy’s support and patience with my gain-
ing a grasp of the field, I would never have been able to pursue this career
trajectory.
I also owe a considerable debt to the faculty with whom I studied in the
Communication, Rhetoric, and Digital Media doctoral program at North
Carolina State University; their guidance helped me develop the ideas cen-
tral to my argument throughout this book. David M. Rieder offered invalu-
able and enthusiastic input throughout my time in the program. Along-
side David, Susan Miller-Cochran, Jason Swarts, and Kenneth Zagacki all
shared with me their incredible insight and feedback on my dissertation,
which served as an early attempt at articulating my argument in this book.
In addition, the courses I took with Carolyn R. Miller, Chris Anson, Susan
Katz, Kelly Albada, David Berube, and Denise Gonzales Crisp helped me
further refine the theories and methodologies informing my approach to
communication, code, and software development.
While at North Carolina State, I was lucky to explore interdisciplinary
inquiry alongside an excellent body of emerging scholars in the CRDM
program, especially Jen Ware, Wendi Sierra, Dana Gierdowski, Robin
viii • Acknowledgments
www.dbooks.org
Acknowledgments • ix
not initially anticipated. I did not ever think I would enjoy so much work-
ing with a press.
Finally, I want to thank my patient friends and family for supporting
my efforts and tolerating my distant-and absent-minded behavior while I
worked, especially my wife Erin and my mother Cindy. David, Patrick, and
Jim Brock were reliable sources of needed levity and distracting, although
always informative, debate. My friends Jonathan, Adrianne, Gabriel,
Scott, George, Pat, Dustin, and Ibrahim always made themselves available
for whatever assistance they could provide. I don’t know how you all have
put up with me, but I will always adore you for it.
www.dbooks.org
Contents
Introduction1
6 Conclusions 181
Rhetorical Code Studies Thus Far 182
Assessing Computational Action 186
A Future for Rhetorical Code Studies 190
Bibliography193
Index207
Digital materials related to this title can be found on the Fulcrum platform
via the following citable URL: https://doi.org/10.3998/mpub.10019291
www.dbooks.org
Tables
www.dbooks.org
Introduction • 3
employment of code and its procedural logic for particular civic, political,
and economic ends, attending to the myriad dimensions that influence
and are influenced by the construction of software programs.
This is not to say that efforts to bring together these groups of conver-
sations about critical, rhetorical, and instrumental approaches to studying
digital technology are not attempted more broadly. Indeed, a great many
public opinion pieces by media critics, programmers, and educators have
championed various fusions of instrumental code composing or “mak-
ing” with critical reflection on those composing activities. Similarly, nu-
merous programming platforms have been developed to make software
development more accessible and palatable to wider user populations
than might otherwise encounter them, such as Scratch, Codecademy, Pro-
cessing, or Hackety Hack. As Ford (2015) explained, it tends to be much
easier to develop more accessible ways to teach people existing languages
than to develop new languages or change existing ones:
www.dbooks.org
Introduction • 5
1. Throughout the book but primarily in chapters 3 and 4, I discuss posts and code ex-
cerpts by a number of users on various software versioning system-related websites. I refer
to the real names of those users who are either very well-known in the industry or whose
usernames are identical to their real names; otherwise, I refer to users by the username they
employ on the website. While in some instances a real name might be inferred, I have opted
to call users by the monikers by which they wish to identify themselves on those sites.
6 • rhetorical code studies
www.dbooks.org
Introduction • 7
Ultimately, I hope that the close relationship I identify in this text be-
tween rhetoric and code will be taken up and explored further by other
scholars, whether in rhetoric or in other fields. Perhaps a rhetorical study,
and practice, of code can lead to more software development engaged with
the ideologies and values of programmers and users and that works to ef-
fect cultural and political change more fully, actively, and explicitly to the
benefit of those same populations. For a world fundamentally impacted
by digital technology—and thus by its software—the arguments we and
others make in code have the potential to be read, experienced, and re-
sponded to so that we can develop not only more responsible and ethical
programs (to use a term coined by Brown 2015) but more responsible and
ethical publics as well.
www.dbooks.org
chap ter 1
9
10 • rhetorical code studies
sures that the length of a given heartbeat (the “payload”) has an appropri-
ately long record; otherwise, the request is discarded (Cassidy 2014). De-
spite the relative simplicity of the code in terms of the overall complexity
and number of lines of code involved, its significance was enormous, with
only 12,000 of the 800,000 most popular websites remaining vulnerable
more than a month after the bug was made public (Leyden 2014).
So, given the potential consequences of Heartbleed and the relatively
small fix it took to resolve the issue, why did it persist for so long? And
what does the story tell us about the rhetorical activity taking place not
only in response to the bug, of which there are many examples to choose
from, but also within the code texts before and after its patch? Further,
to what extent does Heartbleed—or any other specific example, such as
the case of the Mozilla web browser, discussed later in this book—reflect
more broadly applicable understanding in regards to software develop-
ment, use, and the ways programmers approach their code as meaningful
communication?
These questions cannot all be answered easily. My goal, however, is not
to propose easy answers so much as to attend to the tensions, problems,
and complications that arise from circumstances like those of the Heart-
bleed bug. Further, I hope to draw more critical attention to the rhetorical
activity taking place in and through the code at the center of phenomena
like the Heartbleed bug, as that activity can and does exert tremendous in-
fluence over how individuals and communities respond to and deal with
the consequences of writing code—and thus constructing and dissemi-
nating meaning in particular ways for certain audiences. This attention
takes place through the cultivation of a rhetorical orientation toward
software, code, and its algorithmic procedures, which we can recognize
through scholarly literature in several fields: digital rhetoric, software
studies, critical code studies, and technical communication.
Table 1.1. Excerpt from Heartbleed patch (t1_lib.c) by snhenson et al. (2015)
Line Code
3977 /* Read type and payload length first */
3978 if (1 + 2 + 16 > s-
>s3-
>rrec.length)
3979 return 0; /* silently discard */
3980 hbtype = *p++;
3981 n2s(p, payload);
3982 if (1 + 2 + payload + 16 > s-
>s3-
>rrec.length)
3983 return 0; /* silently discard per RFC 6520 sec. 4 */
3984 pl = p;
www.dbooks.org
Toward the Rhetorical Study of Code • 11
Over the past decade, there has been continually increasing interest in
the rhetorical study of software and code, with examinations of software
as possessing and communicating ethics (Brown 2015) to advocacy for
code-related literacy (Vee 2017) to an understanding of video games as a
form of embodied practice (Holmes 2017) to the potential emergence of
genres in code texts (Brock and Mehlenbacher 2017), as well as to experi-
mentation with writing meant for algorithmic readers (Gallagher 2017).
This interest, as well as its broadening scope and deepening focus, sug-
gests the birth of a scholarly field related to but not incorporated entirely
within rhetoric nor within the fields of software studies or critical code
studies. Instead, this field, which I call “rhetorical code studies” (a term
that has already seen some uptake; see Beck 2016), exists at a point of con-
vergence of all three areas of study; its name reflects the position and fo-
cus of inquiry that the field has developed thus far and the possibilities
that future investigations might uncover. Rhetorical code studies provides
a means by which software use and development as well as the communi-
cative work that takes place through its code texts—as well as the algorith-
mic logics communicated through those code texts (Beck 2016)—could be
understood more clearly as rhetorical activity. Further, such inquiry could
open up new directions for pedagogical engagement with code and com-
putation as avenues for communication as well as for critical literacy.
An argument for the rhetorical study of code might seem either as ob-
vious as the rhetorical study of other forms of communication or as pre-
posterous as the rhetorical study of an arhetorical subject, and this reflects
two common threads of conversation among rhetoricians regarding the
scope of the discipline. It is neither compelling nor accurate to argue that
rhetoricians should attend to code simply because such inquiry has not
been performed much or at all. Instead, I base my argument on the prem-
ises that code is as meaningful as any other form of communication and
that the sheer amount of code produced each day (likely numbering in the
billions of lines of code), along with the impact that much of that code
has on myriad aspects of daily life, suggests an important phenomenon in
need of continued and focused investigation.
Rhetorical code studies can potentially address multiple kinds and
modes of rhetorical activity and interaction, including communication
reflecting complex relationships such as among developers, between de-
velopers and users, between developers and technologies, and also users
and technologies. For the purposes of this project, and explained in more
detail in chapters 2 and 3, I emphasize the rhetorical activity of developer-
12 • rhetorical code studies
www.dbooks.org
Toward the Rhetorical Study of Code • 13
ing of labor relating to their production and innovation, and the social and
political impacts of that gendering (Abbate 2012; Hicks 2017). Still others,
like Coleman (2013) and Kelty (2008), have examined cultural concerns
and contexts surrounding software use, especially free and open source
software and its various development, user, and hacker communities.
These characteristics of code—its rhetorical qualities, the discourse
surrounding its development, and the social and cultural contexts in
which it is composed and employed—inform the premises on which
rhetorical code studies is built. In addition to providing an avenue for fo-
cused critical inquiry of underexplored objects of study and perspectives
for study regarding technological development and use, rhetorical code
studies would offer new means of engaging in the creative and rhetori-
cally informed production of meaningful code and software. Specifically, I
posit that software that has been composed with as much attention to the
rhetorical dimensions of its code as to its intended and anticipated execu-
tion and output—as opposed to code perceived to be primarily or wholly
instrumental in nature—might well herald valuable innovations for ap-
proaching computer use in general and code composition in particular.
I hope to describe rhetorical code studies and how its object might be
more fully scrutinized precisely because the use and development of soft-
ware and code can help us understand more clearly, across a number of
rhetorical dimensions, how we attempt to communicate meaningfully
with others across digital contexts. For rhetoric in particular, a field in
which scholars seek out knowledge of and proficiency with meaningful
expression relating to a given situation, this help is key. Further, given the
increasingly significant role that software plays in the daily activities of
all manner of individuals and populations, it is imperative that critics of
rhetoric and software alike understand how software and its code exert
influence upon our efforts to communicate with one another so that we—
academics, software developers, and the general public—can make more
effective and aware use of these code-based forms of making meaning.
In the chapters that follow, this potential field of rhetorical code stud-
ies will be developed through a focus on a set of interrelated concepts
emphasizing the rhetorical means and goals of code, concepts that have
had longstanding importance to rhetoric. The first of these is action as
understood through Burke’s (1969) term symbolic action. For Burke, sym-
bolic action refers to any communicative effort the meaning of which
extends beyond the specific set of acts that makes up the transmission
of a particular message. The second concept central to this argument is
meaning making, the efforts by one or more rhetors to induce or influence
www.dbooks.org
Toward the Rhetorical Study of Code • 15
Digital Rhetoric
While rhetoric as a discipline is not inherently focused on digital media,
it has nonetheless incorporated digital forms of meaning making into its
fold, with scholars revising and inventing theories of rhetoric as necessary
to more fully understand how those forms operate rhetorically. Below, I
outline the relationship between digital rhetoric, its subfield of computers
and writing, and the emergence of procedural rhetoric as a lens through
which to understand how code, through algorithmic procedure, con-
structs and communicates meaning.
Rhetoric—and most notably rhetoric and composition—has expressly
held an interest in digital technologies for communicative ends at least
since the birth of the Computers and Writing conference in 1982, when
a number of scholars and consultants gathered to discuss “the place of
computing in the writing curriculum” (Gerrard 1995, 280). While the
primary focus for the conference’s first several meetings was on the fa-
cilitation of student writing with computer technologies and the analysis
of that writing, discussions over the next several meetings of the confer-
ence quickly expanded to include the social and political impacts of those
16 • rhetorical code studies
1. The conventions of new digital genres that are used for every dis-
course, as well as for special occasions, in average people’s lives.
2. Public rhetoric, in the form of political messages from government
institutions, which is represented or recorded through digital tech-
nology and disseminated via electronic distributed networks.
3. The emerging scholarly discipline concerned with the rhetorical in-
terpretation of computer-generated media as objects of study.
4. Mathematical theories of communication from the field of informa-
tion science, many of which attempt to quantify the amount of un-
certainty in a given linguistic exchange or the likely paths through
which messages travel. (47–48)
Losh’s definitions clearly include not only humanistic inquiry but the
broader employment of rhetoric as constructing meaning for diverse pur-
poses. Her fourth definition is perhaps most significant for this project, as
the valuable and relevant work occurring in information science identified
by Losh informs much of the philosophy behind rhetorical code studies.
Eyman (2015) has offered a similar broadened set of definitions of
“digital rhetoric” (although focused primarily on scholarly contexts),
www.dbooks.org
Toward the Rhetorical Study of Code • 17
[I]nterfaces are difficult to talk about. They seem natural and inevita-
ble to most people. They are often transparent. Students in my classes
can’t imagine computers being any other way—and most of the time,
neither can I. Interfaces are what programmers write. (465–66)
cal theory. One group of rhetorical critics has explored how historical ap-
proaches to rhetoric could effectively provide insight to communication
taking place through electronic and digital media. Miller (2007) examined
the concepts of ethopoeia and rhetorical agency in relation to automation
and similar complex technological engagements, using the example of
an automated software program for writing assessment. Warnick (2007)
argued that rhetoric as a discipline must move away from notions of sin-
gle authors and works as the bases for its study and instead turn toward
the distinct concepts of collaborative authorships and interlinked hyper-
texts (122). Brooke (2009) restructured the rhetorical canons in order
to more clearly and directly define them in relation to the variety of new
media emerging as part of developments in digital technology. Carnegie
(2009) examined how technological interfaces might be better understood
as contemporary forms of exordium; Tarsa (2015) expanded on this argu-
ment to explore how students make sense of digital interface through that
lens, especially in regards to interfaces that promote participation and
interactivity.
A second group of rhetorical scholars has worked to expand critical
orientation and language so as to more fully explain and contextualize dis-
cursive practices mediated by digital technologies. For example, Fagerjord
(2003) argued that rhetoric as a term needed to be redefined to incorporate
more diverse kinds and dimensions of emerging media. Zappen (2005)
posited that it is necessary to consider how the qualities of digital commu-
nication can and do affect specific types of inquiry and discourse, and spe-
cifically “the characteristics and [ . . . ] strategies of self-expression, par-
ticipation, and collaboration that we now associate with [digital] spaces”
(323). Porter (2009) examined delivery as a means of revising existing rhe-
torical theory or producing new theoretical perspective: “[t]he real value
in developing a robust rhetorical theory for digital delivery lies in [produc-
tive action]” (221). Losh (2016) argued for the need to attend to rhetorical
situation, exigence, orientation, and navigation in regards to “new forms
of rhetorical performance by computational components [that] may be
going on independent of human-centered display” and not merely those
technological engagements easily accessible or recognizable to us (n.p.).
Meanwhile, Stolley (2014) drew an explicit connection between conven-
tional and digital approaches to meaning making in order to advocate for
a transformation of rhetorical thought, arguing outright that “program-
ming is writing. I mean that literally” (264).
www.dbooks.org
Toward the Rhetorical Study of Code • 19
www.dbooks.org
Toward the Rhetorical Study of Code • 21
ing logics for digital media. Rhetorical code studies can build on this work
by providing continued and heightened attention to how the technologies
underlying those contexts enable, augment, and constrain the construc-
tion of meaning with and through digital technologies.
the act of reading web pages and markup language, since PHP is inter-
preted by a web server and transformed into HTML before a user has the
chance to see what it does when the user looks at a particular web page.
Jerz (2007) explored both the source code for the late 1970s text-based
video game “Adventure” and the physical location (Kentucky’s Mammoth
Cave) that inspired its creation in order to understand how specific lines
of code in its files communicated significant meaning to the game player
about how to explore certain possibilities for game play. Sullivan (2013)
developed a conference presentation webtext whose full content would
only reveal itself when a reader examined its source code, where the bulk
of Sullivan’s argument existed as comments hidden from web browser
rendering. Schlesinger (2013) explored the possibility of a “feminist pro-
gramming language,” one that might not be based on Boolean logic, in
a HASTAC blog post that garnered considerable discussion regarding its
potential impact on programming philosophy (namely, about the extent
to which existing technological constraints would allow such a language
to function). Schlesinger’s work is also noteworthy for the nearly immedi-
ate backlash it received from some programmer circles whose members
deemed its theoretical language “academic gibberish” and who offered
thinly veiled and overt misogynistic criticisms at Schlesinger and other
discussion participants (cf. topwiz 2013; Reif 2013).
Another group of scholars straddles the boundary between software
and critical code studies, emphasizing through their work how code and
software are often as radically different objects of study as they are similar
to one another. Chun (2011) has led this particular charge, pointing out
that executing code—the compiled software that one runs in order to use
specific programs on a computer—is distinct from its comparatively static
source code that, while readable, does not act. For Chun, source code
is an artifact that only hints at the possibility of what a program can do
since the act of using the software cannot be replicated by reading its code.
In contrast, Hayles (2005) argued for a distinction between natural lan-
guage and executable code language that emphasized the ability of natural
language communication to signify more than it literally suggests, subor-
dinating code to mere description of the computational operations that
its compiled program would execute, although it must be noted that the
majority of code critics ultimately disagreed with this distinction (Cayley
2002; Cramer 2005; Marino 2006). For scholars like Chun and Hayles, the
critical study of code offers an important avenue for engaging with digi-
tal technologies as means of creative invention that, nonetheless, reflect
www.dbooks.org
Toward the Rhetorical Study of Code • 23
Software Studies
The field of software studies, while closely related to the critical study
and analysis of code, is focused primarily on the social and cultural sig-
nificances of and influences upon the processes of software programs and
the logic that facilitates their use, concerns of clear relevance to rhetorical
code studies. There are several major initiatives currently being developed
by software scholars beyond the set of varied approaches to the study of
software by critics who affiliate themselves, or who are otherwise associ-
ated, with the field.
24 • rhetorical code studies
www.dbooks.org
Toward the Rhetorical Study of Code • 25
1. new media objects are composed of digital code, which is the nu-
merical (binary) representation of data;
2. the structural elements of new media objects are fundamentally
modular;
3. automation is prevalent enough in new media systems that human
presence or intervention is unnecessary;
4. new media are infinitely variable;
5. new media, as computer data, can be transcoded into a potentially
infinite variety of formats. (Manovich 2001, 27–45)
While not all software critics are interested in the technical qualities of
digital media included in Manovich’s list, these concerns nevertheless
have informed much relevant scholarship, such as Cramer’s (2005) analy-
sis of algorithm as “magic,” in which he broke down the ways various cul-
tures have attempted to comprehend computation.
Several scholars have attended to the relationships between software,
code, and infrastructure. Hayles’ (2004, 2005) comparison of natural and
code languages for meaningful purposes suggested that code, despite its
mutable, transcodable nature—one that suggests a flexible or shifting po-
tential meaning attached to it—does not possess the ability to signify or
transmit multiple meanings in the liquid manner that natural language
can and does. Fuller and Matos (2011), meanwhile, have extrapolated the
possibilities of “feral” computing systems and the potential for wild, il-
logical designs that already emerge from the inherently logical nature of
new media as data and code languages. Helmond (2013) examined the
“algorithmization” of hyperlink construction and dissemination over time
as expectations changed for web and social media navigation, sharing,
and tracking activities. Noble (2018) has called attention to the ways that
search engines like Google reinforce sexist and racist cultural values (es-
pecially those harmful to black women) through their algorithmic media-
tion and presentation of search results to users. Johnson and Neal (2017)
highlighted the growth of black code studies, a related field whose schol-
26 • rhetorical code studies
www.dbooks.org
Toward the Rhetorical Study of Code • 27
Technical Communication
While technical communication was not identified as a foundation for
rhetorical code studies, it nonetheless has had a long and rich relation-
ship with rhetoric and software development that is worthy of mention,
thanks to its focus on (among others) clear and effective communication
that facilitates complex activities. While the majority of relevant technical
communication scholarship has focused less on the explicit composition
of code than on the composition and design of supporting communica-
tion practices and documents (e.g., installation guides, new user tutori-
als, etc.), it nonetheless contributes to rhetorical code studies through
its emphasis on expert authors’ need to answer less informed audiences’
questions and address potential confusions with a given text or related
28 • rhetorical code studies
www.dbooks.org
Toward the Rhetorical Study of Code • 29
www.dbooks.org
Toward the Rhetorical Study of Code • 31
The algorithm is perhaps the concept most central to rhetorical code stud-
ies, and it is necessary to examine how algorithmic procedures are related
to humanistic scholarship in general and to rhetoric in particular. This re-
lationship can be demonstrated by tracing a path from the origins of the
algorithm through its adoption from mathematics by computer science
and engineering to its role in the critical work of humanities research. Fol-
lowing this brief history of the algorithm and its connection to humanis-
tic work is an interrogation of how the algorithm plays an integral role in
rhetorical activity. Such activity can be understood from a perspective that
Hayles (2012) has referred to as “technogenetic,” meaning that it identi-
fies the interrelated codevelopment (or, for Hayles, coevolution) of hu-
man and technological entities (10). For rhetoricians, this means not only
digital or electronic technologies but all apparatuses, broadly employed,
for the purpose of making and communicating meaning as well as the
“specific implications” Gillespie (2014) has identified “when we use algo-
rithms to select what is most relevant from a corpus of data composed of
traces of our activities, preferences, and expressions” (168). Algorithmic
construction of meaning, the execution of a kind of “knowledge logic”
(Gillespie 2014, 168), works to facilitate action in a variety of digital con-
texts, emerging from their predecessors in new and familiar ways.
33
34 • rhetorical code studies
www.dbooks.org
Rhetoric and the Algorithm • 35
Step 1: 5x2 = 80
Step 2: x2 = 80 * 1/5
Step 2a: x2 = 80/5
Step 3: x2 = 16
A new, a vast, and a powerful language is developed for the future use
of analysis, in which to wield its truths so that these may become of
more speedy and accurate practical application for the purposes of
mankind than the means hitherto in our possession have rendered
possible. Thus not only the mental and the material, but the theoreti-
36 • rhetorical code studies
cal and the practical in the mathematical world, are brought into more
intimate and effective connection with each other. (2002, 19)
www.dbooks.org
Rhetoric and the Algorithm • 37
www.dbooks.org
Rhetoric and the Algorithm • 39
enthymeme as algorithm
As I have argued elsewhere (Brock 2014), the algorithm most central to
Western rhetoric is the enthymeme, a concept that has predominantly been
defined as an incomplete logical argument that, through its procedural
logic and presentation, compels an audience to complete the argument in
order for it to be properly and effectively expressed (Bitzer 1959; Walker
1994). Specifically, the enthymeme is a rhetorically oriented syllogism, a set
of premises (major and minor) that, in combination, lead to some sort of
conclusion or result. For a complete syllogism, the relationship between
these elements is explicitly stated (see below). For an enthymeme, this re-
lationship is probable and implicit, as its logic remains procedurally sus-
pended until audiences identify it on their own. As Hairston (1986) has
argued, “The person who argues from an enthymeme is [usually] not try-
ing to prove a proposition; he or she is only trying to establish high prob-
ability” for an audience to accept the rhetor’s proposition (76). The most
well-known syllogism includes the following components:
www.dbooks.org
Rhetoric and the Algorithm • 41
www.dbooks.org
Rhetoric and the Algorithm • 43
www.dbooks.org
Rhetoric and the Algorithm • 45
www.dbooks.org
Rhetoric and the Algorithm • 47
stylistic concerns that guide each approach. As Lopes noted, “By honoring
different constraints, we can write a variety of programs that are virtually
identical in terms of what they do, but that are radically different in terms
of how they do it” (2014, xii). Rhetoricians interested in the complexity of
diverse possibilities that emerge from constrained situations—whether
digital in nature or not—can take a great deal from the Oulipo’s experi-
ments with algorithmic approaches to invention.
algorithmic criticism
Possibly the most explicit use of algorithmic procedure to facilitate hu-
manities scholarship, both conventional and unconventional, is Ramsay’s
(2011) concept of “algorithmic criticism.” For Ramsay, algorithms provide
avenues for literary research and interpretation through their expressive
transformations of texts into novel “paratexts” that reveal insights that are
otherwise unavailable or difficult to recognize. Paratexts, for Ramsay and
other literary scholars interested in algorithmic criticism, are texts trans-
formed, deformed, and performed in innovative ways and for various ends
through procedural mutation and reconfiguration; Ramsay argued that
“[t]he critic who puts forth a ‘reading’ puts forth not the text, but a new
text in which the data has been paraphrased, elaborated, selected, trun-
48 • rhetorical code studies
cated, and transduced” (2011, 16). Among the means by which Ramsay
demonstrated the literary potential for algorithmic procedure is the aggre-
gation and computation of particular types of data in order to restructure
the literary reading experience.
For example, Ramsay compared the most frequently used terms and
ideas provided by the major characters in Woolf ’s The Waves, demonstrat-
ing how the commonalities between characters’ most frequent terms al-
low readers to draw new connections between those characters. Included
in table 2.1 (Ramsay 2011, 13) is an excerpt from the expressed set of fre-
quently used terms for two of the novel’s six protagonists using a relevant
algorithm employed by Ramsay. Ramsay’s line of inquiry sought out the
terms that were not only most frequently used but also were not used fre-
quently by any other character, that is, the terms that were either unique
to, or at least primarily associated with, each protagonist.
One conclusion related to new connections that Ramsay draws is that
although the character Louis (as the only Australian in the group) is self-
conscious of his accent, the other characters seem to pay that cultural dis-
tinction little attention: no one else, for instance, ever mentions the terms
“Australian” or “accent.” To the others, these concepts seemingly do not
matter since they do not appear among the terms used frequently by those
characters (Ramsay 2011, 12–14).
This sort of reading by Ramsay—in which previously unrecognized
Table 2.1. Excerpted lists of term frequency from Woolf’s The Waves,
compiled by Ramsay (2011)
Louis Neville
mr catullus
western doomed
nile immitigable
australian papers
beast bookcase
grained bored
thou camel
wilt detect
pitchers expose
steel hubbub
attempt incredible
average lack
clerks loads
disorder mallet
accent marvel
www.dbooks.org
Rhetoric and the Algorithm • 49
It is easy to consider the semiotic value of code when its syntax closely
resembles that of natural language, and many languages use syntax re-
sembling that of English. The idea that code could and should be written
primarily for human readers, rather than for the computers that interpret
the code, has its origin in Knuth (1992), whose idea of “literate program-
ming” required a radical reconsideration of how computer science might
be approached. For Knuth, it was crucial that code be composed in such
a manner that its meaning was clearly articulated to human audiences; its
ability to be executed properly or accurately by a computer was secondary.
Essentially, the idea is that human collaborators should be able to com-
prehend any of their colleagues’ work and the functional intent of that
work. This perspective has been echoed by influential programmers since
then, including in several texts on fundamental programming principles
and practices (Kernighan and Plauger 1978; Kernighan and Pike 1999).
Matsumoto (2007) urged his audience specifically to treat code “as an es-
say,” and he demonstrated doing so through a series of example programs
written in the Ruby language (477).
There is a relationship between saying (describing) and doing (com-
puting or executing) in source code and the executable programs they
describe, but this relationship is not always emphasized or addressed in
specific code texts. “Codework,” a kind of code poetry, blurs that relation-
ship with a similar relationship in written language between “saying” and
“appearing,” what Lanham (1993) referred to as a bistable oscillation be-
tween looking “AT and then THROUGH” texts, an oscillation that is never
eradicated but might fluctuate to varying extents between audiences and
contexts (5). Cayley (2002) wrote codeworks in order to experiment with
the possibilities of maximizing code’s ability to perform computational
tasks while also clearly communicating its goals to a reader in a conven-
tionally understandable manner. For Cayley, “codework” as a term high-
lighted its distinction from the vast majority of code that is technically
productive but not intended to be artistic in form. The following is a brief
excerpt from one such codework:
www.dbooks.org
Rhetoric and the Algorithm • 51
modes. The notion that an algorithm can and does work rhetorically is
a radical departure from its conventional definition, which emphasizes
discrete procedural execution of its components. In some computer sci-
ence contexts, there is significant discussion about the optimal way to
construct a particular program or function in a given language, focusing
not so much on what a procedure means to do but rather on how to clearly,
effectively, and efficiently state and structure the steps of that procedure.
There is an implicit recognition of the procedure’s purpose and its value,
but those qualities do not occupy the center of discussion. As Edmonds
(2008) noted, novice programmers often find themselves needing to shift
mentally “from viewing an algorithm as a sequence of actions to viewing
it as a sequence of snapshots of the state of the computer” (6). This shift,
he argued, is significant because it draws attention to how code computes
data from one action to the next within a procedure rather than on what
the end result does or means. In other words, the scale of critical inquiry
assumes that the point or goal of a procedure is already determined or
understood, rather than remaining germane to the discussion about how
best to solve a relevant problem.
The novice mentality described by Edmonds (2008) is closer to the
mark for thinking critically in regards to algorithms and rhetoric than
the conventional “learned” mentality, since the novice student has not yet
been trained to disregard certain critical perspectives in order to approach
the algorithm “correctly” for academic or industrial purposes. Berlinski
(2000) noted that an algorithm is, in addition to the strict, conventionally
computational procedure he had initially provided for his reader, “a set
of rules, a recipe, a prescription for action, a guide, a linked and controlled
injunction, an aduration, a code, an effort to throw a complex verbal shawl
over life’s shattering chaos” (xvi, emphasis added). Berlinski’s reference
to a “prescription for action” is not just a means of defining a particular
action to occur in a certain way but to call for that action to be undertaken
by a certain audience, laying bare the algorithm as a procedural engage-
ment with a rhetorical exigence.
What a recognition of algorithm as meaning making offers rhetoricians,
then, is an opportunity to explore how a seemingly “machinic” manner of
discourse—the code of digital technologies and media—can provide in-
sight into the interplay among the canons of rhetoric to influence the po-
tential expression(s) of a particular rhetorical situation. For example, how
does style affect code-based composition practices in order to facilitate ac-
tion in human agents? How might a critical acceptance of a technological
www.dbooks.org
Rhetoric and the Algorithm • 53
Procedural Rhetoric
While it may appear trivial, there is a significant difference between algo-
rithmic meaning making and the related idea of procedural rhetoric. Pro-
cedural rhetoric as described by Bogost (2007) deals with the influential
qualities of procedure-based systems exerted upon individuals who make
use of those systems. Bogost, however, did not elaborate on a wide vari-
ety of code-based algorithms as much as on how algorithms function in
regards to interactive systematic procedures like video games and how
games’ procedures persuade players to act within a game’s context. For
Bogost and for others since (including Sample 2013), the rhetorical ca-
pabilities of a procedural system offered new ways of engaging specific
populations that might otherwise be ignored or overlooked. A video game
teaches its player the rules of its “world” through activity within the game;
the player, through trial and error, explicit tutorial, or both, learns what
behaviors and perspectives are acceptable and “valid” while engaging that
game’s system. The rhetorical action that occurs at the user level empha-
sizes the way(s) a game’s developers intend for its content to be encoun-
tered by a player.
But there is also significant rhetorical action at the developer level,
demonstrated by the ways through which the developers constrained
particular means of user interaction with the processes of a given game
world, effectively making use of another level of procedural rhetoric—
wherein one developer persuades another—to facilitate the game itself.
As Bogost described it, “processes define the way things work: the meth-
54 • rhetorical code studies
ods, techniques, and logics that drive the operations of systems from me-
chanical systems like engines to organizational systems like high schools
to conceptual systems like religious faith” (2007, 3). This definition sug-
gests that code—as a symbolic representation of algorithmic procedure—
might play a prominent part of Bogost’s discussion of procedural rhetoric.
Bogost noted, however, that some processes that “might appear unex-
pressive, devoid of symbol manipulation, may actually found expression
of a higher order” and explained how those humans who are perceived
as “breaking procedure” in actuality are constructing new processes, and
expressing them, in order to complete tasks (2007, 5). This adjustment of
emphasis (to “higher order” expression), while hinting at the possibilities
of computation for rhetorical ends, facilitated Bogost’s close analysis of
video games and gameplay experiences as procedural expressions.
Rhetorical procedure has been explored further by Lanham (2003),
who referred to such procedures as “tacit persuasion patterns” (119). For
Lanham, tacit persuasion occurs constantly, since we are almost never
acutely aware of all influences attempting to exert themselves upon us. As
Lanham observed, individuals often “feel” the presence of tactic persua-
sion patterns “subconsciously, even if we do not bring that knowledge to
self-awareness” (2003, 120). This description hints not just at a passive
acceptance of rhetorical appeals but a subconscious engagement with
the variables of a rhetorical situation as well as enthymematic arguments
provided by a rhetor across multiple levels of language. As a scholar in-
terested in speech and writing, Lanham focused primarily on persuasive
techniques available in discursive language, such as rhyme, chiasmus,
alliteration, and anaphora. Each of these devices provides a rhetor with
the ability to draw or hold the attention of an audience that might other-
wise have not bothered to heed an argument. Such devices suggest a sig-
nificance in the argument through the affordances of languages’ stylistics.
While Lanham did not address the possibilities of tacit persuasion pat-
terns or devices in artificial (code) languages, they nevertheless exist and
are already used frequently by many developers working collaboratively, as
will be discussed in subsequent chapters.
Rhetorical code studies continues this conversation in regards to the
potential for expressive action through the languages of computer code.
Code might be described as “inexpressive” in that it creates and commu-
nicates meaning in ways that often differ from conventional invention
and delivery of discursive arguments; it is precisely because of this qual-
ity, however, that its procedural nature can demonstrate expressive out-
www.dbooks.org
Rhetoric and the Algorithm • 55
comes in novel and unique ways. Here I set aside the specific expressive
acts of procedural execution (which would highlight the general user’s
experience with a particular software program) and instead discuss how
the construction of algorithms in and through code as both text and process
functions persuasively on user and developer as well as, to a lesser extent,
on technological systems including user workstations, servers, network
routers, sharing economies, etc. In other words, my interest in algorithms
is focused on how code, as a medium to describe algorithmic procedures,
is articulated for rhetorical purposes.
simple code algorithms appear to, and do, work rhetorically. In the fol-
lowing pages, I address several examples of increasing complexity whose
code texts communicate at various levels the meaningful action they mean
to effect through the computational operations that make up their text
forms. First, I look at FizzBuzz, a program that iterates through a specific
body of data, used in hiring tests to determine applicants’ knowledge of
algorithmic principles. Second, I examine quine, a program that outputs
its entire code content. Third, I turn to HashMap concordance, a program
that tracks word frequency across a set of input text (in this case, Mary
Shelley’s Frankenstein and Bram Stoker’s Dracula).
c ase 1: fizzbuzz
The first example to be scrutinized, the “FizzBuzz test,” is relatively simple
in construction and intent (although elsewhere I have explored the rhetor-
ical canon of style in greater depth than is offered in the discussion below;
see Brock 2016). It is the focus of a common hiring test for programmers,
intended to weed out applicants who are unable to work through the ba-
sic principles of algorithmic procedure and expression. The goal of this
algorithm is to take the numbers 1 through 100 and print them out, one
at a time, unless they are multiples of three, in which case the word “Fizz”
should be printed, or if they are multiples of five, in which case the word
“Buzz” should be printed. There is an implicit extra rule here; specifically,
numbers that are multiples of fifteen (that is, both of three and of five)
should print out “FizzBuzz.” The entire output of the program—which is
identical across all four of the examples provided below—is the follow-
ing single line of text (although some variations on the test would include
line breaks, spaces, or some other distinguishing markers between each
output iteration):
12Fizz4BuzzFizz78FizzBuzz11Fizz1314FizzBuzz1617Fizz
19BuzzFizz2223FizzBuzz26Fizz2829FizzBuzz3132Fizz
34BuzzFizz3738FizzBuzz41Fizz4344FizzBuzz4647Fizz
49BuzzFizz5253FizzBuzz56Fizz5859FizzBuzz6162Fizz
64BuzzFizz6768FizzBuzz71Fizz7374FizzBuzz7677Fizz
79BuzzFizz8283FizzBuzz86Fizz8889FizzBuzz9192Fizz
94BuzzFizz9798FizzBuzz
www.dbooks.org
Rhetoric and the Algorithm • 57
www.dbooks.org
Rhetoric and the Algorithm • 59
c ase 2: quine
The second example to be discussed here is the quine, defined most con-
cisely as a “self-reproducing” program. In other words, the output of a
quine is the sum of its code content, meant to mirror that content per-
fectly. The term “quine” derives from the name of mid-twentieth-century
logician Willard Van Orman Quine, who provided the following self-
referential paradox: “‘Yields a falsehood when appended to its own quo-
tation’ yields a falsehood when appended to its own quotation” (Quine
1976). Quine meant that the statement provided can accurately be neither
true nor false, and it is only in the combination of concept and quoted con-
cept that the paradox’s meaning emerges. Rhetorically, the algorithmic
quine offers an opportunity for a rhetor to consider what it means to con-
struct a “logically sound” argument and how to communicate that logic
to a given audience. Is the argument merely an appealing effort at con-
structing or suggesting the construction of meaning, or is there an inter-
nally valid consistency to a quine? Does the former require the latter? How
transparent or opaque should its logical mechanisms be to the audience
so that it can recognize (or not) how the rhetor works to persuade it to ac-
tion? An algorithmic argument generates much of its appeal through its
consistent logic, although this consistency does not necessarily demand
any objective truth or accuracy to succeed.
One simple quine in code, written in the Ruby programming language,
is a single-line program provided in its entirety:
www.dbooks.org
Rhetoric and the Algorithm • 61
Within this line of code, there are two distinct operations that occur. The
first is to define the variable x, and its value consists of the characters
within the quotation marks; this operation ends at the second semico-
lon. In essence, x is defined as a data type called a “string,” a container
for some arbitrary set of alphanumeric characters (whose boundar-
ies are identified by the quotation marks preceding and following the
string’s content). The second operation in the quine, beginning directly
after that same semicolon, recalls and displays for the user the string’s
content exactly, via the puts function. It is important to note that this
second operation must include its own call as part of its output in order
for the quine program to be considered fully self-referential (i.e., the re-
call command itself has to appear in the output of the recall). When x
is defined in part as %p, %p serves as a container in which other content
might be substituted later; the statement puts x % x effectively in-
serts the content of x into itself so as to print out the quine’s input cor-
rectly. Many programmers separate the content of a quine into two com-
ponents, what they refer to as the “code” (the operations to be computed
when the program is run) and the “data” (the noncomputing replication
of those operations). This binary quality of the quine, for developers, al-
lows them to make explicit note of what “runs” (i.e., what computes)
and what is output (i.e., what is computed).
When we examine the code-based quine rhetorically, this distinction
changes as we turn from computational success to meaningful action as a
criterion of evaluation. The action of the quine’s code is to reveal its data
as procedure and output; the action of the data is to highlight the means
by which it was revealed, the computations constituting the code itself.
It is significant that the two components function reflexively rather than
the code unidirectionally working “on behalf of ” the data; the quine as
a whole is displayed as an apparently complete persuasive entity. That is,
because the quine outputs itself, “everything” is made clear to the user
who executes it. It is this relationship that Cayley (2002) referred to when
identifying code existing as both text and not-text (as objects of study);
the code and data components of a program are inherently interrelated,
but the reading of code as executable action and as meaningful language
are two different activities. For the quine, much of its effect—its demon-
stration of its “completeness”—is due to the appearance of the quine as
a transparent argument. In simple terms, this appearance suggests that
the quine does (only) what it says and it says (only) what it does, present-
ing the semblance of a computational chiasmus that is completed when the
input is ultimately displayed as output.
62 • rhetorical code studies
The quine also implies, though, that it is a simple program that merely
presents a plainly stated message: its content. In a sense, this implication
is the perfect argument that could be made by a rhetor: the tools used to
make a case make up that case. Miller (2010b) has pointed out the com-
mon rhetorical tactic of self-denial as a way of playing down or otherwise
concealing the acknowledgment that a persuasive effort is currently tak-
ing place. A significant component of this tactic, she argued, is mimesis,
the idea that language has the potential to represent its subject so clearly
and faithfully that it need not (or cannot) deceive in its representation. As
a result, a rhetor must work not only to conceal his or her true intentions
in using language for a given purpose but also to conceal the fact that the
rhetor is concealing anything. This idea of language as apparently, but not
actually, mimetic is key to an understanding of the quine and what it can
achieve rhetorically (and, perhaps, reminiscent of the debate over techni-
cal communication as instrumental or humanistic; see Miller 1979; John-
son 1998; Moore 1999; Johnson 1999; and discussed further in Dubinsky
2004). It is not simply the sum of its parts (that is, its expression does not
only equal its content); it is a means of suggesting, in more general terms,
that all code can be reduced to such a description and that no further criti-
cal inquiry as to its purpose or mechanical procedure(s) is necessary.
One complication for the quine—and thus, by association, any execut-
able software program—is that it is possible to hide from audiences what
the true intentions and content of a code-based program may actually be.
Thompson (1984) demonstrated the ease with which a skilled developer
might circumvent the transparency of code composition and execution
by inserting instructions into a UNIX machine’s compiler software. The
compiler is an intermediary, a translation program whose function is
to transform source code (readable by humans) into an executable pro-
gram (readable by the machine). Thompson revealed that it was possible
to manipulate the code of a compiler in such a way that it would be un-
detectable to anyone using the compiler, along with any other programs the
compiler subsequently compiles, for other purposes—including the execution
of a quine. Thompson’s point was that one could trust only the code one
wrote: all else was potentially devious, even a program that purported to
print the entirety of its own code. Whenever one interacts with an external
entity (e.g., code written by another person), it may not only be difficult
to tell whether some meaning is concealed but it may be impossible to ver-
ify whether any concealment has ever occurred unless attention is drawn
thereto (cf. Miller 2010b). While the quine itself may not be to blame for
www.dbooks.org
Rhetoric and the Algorithm • 63
c ase 3: hashmap
The third example to be discussed transforms and deforms existing
texts—and conventional readings thereof—in order to bring to light new
meaning that might not have been exposed in the text’s original format.
This sort of code, and its paratextual output, is aligned closely with the
algorithmic criticism of literature promoted by Ramsay (2011) and oth-
ers. Here the example code is included not so much to demonstrate the
possibilities of code for literary criticism but instead to highlight how
algorithmic manipulations of text work to engage different audiences
rhetorically. This example was composed by Shiffman (2014) for, and to
be included with, the Processing integrated development environment
(IDE), which uses a streamlined syntax based on the Java programming
language. Shiffman’s code makes use of a type of data called a HashMap,
which serves as a way to store a “collection” of individual data elements so
that each has its own identifying key data. By default, the program takes
a plain text file with the contents of Mary Shelley’s Frankenstein and Bram
Stoker’s Dracula, the text for each novel made available through the elec-
tronic Project Gutenberg public domain library, and displays each word in
a particular font size related to the frequency of each word’s occurrence in
64 • rhetorical code studies
either novel. The program will not count a word if it appears in both novels
or if it appears fewer than five times. The novel’s words, reconfigured as a
HashMap (a kind of data table that stores paired “key” and “value” data),
offer in their recombined form a way to read meaning in each text, and
in comparison to the other text, based upon the frequency of particular
terms and concepts. Table 2.4 contains excerpts from Shiffman’s code,
which appears as an example project in two files (“HashMapClass.pde”
and “Word.pde”).
The program takes the contents of Dracula and Frankenstein and strips
out all punctuation so that only words (data “strings” of characters, re-
ferred to as hash map “keys”), and the spaces between them, remain.
Then each word is checked against the current contents of the HashMap
Table 2.4. Excerpted HashMap example code by Shiffman (2014) written for
Processing, from “HashMapClass.pde”
Line Code from “HashMapClass.pde” file in HashMapClass example (Shiffman 2014)
27 words = new HashMap<String, Word>();
[ . . . ] [. . . These lines create variables populated by the novels’ texts]
50 void loadFile(String filename) {
51 String[] lines = loadStrings(filename);
52 String allText = join(lines, " ").toLowerCase();
53 String[] tokens = splitTokens(allText, " ,.?!:;[]- \"'");
54
55 for (String s : tokens) {
56 // Is the word in the HashMap
57 if (words.containsKey(s)) {
[ . . . ] [. . . These lines locate the appropriate key and update its value]
68 }
69 else {
70 // Otherwise make a new word
71 Word w = new Word(s);
72 // And add to the HashMap put() takes two arguments, "key"
and "value"
73 // The key for us is the String and the value is the Word
object
74 words.put(s, w);
75 if (filename.contains("dracula")) {
76 w.incrementDracula();
77 } else if (filename.contains("frankenstein")) {
78 w.incrementFranken();
79 }
80 }
81 }
82 }
www.dbooks.org
Rhetoric and the Algorithm • 65
and, if it does not currently hold a position within the HashMap container,
is added thereto with a value of 1. If the word does already exist within the
HashMap, then the appropriate value for that word is increased by 1. Once
this check is completed, it is repeated for the next word in the novel, and
then the next, until the entire novel has been iteratively “read” in this fash-
ion. This activity—or at least an activity closely related to it—is described
as “text mining,” referring to the act of extracting meaningful data from
an otherwise opaque or unexamined source text.
As these word count checks occur, each word that has been computed
is written onto the screen at a random spot along the top with its incre-
menter value influencing the size of that word on the screen. Words that
occur more frequently in either novel are displayed in larger font size
and move down the screen more quickly, and only so many words are
displayed on the screen at any given time, even though the total calcula-
tion of the novels’ contents continues to execute. In other words, there is
a distinction between what the user and his or her machine experiences,
with the former engaged in a particular constrained reading of Dracula and
Frankenstein that is acutely distinct from Processing’s interpretation of the
data as solely important in its numerical sense.
There are several meaningful activities that occur within the lines of
the HashMap code that, together, dramatically alter the traditional con-
cept of reading and writing. Perhaps the most significant of these is the
incorporation of object- oriented programming (OOP) principles into
these activities. In OOP, distinct “objects”—clusters of expressive code
entities—are created from a framework of rules (called a “class”); each
instanced iteration of an object obeys the same procedural rules but re-
sponds to those rules independently of other object instances; that is, it
calculates and expresses its procedures without any inherent influence on
any other object, although this may occur incidentally. The result is a set
of objects whose behavior has the same fundamental principles but that
emerges uniquely for each individual based upon the constraints of its be-
ing called or created as part of a given program; in this example program,
each displayed word is a separate object. (As an aside, OOP is unrelated
to the philosophical subfield that has been named object-oriented ontol-
ogy for its focus on nonhuman entities.) What OOP allows for is the po-
tential for a multiplicity of contextual meaning made possible through the
expression of iterative object creation and activity emerging from an initial
set of algorithmic procedures.
At the same time, the nuanced context of each iteration of a given class
66 • rhetorical code studies
www.dbooks.org
Rhetoric and the Algorithm • 67
results in a very different visible outcome than through some other ap-
proach, such as generating a text list of each word and its final frequency
count. Because only a subset of words from each novel appears on the
screen at any moment, the user ultimately is left unaware of the signifi-
cance of words that do not continually appear or that do so in a small font
size (see figure 2.2).
In figure 2.2, a screenshot taken at another moment during the same
expression of the code displayed in figure 2.1, there is a noticeable differ-
ence in the makeup of visible words. While the code continues to cycle
through the words in each novel, the user is only given access at any time
to a small set of the computational results. Words such as “mina,” “mur-
derer,” and “bag” (visible in figure 2.1) have all been repositioned beyond
the bounds of the program’s output window, obscuring the visualizations
of their frequency; but “harker” has cycled across the screen again at this
point, its position unintentionally captured at nearly the same vertical
point as in figure 2.1.
Why might a program seemingly so trivial—at least in terms of how
it presents a “reading” of Dracula and Frankenstein—be worthy of discus-
sion? The choices Shiffman made in creating this program signal to user
and to developer a particular set of values related to reading and (re)writ-
ing these novels algorithmically. Word-level elements of the novel are de-
formed contextually from their original meaning and given new context
through significance; the words that appear more often in the text appear
more prominent in the code’s expressive arrangement/layout. At the same
time, the way Shiffman has chosen to determine what defines a word
(based on the characters that might surround it) alerts other coders, and
the system expressing the code, as to how to arrange and read the text he or she
inputs. This is not simple instruction entirely devoid of persuasion: we are
68 • rhetorical code studies
Conclusions
More generally, each of these examples discussed above serves to demon-
strate some fundamental qualities of code as a significant form of making
meaning rhetorically. While on its own each program may seem to serve
only a limited purpose, together the code functions provided in these ex-
amples work—alongside thousands of others used daily—in more robust
software programs to persuade and influence numerous human and tech-
nological audiences to act in rhetorically meaningful ways. These ways
may not always be visible, clearly recognizable, or discursive in nature,
but they nonetheless create meaning and work to persuade the human and
nonhuman audiences they engage to induce various types of change in the
ecologies in which they operate.
Further, the potential for meaningful symbolic action that is demon-
strated in these examples reflects the close connection that has existed
for millennia between algorithmic procedure and humanistic activity, in
terms of both creatively and critically oriented work alike. While the vast
majority of scholarly rhetorical focus has thus far centered on a variety
of communicative modes including writing, speaking, image, and even
place, the scholarship on procedure—and especially algorithmic procedure
demonstrated through digital and computational media—as means of
persuasion is relatively sparse. Rhetorical code studies, however, serves as
a space in which to tease out the rhetorical potential of algorithms, and
of software code as a particularly significant contemporary form of con-
structing algorithms, to facilitate action in audiences.
The following chapter demonstrates the potential of code to facilitate
action through an examination of the spheres of discourse surrounding
the composition of code in development communities. Exploring writ-
ten communication about code can provide a means of demonstrating the
rhetorical strategies used by programmers to develop and promote soft-
ware among certain populations (namely, other current and potential pro-
www.dbooks.org
Rhetoric and the Algorithm • 69
grammers). The values that developers stress in their code and discursive
commentary, in addition to the persuasive tactics they use to build particu-
lar types of identities and communities, highlight a set of qualities likely
to be communicated in and through the code they produce. Building on
this foundation, we will then turn to bodies of code texts to see how those
persuasive expectations—and the strategies believed to facilitate the real-
ization of those expectations—play out in a given development case.
www.dbooks.org
chap ter 3
Decades of efforts have gone into helping civilians write code as they might
use a calculator or write an e-mail. Nothing yet has done away with developers,
developers, developers, developers.
–Paul Ford, “What Is Code?”
71
72 • rhetorical code studies
cussion, and the arguments made in that defense bring to light a num-
ber of values possessed by that developer regarding: the program and its
purpose(s); the language(s) upon which the program is built; the develop-
ment team and its goals; and even the broader perspective that the devel-
oper may possess about what is possible in code and how it can be made
possible within the constraints of that particular project.
There are several genres in which programmers predominantly com-
municate with explicitly rhetorical goals. Email (individual messages and
electronic mailing lists), discussion forum posts, and chat environments—
such as IRC and, more recently, Slack—provide opportunities for develop-
ers to engage in sustained synchronous and asynchronous conversation
with their peers about code: solving particular computational problems
or bugs, deliberating over preferred software and hardware architecture,
and even addressing perceived differences between developer and user
knowledge about a program and its use(s). More “official” documenta-
tion genres, provided as code comments and related files (e.g., “Readme”
text documents) outlining the intended purpose of a given program, of-
fer programmers a means of articulating a range of formal and informal
suggestions for how others adopting or modifying a given program’s code
should or should not approach doing so. Similarly, versioning systems
serve collaborators as arenas for deliberation on specific code texts’ rele-
vance to and strength or value in improving a particular program through
the acceptance or rejection of specific changes to its code base.
To begin investigating the role(s) of programmer discourse on rhetori-
cal communication in code, I relate discursive activity on code to tradi-
tional discourse studied by rhetoricians. The rhetorical qualities of such
communication can tell us a great deal about the considerations that de-
velopers weigh when it comes to discussing their work with collaborators
and other audiences. While this sort of discursive activity only partially
describes the range of meaning communicated by developers to develop-
ment audiences, it nonetheless demonstrates the kinds of meaning poten-
tially created and communicated in code as well.
www.dbooks.org
Analyzing Arguments Surrounding Code • 73
torically the bodies of texts composed for their diverse goals. Rhetorical
inquiry into the makeup and activity of online discourse communities
(formed by a wide variety of shared interests or qualities) has occurred
primarily through two major approaches. The first approach tends to
examine online communities as electronically transplanted iterations of
conventional communities, with their forums and email lists as sites for
gathering and exchange that are perceived to function as digital iterations
of historical agorae. When examined through this lens, digital environ-
ments are understood not necessarily to possess qualities unique or oth-
erwise distinct from those of more traditional communities or forms of
communication. Instead, groups communicating digitally are examined
as extensions of traditional discourse communities that employ different,
but historically relatable, media from their predecessors. The second ap-
proach to rhetorical inquiry into online communities involves exploring
those communities as fundamentally distinct from conventional groups
with similarly distinct means of (and preferences for) communication
among group members. In this approach, online communities are gen-
erally positioned as networks with unique qualities that would be impos-
sible to replicate—or otherwise have no clear or familiar analogue or prec-
edent—in nondigital environments.
While these two approaches differ significantly, they nonetheless are
similar in regards to the interactions on which they focus: the traditional
patterns of discursive communication between individuals within a given
community. Both approaches are complicated by the integration of code
into rhetorical examinations of online communities and particularly those
communities involved in the development of software, for whom code
is not merely a facilitator of discourse but a means of communication in
its own right. Should it be understood as an electronic transcription or
inscription of Boolean logic (which does not need digital technology to
operate in the most technical sense)? Or is it a form of communication
realized in full only through the capabilities of electronic, networked com-
puter systems? The likeliest answer is that it is both of these and more.
Admittedly, many of the studies that viewed online communities as
digital extensions of conventional communities are dated, with the major-
ity of such publications spanning the late 1990s or early 2000s. In part,
a number of scholars may have focused on conventional qualities of on-
line communities due to the limitations or unanticipated uses of Internet
spaces, such as Benson’s (1996) examination of Usenet groups’ digital
extension of political discourse or Silver’s (2005) discussion of electronic
74 • rhetorical code studies
www.dbooks.org
Analyzing Arguments Surrounding Code • 75
www.dbooks.org
Analyzing Arguments Surrounding Code • 77
duction and distribution. The defining qualities of OSS include free access
to source code and communal development and improvement of software
programs, “free” meaning unlimited or unhindered, but in many cases
also referring to a lack of financial cost; “libre” has also been used for the
former meaning so as to distinguish it from the latter. Individuals pos-
sess the legal right and, for some, the knowledge to experiment with and
make adjustments to OSS program code. In addition, users are often en-
couraged to distribute the modified code back out to the general populace
so that it can be further modified and distributed in new iterations of the
program, theoretically ad infinitum. Among the most notable OSS projects
include the Linux operating system (of which dozens of distinct distribu-
tions exist, including Red Hat’s Fedora, Debian, Slackware, Ubuntu, and
Gentoo), the Mozilla Firefox web browser, and the Apache web server.
While these few programs listed here are among the most well-known
OSS projects, their popularity nonetheless demonstrates a widespread use
of OSS programs; this suggests in turn a growing popular interest in OSS
development.
Despite a significant increase in OSS use and development since the
early 1990s, it would be misleading to claim that OSS is inherently or
even radically different in terms of development structure than its tradi-
tional proprietary counterpart. That is, in both paradigms, there is gener-
ally a community of dedicated developers working on an active software
program and a community of nondeveloper users that may or may not
contribute suggestions for improvement (such as through bug reports
or requests for features). Where OSS tends to differ from proprietary de-
velopment is that there is often some overlap between “developer” and
“user” (i.e., the prosumer role, cf. Ritzer and Jurgenson 2010), both in
the amount of contributed aid provided by developers or users and the
amount of perceived importance of any community member.
In many OSS communities, a hierarchy of development contribution
value has been established wherein certain developers possess significant
influence over a given project and the vast majority of end-users hold very
little (Christley and Madey 2007). A number of studies have attempted to
understand the social dynamics of OSS development communities and
any hierarchical structures constructed by those communities (Crowston
et al. 2005; Crowston and Howison 2005, 2006; Wiggins, Howison, and
Crowston 2008). These studies, however, generally suggest that a clear
organizational structure, rather than a dynamic and chaotic environment,
has been demonstrated to be the most effective means of ensuring project
www.dbooks.org
Analyzing Arguments Surrounding Code • 79
success. In fact, Crowston and Howison (2006) suggested that the opti-
mal structure of an OSS development community “is onion-shaped, with
distinct roles for developers, leaders, and users” (114). This onion has at
its center the primary source of social power and influence, made up of
the project founder(s) and the release maintainer(s). The further from the
center each layer is, the less influential and less actively involved in the di-
rection and improvement of the project it is, with the outermost layer con-
sisting of those passive users who do not contribute at all.
While Crowston and Howison’s onion metaphor is helpful in describ-
ing the general hierarchies constructed for a given software project, it
obscures the dynamic movement that can occur across these layers and
privileges (or responsibilities). For example, an individual overseeing a
significant section of an OSS project might be near the center of the onion
of that section, but that individual may be less central to the development
of another major section of the project or to development of the project
as a whole. As a result, it may well be more useful to think of the onion as
having intersecting, Venn diagram–like networked links that cross at mul-
tiple node points, rather than layers that engulf others.
www.dbooks.org
Analyzing Arguments Surrounding Code • 81
www.dbooks.org
Analyzing Arguments Surrounding Code • 83
www.dbooks.org
Analyzing Arguments Surrounding Code • 85
www.dbooks.org
Analyzing Arguments Surrounding Code • 87
www.dbooks.org
Analyzing Arguments Surrounding Code • 89
vice that makes use of the Ruby programming language to deliver content
to users. Rails builds on a three-part structure of “models,” “views,” and
“controllers” that serve to describe different rhetorical functions of the
data being manipulated. Briefly, models describe data objects in a gen-
eral or ideal (Platonic) sense, views render them into the output accessed
by users, and controllers deliver data requests to the proper destination
so that views can be rendered properly. While there are hundreds of con-
tributors to Rails, there is a smaller core team of established developers
who collectively decide on the future of the project. One member of that
team, França, in 2012 submitted a relatively brief proposal to add a “sym-
bol,” a special type of object in the Ruby language on which Rails runs,
to a small portion of the Rails code. The overwhelming response to this
proposed change was that the symbol addition was unnecessary and thus
worked against the goals of the project. Several developers questioned
the purpose of the code: “Why is this a module? I see it being included
a single place [ . . . ] I’d imagine it’s not designed to be used anywhere
else, so why bother?” (França et al. 2012), Another contributor asked, “Is
there an actual problem this code is solving?” (França et al. 2012). Yet an-
other contributor argued, “I think this is a horrible addition to the router
that doesn’t appear to be actually solving a problem, as well as poor code”
(França et al. 2012). França himself did not enter the comment discussion
on the merit of his code proposal, leaving his colleagues unclear as to the
intended purpose of his submission, even if the end result may have dif-
fered from that intent. França’s contribution thus clashed with the set of
practices that had been established and supported by the majority of vocal
contributors to Rails, and his colleagues seemed to be in consensus that it
was ultimately not a worthwhile addition to the project.
But David H. Hansson—the initial developer of Rails and a “benevo-
lent dictator” over the project with the ability to overrule the decisions of
even the core team—ultimately decided to accept França’s proposed code.
In his support for the proposal, Hansson noted, “I find [the proposal] to
be a wonderful addition to the domain language and a key building block
for making beautiful Rails applications. So we will spread that beauty far
and wide” (França et al. 2012). In essence, Hansson accepted the proposal
not because the community decided it was the best approach but instead
because he felt that it served the community well. The remaining discus-
sion hinged on the soundness of Hansson’s decision, focused primarily
on whether Hansson’s own preferences for Rails code style may or may
not have aligned with the stylistic preferences and goals of the majority
90 • rhetorical code studies
For Zawinski and many others who had contributed to the early releases
of Netscape Navigator, the act of sanitation—interpreted by lawyers to
be a legal necessity—was one of erasure that removed the character of
Netscape-related development from the published texts. Yes, there was a
tremendous amount of profanity in the comment lines, but for Zawinski
and his collaborators, that profanity was an important component of their
programming efforts, as well as being an accurate depiction of the frustra-
www.dbooks.org
Analyzing Arguments Surrounding Code • 91
tion that often accompanied development activities. For his part, Zawinski
published, in 2004, a partial archive of commented lines that had been re-
moved from the first public release of Netscape Navigator (see table 3.1).
None of the comments are particularly heinous, and other than the oc-
casional comment targeting a specific individual (“Lou”) or group (“mar-
keting”), most of the obscenities are focused on problems with how par-
ticular lines or blocks of code function, usually in unexpected ways. Given,
however, that Netscape was in a position to have its initial public release
of code scrutinized heavily by the public, or at least by individuals outside
of the corporate and social structure of the Netscape team, a particular
presentation of the company and “releasable code” influenced a move
toward standardization of otherwise internal discourse to become a pub-
licly palatable set of texts. That is, complaints about Netscape’s code in
comment lines may have been perceived (whether by the legal team or in
anticipation of public audiences) as metonymic critiques of the browser
itself rather than, perhaps, as cathartic expressions of temporary anger or
disagreements between individual developers. In any case, the comments
were intercepted by Netscape’s lawyers in order to circumvent any such
potential interpretation.
If Netscape had never released the browser’s code to the public,
would it still potentially be laden with profanities? Are profanities gener-
ally offloaded to other discursive channels? It is difficult to say, and the
Table 3.1. Example comments sanitized from Netscape Navigator 4.x (1998)
File Name Sanitized Comment(s)
ns/include/xp_mcom.h /* this sucks, should I really include
this here or what? *?
ns/lib/layout/edtbuf. // LTNOTE: what the fuck. This crashes
cpp sometimes??
// we are fucked! try something
different.
ns/cmd/macfe/central/ // * I have no damn idea why this is so
profile.cp convoluted
// BULLSHIT ALERT: Get out if I can’t
call GetSharedLibrary.
ns/cmd/xfe/src/ // crap from marketing
PersonalToolbar.cpp
ns/cmd/winfe/display. /* check if Lou is a pindick */
cpp
ns/cmd/winfe/woohoo. return NULL; //The list file did not
cpp exist!!!! Bastards!
92 • rhetorical code studies
black boxes of proprietary code may cause one to wonder whether most
software to which the public has no access might appear to be reflections
of community character, ideology, value, and so on. Some supporters of
OSS projects champion the self-policing nature of OSS communities, with
“problematic” individuals being ostracized or outright removed from a
given project. But such arguments assume that all readers support similar
means of evaluating whether or not a given situation should be dealt with.
In the case of Netscape, the company’s legal team overrode the implicit
values of the programming team to show off, rather than hide, the labor—
frustrations and all—that went into the development of the browser.
www.dbooks.org
Analyzing Arguments Surrounding Code • 93
tion], putting too much examples [sic] is not that useful” (2012). The com-
menter replied again after more code submissions:
So, inch by inch, this is getting closer to the quality required for
mozilla-central. Even if we omit our core disagreement on how to im-
plement result, [sic] there is still work to do. Unfortunately, by now, I
am just too tired to continue pulling you kicking and screaming to that
level of quality. (Gozala et al. 2012)
revised by its editors, although it has been observed that in practice, many
bugs are overlooked or otherwise unidentified (Kerner 2015).
www.dbooks.org
Analyzing Arguments Surrounding Code • 95
few were granted permission to alter the production code directly, those
that “had ‘earned’ the merit to be part of the development community”
(Apache Software Foundation 2012). In other words, the ASF self-policed
by supporting those individuals its members felt were “committed enough
for the task” as opposed to those who might contribute in a more casual or
occasional fashion, and only those with social authority were considered
to be part of the community. It was thus not enough that individuals might
want to help but that they demonstrated a desire and ability to focus on the
contributions they made to Apache, whether through frequency, amount,
or quality. The meritocratic ASF community is actually a set of communi-
ties, including those who are viewed as having earned a prominent place
and those who have not yet earned such a place.
These brief examples begin to demonstrate how particular individu-
als and groups may attempt to rhetorically position their work for various
audiences and purposes. The goals and their discussions provided above
will be compared below with developers’ rhetorically aware appeals to de-
termine how frequently such efforts are explicitly employed to achieve a
given end versus appeals that implicitly suggest code as the sole focus of
deliberation.
[ . . . ] Why are some semantic constructs more privileged than others?
[ . . . ] How can content truly be reused?” (84–85). Ford (2005, 2015) also
appeared to recognize implicitly the rhetorical qualities of interfaces and
code alike as ways of understanding more effectively the history and activ-
ity of software development.
Ford’s (2005) final question, which suggested a kind of rhetorical
oscillation, is integral to code practices in that it emphasizes the suasive
nature of effective code and communication: “What is sprezzatura for the
Web?” (2005, 91). Sprezzatura refers to one’s ability to make a difficult act
appear as though its execution were effortless, what Castiglione (1988) de-
scribed as “a certain nonchalance which conceals all artistry and makes
whatever one says and does seem uncontrived and effortless” (67). Ford’s
question effectively highlights concerns of rhetorical style and delivery:
How can the effective and successful construction of code—which itself
might appear to be not much work—make software development and use
easier and more accessible for all? In essence, the rhetorical value of user
and coder goals should influence development practices rather than be
considered only in retrospect as a quality not inherent in software creation
or use.
In a critique of general software practices, Platt (2007) argued that
many code decisions stem from considerations of convenience for a de-
veloper rather than from some objectively superior or “best” quality con-
nected to those decisions. In other words, many developers lack the rhe-
torical awareness required for a successful engagement with one’s user
base or audience. As part of a description of the “Do you want to save the
changes?” dialog box that appears when a user attempts to exit Micro-
soft Notepad without saving the file he or she has been working on, Platt
(2007) observed that
[t]he programmer wrote the program this way (copy the document
from disk to memory, make changes on the memory copy, and write it
back to disk) because that was easier for her [ . . . ] Reading or writing
characters from the disk (spinning iron platters with moveable parts)
is roughly a thousand times slower than doing it in memory (electrons
moving at the speed of light)[.] (17)
www.dbooks.org
Analyzing Arguments Surrounding Code • 97
are the only means by which one might approach code and relevant dis-
course in order to identify rhetorical activity, but they serve as a productive
starting point to engage code-related communication.
Perhaps unsurprisingly, many programmers ultimately argue for code
practices that hinge on concerns outside of the code itself, such as when
well-known developers stress their social position in a given community
as valid support for community-related claims. Developers’ recognition of
their rhetorical efforts is important here, since the ways they construct and
present their arguments can be as insightful about their values on coding
as is information in the code texts about which they deliberate.
ethos
Among the appeals used relatively explicitly in development communities
is that of ethos, which is used not only in its classical sense to demon-
strate the credibility or expertise of a particular individual but also to “le-
gitimize” the project to (or from) which a particular set of contributions
are made. Several rhetoricians have explored the distinctions between tra-
ditional appeals to ethos and complicated contemporary appeals to ethos
that are less clear-cut. Miller (2001) has suggested that ethos is central to
electronic communication because humans need to be able to evaluate
their discursive companions, whom they may or may not know well or at
all: “what sort of character is behind the words: one we can trust? one we
can learn from? one who is like us or one who is strange and challenging?
one we can dominate or one who will seek to dominate us?” (273). These
concerns, while not always easily answered, nonetheless fuel much of an
audience’s determinations of a particular rhetorical effort. Warnick (2004)
argued that web communication, precisely because it is often so difficult
to discern the author of a text, let alone the author’s character, demands
a consideration of ethos focused more on the performance of credibility
through the presentation of pertinent information than the expertise of a
clearly defined author.
These concerns over the relationship between conventional forms of
ethos and newer means of demonstrating ethos are debated in many com-
munities. For example, headius et al. (2012) discussed code proposals for
a number of security tests related to the code suite distributed with the
Ruby programming language. This proposed code had initially been de-
veloped for a fork of Ruby modified to run inside the Java Virtual Machine,
and which thus could work alongside the Java language; this fork was
called JRuby due to its hybrid nature. The JRuby community’s members
www.dbooks.org
Analyzing Arguments Surrounding Code • 99
felt it had the potential to benefit the broader Ruby development commu-
nity and offered to merge it into the main Ruby project, but only as long
as its origin in JRuby remained clear: they “would like to contribute these
tests, but [JRuby’s developers] would ideally not lose the JRuby bug num-
bers for future reference” (headius et al. 2012). Since the project was still
“in process,” the bugs that JRuby developers might continue to find, when
identified by numbers according to their existing maintenance scheme,
could make fixing those bugs easier.
headius’s offer was thus contingent upon the community’s willingness
to recognize the authority of the JRuby community for its contributions.
Not surprisingly, this appeal was met with some resistance by Ruby devel-
opers, who had their own maintenance preferences. One individual who
noted his appreciation for the code asked in response to the request for
JRuby’s bug references to remain in the code, “I’m confused, I was think-
ing I could simply strip those references when committing it to [the main
Ruby project], or not?” (Scott et al. 2012). Here, the ethos of the JRuby
community clashes with the ethos of the project itself (regarding whether
it was worthy of being included in the main Ruby project), bringing to the
spotlight the differences between the values of each community.
A counterexample to the JRuby case above can be found in a discussion
related to how scalable vector graphics (SVG) image files are implemented
through jQuery, a popular JavaScript library that enables event handling
and animations on web pages. One developer noted that it was impossible
to hide SVG images in the Mozilla Firefox browser and offered a potential
fix to that problem; subsequent discussion focused on whether it was—or
should be—the goal of the jQuery community to resolve problems that
they identified as being more relevant to other communities. As one re-
spondent noted, “this seems like a lot of work to support something we
don’t support,” while another likened the proposed solution to a can of
worms (Sherov et al. 2012). The “can of worms” perspective appeared to
anticipate other potentially unrelated issues that, should this first prob-
lem be considered seriously, the community might then feel obligated to
support or address. Almost unanimously, the development community
determined that work related to this issue was not within the purview of
their collaboration. The only real point of disagreement reflected the lack
of clarity as to who should take care of this issue: was it Firefox’s domain
or that of other JavaScript libraries? No consensus has formed in answer
to these questions, in part because no individual has assumed a position
of authority to definitively mark out that territory as belonging to jQuery
100 • rhetorical code studies
pathos
Perhaps unsurprisingly, developers who are dedicated to the projects
they work on often find themselves balancing their discussions between
(1) technical and logical reasoning and (2) passion for the work they
contribute to their projects. While it is rare to see a discussion in which
emotional appeals serve as the primary initial means of promoting par-
ticular perspectives, pathos nonetheless remains a critically important
strategy through which individual developers can stress the strength or
intensity of their convictions—or at least the convictions they perceive
their audiences to feel strongly about—in relation to a particular point
or as support for their appeals to ethos. Fahnestock (2011) has observed
this relationship between ethos and pathos as they relate to stylistics:
“[a]ttitudes and bids for alignment are encoded in every language
choice, and the rhetor’s presence and relation with an audience are the
unerasable ground of all discourse” (279). For discussions surround-
ing code, these language choices are especially important since they are
meant to reflect the emotional response not just to an individual com-
ment but to the code under discussion as well.
One particularly noteworthy conversation revolved around a request
for code to be merged into the general Linux kernel through the code-
sharing website GitHub, which makes use of a software versioning sys-
tem, a means of tracking software changes across a distributed popula-
tion, named git. This request required approval from Linus Torvalds, the
“benevolent dictator” of Linux development and initial developer of the
software versioning program git. What made this particular request no-
table is that Torvalds adamantly refused to address any code submitted to
him through the GitHub site. He argued:
Git comes with a nice pull-request generation module, but github in-
stead decided to replace it with their own totally inferior version. As a
result, I consider github useless for these kinds of things. It’s fine for
www.dbooks.org
Analyzing Arguments Surrounding Code • 101
*hosting*, [sic] but the pull requests and the online commit editing,
are just pure garbage. (WNeZRoS et al. 2012)
the reason for that is that the way the github web interface work [sic],
those commits are invariably pure crap. Commits done on github in-
variably have totally unreadable descriptions, because the github com-
mit making thing doesn’t do *any* [sic] of the simplest things that the
kernel people expect from a commit message[.] (WNeZRoS et al. 2012)
tered on the “objectively best” practice that would benefit not only Linux
development but all software development hosted by GitHub.
Ultimately, WNeZRoS’s proposed code was never implemented
through his GitHub submission, but Torvalds’ pathetic arguments clarified
for many developers how continued community work on the Linux kernel
would likely progress from that point forward. As many recognized, the
rational merit of Torvalds’ argument was not any more important or cen-
tral to the project than Torvalds’ personal opinion. As Garsten (2006) has
noted, emotion, and especially passion, can “stimulate reflection or judg-
ment by disrupting ordinary habits of response” (196). The Linux kernel
development community was obligated to accept Torvalds’ complaints as
a normal component of community discussion in order to continue “work
as normal” through the GitHub versioning system. But since his com-
plaints directly addressed that system, an inordinate amount of discus-
sion focused on whether or not Torvalds’ criticism was rationally accurate
rather than whether the code proposal merited a merge into the main code
repository. As Torvalds had the final say in how the community’s develop-
ment practices were structured and executed, his position was essentially
impervious to colleagues’ criticism, leaving him free to offer arguments
that allowed him to share the emotions that fueled his perspective.
Just as there is no universally agreed-upon “best practice” for coding
in a particular language or even on a specific project, neither is there any
consensus on the most appropriate means of presenting an argument for
a particular community. The kairotic qualities of a coding situation influ-
ence each developer and audience in unique ways, and the appeals used
by a developer to effect change in his or her audience highlight that de-
veloper’s understanding of the relationship he or she has with the project
under discussion.
www.dbooks.org
Analyzing Arguments Surrounding Code • 103
forking
The concept of forking contributes significantly to the ebb and flow of many
development community life cycles (and especially to OSS community life
cycles), and it does so in fundamentally rhetorical ways. A fork is a cloned
version of a project that has become distinct from its originator project
at a particular point in time, and there may or may not be code or devel-
opers shared between original and forked projects from that point for-
ward. Well-known OSS forks include Ubuntu, a fork of the Debian Linux
OS; LibreOffice, a fork of the OpenOffice suite; and WebKit, a fork of the
KHTML web browser framework (WebKit powers the Google Chrome and
Apple Safari web browsers). A fork may be created for one of any number
of reasons, such as an individual’s desiring to tinker with a program out-
side the project’s regular work flow or development trajectory. In other sit-
uations, the fork may have been created because of a philosophical schism
between several developers that made further collaboration impossible.
Despite this relatively pessimistic example, Howison (2006) has argued
that in most cases, even when projects may have regular forking events oc-
cur, there are often efforts by the forking developers to make available im-
provements for the original program as well as for their own forked ver-
sions. This is likely because continued intercommunal goodwill increases
the chances of other developers contributing back to the fork in kind.
Despite its technological focus, forking bears a close resemblance to
the back-and-forth of conversation. As ideas are circulated within a dis-
course community, they are tested, supported, refuted, and mutated as
different individuals choose to address them. Sometimes, requests for re-
sponses are clearly indicated, such as when a developer comments in code
on “hacking” a workable but nonpreferred solution to a problem, unable
to come up with a stronger case until a colleague suggests one. At other
times, responses are provided but not solicited once a program’s code
is “published” alongside the program itself. Burke (1973) provided what
remains one of the greatest descriptions of discursive activity, comparing
knowledge creation as deliberation in a social setting:
104 • rhetorical code studies
Imagine that you enter a parlor. You come late. When you arrive, others
have long preceded you, and they are engaged in a heated discussion,
a discussion too heated for them to pause and tell you exactly what it
is about. In fact, the discussion had already begun long before any of
them got there, so that no one present is qualified to retrace for you all
the steps that had gone before. You listen for a while, until you decide
that you have caught the tenor of the argument; then you put in your
oar. Someone answers; you answer him; another comes to your de-
fense; another aligns himself against you, to either the embarrassment
or gratification of your opponent, depending upon the quality of your
ally’s assistance. However, the discussion is interminable. The hour
grows late, you must depart. And you do depart, with the discussion
still vigorously in progress. (110–11)
For Burke and for many rhetoricians since, this metaphor of the parlor
reflects academic and civic discourse: our understanding of a topic is ad-
vanced only through its public (social) “testing” of merit, reception, and
so on. Contributors to the discussion—individual scholars or citizens—
add their voices when they can, but the discussion continues, and often
changes, long after each departs from it. The same is true of software
development: forking serves as a means of “testing” a set of ideas by al-
lowing motivated individuals to explore alternatives to an original devel-
opment plan. The strength of a particular argument (i.e., development
philosophy) then ultimately is determined by the success of a particu-
lar fork as accepted and taken up by a given community. While it is the
project’s development philosophy that propels its creation, a fork might
prosper as much from the kairotic solicitation of aid and use—that is, es-
tablishing a solid user and developer base—as from the computational
strength and efficiency of the program’s code base.
The practice of open source software distribution and access could it-
self be viewed as a kind of rhetorical imitation: At what point does the use
of another developer’s code blur into the substance of a subsequent devel-
oper’s work? The use of someone else’s efforts as a foundation for one’s
own, in a programming sense, often has more in common with rhetorical
topoi than with academic plagiarism (although this is also certainly within
the scope of discussion). As Miller (2000) observed, “[t]he topos is concep-
tual space without fully specified or specifiable contents; it is a region of
productive uncertainty [ . . . ] [I]t is a space, or a located perspective, from
[sic] which one searches” (141). Topoi are useful to assist a rhetor in con-
www.dbooks.org
Analyzing Arguments Surrounding Code • 105
www.dbooks.org
Analyzing Arguments Surrounding Code • 107
it suggest that the decisions made to construct that code reflect the goals
and values of the development team. Implicitly, there is, accompanying
the code itself, an argument that any code that other developers want to
have included in future releases of that program should work and look like
the code being distributed, an achievement complicated by the inherently dy-
namic nature of continually developing code practices.
In contrast, pulling serves as a relatively passive acceptance of a rhe-
torical effort, an audience-oriented evaluation of the code being pushed
out to its broad user population. (The employment of pushed code as de-
scribed above is a kind of pulling.) Garsten (2006) referred to this sort of
approach (in a general sense) as “pandering” in that it demands of the
rhetor-developer an orientation that downplays the rhetor’s contribu-
tions in favor of the audience’s expectations. That is, individual users, at
least for OSS projects, have the ability to modify and freely redistribute (or
fork) the code for a given program. What they usually lack is the size of the
audience of the original or “mainstream” version of the program, which
means that their work on the project is likely to be overlooked. Many soft-
ware versioning systems provide a workaround for this, allowing users
to make pull requests to the core development team. A pull request effec-
tively works as a plea to merge together the individual user’s code changes
with the mainstream code base (some of the examples provided earlier in
this chapter centered on pull requests and the justifications for their ac-
ceptance). This process provides a voice to the individual by giving him
or her the opportunity to demonstrate to a community the rhetorical and
computational power of a proposed code change. At the same time, if and
when the code is merged, whether immediately or following further revi-
sion, the identity of its author is partly erased; the code content becomes
a part of the main program and, barring any specifically added comments
to identify its creator, the code is no longer distinguishable from the other
lines of code surrounding it or other files accompanying it. Given the hi-
erarchical structures that constitute many OSS communities, a developer
may need to construct his or her code in such a way as to appeal not only
to the needs of the user base but to the stylistic and logical preferences of
the project’s authorities. The pull request serves to highlight the “vanish-
ing act” that often occurs through successful rhetorical appeal: the user is
assimilated into the project’s body of work and activity.
Ignoring pushed updates is a possibility as well, and this action pro-
motes a unique rhetorical approach to communication and collaboration.
As discussed earlier in regards to forking, the idea of one or more develop-
108 • rhetorical code studies
patching
Other than forking and collaborative versioning, perhaps the most “so-
cial” practice of software development is patching, where small fixes to spe-
cific code issues are applied to existing software programs. Patches serve
as a sort of continued discourse between parties (developer and client) as
security bugs are fixed, hardware functionality is updated, and so on; of-
ten the exigence for a patch stems from explicit communication from a
user of the software, requesting improvement in some regard. Patches are
often highly kairotic in that they are developed quickly by individual pro-
grammers who spot and attempt to fix code exploits on their own instal-
lation of a given program, which are then perhaps distributed out to the
broader community of users for that program. Platt (2007) highlighted
one traditional weakness of this practice: patches “work only if you use
them, and almost nobody does of his own accord” (85). That is, software
patches are generally only applied voluntarily when a particular client
notes some problem with his or her program and seeks out a potential
fix to that problem. In recent years, this issue has been mitigated by au-
tomated updates that in many cases are partially or fully “invisible” to the
www.dbooks.org
Analyzing Arguments Surrounding Code • 109
end user: Microsoft Updates and Ubuntu Update Manager, for example,
each regularly check for patches and then prompt users to update relevant
programs, either individually or as a “batch.”
While this increased automation makes implementing official patches
easier, there is an issue of relevant control, not unlike the issue with Mi-
crosoft Notepad addressed by Platt earlier in this chapter. In one sense,
code concerns become a nonissue as users are directed to merely apply
the regularly provided updates from developers. In another sense, though,
code concerns become a central issue, as there is no demand for, or expec-
tation of, users to examine proposed updates on their own and determine
whether or not to apply those patches. While there may be users who do
approach automated updates with caution, the system assumes users will
simply follow the suggestions of the update management software and its
assumed authority in distributing only patches that have passed testing.
With manually applied patches, there is an expectation that a user recog-
nizes a particular issue and actively seeks a resolution to it. There are two
significant possibilities arising from this approach. First, the user may
simply not recognize other issues to fix and may leave his or her software
open to other vulnerabilities (although, in a sense, all software is open to
unacknowledged or undiscovered vulnerabilities). Second, the user could
specifically avoid patches that he or she feels are unnecessary to apply.
This second possibility is important in that the user, while not unilaterally
protecting his or her software to the same degree, is capable of controlling
the “bloat” of the software by increasing its size and processor use with
only the additional functions and protections he or she desires. In addi-
tion, it must be noted that the security of automatic updating hides the
potential new problems that might be caused by patch code: just as with
revision of any other type of writing, even though one issue might be fixed
by a patch, the added code might in turn generate new issues that need to
be addressed by more patches, and so on. Put another way, the Ship of The-
seus will never become fully watertight.
Accordingly, not all patches or updates are equal. In some cases, they
are designed to fix seemingly trivial but potentially devastating issues. For
example, Valarissa et al. (2012) fixed the problem of a typo relating to an
account-specific variable in the code for microblogging platform rstat.us.
This typo left open the possibility of “orphaned” code, or a set of refer-
ences to data that no longer existed. Specifically, the Ruby variable :de-
pendent had been initially written as :dependant, which meant that
any other functions attempting to make use of the variable would not lo-
110 • rhetorical code studies
cate it properly anywhere in the software. Even though this particular issue
was extremely easy to resolve, the participating developers—the “fixer” as
well as the developer who had initially coded in the problem—identified
their roles clearly for public scrutiny since discussions about that update
were recorded alongside the updated code itself.
Often, patches cause any number of unforeseen and potentially signifi-
cant consequences for users and their systems, making a “fix” the catalyst
for problems that would never have been encountered if the program had
not been updated. For this reason, patching generally involves the possi-
bility that a user will back out of (or “downgrade”) the update, making
software versioning (the use of differently updated iterations of a pro-
gram) a particularly intriguing phenomenon among meaningful forms
of communication. While any individuals participating in some discourse
might revisit previously stated ideas and reconsider their positions, there
is no “undoing” of the reconsidered discourse; for code, however, this can
literally be the case, and new issues can be erased outright by a rollback to
a previous version. As a result, users who have opted to employ different
versions of a given program often find themselves engaging in otherwise
identical activities that, by necessity (e.g., being unable to patch success-
fully) or desire (e.g., avoiding problems likely to result from a patch), re-
flect specifically situated contexts stemming from the capabilities of the
software versions they are currently using.
The Drupal content management system, for example, is widely used
and considered highly successful because of its numerous customizable
“plug-and-play” modules, software add-ins developed by volunteers to
help website administrators achieve specific tasks. Each module has its
own set of dependencies and effects on the overall Drupal system, mean-
ing that some modules work in unexpected fashions when other modules
are also installed, and many developers recognize the potential for catas-
trophe here. The sheer number of potential module combinations that
one could install makes any sort of anticipation for particular bundles of
modules almost impossible. As a result, a common practice among Dru-
pal developers is to provide patches to problems they identify and then ask
volunteers to point out any problems stemming from specific modules
present in their installations.
Such a practice treats the development of a given module or the larger
Drupal project as a continually emerging process of fragmented innova-
tion and standardization, as developers are tasked both with experiment-
ing in new ways with technological capabilities and ensuring that the pro-
www.dbooks.org
Analyzing Arguments Surrounding Code • 111
gram is as likely not to fail or break when used by the largest population
of administrators and users as possible. When the software does break,
then, the moves undertaken by involved developers present clear indica-
tors of the rhetorical awareness of the current situation—fixing an unfore-
seen problem—and of the purposes various administrators might have for
setting up particular module combinations in their Drupal installations.
For example, one very commonly used module is drush (short for
“Drupal shell”), a command-line tool that allows Drupal administra-
tors to modify their systems quickly from a terminal window rather than
through the default browser-based interface. When used in combination
with git, a program that provides versioning control for collaboratively de-
veloped software, drush—or almost any Drupal module—can be updated
and tweaked regularly and relatively quickly. Differences in software ver-
sions of both drush and git between individual Drupal developers, how-
ever, can quickly lead to complicated situations in which it is difficult for
all involved to easily smooth out problems experienced by some or all.
When a developer attempts to change “working versions” of a program
to test out changes to code, git should track the version currently under
development. For Drupal users jgraham et al. (2011), the ways git and
drush (specifically, a subcommand of drush called “drush make”) worked
at the time disrupted the successful progress of development for either
program, and the ensuing discussion provided an example of the rhetori-
cal and discursive nature of composing and revising code. jgraham noted
that a perceived similarity in command syntax for two git command flags
(--working-copy and --bare) should have, but did not, provide simi-
lar results for a git-related update, as both flags defined the location of
a “working” directory in which development would occur, although the
--bare flag specifically changed the hierarchical directory structure of
the code project. Functional differences in multiple versions of git and
drush used by developers, however, resulted in multiple patch failures.
Some users received error messages, while others received successful re-
ports, only to discover the code they thought had been patched had not ac-
tually been.
To resolve these issues, jgraham et al. (2009) created several small
patches that attempted to unify calls for one flag (--working-copy) to
use the other flag (--bare) so that all potential developers would have
the same project structure on their systems. But problems persisted: those
who reported using git versions 1.7.0.x continued to encounter the is-
sue, while those using newer versions of git perceived it as resolved. At
112 • rhetorical code studies
the same time, drush as a project was being updated by a larger body of
coders, and the command being problematically patched (drush make)
was being merged as a project into a “core” project for drush, meaning
that further development might vary wildly in focus and scope toward the
problem jgraham had identified. Even though specific problems had been
identified, some of which were even addressed and resolved, the rhetori-
cal concerns of the ad hoc development community were not fully satis-
fied; the code-related constraints of individual Drupal administrators, and
their proficiency with Drupal, drush, and git (or their desire or ability to
upgrade any or all of those components) further limited each in achieving
complete success in regards to this technical issue.
Such practices for patching and resolving problems with software,
successful and unsuccessful, are not limited to Drupal; whenever devel-
opers collaborate on projects with diverse goals and on varied computer
systems, contextual issues arise, in a fashion parallel to the contextual
difficulties of rhetorical communication in any other form. When the
members of massive volunteer communities of developers collaborate
on software projects, such as in the case of Mozilla Firefox, the rhetori-
cal influences developers and computer systems exert upon one another
are myriad in significance and purpose; in some cases, the intended action
says more about the various goals for the program held by individual or
specific groups of developers than those held the community at large. As
with any collaborative development activity, rhetorical affordances emerge
as being particularly apt (or not) for certain ends and types of action,
whether that may be radically altering the trajectory of a given project’s
development or merely communicating clarification about the intended
purpose of some contributed code lines.
Conclusions
Discursive and nondiscursive collaborative activities surrounding code de-
velopment, from commenting to forking to patching, demonstrate rhetor-
ical character and value as fundamental components of meaning making
through these activities. The potential for rhetorical interaction between
developers and technologies through dynamic OSS community structures
and development processes is especially important when considering ac-
tivities like forking, patching, and naming. The meaning constructed and
communicated through these practices suggests a set of tools by which
developers actively engage one another with important and potentially ef-
www.dbooks.org
Analyzing Arguments Surrounding Code • 113
fective rhetorical strategies that are employed in the writing of code as well
in the writing that takes place around code. While at times these rhetori-
cal efforts may be difficult to recognize—since they may not clearly reflect
more conventional forms of discourse—they nonetheless work to compel
readers (e.g., collaborators) to engage in particular types of action or activ-
ity as much as to articulate the operations to be executed by the computer.
In the next chapter, these rhetorical strategies and others in (and
around) code will be explored in more depth through the lens of soft-
ware development of the web browser Mozilla Firefox, a program col-
laborated on by thousands of programmers over the past seventeen years.
The browser’s code, in all its iterations over that span of time, and the de-
velopment thereof have rhetorically impacted subsequent development,
as well as use, of the program for particular ends. Where rhetorical action
was explored as occurring in relatively conventional text and activities in
the examples provided earlier in this chapter, the forms of engagement
undertaken through code do not always closely resemble traditional dis-
course. Nonetheless, they create and communicate meaning in rhetorical
fashions, and it is important for scholars interested in code as a means of
communication to recognize how and why this occurs.
www.dbooks.org
chap ter 4
115
116 • rhetorical code studies
www.dbooks.org
Developing Arguments in Code • 117
www.dbooks.org
Developing Arguments in Code • 119
www.dbooks.org
Developing Arguments in Code • 121
called Navigator, based on Mosaic, one of the very first Internet brows-
ers. In fact, the name “Mozilla” comes from a combination of Mosaic and
Godzilla, the latter name referring to the Navigator project as “a beast
vastly more powerful” than the former (Hamerly, Paquin, and Walton
1999). While Navigator was offered to the public at no charge, it was not
initially popular thanks to increasing efforts by Microsoft to integrate its
own web browser, Internet Explorer, into its Windows 95 and subsequent
versions of the OS. After several years of diminishing browser share, in
January 1998 Netscape released the source code for its newest version of
the program under an open source software license and turned over pri-
mary development responsibilities to the global community in the form of
the Mozilla Project (Mozilla n.d.b). The Mozilla Project, in turn, assumed
a new form in 2003 as the nonprofit Mozilla Foundation, collecting to-
gether under its governance the assorted open source projects contribut-
ing to the Mozilla software suite (Mozilla n.d.a).
The shift from corporate to open source and volunteer-based develop-
ment marked a major shift for Mozilla’s web browser project. The brows-
er’s code became publicly and freely available, meaning that anyone inter-
ested could not only download the browser and its code but that person
could also modify the code as he or she saw fit; further, one could release
his or her own modified version of the program, assuming that release ad-
hered to the original license, that is, its source code also made freely avail-
able alongside the compiled, executable version of the browser. Commu-
nication (i.e., email) related to the program’s development also became
publicly available, meaning that any interested parties could browse or
engage in discussion about the project and involve themselves in code and
any other communicative efforts to influence Mozilla’s developmental tra-
jectory. The semiorganized, semichaotic nature of the developer commu-
nity for the Firefox browser, as demonstrated through members’ writing,
provides rhetoricians with the capability to examine how these wildly dif-
ferent types of social interaction are weighed against the other for rhetori-
cal, influential purposes.
With Mozilla’s projects existing as a set of connected but distinct de-
velopment communities working on similarly connected but distinct
software programs, the potential was initially overwhelming for rhetori-
cal chaos to affect the progress of any of these programs, to say nothing
of the suite as a whole. But with almost seventeen years of collaboration
and tradition to “normalize” the broad behavior of the development com-
munities within Mozilla’s fold, contemporary rhetorical concerns for
122 • rhetorical code studies
Firefox’s developers are quite different in many ways than they had been
earlier, although the voluntary and open nature of the project means that
some of the initial chaos remains a fundamental component of developer
socialization and interaction.
Examining the development of Firefox through its code practices and
texts is important not only for the field of rhetoric and for technical com-
munication but also for scholars interested critically in the cultural dimen-
sions of software and code, such as Black (2015), who performed topic
modeling analysis to explore various sociocultural influences on devel-
opment of the browser. Firefox and the events and texts described in this
chapter provide a lens through which we might more fully understand the
social and industrial influences exerted upon software programming par-
adigms as well as how we might approach more clearly and expertly the
user experiences anticipated by developers through the code structures
they implemented in their programs. Where rhetoric focuses on not just
what is said in a given argument but how it is communicated and what it
induces, inquiry into the culture of development might involve exploring
(as an example) how social structures and conventions impact the compo-
sitions and interactions of particular communities and the sociopolitical
ends to which they might work. These sorts of concerns are occasionally
incorporated into the discussion below, although they serve primarily as
threads to be tugged on by other scholars interested in the influence of
culture on code development.
www.dbooks.org
Developing Arguments in Code • 123
at a given time, if any, will be added to the official code package for the
program.
Despite claims of meritocratic structures and mechanisms, the ex-
istence of a hierarchical administration in regards to Mozilla’s software
programs has the potential to work against the values of an otherwise
“open” approach to community-based collaboration efforts. As Hamerly,
Paquin, and Walton (1999) described the evaluation process:
program. Then, any changes a developer might feel are worthy of inclu-
sion in the official version of the program are submitted to the project’s
management for review. If any of those changes are deemed acceptable,
they are “committed” to the program, and the official version of the soft-
ware code is updated to include those changes. As of September 1, 2016,
Mozilla currently has almost 150 developers listed publicly as members of
its organization, participating in more than three hundred distinct proj-
ects, and using two major software versioning utilities to track browser
development.
Each of these utilities is fueled by a distinct exigence, although the indi-
viduals contributing to either are spurred by their own motives and sense
of kairos. Mercurial serves as the primary tool with which the development
of Firefox takes place; individuals engaging in the active, community-
preferred (or at least leadership-preferred) work on the browser contrib-
ute their code to their companions through the Mercurial system. GitHub,
meanwhile, is a “social coding” website designed to make the versions of
a program’s code more accessible and collaborative. GitHub works as an
archive of the contributions made through Mercurial, although there are
numerous developers offering code changes through GitHub, effectively
working outside of the “normal” workflow.
Mercurial is a “distributed” versioning system that enables developers
with Internet access to share their individual changes to a project’s code
by “pushing,” sending those changes out to everyone else via a web-based
repository (serving as a technological record-keeping intermediary) on the
mozilla.org server as part of the organized Mozilla Developer Network
(Mozilla 2012a). Through Mercurial, which works very similarly to several
other software versioning tools, each developer has his or her own clone of
the project and makes changes to a personal branch—essentially a unique
version of the code—and can request “pulls,” submissions for incorpo-
ration in the central, official version of the project. A significant amount
of discourse occurs between developers in this push-pull process, and
some versioning tools refer to pull requests specifically as lively spaces for
discussion and debate (GitHub 2012); many developers are likely to sug-
gest small (fewer than 20 lines of code) changes to specific files within
the Mozilla project, and the administrators and various testers are tasked
with determining the value and potential consequences of accepting each
of those changes.
The counterpart to Mercurial is the repository website GitHub, which
is built on git, a different version control program (Mozilla 2012b) argued
www.dbooks.org
Developing Arguments in Code • 125
www.dbooks.org
Developing Arguments in Code • 127
www.dbooks.org
Developing Arguments in Code • 129
The two genres discussed below certainly recur across numerous code
projects, iterations, and authors, but they are not always typified in easily
recognizable ways; that is, the formal or structural components of many
genres do not lend themselves easily to code texts written in different lan-
guages or for different communities whose style preferences may radically
vary from those of other communities (cf. an examination of code genres
via Drupal modules by Brock and Mehlenbacher 2017). The purposes for
particular recurrent responses to given situations are certainly recogniz-
able, as are the kinds of action that rhetors may attempt to induce through
their communicative efforts. As a result, these genres may best be under-
stood as responses to tensions surrounding recurrence in Firefox, namely,
as individuals and groups attempt to entrench or continue particular tradi-
tions and normalized behaviors while also, or in response, presenting in-
novative or unconventional approaches to solving particular problems or
answering particular questions considered significant to the development
community.
www.dbooks.org
Developing Arguments in Code • 131
vation upon an existing feature, as part of a tool called the Device Manager
Android Debug Bridge, or ADB, designed for the Android mobile operat-
ing system. While the ADB is itself a relatively recent innovation (inspired
by the rise of the mobile device OS), this adjustment to the code also in-
troduced some new and potentially significant capabilities. Originally, the
ADB code (written in the Python scripting language) enabled a developer
to upload directories of files from the local hard drive to an external server.
As noted by gbrownmozilla (2011) in the comments at the beginning of
the quoted excerpt (lines 95–97), however, the code as originally written
did not account for symbolic links, links that pointed to other directories
and that may not have been intended to get included in the set of data to
be uploaded or that may not even exist (in an accessible location or even at
all) on the remote server. gbrownmozilla modified the ADB code to work
through each file and directory link individually, ensuring that all data be-
ing uploaded was an appropriate part of the call (i.e., removing irrelevant
symbolic links from the operation). In addition, gbrownmozilla included
a line of code to modify each file’s permissions as it is uploaded, a helpful
task for developers but one that might compromise file security for non-
developers, as he specifically set all uploaded directories (and their files)
to be readable, writable, and executable by all users on a system.
gbrownmozilla’s innovation reflects broader practices in that they
made use of multiple loops in order to ensure that the exact sort of outcome
he anticipated was likely to occur. Before gbrownmozilla’s proposed code
change, there was no check to determine whether or not all files being up-
loaded were “valid” and not security risks. gbrownmozilla’s ordering of
relevant operations, complemented by informative commentary, induces
other colleagues to consider the implications of the ways they attempt to
construct software for their own, or others’, benefit. It is not just that files
are separated from directories but that each is checked against conditions
ensuring its relevance to the attempted activity (the uploading of one or
more directories and its files). Because they are not the same, gbrown-
mozilla has distinguished between them, but because they have similar
qualities, those tests are repeated in order to lessen the chance of an error
occurring. In other words, gbrownmozilla has positioned readability and
clarity in intent over optimized computation so that the tool they worked
on is not only improved by that contribution but that other developers can
see how and why that contribution has a positive impact on the browser’s
development. It is certainly possible that some of gbrownmozilla’s col-
leagues will interpret this code as inelegant or inefficient, but its value
in communicating what it does clearly and accessibly, so that it might be
improved further by other contributors, is arguably greater than any lost
machine efficiency in its current form.
A second example provides insight into innovative developments based
on the anticipated preferences of users when it comes to interacting with
Firefox each time the program is opened. Originally, the relevant browser
code allowed for one of two events to occur when Firefox was started: if
the user had saved a preferred home page, it would be loaded; otherwise,
a default home page would be loaded instead (Walden, Goodger, and Ro-
mano 2006a). This functionality, however, was improved multiple times.
One early improvement was to recognize the possibility of a separate
home page URI being set for each browser “tab” that a user might want
www.dbooks.org
Developing Arguments in Code • 133
to have open when the program starts (Walden, Goodger, and Romano
2006b). A much more recent innovation made use of the browser’s since-
expanded capacity to provide an initial home page via the browser’s about
protocol, written almost immediately above the untouched lines of code
written four years earlier (Sharp et al. 2010). Excerpts from each of these
innovations can be seen in comparison with the others in table 4.2.
Table 4.2. Three iterations of Firefox startup home page code (2006a, 2006b, 2010)
Line # Code by Walden, Goodger, and Romano (2006a)
69 var useCurrent = document.getElementById("useCurrent");
70 var chooseBookmark = document.getElementById("chooseBookmark");
71 var bookmarkName = document.getElementById("bookmarkName");
72 var otherURL = document.getElementById("otherURL");
[ . . . ]
80 if (bookmarkName.getAttribute("uri") == " (none)") {
81 useCurrent.disabled = otherURL.disabled = true;
82 bookmarkName.disabled = chooseBookmark.disabled = false;
83
84 return "bookmark";
85 }
86
87 var homePage = document.getElementById("browser.startup.home
page");
88 if (homePage.value == homePage.defaultValue) {
89 useCurrent.disabled = otherURL.disabled = true;
90 bookmarkName.disabled = chooseBookmark.disabled = true;
91 return "default";
92 }
93 else {
94 var bookmarkTitle = null;
95
96 if (homePage.value.indexOf("|") >= 0) {
97 // multiple tabs— XXX dangerous "|" character!
98 // don’t bother treating this as a bookmark, because the level
of
99 // discernment needed to determine that these actually
represent a
100 // folder is probably more trouble than it’s worth
101 } else {
102 #ifdef MOZ_PLACES
[ . . . ]
115 #else
[ . . . ]
124 if (bookmarkName.getAttribute("uri") == homePage.value)
125 bookmarkTitle = bookmarkName.value;
126 #endif
127 }
Table 4.2.—Continued
www.dbooks.org
Developing Arguments in Code • 135
91
92 // Otherwise, show the actual pref value.
93 return undefined;
94 },
95
96 syncToHomePref: function (value)
97 {
98 // If the value is "", use about:home.
99 if (value == "")
100 return "about:home";
101
102 // Otherwise, use the actual textbox value.
103 return undefined;
104 }
www.dbooks.org
Table 4.3. Firefox pop-up removal code in JavaScript, 2010 (upper) and 2013 (lower)
Line # Code by Lamouri et al. (2010)
838 // If the user type something or blur the element, we want to
remove the popup.
839 // We could check for clicks but a click is already removing
the popup.
840 let eventHandler = function(e) {
841 gFormSubmitObserver.panel.hidePopup();
842 };
843 element.addEventListener("input", eventHandler, false);
844 element.addEventListener("blur", eventHandler, false);
845
846 // One event to bring them all and in the darkness bind them
all.
847 this.panel.addEventListener("popuphiding", function(aEvent) {
848 aEvent.target.removeEventListener("popuphiding", arguments.
callee, false);
849 element.removeEventListener("input", eventHandler, false);
850 element.removeEventListener("blur", eventHandler, false);
851 }, false);
852
853 this.panel.hidden = false;
854 this.panel.openPopup(element, "after_start", 0, 0);
Table 4.3.—Continued
693 // One event to bring them all and in the darkness bind them.
694 this.panel.addEventListener("popuphiding", function
onPopupHiding(aEvent) {
695 aEvent.target.removeEventListener("popuphiding",
onPopupHiding, false);
696 element.removeEventListener("input", inputHandler, false);
697 element.removeEventListener("blur", blurHandler, false);
698 }, false);
699
700 this.panel.hidden = false;
www.dbooks.org
Developing Arguments in Code • 139
www.dbooks.org
Developing Arguments in Code • 141
munity, the desire to avoid these issues is articulated through the “DRY”
principle or philosophy, DRY standing for “Don’t Repeat Yourself ” (Mat-
sumoto 2007, 479). In essence, DRY programmers seek conciseness as a
means to elegance, although this conciseness does not mean never repeat-
ing code but rather avoiding unnecessary repetition (e.g., the difference
between redefining an object class vs. initializing a single object out of
that class). With a number of the world’s most popular programming lan-
guages making use of modularity such as that of object orientation, the
impact that unintentional repetition—or, more accurately, unintentional
iterative difference across multiple versions of a given code block—might
have on a program’s successful execution is potentially enormous.
Rhetorical attention to repetition and arrangement is especially impor-
tant for a large-scale OSS program like Firefox, since development on the
browser involves work on dozens of interlinked modules each of whose
code needs to set itself apart from the others. Each of these same modules,
however, must also maintain a stylistic and logical form close enough to
the others to make it capable of being modified and improved upon by
an interested party who might have worked on some other component of
Firefox code. While the code can never reach a fully scalable “fractal” state
(wherein the same general structures are perfectly or infinitely repeated at
different scales of code), there are nonetheless observable efforts by de-
velopers to convince one another to implement and maintain particular
forms of procedural repetition as part of an effort to suggest the use of
some coding paradigms over others.
One such example of repetition within the code for a single module
is the early work composed a decade ago for a spam filter in the Mozilla
suite’s email and news program (which has since become the program
Mozilla Thunderbird). dmose%netscape.com and peterv (2002) contrib-
uted the initial code to the project, making use of a function (among oth-
ers) called processNext() to iterate through the list of messages to
be read and dealt with by a user. Technically, there existed multiple pro-
cessNext() functions, each working similarly but with a different fo-
cus: one to move between folders, one to move between messages within
a folder, one to mark spam messages, and one to mark spam folders. Each
function in which some variation of processNext() resided called
processNext() at the end of its own operation in order to compute
whether or not processNext() would need to be run again. The short-
est of these variations is given in table 4.4.
The function in which a given folder is determined to be spam calls
www.dbooks.org
Developing Arguments in Code • 143
www.dbooks.org
Developing Arguments in Code • 145
scrutiny at any given moment. Such practices, however, are not limited to
the placement of significant operations and procedures (in climactic, ana-
phoric, or epistrophic senses) but are extendable to the idea of repetition
itself: when should a given function be called? When should a set of op-
erations be written multiple times for similar or distinct purposes? These
considerations reflect an awareness of exergasia, which—while related to
the devices of repetition and arrangement discussed so far—has the po-
tential to be exponentially more powerful in communicating significance
through iteration (and implicit or explicit impact of the variations across
relevant iterations).
e xergasia
Just as repeated, or closely similar, arguments can provide both rhetor
and audience with an understanding of the range of possibilities available
to either through those arguments, so too can repetition serve to cement
the suggested necessity for a particular rhetorical approach. Repetition
in code can offer developers with an understanding of preferred stylistic
practices by associating multiple separate functions or sets of operations.
Rhetorically, this can be considered a type of exergasia, a particular type of
repetition: the repetition of a significant idea across multiple forms of ex-
pression. For software programs that consist of hundreds of thousands of
lines of code, exergasia is a helpful device that works to instruct readers
on how other developers have determined code structures within the pro-
gram should work. Simply put, it provides a procedurally rhetorical en-
gagement, to use Bogost’s (2007) term, with the code’s anticipated func-
tionality, both as a component of the larger program and as an entity that
persuades audiences to act in regards to its facilitated activities.
For a massively collaborative OSS program like Firefox, exergasia is a
powerful tool by which myriad developers signal to one another how par-
ticular procedures should be constructed and executed across functions,
modules, and iterative program releases. By making use of explicit repeti-
tion to accomplish multiple related tasks, a developer can suggest that the
operations and syntactical structures of the repeated code are valuable by
way of both the frequency of such structures’ repetition and the relations
perceived to exist between each iteration of the code. Similarly, the method
of repetition is critical to an understanding and use of code as rhetori-
cally powerful communication. Given the ability of code to loop iteratively
through a set of operations, it is possible, if not inevitable, for repetition
to occur conceptually but not explicitly in the statements that constitute the
146 • rhetorical code studies
www.dbooks.org
Developing Arguments in Code • 147
will affect the person1 and person2 objects, and any number of objects
can be instantiated to serve as distinct entities that are nonetheless “re-
petitive” in terms of the code functions they share from the same proto-
type. In this sense, all relevant code is simultaneously repeated across all
prototypical instances and expressed in potentially unique ways, as each
iteration of the prototype differs from most, if not all, of the others. The
argument, provided through the use of exergasic code written as object-
oriented structures, can implicitly and explicitly call attention to the mod-
ular and repeatable nature of the functions and operations called to help
achieve certain goals.
It is no coincidence that “person” serves as the go-to example for such
a discussion. By equating “personness” with “objectness” to explain how
object-oriented code works, saskatchewancatch et al. (2016) suggest that
the construction of code objects is as full of symbolic meaning as any
other means by which we might consider and constitute the human form.
(It would be incorrect, however, to fully map or analogize programming
objects, prototypes, or classes to humans or sets of human behaviors,
characteristics, cultures, and so on. It is a useful metaphor for a brief en-
gagement with the basics of object behavior and inheritance.) To an ex-
tent, this example provides its own exergasic demonstration of the vari-
ety of unique qualities that might be possessed by any individual person,
qualities that only emerge through the activity of computational action. To
state it bluntly, we are what we do, and we are constrained in what we do
by what we can (and cannot) do, sets of affordances defined individually
and socially, not unlike the sorts of repetitive rules outlined in the Person
prototype example.
For an example of exergasia inside Firefox’s production code base,
troy%netscape.com (1999) provided an early series of code blocks to com-
pute the size parameters for the minimum and maximum width and height
properties of various components of the Firefox browser. JavaScript, like
many code languages, has a pair of properties called width and height
that can belong to certain types of objects and which store the rendered
width and height values (in pixels) of entities drawn on a computer screen.
But this only provides one value for each dimension; for those components
of a program that calculate their own size as derivatives of other objects’
width and height, customized functions are necessary to make and
store those calculations, and troy%netscape.com composed four such
relevant function blocks. Because these blocks worked almost identically,
troy%netscape.com provided a uniform structure across all four of the
methods needed to compute their values (i.e., one method each for mini-
mum width, minimum height, maximum width, and maximum height).
One of the code blocks appears in his initial text as seen in table 4.6.
This block is made up of two parts. The first is a variable declaration
that sets the minimum width unit size to be used for comparative pur-
poses. The second is a conditional statement that determines what the
minimum width of a browser component should be, based upon the size
restrictions imposed upon it by any “containing block,” or (in this case)
the parent-level component in which the current component resides. The
associated size blocks differ only in the specific variables being called by
the relevant code, for example, height-related blocks look for “vertical”
www.dbooks.org
Developing Arguments in Code • 149
Conclusions
Just as rhetorical action is ever present in discussions about any human
activity, so too is it demonstrated through the activity of code production.
The social practices that developers engage in as part of their rhetorical
efforts serve to influence them—as communities and as individuals—to
participate in particular types of development, for particular ends. Because
code, like other forms of language, serves to describe more than what it
literally states, the variety of rhetorical strategies and devices available to
developers in code is relatively astounding. This is significant in that de-
velopers can, and do, induce one another in implicit and explicit ways to
accept the practices they suggest through the texts they produce.
The act of reading code as a rhetorical text and practice, however, can
hold considerable difficulty for the vast majority of rhetorical critics unfa-
miliar with programming or the languages thereof. Examinations of code
like those provided in this chapter may offer helpful examples for future
investigations and support for (as much as is possible) more comprehen-
sive and in-depth scrutinies of individual code projects, trends, and genres
across multiple programs, or even of programming languages themselves.
The possibilities for analysis and application of the rhetorical activities
found in code (whether for industrial, civic, or pedagogical purposes) are
not necessarily endless but are myriad and diverse, and it is in our interests
as scholars and teachers of rhetoric to attend to the overwhelming amount
150 • rhetorical code studies
of code being written each day and the means by which its authors com-
municate meaning to collaborators and other readers through their code.
Mozilla Firefox provides a valuable locus for an in-depth analysis of
rhetorical efforts made in code by a massive programming community
of thousands over a decade of collaborative development. While much of
the specific code produced reflects industrial as well as individual stylistic
preferences and trends for invention, it nonetheless demonstrates a var-
ied range of innovative attempts by numerous programmers to engage
their colleagues (as audiences) in creative and highly suasive ways. These
attempts can be recognized at relatively large scales, such as in how in-
novative experimentation and normalizing revision occurs over time. But
they also occur at small scales, such as when particular logical operations
make use of climactic or epistrophic structures in order to lead a developer
audience to compose code in alignment with those structural paradigms.
As a result, we are able to witness a dynamic, continually changing ecol-
ogy of development practice and suasion whose components also shift
and develop over time.
In the next chapter, I turn from my focus on analysis to inventive ex-
perimentation, offering a series of exercises related to the rhetorical
composition of code. These exercises are intended to be accessible to the
nonprogrammer audience, and they can be practiced in the web browser
rather than requiring any other special software to be installed. Together,
these exercises function as a set of progymnasmata that introduce funda-
mental concepts of programming and suggest means of employing those
concepts for effective rhetorical communication through the composi-
tion of code texts. While the progymnasmata are hardly comprehensive
in coverage of rhetorical principles applied in code, they may be valuable
for readers who remain skeptical or confused about the actual activity of
composing via procedure rather than conventional discourse. Further, for
readers with more familiarity with programming, the progymnasmata
may be useful exercises for explicitly engaging with particular rhetorical
principles during an activity generally considered to be a purely instru-
mental form of writing.
www.dbooks.org
chap ter 5
Composing in Code
A Brief Engagement with JavaScript
151
152 • rhetorical code studies
Procedural Progymnasmata
Classical Greek rhetoric introduced the concept of the progymnasmata to
students of rhetoric seeking to improve their abilities, and the progym-
nasmata have become staples of rhetorical education since. Progymnas-
mata are exercises in training particular rhetorical principles in order
to improve a student’s use of those being emphasized in any particular
example.
In many ways, progymnasmata encourage imitation of particular strat-
egies as forms of invention by constraining students to focus on a small
range of questions or considerations during a single exercise. As Crowley
and Hawhee (2009) have described it,
www.dbooks.org
Composing in Code • 153
For JavaScript, the “Hello World” program typically looks like the fol-
lowing one-line statement, made up of one function and a single param-
eter to be passed through it:
alert("hello, world!");
What the above line of code effectively says is for the interpreter to ren-
der an “alert”—that is, to display a pop-up window—with the quoted text
("hello, world!") within the alert() function’s parentheses. The
semicolon at the end of the line tells the interpreter that the statement has
concluded, much like a period at the end of a sentence. One could replace
the text hello, world! with any other text, and the program should
work just as smoothly, so long as the input text is surrounded by quotation
marks. As a brief aside: the remaining exercises will not use the alert()
function, instead displaying output within a JavaScript console environ-
ment. The pop-up window that alert() creates is a helpful visual indi-
cator that the code has successfully been interpreted.
A program like “Hello World” provides the fundamental components
of a language’s syntax to begin orienting a novice programmer to the act
of composing in code. There’s a tremendous amount still to learn, but this
first step is meant to make everything else just a bit easier and more famil-
iar for future experiments in programming.
In order to make any program work, however, we need to understand
some essential concepts related to Boolean logic, as this is what allows
computers to function. Boolean logic is a logical system in which ev-
erything can be reduced to a binary: true or false, yes or no, positive or
negative, 1 or 0. Computer circuits make use of electron charges to parse
computational operations, with powerful circuits employing hundreds or
thousands of “logic gates” to determine the answers to specific calcula-
tions, using similar binary calculations to determine relations among in-
dividual points of data, for example, a AND b (output “true” if both vari-
ables’ values are “true”), a OR b (output “true” if either is “true”), a NOR
b (output “true” if both variables’ values are “false”), a NAND b (output
“true” if only one of the two is “true”), etc. While none of the exercises in
this chapter will tax a JavaScript interpreter, it is important to realize that
the logical considerations we will make here work as microcosmic reflec-
tions of far more robust and important programs; there’s nothing funda-
mentally different about the underlying nature of any software. We’ll just
be working at a much, much smaller scale in the following exercises.
www.dbooks.org
Composing in Code • 155
Admittedly, there is not much to this program, but it does at least il-
luminate how we can see individual statements referring to—and in many
cases relying on—other statements in order to create more complex calcu-
lations and manipulations of data. This combinatorial approach is much
more impressive when we want to make use of a lot of data values together,
such as when we might want to display a list of volunteer names and rel-
evant contact information. We will see this sort of computational power
play out through the use of loops that perform similar (if not identical)
calculations on each member of a set of data. Before turning to loops,
however, it is important to examine how conditional statements work.
Conditional statements make use of Boolean logic to execute particu-
lar operations when certain parameters (conditions) apply. For example,
we could revise our two-line program (in practice script 5.1) to incorpo-
rate a single condition so as to display a message only when that condition
is met, as demonstrated in practice script 5.2. In this program, the condi-
tion begins on line 2 and ends on line 4. Due to its multiple-line scope,
the conditional operations are incorporated within a pair of curly brack-
156 • rhetorical code studies
www.dbooks.org
Composing in Code • 157
With these added lines, several additional operations occur. The first—
else()—means that its subordinate statements will only be computed
whenever the original if() condition is not met, that is, when myVariable
is false. A similar output message is provided so that we know the current
value of myVariable (not that anything has been done to change it).
But, while these initial programs should successfully execute, neither
of them is particularly elegant, that is, the purpose for these programs is
quite simple, and for this purpose the provided code is not as clear or concise
as it could be, given how JavaScript works. Our initial program (in prac-
tice script 5.1) does its job much more concisely, but the conditional logic
demonstrated in practice script 5.2 and practice script 5.3 allow glimpses
into much more complex and elaborate computational statements, as we
will see shortly in combination with loops that allow for iteration through
sets of data.
slightly (e.g., driving a rental car instead of one’s own car), neither do pro-
grammers generally seek to create new algorithms for variations on exist-
ing ones.
The example program in practice script 5.4 is certainly longer than
those provided so far in this chapter, but that length is meant to reflect
the difference between looping and not looping through similar kinds of
data points. Those with programming experience will recognize it as an
incredibly inefficient program that is effectively impossible to maintain or
scale (such as if we wanted to display not letters of the alphabet but some
other set of data with multiple elements).
www.dbooks.org
Composing in Code • 159
to perform upon each iteration (i++ is shorthand for “add one to the cur-
rent value of i”). Technically, there is no inherent relationship between the
length of the alphabet variable and the i counter variable: this particu-
lar program defines them as having the same “size” and thus the loop will
occur the same number of times as there are elements in the alphabet
array. The loop’s condition could be altered to provide some other bound-
ary value; this might (if the number is less than 26) result in displaying
only some of the letters or (if the number is greater than 26) displaying an
error message.
Similarly, we could change the order of the displayed elements, as in
practice script 5.6, where the values of alphabet are displayed in reverse
order; the loop—rather than starting from zero (the array’s initial element
position) and working toward the end—begins with the final element po-
sition and works back to the first.
www.dbooks.org
Composing in Code • 161
displayed value will not always be a, even though i initially equals zero,
as established in line 3). Unlike in the previous two versions of this pro-
gram, though, the arbitrary nature of the relationship between “iterator”
and “data being iterated” has been clarified through the randomization of
both the loop and its displayed output.
www.dbooks.org
Composing in Code • 163
ventions of other languages with which they are more familiar. As a genre,
“FizzBuzz” offers a number of opportunities not only for rhetorical analy-
sis (e.g., of existing versions of the program) but also for inventive pos-
sibility when writing new versions of the program. This is not to suggest
that the program must always be rewritten in novel ways, just that it can be,
and attempting to work through how to write such a program can serve as
a useful exercise for us. The following examples of potential “FizzBuzz”
programs attempt to provide identical output to those in practice scripts
5.8 and 5.9, but they do so with trivial or significant differences in how
that output is generated.
The example in practice script 5.10 is a particularly inefficient means
of executing the “FizzBuzz” loop. Thanks to an array-specific method
(forEach()), the program does technically iterate through a set of
data—the elements of the myArray variable—but the “real” computa-
tional work of the program is hard-coded into the array elements. That is,
the program does not determine when to print a number or a string, but
instead prints the values entered directly by the author. There is no “dis-
covery” here of how the program will calculate each of its data points; the
output simply repeats the contents of the array in order. The resulting out-
put remains identical to practice script 5.8 and practice script 5.9, but the
source code of practice script 5.10 betrays its lack of any conventional el-
egance (whether using computational or stylistic definitions of elegance).
Despite its lack of elegance, the program nonetheless offers useful insight
164 • rhetorical code studies
In contrast, practice script 5.11 makes use of multiple variables that al-
low for the test program to be adjusted as desired beyond the loop bounds
of 1–100 (with a potentially different scope of iteration), for new condi-
tions to be checked, or for different output to be displayed. The basic
exclusive conditional logic used in practice script 5.11 is nearly identical
to that of practice script 5.9, save that the exclusive nature of each check
must be more explicit, as the relationship between multipleA, mul-
tipleB, and multipleC—should the parameters for this “FizzBuzz”
program ever change—may not always be easily recognizable (if such a
relationship exists at all). Specifically, each of these conditions employs
Boolean logic to rule out multiple successful checks, so line 11 describes
checking whether i%multipleA equals the value of checkedMod, so
long as the same is NOT also true for i%multipleB and i%multipleC.
Practice script 5.11 is the longest of the looping versions of “FizzBuzz”
provided in this chapter, but its length does not make it necessarily un-
wieldy or unreadable. Due to its “scalability first” approach, however, it
does suggest a very different programming philosophy than those in prac-
www.dbooks.org
Composing in Code • 165
tice scripts 5.8, 5.9, or 5.10, namely, that a program can and should be
written in such a way as to reduce any potential redundancy in future revi-
sions of that program. The passing of custom input data to the function
each time it is called allows for experimentation with the “FizzBuzz” algo-
rithm. Several input data points are established as passing to the function
in line 8 of practice script 5.11, with an example call of the function in line
22. While the majority of these “FizzBuzz” programs work, they are not so
easily adjustable for alternate data (that is, the loops themselves would be
rewritten rather than the values for individual variables).
As progymnasmata, what these “FizzBuzz” examples hopefully dem-
onstrate, more than anything else, is the power of rhetorical style in estab-
lishing an argument. It illuminates particular logics and decisions behind
a rhetor’s claims, even if the ultimate “point” may seem indistinguishable
from that of other arguments. While we often consider issues of style and
arrangement with an orientation toward audience reception and subse-
166 • rhetorical code studies
quent action, we can attend equally to the means and meaningful mecha-
nisms by which a rhetor has established a particular line of reasoning or
how that rhetor has framed significant concepts or terms as a reflection of
his or her own comprehension of the issue at hand.
www.dbooks.org
Composing in Code • 167
borg) and then creates two objects that inherit the class’s defined be-
haviors. Functionally, the program is quite simple, as the only behavior
defined initially is the establishment of a name attribute, based on the
myName argument passed to the class function when each new object is
created. Through the composition of this program, however, we can get
an initial sense of how effects of the work performed in developing a class
echo through the objects we create from that class. In this case, line 4 re-
turns text confirming each new object’s creation with a message that in-
cludes its custom name data when the greet() method is called, as in
line 8. While this is not a complicated operation, it nonetheless hinges on
the expectation that each new relevant object will have name data set upon
its initialization (in part so that the message will appear to the user as in-
tended). Any Cyborg-based objects without this variable are thus missing
a potentially vital component to their “existence” in the program and its
purpose.
www.dbooks.org
Composing in Code • 169
www.dbooks.org
Composing in Code • 171
of Array data via a temporary variable that momentarily stores the original
value of each element as it gets altered in the course of the loop.
www.dbooks.org
Composing in Code • 173
Clearly, the two approaches to “Bubble Sort” suggest very different log-
ics, with one keyed in to the affordances of JavaScript (and thus “obscur-
ing,” to some readers, the means by which a list is sorted while clarifying
it to others) and the other assuming a need to develop an explicit sorting
apparatus for readers—and, perhaps, the author himself or herself—to
understand how one can achieve a particular goal.
www.dbooks.org
Composing in Code • 175
Practice Script 5.16: Enthymeme generator built on earlier object creation code
Line Code
1 noun = ["apple", "banana", "canteloupe"]; // Expand these
vocabulary lists for more interesting results!
2 verb = ["act", "bellow", "cry"];
3 adjective = ["angry", "beaming", "cold"];
4 quantity = ["all", "few", "half"];
5 function Person(firstName) {
6 this.firstName = firstName;
7 }
8 function Machine(serial) {
9 this.serial = serial;
10 }
11 Cyborg = function(firstName,serial) {
12 Person.call(this,firstName);
13 Machine.call(this,serial);
14 name = firstName + "-
" + serial;
15 birthdate = Date();
16 return "New cyborg, " + name + ", activated.";
17 };
18 Cyborg.prototype.singularize = function(term) {
19 iesLetters = "aeou";
20 esLetters = "hosx";
21 if (term.charAt(term.length-
1) == "y") {
22 if (iesLetters.indexOf(term.charAt(term.length-
2)) == -
1) {
23 temp = "";
24 for (i = 0; i < term.length-1; i++) {
25 temp = temp + term.charAt(i);
26 }
27 term = temp + "ies";
28 }
29 else {
30 term = term + "s";
Practice Script 5.16: (continued)
31 }
32 }
33 else if (esLetters.indexOf(term.charAt(term.length-
1)) != -
1) {
34 term = term + "es";
35 }
36 else {
37 term = term + "s";
38 }
39 return term;
40 }
41 Cyborg.prototype.randomize = function(list) {
42 randomTerm = list[Math.floor(Math.random() * (list.length))];
43 return randomTerm;
44 }
45 Cyborg.prototype.enthymemeGenerate = function() {
46 amount = this.randomize(quantity);
47 subject1 = this.randomize(noun);
48 subject2 = this.randomize(noun);
49 action = this.randomize(verb);
50 directObject = this.randomize(noun);
51 this.sentence("major", amount, subject1, subject2, action,
directObject);
52 this.sentence("minor", amount, subject1, subject2, action,
directObject);
53 return output;
54 }
55 Cyborg.prototype.sentence = function(type, amount, subject1,
subject2, action, directObject) {
56 if (type == "major") {
57 myQuantity = amount;
58 mySubject = this.singularize(subject1);
59 myVerb = action;
60 directObject = this.singularize(directObject);
61 majorPremise = myQuantity + " " + mySubject + " " + myVerb +
" " + directObject + ".";
62 majorPremise = majorPremise[0].toUpperCase() + majorPremise.
substring(1);
63 output = majorPremise;
64 } else if (type == "minor") {
65 mySubject = subject2;
66 myVerb = this.singularize(action);
67 directObject = this.singularize(directObject);
68 minorPremise = mySubject + " " + myVerb + " " + directObject
+ ".";
69 minorPremise = minorPremise[0].toUpperCase() + minorPremise.
substring(1);
70 output += " " + minorPremise;
71 }
72 }
73 cyborg1 = new Cyborg("Grover", "1");
74 cyborg1.enthymemeGenerate();
www.dbooks.org
Composing in Code • 177
Outside of the word lists in the first several lines of the program (each
of which is purposefully short so as not to double the overall length of this
text), much of the first quarter of the provided code may look especially
familiar, since it involves a construction of the Cyborg object type so that
readers can build on their program drafts from earlier exercises. That code
is included first here to provide context for the code to come. Unlike many
programming languages whose code texts are compiled and executed, Ja-
vaScript interprets its lines, so the order of composed procedures matters
(that is, the program will not operate successfully unless we first establish
variables that are referenced elsewhere before we can write the code that
makes those references).
A new set of methods appended to the existing code lines provides
the necessary functionality for generating the randomized enthymemes
for this exercise. There are three distinct but connected methods—
singularize(), randomize(), and sentence()—that are all acti-
vated when the “umbrella” method, enthymemeGenerate(), is called.
In each of these methods, a particular procedure produces a key compo-
nent of the enthymeme that is ultimately generated and displayed; it is
worth noting that in its current form, the program creates a “categorical”
enthymeme, meaning that the expected conclusion to be drawn is one
that relates the subject of the minor premise to the subject of the major
premise.
Of the integral functions used in this program, the randomize()
method (lines 41–44) generates a random number, using Math.floor()
and Math.random(), and then pulls the array element of that num-
ber from the appropriate list (as established when the method is called).
Its nature as nonspecific to any particular type of term (noun, verb, etc.)
means that it can be used to populate any grammatical component for
these premise statements. The singularize() method (lines 18–40)
similarly performs in a generic manner, although its name suggests its use
is specific, as singularizing a noun often appears opposite to singulariz-
ing a verb; in fact, when this singularize() method is used for nouns,
it actually pluralizes them by appending characters (e.g., “s” or “es”) to
words. The specific appended characters are determined based on the fi-
nal characters of a given word, established in lines 19–20 and checked in
the conditional statements beginning on line 21. Thus a word ending in
“y” will have that “y” replaced with “ies” unless the letter just before “y”
is included in the string on line 19 (the variable iesLetters), in which
case the word will be altered to have an “s” after the “y” character. While
178 • rhetorical code studies
www.dbooks.org
Composing in Code • 179
Conclusions
The exercises presented in this chapter attempt to demonstrate a variety
of key rhetorical concepts that inform composing practices across genres,
modes, and media and reflect composing in code specifically. While pro-
gramming as a form of meaning making involves a functional need to
compose code in such a way as to be readable (interpretable) by the com-
puter, it is nonetheless also a form of making and communicating mean-
ing to human audiences (including potential collaborators or even some
users). Accordingly, we can approach composing in code as a rhetorical
activity, allowing us to experiment with the development of arguments
in code just as we would in other media. In addition, we can potentially
investigate more effectively how professional and amateur programmers
compose their work with rhetorical strategies (un)consciously in mind.
To be clear, these exercises barely scratch the surface of the potential
range of tactics a rhetor might employ in code or in another medium.
Nonetheless they suggest what I hope is a suitable variety of consider-
ations regarding the importance of treating code as an important and
inherently rhetorical form of communication. If as rhetoricians we want
to understand and inform the effective composition of meaning through
code, or if as programmers (professional or amateur) we want to develop
approaches or workflows to coding that are accessible as well as efficient,
it behooves us to attend more closely to the relationships between the pro-
gymnasmata of classical rhetoric and the exercises of contemporary pro-
gramming texts and hiring processes, as together they can tell us a great
deal about the forms of meaning making that code authors and readers
alike are expected to recognize, understand, and engage in particular ways
for similarly particular purposes.
www.dbooks.org
chap ter 6
Conclusions
181
182 • rhetorical code studies
www.dbooks.org
Conclusions • 183
www.dbooks.org
Conclusions • 185
[H]ow might a rhetorical code studies treat social and cultural theo-
ries alongside non-human theories of machinic contexts? Addition-
ally, how might focusing scholarly attention toward rhetorical and
theoretical treatments of computer algorithms open interdisciplinary
conversations and relationships? How might such perspectives attract
complementary and divergent views? Since algorithms affect changes
in machine and human behaviors, as the two scenarios that frame
this article illustrate, how might those allied with rhetoric and writing
studies gift a path toward greater knowledge about the formation, cre-
ation, and use of computer algorithms in myriad digital and scholarly
spaces? (n.p.)
www.dbooks.org
Conclusions • 187
that would help clarify how those procedural development practices func-
tion in these ways. Scholars interested in the rhetoric of code can help
bridge this gap between critical analysis and pragmatic practice, but it re-
quires an ability not only to translate rhetorical principles to professional
and public audiences but to help those audiences assess the possibilities of
rhetoric communicated through code.
Bogost (2007) addressed such a contextual concern as part of an ex-
amination of the potential ways to assess procedural rhetoric, especially
in relation to video games. For Bogost, assessment was crucial because it
“always requires an appeal to an existing domain. An assessment equates
one form of symbolic action with another form of symbolic action through
some mediating measurement” (2007, 322). In other words, the meaning
of a particular set of behavior is given a second set of meaning(s). Bogost
specifically described the assessment of game play as “a form of proce-
dural symbolic action [ . . . ] compared with desirable behavior within an
institution, via material measurements like written texts or job perfor-
mance” (2007, 323). For computational action, rhetorical assessment pro-
vides a means of outlining the suasive influence of particular algorithmic
procedures on human behavior as well as on the construction of machinic
behavior (as a result of influenced human activity). For rhetorical action,
computational assessment offers a perspective focused on the structure(s)
of anticipated activity to be executed through and as a result of a given at-
tempt at meaningful suasion. Bogost (2007) suggested that “procedural
rhetorics can [ . . . ] challenge the situations that contain them, expos-
ing the logic of their operations and opening the possibility for new con-
figurations” (326). In other words, examining and assessing algorithmic
procedures can not only shine light on how they work, or toward what
ends they function, but also how other suasive procedures might be con-
structed for other purposes and audiences.
But by what metrics can the aforementioned types of assessment be
evaluated? It is admittedly easier for rhetoricians to consider the ways in
which computational procedures—especially as code texts—might be
read as meaningful communication; Burkean dramatism, as described
by Burke (1962), even offers one specific means of approaching com-
putation with an algorithmically oriented school of criticism. Reading
code as rhetorical text (while using an interpretive lens such as Burke’s
pentad) offers new possibilities of understanding symbolic action com-
municated through forms that have yet to be explored, mostly due to the
long-standing definition of code as machine-focused and nonmeaningful
188 • rhetorical code studies
www.dbooks.org
Conclusions • 189
Such a model is aligned with the goals of activity theory (AT) and its
computational structure as well. In activity theory, a set of subjects and
their object emerge through the course of undertaking and accomplish-
ing (or at least attempting to accomplish) a particular activity. AT has pri-
marily been applied to human-computer interaction, but its fundamen-
tal principles could just as easily be applied to the rhetorical practices of
software code development as well as of its use. Christiansen (1996) has
argued that
activity [is] the term for the process through which a person creates
meaning in her practice, a process we can neither see or fully recall but
a process that is ongoing as a part of the participation in a community
of practice. Activity is a process that we can approach by unfolding the
task as stated within the community of practice and the objectified mo-
tive of the activity[.] (177)
www.dbooks.org
Conclusions • 191
193
194 • Bibliography
Berlinski, D. 2000. The Advent of the Algorithm: The 300-Year Journey from an Idea to the
Computer. San Diego: Harcourt.
Berry, D. 2011. “Iteracy: Reading, Writing and Running Code.” Stunlaw: A Critical
Review of Politics, Arts, and Technology. Retrieved from http://stunlaw.blogspot.
com/2011/09/iteracy-reading-writing-and-running.html
Birkbak, A., and H. B. Carlsen. 2016. “The World of EdgeRank: Rhetorical Justifica-
tions of Facebook’s News Feed Algorithm.” Computational Culture 5. Retrieved from
http://computationalculture.net/the-world-of-edgerank-rhetorical-justifications-
of-facebooks-news-feed-algorithm/
Bitzer, L. F. 1959. “Aristotle’s Enthymeme Revisited.” Quarterly Journal of Speech 45 (4):
399–408.
Bitzer, L. F. 1968. “The Rhetorical Situation.” Philosophy and Rhetoric 1 (1): 1–14.
Black, M. L. 2015. “A Textual History of Mozilla: Using Topic Modeling to Trace Socio-
cultural Influences on Software Development.” Digital Humanities Quarterly 9 (3).
Retrieved from http://digitalhumanities.org/dhq/vol/9/3/000224/000224.html
Black, P. E. 2007. “Algorithm.” In Dictionary of Algorithms and Data Structures, edited by
P. E. Black. Retrieved from http://xlinux.nist.gov/dads//HTML/algorithm.html
Bogost, I. 2007. Persuasive Games: The Expressive Power of Videogames. Cambridge, MA:
MIT Press.
Bogost, I. 2008. “Platform Studies.” SoftWhere 2008. Retrieved from http://emerge.
softwarestudies.com/files/05_Ian_Bogost.mov
Bogost, I. and N. Montfort. 2009. “Platform Studies: Frequently Questioned
Answers.” Proceedings of the Digital Arts and Culture Conference. Retrieved from
http://escholarship.org/uc/item/01r0k9br
Bossert, T. P. 2017. “It’s Official: North Korea Is Behind WannaCry.”
Wall Street Journal. Retrieved from https://www.wsj.com/articles/
its-official-north-korea-is-behind-wannacry-1513642537
Bowker, G. 2008. “Software Values.” SoftWhere 2008 Software Studies Workshop. Re-
trieved from http://workshop.softwarestudies.com
Brassard, G., and P. Bratley. 1996. Fundamentals of Algorithmics. Englewood Cliffs, NJ:
Prentice-Hall.
Brock, K. 2014. “Enthymeme as Rhetorical Algorithm.” Present Tense: A Journal of Rheto-
ric in Society 4 (1). Retrieved from http://www.presenttensejournal.org/volume-4/
enthymeme-as-rhetorical-algorithm/
Brock, K. 2016. “The ‘FizzBuzz’ Programming Test: A Case-Based Exploration of Rhe-
torical Style in Code.” Computational Culture: A Journal of Software Studies 5. Retrieved
from http://computationalculture.net/article/the-fizzbuzz-programming-test-a-
case-based-exploration-of-rhetorical-style-in-code
Brock, K., and A. R. Mehlenbacher. 2017. “Rhetorical Genres in Code.” Journal of Tech-
nical Writing and Communication. http://dx.doi.org/10.1177/0047281617726278
Brock, K., and D. Shepherd. 2016. “Understanding How Algorithms Work Persua-
sively through the Procedural Enthymeme.” Computers and Composition 42: 17–27.
Brooke, C. G. 2009. Lingua Fracta: Towards a Thetoric of New Media. Cresskill, NJ: Hamp-
ton Press.
Brown, J. J., Jr. 2015. Ethical Programs: Hospitality and the Rhetorics of Software. Ann Arbor:
University of Michigan Press.
Brown, J. J., Jr., and A. Vee. 2016. “Rhetoric Special Issue Editorial Introduc-
www.dbooks.org
Bibliography • 195
Crowston, K., and J. Howison. 2005. “The Social Structure of Free and Open Source
Software Development.” First Monday 10: 1–27. Retrieved from http://floss.syr.edu
Crowston, K., and J. Howison. 2006. “Assessing the Health of Open Source Commu-
nities.” IEEE Computer 39: 113–15. Retrieved from http://floss.syr.edu
Cummings, R. E. 2006. “Coding with Power: Toward a Rhetoric of Computer Coding
and Composition.” Computers and Composition 23 (4): 430–43.
deasydoesit, et al. 2018. “Object Prototypes.” MDN Web Docs. Retrieved from https://
developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Object_prototypes
Debian. 2011. “Debian Project Leader.” Debian Developer’s Corner. Retrieved from http://
www.debian.org/devel/leader.en.html
Divine, D., T. Ferro, and M. Zachry. 2011. “Work Through the Web: A Typology of Web
2.0 Services.” In SIGDOC ’11: Proceedings of the 29th Annual ACM International Conference
on Design of Communication, edited by A. Protopsaltis et al., 121–28. New York: ACM
Digital Library.
dmose%netscape.com, and peterv. 2002. “Initial work (mostly by peterv) for a bayes-
ian spam filter. Not yet part of the build.” GitHub. Retrieved from https://github.
com/mozilla/ gecko-dev/blob/b7890a4bbb26100ef95f8872b10e18349d961400/
mailnews/extensions/bayesian-spam-filter/menuOverlay.js
Douglass, J. 2008. “#include Genre.” SoftWhere 2008 Software Studies Workshop. Re-
trieved from http://workshop.softwarestudies.com
Douglass, J. 2011. “Critical code studies conference—Week two discussion.” Electronic
Book Review. Retrieved from http://www.electronicbookreview.com/thread/
firstperson/recoded
Dubinsky, J. M., ed. 2004. Teaching Technical Communication: Critical Issues for the Class-
room. Boston: Bedford/St. Martin’s Press.
Duckett, J. 2014. JavaScript and jQuery: Interactive Front-End Web Development. Indianapo-
lis: Wiley & Sons.
Dyehouse, J. 2007. “Knowledge Consolidation Analysis: Toward a Methodology for
Studying the Role of Argument in Technology Development.” Written Communica-
tion 24 (2): 111–39.
Edbauer, J. 2005. “Unframing Models of Public Distribution: From Rhetorical Situa-
tion to Rhetorical Ecologies.” Rhetoric Society Quarterly 35 (4): 5–24.
Edmonds, J. 2008. How to Think about Algorithms. Cambridge, UK: Cambridge Univer-
sity Press.
ehsan, et al. 2013. “Bug 829870—Only draw in the title bar of private windows which
are browser windows on Mac; r=gavin.” GitHub. Retrieved from https://github.
com/mozilla/gecko-dev/blob/88ce997385044499f1781dcf7b80a1a969e282d8/
browser/base/content/browser.js
Eyman, D. 2015. Digital Rhetoric: Theory, Method, Practice. Ann Arbor: University of
Michigan Press.
Fagerjord, A. 2003. “Rhetorical Convergence: Studying Web Media.” In Digital Media
Revisited, edited by G. Liestøl, A. Morrison, and T. Rasmussen, 293–325. Cam-
bridge, MA: MIT Press.
Fahnestock, J. 2011. Rhetorical Style: The Uses of Language in Persuasion. Oxford: Oxford
University Press.
Ford, P. 2005. “Processing Processing.” In The Best Software Writing I, edited by J. Spol-
sky, 79–94. Berkeley, CA: Apress.
www.dbooks.org
Bibliography • 197
Ford, P. 2015. “What Is Code?” Businessweek. Retrieved June 11, 2015, from http://www.
bloomberg.com/graphics/2015-paul-ford-what-is-code/
França, R., et al. 2012. “Implementing Routing Concerns.” GitHub. Retrieved from
https://github.com/rails/rails/commit/0dd24728a088fcb4ae616bb5d62734aca52
76b1b
Fuller, M. 2003. Behind the Blip: Essays on the Culture of Software. Brooklyn, NY:
Autonomedia.
Fuller, M., and S. Matos. 2011. “Feral Computing: From Ubiquitous
Calculation to Wild Interactions.” The Fibreculture Journal, 144–63.
Retrieved from http://nineteen.fibreculturejournal.org/fcj-135-
feral-computing-from-ubiquitous-calculation-to-wild-interactions/
Fuller, S. 1997. “‘Rhetoric of science’: Double the Trouble?” In Rhetorical Hermeneu-
tics: Invention and Interpretation in the Age of Science, edited by A. G. Gross and W. M.
Keith, 279–98. Albany: State University of New York Press.
Gallagher, J. R. 2017. “Writing for Algorithmic Audiences.” Computers and Composition
45: 25–35.
Gaonkar, D. P. 1997. “The Idea of Rhetoric in the Rhetoric of Science.” In Rhetorical
Hermeneutics: Invention and Interpretation in the Age of Science, edited by A. G. Gross
and W. M. Keith, 25–85. Albany: SUNY Press.
Gaonkar, D. P. 2004. “Introduction: Contingency and Probability.” In A Companion to
Rhetoric and Rhetorical Criticism, edited by W. Jost and W. Olmsted, 6–21. Oxford,
UK: Blackwell Publishing.
Garsten, B. 2006. Saving Persuasion: A Defense of Rhetoric and Judgment. Cambridge, MA:
Harvard University Press.
gbrownmozilla. 2011. “Bug 669549—Some DeviceManager ADB functions do not
work; r=jmaher a=test-only.” GitHub. Retrieved from https://github.com/mozilla/
gecko-dev/commit/6ccc1a61a0bd87fa5144aa427d697c1971b1cacd
Gerrard, L. 1995. “The Evolution of the Computers and Writing conference.” Comput-
ers and Composition 12 (3): 279–92.
Gillespie, T. 2014. “The Relevance of Algorithms.” In Media Technologies: Essays on Com-
munication, Materiality, and Society, edited by T. Gillespie, P. J. Boczkowski, and K.
A. Foot, 167–94. Cambridge, MA: MIT Press.
Gillespie, T. 2016. Algorithm. In Digital Keywords: A Vocabulary of Information Society &
Culture, edited by B. Peters, 18–30. Princeton: Princeton University Press.
GIMP. 2018. “Getting Involved.” Retrieved from http://www.gimp.org/develop
GitHub. 2012. “Press.” GitHub. Retrieved from https://github.com/about/press
GitHub. 2017. Open Source Survey. Retrieved from http://opensourcesurvey.org/2017/
Goodling, L. 2015. “MOAR Digital Activism, Please.” Kairos: A Journal of Rhetoric, Tech-
nology, and Pedagogy 19 (3). Retrieved from http://kairos.technorhetoric.net/19.3/
topoi/goodling/index.html
Gozala et al. 2012. “Bug 7098984—promoting SDK promise library for toolkit.”
GitHub. Retrieved from https://github.com/mozilla/mozilla-central/pull/4
Grabill, J. 2003. “On Divides and Interfaces: Access, Class, and Computers.” Computers
and Composition 20 (4): 455–72.
Gurak, L. 1997. Persuasion and Privacy in Cyberspace. New Haven: Yale University Press.
Haefner, J. 1999. “The Politics of the Code.” Computers and Composition 16 (3): 325–39.
Hairston, M. C. 1986. “Bringing Aristotle’s Enthymeme into the Composition Class-
198 • Bibliography
room.” In Rhetoric and Praxis: The Contribution of Classical Rhetoric to Practical Reason-
ing, edited by J. D. Moss, 59–77. Washington, DC: Catholic University of America
Press.
Hamerly, J., T. Paquin, and S. Walton. 1999. “Freeing the Source: The Story of
Mozilla.” In Open Sources: Voices from the Revolution, edited by C. DiBona and S. Ock-
man. Retrieved April 17, 2012, from http://oreilly.com/openbook/opensources/
book/netrev.html
Hart-Davidson, W., et al. 2008. “Coming to Content Management: Inventing Infra-
structure for Organizational Knowledge Work.” Technical Communication Quarterly
17 (1): 10–34.
Haverbeke, M. 2015. Eloquent JavaScript: A Modern Introduction to Programming. 2nd ed.
San Francisco: No Starch Press.
Hayles, N. K. 2004. “Print Is Flat, Code Is Deep: The Importance of a Media-Specific
Analysis.” Poetics Today 25 (1): 67–90.
Hayles, N. K. 2005. My Mother Was a Computer: Digital Subjects and Literary Texts. Chicago:
University of Chicago Press.
Hayles, N. K. 2012. How We Think: Digital Media and Contemporary Technogenesis. Chicago:
University of Chicago Press.
headius, et al. 2012. “Incorporate OpenSSL tests from JRuby.” GitHub. Retrieved from
https://github.com/ruby/ruby/pull/206
Helmond, A. 2013. “The Algorithmization of Hyperlinks.” Computa-
tional Culture 3. Retrieved from http://computationalculture.net/
the-algorithmization-of-the-hyperlink/
Herrick, J. A. 2016. History and Theory of Rhetoric: An Introduction. 5th ed. New York:
Routledge.
Hicks, M. 2017. Programmed Inequality: How Britain Discarded Women Technologists and Lost
its Edge in Computing. Cambridge, MA: MIT Press.
Hillis, W. D. 1998. The Pattern on the Stone: The Simple Ideas That Make Computers Work.
New York: Basic.
Hocks, M. E. 2003. “Understanding Visual Rhetoric in Digital Writing Environ-
ments.” College Composition and Communication 54 (4): 629–56.
Hodgson, J. and Barnett, S. 2016. “Introduction: What Is Rhetorical about Digital
Rhetoric? Perspectives and Definitions of Digital Rhetoric.” enculturation 23.
Retrieved from http://enculturation.net/what-is-rhetorical-about-digital-
rhetoric
Holmes, S. 2016. “Ethos, Hexis, and the Case for Persuasive Technol-
ogy.” enculturation 23. Retrieved from http://enculturation.net/
ethos-hexis-and-the-case-for-persuasive-technologies
Holmes, S. 2017. The Rhetoric of Videogames as Embodied Practice: Procedural Habits. New
York: Routledge.
Howison, J. 2006. Coordinating and Motivating Open Source Contributors. Retrieved from
http://floss.syr.edu
Howison, J., K. Inoue, and K. Crowston. 2006. “Social Dynamics of Free and Open
Source Team Communications.” IFIP 2nd International Conference on Open
Source Software. Lake Como, Italy. Retrieved from http://floss.syr.edu
Ingo, H., trans. 2006. Open Life: The Philosophy of Open Source (With Reader Comments).
Translated by S. Torvalds. Retrieved from http://openlife.cc/onlinebook
www.dbooks.org
Bibliography • 199
Kitchin, R., and M. Dodge. 2011. Code/Space: Software and Everyday Life. Cambridge, MA:
MIT Press.
Kittler, F. 2008. “Code.” In Software Studies: A Lexicon, edited by M. Fuller. Translated by
T. Morrison and F. Cramer, 40–47. Cambridge, MA: MIT Press.
Knuth, D. 1992. Literate programming. Stanford, CA: Center for the Study of Language
and Information.
Lamouri, M., et al. 2010. “Bug 561636 (4/4)—When an invalid form is submitted, an
error messages should be displayed. r=dolske a2.0=blocking.” GitHub. Retrieved
from https://github.com/mozilla/gecko-dev/blob/5d30f398bd39d63e9938165f9de
f84e2218c8589/browser/base/content/browser.js
Lanham, R. A. 1993. The Electronic Word: Democracy, Technology, and the Arts. Chicago:
University of Chicago Press.
Lanham, R. A. 2003. Analyzing Prose. 2nd ed. New York: Continuum.
Le Lionnais, F. 2007. “Lipo: First Manifesto.” In Oulipo: A Primer of Potential Literature,
edited by W. Motte, 26–28. Champaign, IL: Dalkey Archive Press.
Lee, M., W. Mercer, P. Rascagneres, and C. Williams. 2017. “Player 3 has entered the
game: Say hello to ‘WannaCry.’” Talos. Retrieved from http://blog.talosintelli
gence.com/2017/05/wannacry.html
Leyden, J. 2014. “AVG on Heartbleed: It’s Dangerous to Go Alone, Take This (an AVG
Tool). The Register. Retrieved from https://www.theregister.co.uk/2014/05/20/
heartbleed_still_prevalent/
Leyden, J. 2017. “WannaCry Ransomware Note Likely Written by Google Translate
–Using Chinese Speakers.” The Register. Retrieved from https://www.theregister.
co.uk/2017/05/26/wannacrypt_ransom_note_linguistics/
Lopes, C. V. 2014. Exercises in Programming Style. Boca Raton, FL: CRC Press.
Lopez, G. 2017. “Diversity Problems in the Tech Industry Go Far Beyond Google.”
Vox. Retrieved from https://www.vox.com/identities/2017/8/8/16113070/
google-memo-diversity-tech
Losh, E. 2009. Virtualpolitik: An Electronic History of Government Media-Making in a Time of
War, Scandal, Disaster, Miscommunication, and Mistakes. Cambridge, MA: MIT Press.
Losh, E. 2016. “Sensing Exigence: A Rhetoric for Smart Objects.” Com-
putational Culture 5. Retrieved from http://computationalculture.net/
sensing-exigence-a-rhetoric-for-smart-objects/
Lovelace, A. 2002. “Sketch of the Analytical Engine.” In Literature and Science in the
Nineteenth Century: An Anthology, edited by L. Otis, 15–19. Oxford: Oxford University
Press.
Lunenfeld, P. 2008. “Counterprogramming.” SoftWhere 2008 Software Studies Workshop.
Retrieved from http://workshop.softwarestudies.com
MacCormick, J. 2011. Nine Algorithms That Changed the Future: The Ingenious Ideas That
Drive Today’s Computers. Princeton: Princeton University Press.
Maher, J. 2011. “The Technical Communicator as Evangelist: Toward Critical and
Rhetorical Literacies of Software Documentation.” Journal of Technical Writing and
Communication 41 (4): 367–401.
Maher, J. 2016. “Artificial Rhetorical Agents and the Computing of Phronesis.”
Computational Culture 5. Retrieved from http://computationalculture.net/
artificial-rhetorical-agents-and-the-computing-of-phronesis/
Manovich, L. 2001. The Language of New Media. Cambridge, MA: MIT Press.
www.dbooks.org
Bibliography • 201
www.dbooks.org
Bibliography • 203
www.dbooks.org
Bibliography • 205
www.dbooks.org
Index
207
208 • Index
calculation, 12, 35–37, 42, 59, 65, 71, makeup of, 75–85, 94–95, 117, 127,
118, 141, 148–49, 154–57, 160, 163, 139
169, 171. See also: computation values of, 4, 7, 21, 24–25, 39, 69, 72,
canon(s) of rhetoric, 18, 38, 52, 56, 74, 79–84, 87–88, 92–94, 98–99, 107,
170 123, 125–29, 138–39, 141–42, 167
chaining, 168–69, 172, 178 complexity
chiasmus, 54, 61, 97 of algorithms, 10, 37, 44–45, 52, 56,
class (programming), 65, 142, 144, 146– 144, 151–53, 155, 157, 167–69, 173,
47, 166–68 178, 184, 190
climax, 141, 143, 145, 150, 184 of communication, 4, 75, 151
code. See: algorithm; development, soft- of relationships, 11–12, 16, 79–83
ware; program, software of rhetorical activity, 18, 27–28, 31, 36,
codework, 50 39–43, 47, 108, 120, 127, 168
collaboration, 50, 54, 71–72, 75, 80–86, composition, 2, 4, 6, 12–16, 20, 25, 27,
90, 93, 99, 103, 106–8, 111–13, 117, 29, 33, 39, 45, 50–52, 55, 58–59,
121–28, 144–45, 150, 179, 183–85 62–63, 68, 71–73, 75, 81, 88, 95,
combination, 39–40, 60, 110–11, 121, 128, 103, 111, 115–16, 129–29, 135–36,
140, 153–57, 160, 173 142, 148, 150–54, 157, 164, 169–74,
comments in code, 5–6, 12–13, 22, 69, 177, 179, 181, 183–85, 188
72, 89–92, 97, 101–3, 107, 112, 116, computation, 4, 6, 18–20, 22–23, 25,
119, 125, 128, 131–32, 135, 138–39, 29–31, 35–37, 39, 41–46, 48, 50–52,
144 54–61, 63, 65–68, 71–72, 84, 88,
communication, 2, 5–6, 9, 10–23, 27–30, 90, 104, 106–7, 112–13, 119, 127–29,
33, 38, 40, 43–44, 47, 50–53, 56– 132, 140–41, 143–44, 147–48, 153–
57, 60–63, 68–77, 79, 81, 84–86, 93, 57, 163, 166, 168, 171, 178, 181–90.
95–98, 107–8, 110, 112–22, 127–30, See also: algorithm
132, 136, 144–45, 160–51, 171, computer science, 33, 36–38, 50, 181–82
178–79, 181–84, 186–90. See also: conditions, 34, 40–42, 51, 57–58, 66,
discourse; meaning making; techni- 132, 138, 148, 153, 155–57, 159–64,
cal communication 171, 177–78, 189
mode(s) of, 17–19, 68, 73, 77, 98, 102– constraint, 20–24, 26, 31, 37, 42–47, 53,
3, 115, 119, 127, 151, 179 65, 66, 72, 97, 112, 127, 129, 147,
community, 2, 10, 16, 37, 38, 51, 57, 72– 152, 170, 175, 181, 184, 186, 189
95, 97–108, 120–24, 126–28, 130, context, 2, 4, 12–14, 16, 18, 20–21, 29–31,
136, 138–40, 149–50, 183–84, 38, 43, 50–55,, 65, 67, 74, 85, 110,
189 112, 120, 127, 139, 144, 151, 169–70,
development, 14, 28, 57, 68–69, 173, 177–78, 185–87
75–95, 97–108, 112, 116–17, 121– convention, 16–17, 105, 122, 136, 139
24, 126–28 (see also: Open Source credibility, 97–98. See also: ethos
Software) critical code studies, 5, 10, 11, 21–22, 29–
individuals’ standing in, 79–84 31, 49, 182, 190
leadership, 79–84, 95, 99, 100–102, criticism, algorithmic, 21, 39, 47–49,
109, 123–24 63, 187
www.dbooks.org
Index • 209
criticism, rhetorical, 31, 185, 187. See also: epistrophe, 141, 143, 145, 150
rhetoric ethics, 2, 7, 11, 20, 106, 185
ethos, 19, 83, 93, 97–100, 119, 183
exergasia, 141, 145–48
data, 1–3, 9, 20, 24–25, 28, 31, 33, 36, exigence, 2, 18, 39, 43, 44, 52, 108, 124,
47, 47–48, 51–52, 56–61, 63–65, 127, 183
74, 89, 97, 109, 118–19, 130–32, 141, exordium, 18
143, 146, 153–74, 178, 183–84 exploit, 1, 9, 108, 129
Debian Linux, 78, 83, 103 expression, 4, 12, 14, 18, 20–21, 29–31,
delivery, 18, 19, 29, 54–55, 96, 118, 141, 186 33, 42–43, 46, 49–52, 54–57, 62–
development, software, 3–7, 10–18, 23– 67, 90–91, 105, 115, 129, 157, 169,
31, 36–37, 46, 49, 57, 63, 68–69, 174–75, 186, 189
71, 73–88, 90–108, 110–13, 116–17,
120–28, 130, 132, 135–36, 139–42.
See also: language, programming Facebook, 3, 20
communities (see: community) Firefox. See: Mozilla Firefox
philosophy of, 95, 104 FizzBuzz test, 56–60, 135, 161–65, 183
practice(s) of, 13, 20, 26–31, 50, 52, fork, 84, 98, 103–8, 112, 125
63, 87–89, 92, 95–112, 115–18, 120, function (programming), 52, 68, 109,
122, 125–28, 130, 132, 136, 139–41, 119, 130, 135, 138–48, 153–54, 162,
144–46, 149–52, 155–69, 181–90 165, 167, 177, 190
discourse. See also: meta-discourse function (purpose), 3, 6, 13, 19–22, 24,
about code, 6, 12–14, 68, 71–75, 86– 29, 41–42, 46, 50–51, 53, 55, 58–59,
88, 108–10, 124, 61–62, 71–73, 80–82, 86–91, 105,
academic, 18–19, 37, 104–5, 109, 11, 115, 117–18, 125, 128, 140,
community (see: community) 149–50, 151, 153–54, 160, 166–67,
conventional/traditional, 42, 51, 72– 177–79, 182–83, 187–88
74, 98, 102, 112–13, 115–16, 118–20, functionality, 1, 24, 34, 55, 63, 80–82, 87,
123, 150, 170, 183–85, 190 90, 97, 108, 125, 130, 132, 135–36,
digital forms of, 52, 74–75, 102, 113, 139, 144, 167, 169, 177
116, 123, 184–85, 190
Drupal, 110–12, 130
DRY philosophy, 142. See also: repetition genre, 6, 11, 16, 20–21, 28–29, 51, 72,
74, 127–30, 139–40, 149, 161, 163,
179, 189
efficiency, 4, 35, 52, 84, 88, 90, 96–97, ecology, 28, 127–28
104, 127, 132, 141, 146, 158, 163, 171, system, 127, 140
179, 184 GIMP, 82
elegance, 4, 57, 95–96, 132, 142, 146, git, 100–101, 106, 111–12, 124–25
157, 163 GitHub, 77, 100–102, 124–26
engineering, 4, 33, 35, 37, 50, 182 2017 survey, 77
enthymeme, 39–43, 54, 63, 172–78, 182– Google, 24–26, 86, 135
83, 188. See also: syllogism Google Chrome, 103, 120
210 • Index
Hansson, David H., 89–90 24–28, 30, 36, 46, 57–58, 60–61, 63,
HashMap, 56, 63–66, 144, 183 72, 76, 89, 92, 95, 97–98, 102, 129,
Heartbleed, 9–10, 13. See also: bug 131, 144, 146, 148–49, 151, 153–55,
heuristic, 29, 38, 178 162–63, 166, 170, 174, 177, 182–84
human-computer interaction, 189 high-level, 12, 24, 50–53, 115–16 (see
humanities, 5–6, 13, 16, 23, 26–27, 31, also: C language; C++ language; Java
33, 39–40, 45, 47, 49, 51, 62, 68, 71, language; JavaScript language; Ruby
182, 186 language)
digital, 13, 26 individuals’ understanding of, 57,
83–84
low-level, 24 (see also: Assembly
imitation, 104, 152 language)
interface, 12, 17–18, 20, 24, 26–27, 96, object-oriented (see: Object-Oriented
101, 111, 115, 119, 125, 134, 143, Programming)
182 similarities to natural languages, 50,
invention, 5, 15, 19, 22, 27, 30, 38, 45– 53–54, 123, 149
47, 51, 54–55, 95, 105, 129, 150, Linux, 78, 81–83, 100–103
152, 163, 173–74, 178, 182, 186, literate programming, 50, 144. See also:
188–89 readability
iteration, 1, 41, 54, 56, 58–59, 65, 73–74, literacy/literacies
78, 110, 113, 116, 123, 128, 130, 133, of code, 11, 23, 27, 153, 184
135–36, 139–43, 145–47, 157–64, rhetorical, 23, 74
171–66, 172, 183. See also: loop technological, 28–29
logic, 6, 21, 25–27, 29–30, 33, 35–36,
40–43, 49, 54, 58, 60, 88, 100–101,
Java language, 12, 63, 98, 144 107, 118–19, 128–30, 140, 142, 144,
JavaScript language, 57–58, 92, 99, 115– 150, 153, 162, 164–65, 168–69, 171–
16, 136–38, 146–48, 151–52, 154–70, 75, 178, 183, 186
172–78 Boolean, 22, 36, 73, 153–56, 164
JRuby, 98–99 procedural, 4, 6, 11, 13, 21–23, 25–27,
29–31, 35–37, 40–41, 43, 57–60,
119, 128–30, 136, 157, 161–64, 172–
kairos, 84–85, 87, 102, 104, 108, 124, 73, 181, 183, 186–89
127, 149 logos, 97, 170, 178, 183
al-Khwarizmi, Abu Abdulah Mohammed loop, 24, 57–59, 132, 135, 145–46, 155,
ibn Musa, 34–35 157–64, 171–72. See also: iteration
Lovelace, Ada, 35–36
www.dbooks.org
Index • 211
115–18, 123–27, 140, 142–49, 166, communities, 57, 75–92, 103, 105–7,
182–87, 190 112, 123, 127–28, 145, 183
in code, 151–75, 177–79 goals of, 75–87, 97–98, 123
Mercurial, 124–25 social structures of, 78–84, 86, 94,
meta-discourse, 12, 75, 128 105, 107, 184
method (programming), 105, 160, 163, development of, 75–79
166–69, 172–74, 177–78, 190 distribution of, 76–78, 85–87, 98, 104,
Microsoft, 3, 20, 26, 76, 109, 121 106–9
Microsoft Windows, 1, 24, 87, 117 principles of, 85–86, 92–95
mimesis, 62 order. See: arrangement
modularity, 25, 142, 165, 169–70 Oulipo, 45–47
module, software, 89, 100, 110–11, 117,
123, 130, 135, 142, 145
Mozilla Firefox, 6, 10, 15, 78, 87, 90, paratext, 21, 47–49, 63, 68
92–94, 99, 112–13, 115–17, 120–27, patch, software, 1, 9–10, 13, 108–12,
130–40, 142–50, 183–84, 190. See 185
also: Netscape Navigator pathos, 97, 100–102, 183
history of, 120–23 persuasion. See: suasion
tools for developing, 124–27, 130– platform studies, 24, 26, 31
32 Plato, 89, 146
user preferences, 132–35 potential, 6–7, 20, 24–26, 31, 35, 37, 44–
Mozilla Thunderbird, 142–44 46, 48, 54, 63, 68, 77, 80, 98–99,
multimodality, 129, 188. See also: com- 105, 108, 112, 116–18, 120–21, 123,
munication, mode(s) of 126, 129, 135, 146, 173–75, 179, 186,
189
probability, 40, 42, 129, 169
nesting, 168–69, 171 procedure, 19–20, 29, 33–40, 42, 45–48,
Netscape Navigator, 87, 90–92, 121. See 52–56, 61–62, 65, 68, 71, 88, 119,
also: Mozilla Firefox 136, 138, 141–46, 150–51, 153–79,
new media, 21, 25, 74 186–90. See also: algorithm
normalization, 88, 90, 121, 130, 136, 138, process, 19–21, 23–27, 29–30, 41–42,
140, 149–50 53–55, 75–76, 88, 92, 107, 110, 112,
116, 122–26, 128–29, 157, 169, 182–
84, 189–90
obfuscation, 62, 85, 172 processing, expressive, 26–27
object (programming), 65–66, 89, 142, Processing IDE, 4, 63–64, 95
144, 146–48, 166–68, 170, 173–77 program, software, 1–7, 12–13, 18, 21–
Object-Oriented Programming, 65, 116, 23, 25–27, 31, 36, 46–47, 50–52,
144, 146–47, 166 55–58, 60–68, 71–72, 74, 76–78,
objectivity, 43, 45, 60, 84, 88, 96, 102, 80–82, 84–87, 90, 95–97, 100, 103–
119, 140 13, 115–24, 126–28, 130, 132–33,
Open Source Software, 14, 28, 57, 75–85, 136, 138–42, 144–46, 148–75, 177–
103–7, 120–28, 142, 145, 183 79, 182–84, 190–91
212 • Index
www.dbooks.org
Index • 213
49–51, 55–58, 61–63, 69, 71–72, version(ing), software, 5, 72, 82, 92,
88, 97–98, 102, 115–16, 118–20, 100–111, 121–25, 136–42, 144, 146,
122, 130, 135–36, 140–41, 148–51, 159–64, 172–74
153–79, 187
topoi, 104–5
Torvalds, Linus, 82–83, 93, 100–102 WannaCry, 1–2
Treeherder, 125–26 writing. See: composition
www.dbooks.org