Beruflich Dokumente
Kultur Dokumente
com/thread/firstperson/recoded
“How do we read code?” is the more generative and productive question in many respects. It brings
into focus our own diverse code reading practices, and asks us to explore the complexity that
actually underlies a “two cultures” stereotype of ur-programmer and ur-critic literacies. It also
invites us to go further: “How does everyone already read code?” suggests we look to the myriad
ways in which code criticism already exists “in the wild,” far outside disciplinary categories.
Let me begin at the beginning.
Code, but Critically
Week 1 briefly situated Critical Code Studies in relation to the recent emergence of a set of
overlapping interdisciplinary areas of inquiry, including Software Studies, Platform Studies,
Hardware Studies and, of course, Critical Code Studies. But what is our more general situation?
Why “Critical Code Studies”, as opposed to “Code Studies”? Is it just a marker of difference,
distinguishing an open field of new interdisciplinary exploration, where “Code Studies” could be
confused with the established paradigms of software engineering and computer science?
Yet the term “critical” suggests its own established paradigm. Critical * Studies is a popular phrasal
template (or perhaps snowclone) in academia, particularly in the creation of new cultural studies
subfields. So for example in the case of Critical Disability Studies or Critical Terrorism Studies, the
critic (who apparently does not merely study, but does so critically) is distinguished from the
presumed inner-standing point of a default domain professional: the medical expert on disability,
the government agent on terrorism, the programmer on code and so forth. Read in this light,
“Critical Code Studies” suggests a great mapping of one culture of knowledge onto another: some
practices of hermeneutic textual commentary, perhaps taken directly from the humanities or arts,
and then mapped onto the domain of programming in software engineering and computer science.
Conferencia sobre Estudios de Código Críticos - Segunda semana de debate
por
Jeremy Douglass
2011-04-14
En la segunda entrega de un debate de seis semanas, los colaboradores buscan ejemplos de Critical
Code Studies "en la naturaleza". En lugar de preguntar cómo se puede leer el código críticamente,
examinan cómo el código ya está siendo creado y disputado por abogados, programadores, y el
público en general.
Nota del editor:
En la segunda entrega de la discusión que tuvo lugar en el verano de 2010, Jeremy Douglass lidera
el Grupo de Trabajo de Estudios de Código Crítico al explorar los desafíos prácticos y las
limitaciones de la lectura crítica del código, con énfasis en ejemplos del mundo real. Una
introducción y una descripción general para esta semana de Mark Marino y Max Feinstein está
disponible aquí. -Ed Finn
Leyendo el código de lectura
________________________________________
¿Cómo deberíamos leer el código?
Al elaborar mi contribución a nuestra conversación compartida, esta pregunta ha sido mi punto de
partida, tanto porque a pesar de que es (en muchos aspectos) simple, obvia y la pregunta
equivocada. En primer lugar, dedicaré un breve espacio de tiempo a encuadrar un aspecto de la
empresa de Estudios de Código Críticos tal como lo veo, y luego extraeré algunas de las
implicaciones de las formas concretas en que el código se convierte en objeto de crítica y luego
circula en un discurso crítico. ¿Cómo funcionan las operaciones como la cita, la paráfrasis, y
especialmente la cita, en la crítica del código, y cómo constituimos y circulamos esas fuentes
primarias de las que dependen las lecturas secundarias? A continuación, me gustaría realizar una
sustitución:
"¿Cómo deberíamos leer el código?" ->
"¿Cómo leemos el código?"
"¿Cómo leemos el código?" Es la pregunta más generadora y productiva en muchos aspectos. Pone
de relieve nuestras propias prácticas diversas de lectura de códigos, y nos pide que exploremos la
complejidad que en realidad subyace en un estereotipo de "dos culturas" de ur-programmer y ur-
critic alfabetizaciones. También nos invita a ir más allá: "¿Cómo todo el mundo lee el código?",
Sugiere que analicemos la miríada de formas en que la crítica del código ya existe "en la
naturaleza", fuera de las categorías disciplinarias.
Déjame comenzar desde el principio.
Código, pero Críticamente
La Semana 1 se ubicó brevemente en Critical Code Studies en relación con la reciente aparición de
un conjunto de áreas interdisciplinarias de investigación superpuestas, que incluyen estudios de
software, estudios de plataforma, estudios de hardware y, por supuesto, estudios de código crítico.
Pero, ¿cuál es nuestra situación más general?
¿Por qué "Estudios de Código Críticos", a diferencia de "Estudios de Código"? ¿Es solo un
marcador de diferencia, que distingue un campo abierto de nueva exploración interdisciplinaria,
donde los "Estudios de código" podrían confundirse con los paradigmas establecidos de la
ingeniería de software y la informática?
Sin embargo, el término "crítico" sugiere su propio paradigma establecido. Critical * Studies es una
plantilla phrasal popular (o tal vez snowclone) en la academia, particularmente en la creación de
nuevos subcampos de estudios culturales. Entonces, por ejemplo, en el caso de los Estudios de
Discapacidad Crítica o Estudios Críticos de Terrorismo, el crítico (que aparentemente no solo
estudia, pero lo hace críticamente) se distingue del presunto punto interno de un profesional de
dominio predeterminado: el experto médico en discapacidad , el agente del gobierno en el
terrorismo, el programador en el código y así sucesivamente. Leído en esta luz, "Critical Code
Studies" sugiere un gran mapeo de una cultura del conocimiento en otra: algunas prácticas de
comentario textual hermenéutico, quizás tomadas directamente de las humanidades o las artes, y
luego mapeadas en el dominio de la programación en ingeniería de software y Ciencias de la
Computación.
If code is territory, does the philosophy of mathematics hold dominion over it, while the
huddled hermeneutic masses yearn to breathe free? Conversely, does the imperialist culture
of continental philosophers seek to invade and colonize code’s virgin soil, displacing its
native culture?
What counts as a productive relationship to code, or to reading in general? What constitutes
a dangerous relationship? Who is qualified to be productive? …and why must all you people
from [$OpposingSide] insist on devaluing my modes of literacy, especially when you
haven’t even tried to understand them?
In my own background, I’m reminded in many ways of the recent emergence of the “Narratology
vs. Ludology” debates in Game Studies. These debates were sometimes productive conversations
about the key terms of a new endeavor. Yet, at their most heated, they tended to obscure the diverse
and subtle positions of participants. The problem with a “two cultures” frame is that the insertion of
a “versus” hides the rich interdisciplinarity of a community by posing a false choice: which of two
sides will emerge victorious and thereafter be allowed to speak?
Literacy -> Literacies
My original draft preparation for this assembly traced connecting lines from scholarly publishing
culture towards software engineering culture, undertaking a set of heuristic or syllogistic
explorations to imagine what a productive code criticism culture might look like, moving from the
big issues down to the nuts-and-bolts level of the code snippet:
Reference: What are the paratextual and intertextual conventions or archival infrastructures
needed to support code availability that might keep a critical work comprehensible over
time? What are the contextual and intertextual demands of that fact that code meaning is
increasingly situated within complex and rapidly evolving platform ecosystems, whether
across the operating system or the network? For example, is a complete emulation image of
an appropriate configured Windows machine circa 2001 necessary to truly understand the
AnnaKournikova worm? Is a complete copy of the Google PageRank algorithm (or indeed
Google’s data cloud) necessary to understand a search engine artwork which makes use of
Google APIs?
Citation: How and what do we cite when we use code (as opposed to or in addition to
software) as a primary source in a publication? What are the issues specific to code about
versions and their production and reception that should be reflected in citation style?
Quotation: What are the basic principles of significance and selection? What are useful
strategies and conventions for excerpting (e.g. ellipses, explicit substitution, editorial
comment, etc.)? What are the forms of paraphrase, through pseudocode, documentation,
description, or otherwise? Where are they appropriate and how should they be signaled? Is
Text : Quotation :: Code : Snippet? How?
Illustration: When does illustration become necessary, in response to code environment
paradigms (e.g. patch programming or weird languages) or affordances (e.g. syntax
highlighting, folding, search, or visualization)? What are the forms of illustration useful for
code, whether screenshots, video clip, executable applets, emulation snapshot etc.?
This a priori exploration can of course be performed in the opposite direction as well, a posteriori.
We could start with the conventions of speaking about code that already circulate in global
discourse that both is code and is about code - the history and culture of the documentation, diffs,
snippets, pseudocode, proofs, and paraphrase that already make up part of the evolving literacies of
programming textbooks, computer science articles, and code forums. Just as humanists are not
inventing the idea of reading code critically, scholars are not inventing the idea of a textual
apparatus around code - but everyone has much they could gain from and contribute to
understanding code.
The act of imagining multiple reading communities and concerns in relationship to code is
beneficial to all. Insisting on the power and importance of practical fluency in programming does
not disenfranchise the cultural critic. Similarly, evocative readings of keywords and their poetics or
cultural overdeterminations do not displace the authority of the pragmatic programmer. Finally,
there is not a spectrum of two literacies - there are myriad literacies that are not mutually exclusive.
Código para dos culturas?
Por supuesto, mi invocación de la metáfora del "mapeo" simplifica enormemente el proyecto de
CCS y sus participantes, y también lo hace de una manera que implica un tipo de violencia
territorial. ¿El código es un territorio en absoluto? No elijo creerlo, pero estoy sacando la idea
porque parece estar implícita en varios debates que ya se repiten regularmente en torno a CCS,
muchos enmarcados en términos de culturas de poder disciplinario:
Si el código es territorio, ¿la filosofía de las matemáticas tiene dominio sobre él, mientras que las
masas herméticas acumuladas anhelan respirar libremente? Por el contrario, ¿la cultura imperialista
de los filósofos continentales busca invadir y colonizar el suelo virgen del código, desplazando a su
cultura nativa?
¿Qué cuenta como una relación productiva con el código, o con la lectura en general? ¿Qué
constituye una relación peligrosa? ¿Quién está calificado para ser productivo? ... y ¿por qué toda la
gente de [$ OpposingSide] insiste en devaluar mis modos de alfabetización, especialmente cuando
ni siquiera has intentado comprenderlos?
En mi propio contexto, recuerdo de muchas maneras la reciente aparición de los debates sobre
"Narratología vs. Ludología" en Game Studies. Estos debates a veces fueron conversaciones
productivas sobre los términos clave de un nuevo esfuerzo. Sin embargo, en su forma más
acalorada, tendían a oscurecer las posiciones diversas y sutiles de los participantes. El problema con
un marco de "dos culturas" es que la inserción de un "versus" oculta la rica interdisciplinariedad de
una comunidad al plantear una elección falsa: ¿cuál de los dos bandos saldrá victorioso y luego se le
permitirá hablar?
Alfabetización -> Alfabetizaciones
Mi borrador original de preparación para esta asamblea trazó líneas de conexión entre la cultura
editorial erudita y la cultura de la ingeniería de software, emprendiendo un conjunto de
exploraciones heurísticas o silogísticas para imaginar cómo podría ser una cultura de crítica de
código productiva, pasando de los grandes temas a las nueces. -bolts nivel del fragmento de código:
Referencia: ¿Cuáles son las convenciones paratextuales e intertextuales o las infraestructuras de
archivo necesarias para soportar la disponibilidad del código que podría mantener un trabajo crítico
comprensible a lo largo del tiempo? ¿Cuáles son las demandas contextuales e intertextuales de ese
hecho de que el significado del código se encuentra cada vez más dentro de ecosistemas de
plataforma complejos y en rápida evolución, ya sea a través del sistema operativo o la red? Por
ejemplo, ¿es necesaria una imagen de emulación completa de una máquina Windows configurada
adecuada alrededor del año 2001 para comprender realmente el gusano AnnaKournikova? ¿Es
necesaria una copia completa del algoritmo del PageRank de Google (o de la nube de datos de
Google) para comprender una obra de arte del motor de búsqueda que hace uso de las API de
Google?
Citación: ¿Cómo y qué citamos cuando utilizamos el código (en oposición o además del software)
como fuente principal en una publicación? ¿Cuáles son los problemas específicos del código sobre
las versiones y su producción y recepción que deberían reflejarse en el estilo de las citas?
Cita: ¿Cuáles son los principios básicos de significación y selección? ¿Cuáles son las estrategias y
convenciones útiles para el fragmento (por ejemplo, elipsis, sustitución explícita, comentario
editorial, etc.)? ¿Cuáles son las formas de paráfrasis, a través de pseudocódigo, documentación,
descripción u otras? ¿Dónde son apropiados y cómo deben ser señalados? Es texto: Cotización ::
Código: ¿fragmento? ¿Cómo?
Ilustración: ¿Cuándo se vuelve necesaria la ilustración en respuesta a los paradigmas del entorno de
código (por ejemplo, programación de parches o idiomas extraños) o permitidos (por ejemplo,
resaltado de sintaxis, plegado, búsqueda o visualización)? ¿Cuáles son las formas de ilustración
útiles para el código, ya sean capturas de pantalla, videoclip, applets ejecutables, instantáneas de
emulación, etc.?
Esta exploración a priori también puede realizarse en la dirección opuesta, a posteriori. Podríamos
comenzar con las convenciones de hablar sobre el código que ya circula en el discurso global, que
es tanto código como código. La historia y la cultura de la documentación, diffs, snippets,
pseudocode, pruebas y paráfrasis que ya forman parte del alfabetización en evolución de libros de
texto de programación, artículos de informática y foros de códigos. Así como los humanistas no
están inventando la idea de leer el código de manera crítica, los estudiosos no están inventando la
idea de un aparato textual alrededor del código, pero todos tienen mucho de lo que podrían
beneficiarse y contribuir a la comprensión del código.
El acto de imaginar comunidades de lectura múltiple y las preocupaciones en relación con el código
es beneficioso para todos. Insistir en el poder y la importancia de la fluidez práctica en la
programación no priva de derechos a la crítica cultural. De manera similar, las lecturas evocadoras
de palabras clave y sus poéticas o sobredeterminaciones culturales no desplazan la autoridad del
programador pragmático. Finalmente, no hay un espectro de dos alfabetizaciones: hay innumerables
alfabetizaciones que no son mutuamente excluyentes.
Make no mistake - people (and not just professional programmers or techno-critics or industry
gurus) already read code critically. They argue about whether the code is functional, but also
whether the code is virtuous or deceitful, conscientious or negligent, egalitarian or discriminatory.
People debate whether a single piece of code represents either a global warming hoax conspiracy or
the messy work of legitimate science. They treat code archives as business-lead opportunities, and
post online shopping-cart exploit code as a way of fighting the man. They claim that code legibility
is akin to a fundamental human right - or they claim that the act of changing code itself is akin to a
mortal sin against the almighty creator. People bring audiences together around performances that
dip in and out of reading code. These discourses don’t represent an illiterate or vulgar culture at the
periphery of core programming culture, either - they are the very heart of literate programming.
Groklaw began as way for programmers and legal experts to combine expertise in the history of
UNIX source code with a partisan intervention in a contentious lawsuit - an expertise
crowdsourcing in response to the massive exhibition of code as evidence. “Forks” are often code
civil wars, in which a code writing community splits along lines of functionality, but also aesthetics,
personality, and working culture.
What can we learn from these readings? What techniques and perspectives can we offer that would
best serve both ourselves and our home disciplines, and also these communities?
One category of people that read from a critical insider position are collaborators. Working with
others on developing large-scale software projects supposes that there are readers who will be
looking at the code with intense and complicated personal interests including livelihood and
professional status. Coding ethos is often directed towards these collaborations, such that the style
of variable names, the size of functions or the granularity of objects are all subjects of critique and
the means by which underlying thoughts are expressed - the subtext of the code. The grammar of
code can be structured by external authorities - a senior project programmer - or the conventions of
the company. Eccentric coding, which might provide more meaningful cultural readings, is often
expunged from the code by the collaborative processes. While there is personal code, much of what
is running reality is authored by a corporate body. The social schemes by which these bodies are
organized around the development of the immaterial code, including the diversity of physical
presence relationships between authors, would seem to be important.
Reply by Jeremy Douglass on February 8, 2010 at 6:24pm
Your distinction between eccentric “personal” code and collective / corporate “impersonal” code
resonates well with the Debunking Climategate video claim that the idiosyncratic and
unprofessional naming, formatting, and documentation of the code should be considered differently
because it was an individual effort that was never meant to be read outside a very small group.
I like how your suggestion points us towards many other ways of talking about interpersonal code -
for example, the code that results from Pair Programming methodologies, or the code culture that
arises from a collective writing code that will be read or reviewed either by or in light of the views
of one dominant personality - e.g. a high-ranking member of the Linux kernel team, or Steve Jobs.
Reply by Angela Ferraiolo on February 9, 2010 at 8:28am
While there is personal code, much of what is running reality is authored by a corporate body.
This is an interesting point. The corporate body is likely to have a profound effect on code style. For
example: What is the effect of adopting best practices? How are those practices decided and agreed
upon, by whom, and in what ways are they ‘best’? Who is privileged? Who is disadvantaged? What
do nondisclosure agreements do to code styles? How do corporate cultures give rise to the private
languages of proprietary code? (Actually, the rationales programmers give for resisting or accepting
work in proprietary languages is sort of illuminating, isn’t it?) What can we deduce about a culture
from the code it favors and the code styles it creates? For instance, what was happening in our
society at the time programmers began to see object-oriented programming as desirable? What kind
of a society and production environment would favor object-oriented programming over other
approaches or paradigms? How are people who can’t or don’t move on to the new paradigm treated
within the community?
Reply by Evan Buswell on February 9, 2010 at 9:08am
How do corporate cultures give rise to the private languages of proprietary code?
I’m not sure if this is what you meant, but actually “private language” is exactly what I’m thinking
of regarding the “best practices” and other constraints that programmers have from corporate
bodies. Writing within such an environment is like writing with a private language; sure, deviation
would compile, but it’s still ungrammatical. Like to it your ability to parse this sentence. These
traditions are usually bound to particular languages as well, e.g. you would name an object in Java
as “theObject,” but in Perl it would probably be called “the_object.”
In some sense, though, coding is *always* the creation of private languages, insofar as the majority
of function calls, variables, etc. in a large program are going to be things you’ve named yourself. I
think that’s a big reason for open source; a programmer spends all this time making a language and
then they want to talk with other people using that language. They want to build a community that
can read and write in their language.
Una categoría de personas que leen desde una posición privilegiada crítica son colaboradores.
Trabajar con otros en el desarrollo de proyectos de software a gran escala supone que habrá lectores
que mirarán el código con intereses personales intensos y complicados, incluidos los medios de
subsistencia y el estado profesional. El ethos de codificación a menudo se dirige hacia estas
colaboraciones, de modo que el estilo de los nombres variables, el tamaño de las funciones o la
granularidad de los objetos son todos temas de crítica y los medios por los cuales se expresan los
pensamientos subyacentes: el subtexto del código. La gramática del código puede ser estructurada
por autoridades externas, un programador senior de proyectos, o las convenciones de la empresa. La
codificación excéntrica, que podría proporcionar lecturas culturales más significativas, a menudo se
borra del código mediante los procesos de colaboración. Si bien existe un código personal, gran
parte de lo que se está ejecutando en la realidad está escrito por un cuerpo corporativo. Los
esquemas sociales por los cuales estos cuerpos están organizados en torno al desarrollo del código
inmaterial, incluyendo la diversidad de las relaciones de presencia física entre los autores, parecen
ser importantes.
Respuesta de Jeremy Douglass el 8 de febrero de 2010 a las 6:24 p.m.
Su distinción entre el código "personal" excéntrico y el código "impersonal" colectivo / corporativo
resuena bien con el reclamo del video Debunking Climategate de que el nombramiento
idiosincrásico y no profesional, el formateo y la documentación del código deben considerarse de
manera diferente porque fue un esfuerzo individual que fue nunca fue para ser leído fuera de un
grupo muy pequeño.
Me gusta cómo su sugerencia nos señala hacia muchas otras formas de hablar del código
interpersonal, por ejemplo, el código que resulta de las metodologías de programación en pares, o la
cultura del código que surge de un código de escritura colectiva que será leído o revisado por o en
luz de los puntos de vista de una personalidad dominante, por ejemplo un miembro de alto rango del
equipo kernel de Linux, o Steve Jobs.
Respuesta de Angela Ferraiolo el 9 de febrero de 2010 a las 8:28 a.m.
Si bien existe un código personal, gran parte de lo que se está ejecutando en la realidad está escrito
por un cuerpo corporativo.
Este es un punto interesante. Es probable que el cuerpo corporativo tenga un efecto profundo en el
estilo del código. Por ejemplo: ¿Cuál es el efecto de adoptar las mejores prácticas? ¿Cómo se
deciden y acuerdan esas prácticas, por quién y de qué manera son 'las mejores'? ¿Quién es
privilegiado? ¿Quién está en desventaja? ¿Qué hacen los acuerdos de no divulgación para codificar
los estilos? ¿Cómo las culturas corporativas dan lugar a los idiomas privados del código
propietario? (En realidad, los programadores razonantes que dan resistencia o aceptan el trabajo en
lenguajes propietarios es algo esclarecedor, ¿no?) ¿Qué podemos deducir sobre una cultura del
código que favorece y los estilos de código que crea? Por ejemplo, ¿qué estaba pasando en nuestra
sociedad cuando los programadores comenzaron a ver la programación orientada a objetos como
deseable? ¿Qué tipo de sociedad y entorno de producción favorecerían la programación orientada a
objetos sobre otros enfoques o paradigmas? ¿Cómo son las personas que no pueden o no pasan al
nuevo paradigma tratado dentro de la comunidad?
Respuesta de Evan Buswell el 9 de febrero de 2010 a las 9:08 a.m.
¿Cómo las culturas corporativas dan lugar a los idiomas privados del código propietario?
No estoy seguro de si esto es lo que quiso decir, pero en realidad el "lenguaje privado" es
exactamente lo que estoy pensando respecto de las "mejores prácticas" y otras restricciones que los
programadores tienen de los órganos corporativos. Escribir en un entorno así es como escribir con
un lenguaje privado; seguro, la desviación se compilaría, pero aún no es gramatical. Guste su
habilidad para analizar esta oración. Estas tradiciones generalmente también están ligadas a idiomas
particulares, p. nombrarías un objeto en Java como "theObject", pero en Perl probablemente se
llamaría "the_object".
Sin embargo, en cierto sentido, la codificación es * siempre * la creación de lenguajes privados, en
la medida en que la mayoría de las llamadas a funciones, variables, etc. en un programa grande
serán cosas que usted mismo ha nombrado. Creo que esa es una gran razón para el código abierto;
un programador pasa todo este tiempo haciendo un lenguaje y luego quiere hablar con otras
personas que usan ese idioma. Quieren construir una comunidad que pueda leer y escribir en su
idioma.
Also, regarding object-oriented programming, I know that the questions you’re asking have fairly
well-documented answers insofar as the designers of these languages had certain goals in mind, and
they wrote extensively about the social ills that would be cured by OOP. I don’t know too much
about it, but my limited understanding is that the creation of object-oriented languages was a
response to the professionalization of programming. Suddenly, there were really bad programmers
working alongside really good ones, and modularity and encapsulation were needed so that the lead
programmers could tell the poorly-trained programmers: “You go work on this, and I’m not going
to think about how badly coded it is. I know you can’t mess with my code.” Of course, the
genealogy and the present rationale are two different things.
Reply by Jeremy Douglass on February 9, 2010 at 9:47am
On the topic of the difference between the code being legible, idiomatic, or in the house style vs. the
code that compiles and functions but is unconventional or almost illegible - obfuscated
programming contests such as Obfuscated C are one extreme example of this difference. Another
example is the output of decompilers. If you have used a good decompiler, you know that what you
get back is usually functionally similar or identical to the source code that produced the program.
Yet much of the higher level order, structure, and of course the logical connections and emphasis
connoted by naming are stripped away and replaced with a kind of foo bar baz gumbo. Really good
decompilers use a variety of techniques to try to add context and meaning back in, but without
properly named parts and a narrative of functionality, decompiled code often looks like the
machine’s own private language - or just a bag of full of gears.
Reply by David Shepard on February 10, 2010 at 6:00pm
To add to your point, Evan, I think that the audience of code changes because what we think of as
the “progressive” path of programming paradigm production (that alliteration was intentional) isn’t
as linear as we think. What I think of as the major programming paradigms, structured
programming and object-oriented programming, were technologically feasible long before they
were widely adopted. For example, we attribute the invention of structured programming to Edsger
Dijkstra in the mid-1960s, but the language constructs that enable it (like defining functions with
specific input and one exit point, and only access to local variables) were available in the second
draft of the FORTRAN language specification from the mid-1950s, which apparently Dijkstra had
nothing to do with. Object-oriented programming was invented by Alan Kay in the mid-1960s (or
so the story goes), but was not widely adopted until the 1990s, and even the first version of the
MOSAIC web browser was written in non-OOP C. It seems to me that OOP as a house style didn’t
really become that until Java.
The reasons I’ve heard proposed for the rise of OOP is that businesses adopted it to manage
workflow (and thus smooth out the idiosyncrasies of managing large teams of programmers); it was
a tool of management against labor. This is a thesis I’ve partially synthesized from Maurice J.
Black’s Art of Code and Ziv Neeman’s Building Profit-Power into this Electronic Brain, and Linux
devotees who praise structured programming over OOP. One example the devotees’ point to is that
the UNIX/Linux X windows windowing system wasn’t originally object-oriented. Oddly, though,
the Windows 95 API was not object-oriented, nor were later versions until at least 2002. For
example, to create a new window, the programmer calls the CreateWindow() function rather than,
say, instantiating a new WinAPIWindow object. The programmer also must define WinMain() and
WindowProcedure functions in the global namespace, rather than, say, extending a hypothetical
WinApplication class and extending the member WinMain and WindowProcedure methods (I’m
getting this from the following tutorial: http://www.relisoft.com/win32/winnie.html). So suggesting
that it’s a matter of trying to isolate coders from sensitive system functions doesn’t seem like the
real purpose when the company largely blamed for enforcing this separation seems not to have been
particularly keen to enforce the OOP paradigm on application developers.
The technological problem OOP seems to have been most successful in solving is abstraction from
hardware, which is a corporate problem of market reach - that is, having to develop software for
multiple platforms costs more than developing a single version. OOP seems to have reached its
apex with Java, in which programs themselves are classes instantiated by the JVM when it loads.
Java itself was created to free the programmer from having to negotiate the differences between
Windows and Macs, or Sony and RCA DVD players. Microsoft .NET is designed to do the same,
and in .NET, Windows applications do use an OOP API.
Además, con respecto a la programación orientada a objetos, sé que las preguntas que hace tienen
respuestas bastante bien documentadas en la medida en que los diseñadores de estos lenguajes
tenían ciertos objetivos en mente, y escribieron extensamente sobre los males sociales que serían
curados por OOP . No sé demasiado al respecto, pero mi entendimiento limitado es que la creación
de lenguajes orientados a objetos fue una respuesta a la profesionalización de la programación. De
repente, había programadores realmente malos trabajando junto a los realmente buenos, y se
necesitaban modularidad y encapsulamiento para que los programadores principales pudieran
contarles a los programadores mal entrenados: "Van a trabajar en esto, y no voy a pensar en qué tan
mal codificado es. Sé que no puedes meterme con mi código ". Por supuesto, la genealogía y el
razonamiento actual son dos cosas diferentes.
Respuesta de Jeremy Douglass el 9 de febrero de 2010 a las 9:47 a.m.
Sobre el tema de la diferencia entre el código que es legible, idiomático o en el estilo de la casa
versus el código que compila y funciona, pero que es poco convencional o casi ilegible, los
concursos de programación ofuscados como C ofuscado son un ejemplo extremo de esta diferencia.
Otro ejemplo es la salida de descompiladores. Si ha utilizado un descompilador bueno, sabrá que lo
que obtiene generalmente es funcionalmente similar o idéntico al código fuente que produjo el
programa. Sin embargo, gran parte del orden, la estructura y, por supuesto, las conexiones y el
énfasis lógicos connotados por el nombramiento son eliminados y reemplazados por una especie de
foo bar baz gumbo. Los descompiladores realmente buenos usan una variedad de técnicas para
intentar agregar contexto y significado, pero sin las partes apropiadamente nombradas y una
narrativa de funcionalidad, el código decompilado a menudo se parece al lenguaje privado propio
de la máquina, o simplemente una bolsa llena de engranajes.
Respuesta de David Shepard el 10 de febrero de 2010 a las 6:00 p. M.
Para agregar a su punto, Evan, creo que la audiencia de código cambia porque lo que consideramos
como el camino "progresivo" de programación de la producción de paradigmas (que la aliteración
fue intencional) no es tan lineal como creemos. Lo que considero como los principales paradigmas
de programación, programación estructurada y programación orientada a objetos, fueron
tecnológicamente factibles mucho antes de que fueran ampliamente adoptados. Por ejemplo,
atribuimos la invención de la programación estructurada a Edsger Dijkstra a mediados de la década
de 1960, pero las construcciones de lenguaje que lo permiten (como definir funciones con entrada
específica y un punto de salida, y solo acceso a variables locales) estaban disponibles en la segunda
borrador de la especificación del lenguaje FORTRAN de mediados de la década de 1950, que
aparentemente Dijkstra no tuvo nada que ver. La programación orientada a objetos fue inventada
por Alan Kay a mediados de la década de 1960 (o eso dice la historia), pero no fue ampliamente
adoptada hasta la década de 1990, e incluso la primera versión del navegador web MOSAIC fue
escrita en un PC no O. me parece que OOP como un estilo de casa realmente no se convirtió en eso
hasta Java.
Las razones que he escuchado proponer para el aumento de OOP es que las empresas lo adoptaron
para administrar el flujo de trabajo (y así suavizar la idiosincrasia de administrar grandes equipos de
programadores); era una herramienta de gestión contra el trabajo. Esta es una tesis que he
sintetizado en parte de Art of Code de Maurice J. Black y Building Profit-Power de Ziv Neeman en
este Electronic Brain, y devotos de Linux que elogian la programación estructurada sobre OOP. Un
ejemplo que los devotos señalan es que el sistema de ventanas de Windows X de UNIX / Linux no
estaba orientado originalmente a objetos. Curiosamente, sin embargo, la API de Windows 95 no
estaba orientada a objetos, ni tampoco versiones posteriores hasta al menos 2002. Por ejemplo, para
crear una nueva ventana, el programador llama a la función CreateWindow () en lugar de, por
ejemplo, instanciar un nuevo objeto WinAPIWindow . El programador también debe definir las
funciones WinMain () y WindowProcedure en el espacio de nombres global, en lugar de, por
ejemplo, extender una clase WinApplication hipotética y extender los métodos miembros WinMain
y WindowProcedure (obtengo esto del siguiente tutorial: http: // www .relisoft.com / win32 /
winnie.html). Por lo tanto, sugerir que se trata de aislar a los programadores de las funciones del
sistema no parece ser el verdadero propósito cuando la empresa en gran parte culpable por imponer
esta separación parece no haber sido especialmente entusiasta para aplicar el paradigma de OOP en
los desarrolladores de aplicaciones.
El problema tecnológico que OOP parece haber tenido más éxito en resolver es la abstracción del
hardware, que es un problema corporativo de alcance de mercado, es decir, tener que desarrollar
software para plataformas múltiples cuesta más que desarrollar una sola versión. OOP parece haber
llegado a su ápice con Java, en el que los propios programas son clases creadas por la JVM cuando
se carga. La propia Java se creó para liberar al programador de tener que negociar las diferencias
entre Windows y Mac, o los reproductores de DVD Sony y RCA. Microsoft .NET está diseñado
para hacer lo mismo, y en .NET, las aplicaciones de Windows sí usan una API OOP.
But, just because we think of OOP as the dominant programming paradigm now, the creation of a
dominant paradigm generally seems to lead to the rebirth of simpler programming paradigms.
Structured programming was adopted on the System 360 project in the 1960s and 1970s, but most
early PCs came with a BASIC interpreter on a chip, which on IBM clones was later folded into the
software level in MS-DOS. These versions of BASIC, as anyone with affectionate memories of
programming Apple II computers will remember, did not allow structured programming. Structured
BASIC really didn’t become popular until QBasic and Visual Basic, which later came with DOS.
PC applications were written mostly in C, BASIC, or Assembler.
Additionally, Java was supposed to be the major web language, but has lost ground to PHP. PHP’s
innovation (some would say its greatest annoyance) is its ease of use and its reversion to relatively
unstructured programming, which seems technologically regressive. Writing a Java web app
requires extending a base HTTPServlet class at the minimum and enforces strict separation of code,
content, and data, while PHP allows web app development to be done with function calls inlined in
HTML. Up until PHP 5, PHP’s OOP had been fairly weak, and it continues to be much less
developed than Java’s. PHP has become probably the dominant web language because of its
simplicity, and because the alternatives (Java, .NET, Python, and PERL) generally require
significantly more work for even simple apps. Thus, Wordpress, Joomla, Moodle, and most web
software (maybe even Ning?) use PHP. So we have a programming language that is technologically
regressive (a vague concept perhaps, but one that seems useful against the many “evolutionary”
accounts of technology) that wins out because of its simplicity. While OOP is the dominant
paradigm on desktop applications and in some web applications, a language intended to free the
programmer from having to think in those paradigms became popular.
I’m beginning to theorize that programmers seem to envy unstructured programming and therefore
create tools that allow them to write less structured code, like PHP or LINQ. Languages that
simplify a common task by integrating previously-separated concerns (as PHP simplifies web
programming by mixing presentation, logic, and data access) inevitably adopt more complex
features because their simplicity makes more complex tasks possible. Programming language
development seems like an ouroboros: adding more features to manage more complexity eventually
creates a language so unmanageable that an additional layer of abstraction is added which allows
this complexity to be managed more easily.
Reply by Jeremy Douglass on February 11, 2010 at 2:20pm
David,
Thanks for these observations on object-oriented programming. From what little I know about how
various partisans narrate the history of programming languages differently (including contested
origin dates, different generational schemes and family trees, etc.) I’m a bit nervous about broad
claims on programming evolution, for the same reason I’m initially nervous about broad
explanations of, for example, German vs. French aesthetics. I’m not saying such things can never be
useful, I just feel more comfortable when they proceed carefully, driven by specifics.
But to be more specific to your thoughts on OOP: if evolution is a biological metaphor about
fitness, it isn’t clear to me how a web scripting language like PHP could be said to exhibit
evolutionary regression unless it lost OOP features that it once had. Whose regression is also
important. If we are talking about a few internal developers and the languages they had used in their
lives, we might get one story, but if we are talking about public release to a development
community, another. For example, Sun Java was publicly released in May 1995, PHP was released
in June 1995, and many developers in their initial surges were coming to them from all over the
map, including cutting their teeth on programming / scripting for the very first time with them.
A more general idea I take from your points is that we should look to historians of computer
languages to see what useful economic, cultural, political and ethnographic work they have done (or
haven’t done) that connects to the language itself, and how it might be used from or inform a CCS
perspective.
Reply by Max Feinstein on February 11, 2010 at 12:29pm
We have a programming language [PHP] that is technologically regressive (a vague concept
perhaps, but one that seems useful against the many ‘evolutionary’ accounts of technology) that
wins out because of its simplicity.
Pero, solo porque ahora pensamos en OOP como el paradigma de programación dominante, la
creación de un paradigma dominante generalmente parece conducir al renacimiento de paradigmas
de programación más simples. La programación estructurada se adoptó en el proyecto System 360
en las décadas de 1960 y 1970, pero la mayoría de las PC iniciales incluían un intérprete BASIC en
un chip, que en clones de IBM se dobló posteriormente al nivel de software en MS-DOS. Estas
versiones de BASIC, como recordará cualquier persona con recuerdos afectivos de la programación
de las computadoras Apple II, no permitieron la programación estructurada. El BASIC estructurado
realmente no se hizo popular hasta QBasic y Visual Basic, que luego vino con DOS. Las
aplicaciones para PC se escribieron principalmente en C, BASIC o Assembler.
Además, se suponía que Java era el principal lenguaje web, pero ha perdido terreno ante PHP. La
innovación de PHP (algunos dirían que es su mayor molestia) es su facilidad de uso y su reversión a
una programación relativamente desestructurada, que parece tecnológicamente regresiva. Escribir
una aplicación web Java requiere extender al mínimo una clase HTTPServlet base e impone
estrictas separaciones de código, contenido y datos, mientras que PHP permite que el desarrollo de
la aplicación web se realice con llamadas a funciones inlineadas en HTML. Hasta PHP 5, el OOP de
PHP había sido bastante débil, y continúa siendo mucho menos desarrollado que el de Java. PHP se
ha convertido probablemente en el lenguaje web dominante por su simplicidad, y porque las
alternativas (Java, .NET, Python y PERL) generalmente requieren mucho más trabajo incluso para
aplicaciones simples. Por lo tanto, Wordpress, Joomla, Moodle y la mayoría del software web (¿tal
vez incluso Ning?) Usan PHP. Entonces, tenemos un lenguaje de programación que es
tecnológicamente regresivo (un concepto vago tal vez, pero que parece útil en comparación con los
muchos recuentos "evolutivos" de la tecnología) que gana debido a su simplicidad. Mientras que
OOP es el paradigma dominante en aplicaciones de escritorio y en algunas aplicaciones web, un
lenguaje destinado a liberar al programador de tener que pensar en esos paradigmas se hizo popular.
Estoy empezando a teorizar que los programadores parecen envidiar la programación no
estructurada y, por lo tanto, crean herramientas que les permiten escribir código menos estructurado,
como PHP o LINQ. Los lenguajes que simplifican una tarea común al integrar preocupaciones
previamente separadas (ya que PHP simplifica la programación web al mezclar la presentación, la
lógica y el acceso a los datos) inevitablemente adoptan características más complejas porque su
simplicidad posibilita tareas más complejas. El desarrollo del lenguaje de programación parece un
ouroboros: agregar más funciones para administrar más complejidad finalmente crea un lenguaje
tan inmanejable que se agrega una capa adicional de abstracción que permite administrar esta
complejidad más fácilmente.
Respuesta de Jeremy Douglass el 11 de febrero de 2010 a las 2:20 p.m.
David,
Gracias por estas observaciones sobre la programación orientada a objetos. De lo poco que sé sobre
cómo varios partidarios narran la historia de los lenguajes de programación de manera diferente
(incluyendo fechas de origen impugnadas, diferentes esquemas generacionales y árboles
genealógicos, etc.) estoy un poco nervioso acerca de las afirmaciones amplias sobre la evolución de
la programación, por la misma razón Al principio estoy nervioso por las amplias explicaciones de,
por ejemplo, la estética alemana vs. la francesa. No digo que tales cosas nunca puedan ser útiles,
solo me siento más cómodo cuando proceden con cuidado, guiados por detalles.
Pero para ser más específico a sus pensamientos sobre POO: si la evolución es una metáfora
biológica sobre la aptitud, no me queda claro cómo podría decirse que un lenguaje de scripting web
como PHP exhibe regresión evolutiva a menos que pierda las características de OOP que una vez
tuvo . Cuya regresión también es importante. Si hablamos de unos pocos desarrolladores internos y
los idiomas que han utilizado en sus vidas, podríamos obtener una historia, pero si hablamos de
publicación pública para una comunidad de desarrollo, otra. Por ejemplo, Sun Java fue lanzado al
público en mayo de 1995, PHP fue lanzado en junio de 1995, y muchos desarrolladores en sus
oleadas iniciales llegaron a ellos de todo el mapa, incluyendo por primera vez con la programación /
scripting ellos.
Una idea más general que tomo de sus puntos es que debemos mirar a los historiadores de los
lenguajes de computadora para ver qué trabajo económico, cultural, político y etnográfico útil han
realizado (o no han hecho) que se conecta al lenguaje en sí, y cómo se puede usar desde o informar
una perspectiva de CCS.
Respuesta de Max Feinstein el 11 de febrero de 2010 a las 12:29 p.m.
Tenemos un lenguaje de programación [PHP] que es tecnológicamente regresivo (quizás un
concepto vago, pero que parece útil en comparación con los muchos recuentos "evolutivos" de la
tecnología) que gana por su simplicidad.
Perhaps the prevalence of PHP re-writes the definition of technological progress, so the term not
only considers how powerful a language may be (e.g., the presence or absence of comprehensive
OOP support) but also measures its accessibility and easy of use. Instead of using functionality as
the primary gauge for a language’s technological power, we might equally consider the benefits
ushered in by a language’s ability to mix previously independent entities, as you’ve shown that PHP
does with presentation, logic, and data access. Framing languages in this light could add yet another
dimension to CCS by providing new ways to think about programs, or in this case, programming
languages, and how they evolve over time according to the needs and desires of those who work
with code. You’ve already alluded to this idea with the suggestive term “evolutionary accounts,” so
maybe we can expand on it by enumerating the accounts other than technological progress. Such an
exercise might be beneficial for the CCSWG, especially in the context of code critiques.
I’d also like to shed some more light on the distinction between personal and corporate code.
Sheldon brought up this topic when he said “eccentric coding, which might provide more
meaningful cultural readings, is often expunged from the code by the collaborative processes. While
there is personal code, much of what is running reality is authored by a corporate body.” I suggest
that the distinction between eccentric and corporate is less clear than what has been noted already.
For example, in my list of candidates for code critiques, I’ve included a portion of the Windows NT
source code, which was leaked from Microsoft in 2004. The leak gained notoriety not only because
of the proprietary nature of Microsoft code (and most other corporate code), but also because of the
eccentric commentary woven throughout the entire piece of software. Take a peak at this kuro5hin
article that critically reads segments of the leaked code. It’d be great to get our hands on more
corporate code, but that seems to be a practically unattainable ideal.
Reply by Andrew Davis on February 23, 2010 at 3:17pm
It is rarely true that a corporate dialect is somehow a community wisdom or summation of best
practices within a corporation. Dialects rarely evolve within a corporation in my experience. The
ever-present risk factor for a change of dialect inserting bugs or the additional work for already late
software developers just doesn’t let large dialect changes make it over the code critic hill.
In a meager sampling of 6 corporations, all corporate dialects were the work of one or two members
of the first team of engineers in the first month of a corporation or major new project. I was ‘that
guy’ at 3 of those 6 corporations. I write down a list of best practices, garnered from the previous N-
1 corporations and that becomes the corporate standard. Sure, if it had been garbage, the
engineering code critics would have done their job and buried the initiative. But the critics rarely
added content to the dialect themselves.
Although this fiat style might be assumed, it rarely works out as the reason code in a corporation
looks homogeneous. Very few engineers look at a coding guide, style guide, or dialect direction at
any point in their first 6 months of a new job. Generally code is stolen, borrowed, referenced, lib-
ified, etc. So, the coding style of the most prolific programmer quickly becomes the de facto
standard. So, the first set of engineers on a project ‘win’ and get to lay down fresh tracks of code in
once empty files as well as setting the standard for a corporate dialect.
Reply by Mark Marino on February 12, 2010 at 11:44am
David,
Have you read Wolfgang Hagen’s “The Style of Sources,” from Wendy Chun and Thomas Keenan’s
edited volume, old media, new media? It seems like a text that would provide some fodder for this
line of argument. Hagen (as translated by Peter Krapp) sums up his thesis as:
for decades, the arche-structure of the von Neumann machine did not reveal that this machine
would be more than a new calculator, more than a mighty tool for mental labor, namely a new
communications medium [which I believe Lev picks up in his new manuscript]. The development
of FORTRAN demonstrates all too clearly how the communication-imperative was called on the
machine from all sides. The imperative call obviously could not be detected in the arche-structure of
the machine itself. It grew out of the Cold War, out of the economy, out of the organization of labor,
perhaps out of the primitive numeric seduction the machines exerted, out of the numbers game, out
of a game with digits, placeholders, fort/da mechanisms, and the whole quasi-linguistic quid pro
quo of the interior surface of all these source. (173)
Tal vez la prevalencia de PHP vuelve a escribir la definición de progreso tecnológico, por lo que el
término no solo considera qué tan poderoso puede ser un lenguaje (por ejemplo, la presencia o
ausencia de soporte OOP integral), sino que también mide su accesibilidad y facilidad de uso. En
lugar de utilizar la funcionalidad como indicador principal del poder tecnológico de un idioma,
también podríamos considerar los beneficios que la habilidad de un idioma tiene para mezclar
entidades previamente independientes, como lo ha demostrado con la presentación, la lógica y el
acceso a los datos. Enmarcar los lenguajes desde esta perspectiva podría agregar una nueva
dimensión a CCS al proporcionar nuevas formas de pensar acerca de los programas, o en este caso,
los lenguajes de programación, y cómo evolucionan con el tiempo según las necesidades y deseos
de quienes trabajan con el código. Ya ha aludido a esta idea con el sugerente término "cuentas
evolutivas", por lo que tal vez podamos ampliarlo enumerando las cuentas distintas del progreso
tecnológico. Tal ejercicio podría ser beneficioso para el CCSWG, especialmente en el contexto de
las críticas del código.
También me gustaría arrojar más luz sobre la distinción entre el código personal y corporativo.
Sheldon sacó a relucir este tema cuando dijo que "la codificación excéntrica, que podría
proporcionar lecturas culturales más significativas, a menudo es borrada del código por los procesos
de colaboración. Si bien existe un código personal, gran parte de lo que está sucediendo en la
realidad está escrito por un cuerpo corporativo. "Sugiero que la distinción entre excéntrico y
corporativo es menos clara que lo que ya se ha señalado. Por ejemplo, en mi lista de candidatos para
críticas de código, he incluido una parte del código fuente de Windows NT, que se filtró de
Microsoft en 2004. La filtración ganó notoriedad no solo debido a la naturaleza patentada del
código de Microsoft (y la mayoría otro código corporativo), pero también debido a los comentarios
excéntricos tejidos en toda la pieza de software. Haga un pico en este artículo kuro5hin que lee
críticamente segmentos del código filtrado. Sería genial tener en nuestras manos más código
corporativo, pero parece ser un ideal prácticamente inalcanzable.
Respuesta de Andrew Davis el 23 de febrero de 2010 a las 3:17 p.m.
Rara vez es cierto que un dialecto corporativo sea de alguna manera una sabiduría de la comunidad
o una suma de las mejores prácticas dentro de una corporación. Los dialectos raramente
evolucionan dentro de una corporación en mi experiencia. El factor de riesgo omnipresente para un
cambio de dialecto que inserta errores o el trabajo adicional para desarrolladores de software que ya
están avanzados no permite que los grandes cambios dialectales superen el límite crítico del código.
En una muestra exigua de 6 corporaciones, todos los dialectos corporativos fueron obra de uno o
dos miembros del primer equipo de ingenieros en el primer mes de una corporación o un nuevo
proyecto importante. Yo era 'ese tipo' en 3 de esas 6 corporaciones. Escribo una lista de mejores
prácticas, obtenida de las anteriores corporaciones N-1 y que se convierte en el estándar
corporativo. Claro, si hubiera sido basura, los críticos del código de ingeniería habrían hecho su
trabajo y enterrado la iniciativa. Pero los críticos rara vez agregaron contenido al dialecto en sí
mismos.
Aunque este estilo fiduciario podría suponerse, rara vez funciona ya que el código de razón en una
corporación parece homogéneo. Muy pocos ingenieros miran una guía de codificación, una guía de
estilo o una dirección dialectal en cualquier momento de los primeros 6 meses de un nuevo trabajo.
En general, el código es robado, prestado, referenciado, libido, etc. Por lo tanto, el estilo de
programación del programador más prolífico se convierte rápidamente en el estándar de facto. Por
lo tanto, el primer grupo de ingenieros en un proyecto 'gana' y consigue establecer nuevas pistas de
código en archivos una vez vacíos, además de establecer el estándar para un dialecto corporativo.
Respuesta de Mark Marino el 12 de febrero de 2010 a las 11:44 a.m.
David,
¿Has leído "El estilo de las fuentes" de Wolfgang Hagen, del volumen editado de Wendy Chun y
Thomas Keenan, viejos medios, nuevos medios? Parece un texto que proporcionaría algo de forraje
para esta línea argumental. Hagen (traducido por Peter Krapp) resume su tesis como:
durante décadas, la arche-estructura de la máquina de von Neumann no reveló que esta máquina
sería más que una nueva calculadora, más que una poderosa herramienta para el trabajo mental, es
decir, un nuevo medio de comunicación [que creo que Lev recoge en su nuevo manuscrito]. El
desarrollo de FORTRAN demuestra con demasiada claridad cómo se invocó el imperativo de
comunicación en la máquina desde todos los lados. La llamada imperativa obviamente no pudo
detectarse en la arche-estructura de la máquina misma. Surgió de la Guerra Fría, fuera de la
economía, fuera de la organización del trabajo, quizás fuera de la seducción numérica primitiva que
las máquinas ejercían, fuera del juego de los números, de un juego con dígitos, marcadores de
posición, mecanismos fort / da , y todo el quid pro quo cuasi-lingüístico de la superficie interior de
todas estas fuentes. (173)
Another search I’ve been trying is “computer code” in various news archives. I didn’t have much
luck in historical databases on Proquest or JSTOR, but Google’s news archive has yielded some
promising results. The search term I started with is “computer code.” The search even provides a
graphical analysis of the distribution of articles over time:
I found this section quoted in this article: “When Efforts To Conceal May Actually Reveal: Whether
First Amendment Protection Of Encryption Source Code and the Open Source Movement Support
Re-Drawing The Constitutional Line Between the First Amendment and Copyright ” by Rod Dixon
in the Columbia Science and Technology Law Review.
The article begins, provocatively enough:
Computer source code is speech-that is the argument advanced by privacy advocates and
cryptographers, who recently obtained the support of the Ninth Circuit in Bernstein vs. United
States.
No doubt, such a claim raises the ears of critics in the room, and this article and this case fall
squarely in the domain of the copyleft debate, though I believe they are instructional here as well.
Obviously, arguments about the nature of code go far beyond the academy, yet what has been
happening in the courts seems to call for the analytic tools we are developing.
The Snuffle case is one we should discuss further, perhaps in code critiques.
Now, originally I planned to call this code in the wild, but it’s not any more. Among the articles
written about this case include one by CCSWG Member: Gabriella Coleman. Her article “Code is
Speech” should definitely be added to our reading list.
Gabriella, do you want to comment a bit about this “code in the wild”?
Are there others who look at legal rulings on code? Do you find much code in it? Recently, an
attorney friend of mine, Sal Kaihani, explained to me that courts like to describe code rather than
read it.
What other examples of code in the wild turn up in legal rulings?
Reply by Gabriella “Biella” Coleman on February 11, 2010 at 7:59pm
The code referred to above may no longer be “in the wild” and we might even say that in some
cases and circumstances code has “gone wild,” exploding beyond its initial public into other
domains, even traveling via the bodies of programmers on their shirts as was the case with DeCSS
and previously chunks of the PGP code.
In terms of other legal arenas where code might appear, something that comes to mind is patent
dispute cases where some company (who is accused of infringing the patent) is ordered to pony up
some code (the software patent, however has no source code, just a general description of process).
I have not followed any of these cases but there must be a number of them. How and in what
capacity do the courts read vs. describe the code to determine infringement would be interesting to
further explore and compare to copyright/free speech cases that deal with code.
Otra búsqueda que he estado tratando es "código de computadora" en varios archivos de noticias.
No tuve mucha suerte en las bases de datos históricas de Proquest o JSTOR, pero el archivo de
noticias de Google ha arrojado algunos resultados prometedores. El término de búsqueda con el que
comencé es "código de computadora". La búsqueda incluso proporciona un análisis gráfico de la
distribución de artículos a lo largo del tiempo:
Of course, Harris was "the programmer" at the time of the leak, but wasn't in fact the author of
much of the code - he was maintaining and attempting to iterate a complex, poorly documented
code base that was written earlier, apparently by Tim Mitchell and/or Mark New. This leads into the
some of the issues about authorship that are so interesting in code - in theory, code development as
practiced in a versioning system affords the opportunity to talk about the collective production of an
idea in a very concrete and fine-grained way. In practice, however, we are often left reading tea-
leaves, even when in the midst of conversations that require algorithmic literacy or programmacy to
navigate them.
Reply by Mark Sample on February 11, 2010 at 8:55pm
Jeremy, thanks for this enormously productive inquiry. Your list of "real code readers" was
especially valuable - it's a reminder that code (like science in general) needn't be left to the coders
(or scientists). As someone who's only dabbled in code, tweaking some PHP here, cursing some ill-
fated Inform attempts there, I can easily find myself out of my depth among the more accomplished
programmers here.
One aspect of your opening lines - when you run through reference, citation, quotation, and
illustration - reminded me (though there was no clear logical reason why it should have done so) of
the four modes of exegesis developed informally by medieval church scholars to read the Bible:
historia (a literal interpretation); allegoria (the allegorical meaning); tropologia (a moral
interpretation); and anagoge (the eschatological interpretation). It's probably the wannabe
medievalist in me, but I wonder if we might borrow from this four-fold sense of exegesis as we read
and teach code. I've always found this rubric of four senses to be quaint at best (in a Northrop Frye
kind of way) and misguided and dangerous at worst. But now I'm thinking there might be
something here we can salvage, even if tangentially or reactionarily.
Respuesta de Hugh Cayless el 11 de febrero de 2010 a las 10:31 a.m.
Hola Jeremy,
Usted me preguntó cuál era mi opinión sobre el código CRU (y su enfoque al respecto), dada mi
evaluación crítica del código annakournikova que Mark publicó como "inepto" y mi conclusión de
que lo más interesante era el contexto social. No estoy preparado para decir que el código CRU es
inepto (no habiendo pasado mucho tiempo revisándolo). Ciertamente no está en el mismo nivel de
incompetencia.
Creo que el código casi debe leerse en contexto. Es muy difícil apreciar correctamente el código sin
una comprensión de lo que está tratando de lograr, por ejemplo, por lo que la (s) motivación (es) del
programador (es) a menudo son importantes. En mi experiencia de codificación, se pierde mucho
tiempo tratando de descubrir los objetivos de los creadores del código heredado. Algunas veces
estos se aclaran en los comentarios, pero más a menudo no.
Pero hay muchos contextos aquí. Veo al programador, en un espacio lo suficientemente seguro que
él / ella (¿conocemos el género del programador? ¿Importa?) Se sintió cómodo expresando
consternación por la complejidad de los datos y su capacidad para manejarlos. Luego tenemos el
contexto político en el que los científicos sabían que estaban operando, y que invadía el espacio
seguro del programador con la exposición de los archivos. Y luego están los diversos análisis que
Jeremy nos ha dado: teórico de la conspiración, "mirada corporativa" (por tomar un buen término de
Evan Buswell) y simpatizante codificador.
Entonces, como con el código annakournikova, el contexto es muy poderoso e interesante. ¿Es más
interesante que el código? ¿Nos arriesgamos a dejar que las capas de contexto oscurezcan nuestra
visión del código? Sospecho que este código merece más atención que el virus.
Respuesta de Jeremy Douglass el 13 de febrero de 2010 a la 1:17 p. M.
Hugh,
Punto muy interesante sobre contextos. En respuesta a su pregunta sobre el género del programador
real, agregaré un poco más de contexto, aunque "¿Importa?" es una muy buena pregunta de
seguimiento. Estoy seguro de que no importa la cuestión de si un conjunto particular de funciones
corresponde (o no) a un modelo predictivo de las tendencias actuales de la temperatura global y sus
consecuencias. Sin embargo, sospecho fuertemente que la identidad del programador importa en el
debate público, ya sea como una construcción imaginada, o como una persona real (aunque todavía
imaginada).
Al hablar sobre el programador CRU, los segundos videos Debunking muestran (00:50) una
caricatura de un acosado programador masculino como suplente, y sospecho que la caricatura
probablemente corresponde a la imagen mental de muchos seguidores del debate.
La identidad de los programadores reales es más simple pero más turbia que en la mayoría de los
casos, donde una base de código fuente abierto o corporativo puede tener cientos o miles de autores,
pero los cambios pueden registrarse con una identidad registrada contra cada cambio. Con CRU, el
programador que obtuvo la mayor atención fue el autor de HARRY_READ_ME, que
probablemente era Ian 'Harry' Harris.
Por supuesto, Harris era "el programador" en el momento de la fuga, pero en realidad no era el autor
de gran parte del código: mantenía e intentaba iterar una base de código compleja y mal
documentada que se escribió anteriormente, aparentemente por Tim Mitchell y / o Mark New. Esto
conduce a algunos de los temas sobre la autoría que son tan interesantes en el código: en teoría, el
desarrollo del código tal como se practica en un sistema de control de versiones ofrece la
oportunidad de hablar sobre la producción colectiva de una idea de una manera muy concreta y
precisa. En la práctica, sin embargo, con frecuencia nos queda leer hojas de té, incluso cuando
estamos en medio de conversaciones que requieren alfabetización algorítmica o programación para
navegar por ellas.
Respuesta de Mark Sample el 11 de febrero de 2010 a las 8:55 p. M.
Jeremy, gracias por esta investigación enormemente productiva. Su lista de "lectores de códigos
reales" fue especialmente valiosa; es un recordatorio de que el código (como la ciencia en general)
no necesita dejarse en manos de los codificadores (o científicos). Como alguien que solo ha
incursionado en el código, modificando algunos PHP aquí, maldiciendo algunos desafortunados
intentos de Inform allí, puedo encontrarme fácilmente fuera de mi profundidad entre los
programadores más logrados aquí.
Un aspecto de tus líneas iniciales, cuando recorres la referencia, cita, cita e ilustración, me recordó
(aunque no había una razón lógica clara por la que debería haberlo hecho) los cuatro modos de
exégesis desarrollados informalmente por los eruditos de la iglesia medieval. lee la Biblia: historia
(una interpretación literal); allegoria (el significado alegórico); tropologia (una interpretación
moral); y anagoge (la interpretación escatológica). Probablemente es el aspirante medievalista en
mí, pero me pregunto si podríamos tomar prestado de este sentido cuádruple de la exégesis a
medida que leemos y enseñamos el código. Siempre he encontrado que esta rúbrica de los cuatro
sentidos es pintoresca en el mejor de los casos (al estilo de Northrop Frye) y equivocada y peligrosa
en el peor. Pero ahora estoy pensando que podría haber algo aquí que podamos salvar, aunque sea
de manera tangencial o reaccionaria.
I certainly don’t mean this to imply that code should only be read reductively. I mostly mean to say
that there is a line between a critical reading of programmer-implementation-functionality and a
critical reading of user-program-functionality that should be acknowledged, even when the
programmer and user are the same person. There is still a vast amount of room for play, creativity,
and genius (or not) within both of those spaces, and readings of the code should recognize that.
However, there is a danger-particularly in corporate code-of mixing the two during interpretation
when the reality is that they are two separate things, and the first CRU video seems to demonstrate
that conflating them can lead to bad results.
Reply by Jeremy Douglass on February 13, 2010 at 8:00pm
John, I’m still thinking through your proposed “ideal user” (of the software) and trying to come to
grips with how and to what extent it connects with my list of various reading roles for code.
Looking at my own use of “ideal programmer / compiler” I’m also thinking about the parallels with
the “implied reader / author” from literary theory. Perhaps the use of the “implied” (an imagined
role that is actively constructed while reading the code) is helpful for what you are talking about
here.
While reading the CRU code, we construct an implied programmer (or more than one) from what
we read, and this programmer (but ideal, but probably no) may or may not have any relationship to
the real programmer(s). Some readers construct an implied CRU programmer who is deceitful but
incompetent, while others construct one who is earnest but beleaguered. Readers of just the logs or
comments will construct this person differently from readers with procedural literacy.
Now, the code itself implies these things to a reader - we might learn in the news for example that
Harris was hampered in his duties due to drug addiction (he wasn’t), but this new view on Harris
isn’t reflected in the Harry that the code itself implies. Code may likewise indicate or just imply a
compiler, software environment, expected data, and set of use cases to varying degrees of
specificity (or not at all). So, it is a very interesting observation that code has an ideal user that is a
part of the ethos of the code. Is this a user function, in the sense of an author function? A user story
in the mind of the programmer, perhaps one commissioned and then passed down from
management?
In the case of the CRU, the users are not entirely the programmer, although the programmer is
certainly one of the users (but isn’t the programmer almost always one of the users?). Instead, the
CRU users may have been working in offices 10 feet away from the programmer, and were not
abstract at all. They were real scientists in all their messiness and imperfections, and the program
was haltingly revised for them in reaction to their crises and shifting daily concerns, when perhaps
it should have been written for the ideal user, which (we might claim) should have been Science.
At least, that is what I read in the code. But then, what I’m doing is constructing the programmer’s
implied user from the code and context.
Finally, to connect this back to my list of Who Reads Code:
I’m not sure that all of my examples connect directly to use - for example, the lawyer reading
breathalyzer code may not be planning to use a breathalyzer, but is intensely interested in how its
functions interacted with his DUI defense case clients. Similarly, most of my Easter-egg hunters by
definition are uninterested in the functionality of the code, and instead simply want to suck the
marrow from it.
Still, in many examples this user idea makes sense to me. One of the items I listed was “hackers
reading for exploits” - an interesting case of a code reader, as the hacker is also often a user of the
code/software as well. Now, I think you could argue that this hacker is almost never the ideal user
for whom a web application programmer develops her pages. In very few cases will programmers
actually focus on this hacker as their development user story - especially in the specific case of the
code the hacker happens to be reading. And yet, while this hacker is almost never an ideal user, you
might easily say that they are often an implied user. Reading a contemporary PHP web application,
the code repeatedly addresses this user - the buffer overflow, URL-munging, SQL-injecting script
kiddie who is not the core ethos of the feature set, but whom the code constantly addresses and
implies in such a way that we who read the code come to know what this hacker is like (or is
expected and believed to be like).
Ciertamente, no me refiero a que esto implique que el código solo debe leerse de manera reductiva.
Principalmente quiero decir que hay una línea entre una lectura crítica de la funcionalidad de
implementación del programador y una lectura crítica de la funcionalidad del programa del usuario
que debe reconocerse, incluso cuando el programador y el usuario son la misma persona. Todavía
hay una gran cantidad de espacio para el juego, la creatividad y el genio (o no) dentro de ambos
espacios, y las lecturas del código deberían reconocerlo. Sin embargo, existe un peligro,
especialmente en el código corporativo, de mezclar los dos durante la interpretación, cuando la
realidad es que son dos cosas separadas, y el primer video de la CRU parece demostrar que
combinarlos puede generar malos resultados.
Respuesta de Jeremy Douglass el 13 de febrero de 2010 a las 8:00 p. M.
John, todavía estoy pensando en tu "usuario ideal" propuesto (del software) y tratando de entender
cómo y en qué medida se conecta con mi lista de varios roles de lectura para el código. Al analizar
mi propio uso del "programador / compilador ideal", también estoy pensando en los paralelos con el
"lector / autor implícito" de la teoría literaria. Tal vez el uso del "implícito" (un rol imaginario que
se construye activamente al leer el código) sea útil para lo que está hablando aquí.
Mientras leemos el código CRU, construimos un programador implícito (o más de uno) a partir de
lo que leemos, y este programador (pero ideal, pero probablemente no) puede o no tener alguna
relación con el programador real. Algunos lectores construyen un programador de CRU implicado
que es engañoso pero incompetente, mientras que otros construyen uno que es serio pero acosado.
Los lectores de solo los registros o comentarios construirán a esta persona de manera diferente a los
lectores con conocimiento de procedimiento.
Ahora, el código en sí mismo implica estas cosas para un lector; podríamos aprender en las noticias,
por ejemplo, que Harris se vio obstaculizado en sus obligaciones debido a la adicción a las drogas
(no lo era), pero esta nueva visión de Harris no se refleja en Harry que el código mismo implica. El
código también puede indicar o simplemente implicar un compilador, entorno de software, datos
esperados y un conjunto de casos de uso con distintos grados de especificidad (o no tenerlos).
Entonces, es una observación muy interesante que el código tiene un usuario ideal que es parte del
ethos del código. ¿Es esta una función de usuario, en el sentido de una función de autor? ¿Una
historia de usuario en la mente del programador, tal vez una encargada y luego transmitida por la
gerencia?
En el caso de la CRU, los usuarios no son enteramente programadores, aunque el programador es
ciertamente uno de los usuarios (¿pero el programador no es casi siempre uno de los usuarios?). En
cambio, los usuarios de CRU pueden haber estado trabajando en oficinas a 10 pies de distancia del
programador, y no eran en absoluto abstractos. Eran verdaderos científicos en todo su desorden e
imperfecciones, y el programa fue revisado vacilantemente para ellos en reacción a sus crisis y
preocupaciones cotidianas, cuando tal vez debería haber sido escrito para el usuario ideal, que
(podríamos decir) debería haber sido Ciencia.
Al menos, eso es lo que leo en el código. Pero entonces, lo que estoy haciendo es construir el
usuario implícito del programador desde el código y el contexto.
Finalmente, para conectar esto a mi lista de Who Reads Code:
No estoy seguro de que todos mis ejemplos se conecten directamente con el uso; por ejemplo, el
abogado que lee el código del alcoholímetro podría no estar planeando usar un alcoholímetro, pero
está muy interesado en cómo interactúan sus funciones con sus clientes de casos de defensa de DUI.
Del mismo modo, la mayoría de mis cazadores de huevos de Pascua, por definición, no están
interesados en la funcionalidad del código y, en cambio, simplemente quieren chupar el tuétano de
él.
Aún así, en muchos ejemplos, esta idea de usuario tiene sentido para mí. Uno de los elementos que
enumeré fue "hackers que leen para exploits", un caso interesante de lector de código, ya que el
hacker también suele ser usuario del código / software. Ahora, creo que podría argumentar que este
hacker casi nunca es el usuario ideal para quien un programador de aplicaciones web desarrolla sus
páginas. En muy pocos casos, los programadores realmente se enfocarán en este hacker como su
historia de usuario de desarrollo, especialmente en el caso específico del código que el hacker está
leyendo. Y, sin embargo, aunque este pirata informático casi nunca es un usuario ideal, puede decir
fácilmente que a menudo es un usuario implícito. Al leer una aplicación web PHP contemporánea,
el código se dirige repetidamente a este usuario: el desbordamiento de búfer, el uso de URL, el
script de inyección de SQL kiddie que no es el núcleo del conjunto de características, pero que el
código trata e implica constantemente de esa manera que nosotros que leímos el código llegamos a
saber cómo es este hacker (o se espera y se cree que es así).
I very much appreciate Jeremy’s desire to move from how we “should” read code to how we “do”
read code, and in the spirit of this ambition, I’ll offer up an issue that this work has raised for me. In
addition to questions about the ethics of such a script (the FreeRice program has initiated an
unambiguous “no bots” policy), one of the largest questions I have in looking at this code - and I
hesitate to say “reading,” because my knowledge is so provisional - has to deal with the way I came
to it, which is to say as embedded within other variously coded textual environments (on the web,
on a wiki, in English, in a text editor, etc.). While reading these different layers is of course relevant
to my specific project, my question here is scalable: given that it’s useful to read code both closely
and contextually, i.e., within/against/among/over/under (pick your favorite preposition) other types
of codes, what points of intersection have proven particularly fruitful?
Here is an excerpt from ricemaker.py:
self.starttime = time.time() #our start time - will use this to
figure out rice per second stats
try:
self.iterator = 0
while 1:
self.iterator += 1
try:
self.queueitem = self.queue.get(block=True, timeout=10)
self.ricecounter += int(self.queueitem['rice'])
print "iteration:", self.iterator
print "thread number:", self.queueitem['print']['threadnumber']
print "targetword:", self.queueitem['print']['targetword']
print "answer:", self.queueitem['print']['answer']
print "correct?", self.queueitem['print']['correct']
print "vocab level:", self.queueitem['print']['vocablevel']
print "total rice this session:", self.ricecounter
print "total rice all recorded sessions:", self.running_rice_total + self.ricecounter
print "percent correct this session:", str(round(self.ricecounter/self.answer_value/self.iterator*100.0,
2))+"%"
print "iterations per second", str(self.iterator/(time.time()-self.starttime)), ";", "rice per second",
str(self.ricecounter/(time.time() - self.starttime))
print "******************************************"
Reply by Jeremy Douglass on February 14, 2010 at 12:34am
Lisa,
Thanks for this excellent example - I wasn’t familiar with RiceMaker and FreeRice. I have a
number of reactions to this, some of which started with the narratives that get wrapped around the
RiceMaker script (especially their section: “Ethical Considerations”) and the FreeRice webservice
(e.g. the defense offered in “FreeRice a scam? Ask the beneficiaries”).
I’m not sure that I’m ready to say anything interesting about the code above yet that would go
beyond what it says it does on the wrapper, but I have the beginning of an idea of how I would head
into the code. Essentially, there are several competing descriptions of what “FreeRice” is. One is the
actual set of financial arrangements backing the site. Another is the public description (or
approximation) of these business processes as a proxy-donation arrangement (with its implicit
dependency on ad-driven corporate volunteers). A third description is the actual software driving the
FreeRice service (which makes this relationship automatic and procedural), and the way it gets
wrapped in a web interface that moves the proxy-sponsor into the footer, and tells the user that they
are literally creating grains of rice with each interaction. Finally, the RiceMaker code is a kind of
“reductio ad absurdum” / “modest proposal” - it responds to the mild white lie of the web service by
taking it completely seriously, as if an internet signal could (ex nihilo) “make” grains of rice.
So one way I might approach the RiceMaker source code is, how do the bot code procedures
imagine the UN partner program, and how is this description mirrored / contested by other
descriptions? I’m not sure if the code will be interesting or surprising yet, but I can already imagine
other ways that might be interesting to approach it even if it is quite straightforward in structure -
for example, if that straightforward structure id similar to other types of code (like CAPTCHA-
cracking spam-bots, or evidence-pooling SETI@Home clients) that we don’t usually talk about in
the same registers.
Reply by Evan Buswell on February 13, 2010 at 8:17pm
So, I’ve been thinking about the Climategate videos all week, and I finally figured out what’s been
bugging me. I went to the website for the CRU’s temperature data sets and then skimmed through
each of the published papers they listed there. The software is hardly even mentioned.
Reciprocal to this week’s question is the question: How is code not being read, where we might
expect it to be read?
Aprecio mucho el deseo de Jeremy de pasar de la forma en que "deberíamos" leer el código a la
forma en que "leemos" el código de lectura, y en el espíritu de esta ambición, ofreceré un tema que
este trabajo me ha planteado. Además de las preguntas sobre la ética de dicho guión (el programa
FreeRice ha iniciado una política inequívoca de "no bots"), una de las preguntas más importantes
que tengo al mirar este código, y dudo en decir "leer", porque mi el conocimiento es tan
provisional: tiene que ver con la forma en que llegué a él, es decir, como incrustado dentro de otros
entornos textuales diversamente codificados (en la web, en una wiki, en inglés, en un editor de
texto, etc.). Si bien leer estas diferentes capas es por supuesto relevante para mi proyecto específico,
mi pregunta aquí es escalable: dado que es útil para leer el código tanto de cerca como
contextualmente, es decir, dentro / contra / entre / sobre / debajo (elija su preposición favorita) tipos
de códigos, ¿qué puntos de intersección han demostrado ser particularmente fructíferos?
Aquí hay un extracto de ricemaker.py:
self.starttime = time.time () #our start time - usará esto para descubrir arroz por segundo stats
tratar:
self.iterator = 0
mientras que 1:
self.iterator + = 1
tratar:
self.queueitem = self.queue.get (bloque = True, tiempo de espera = 10)
self.ricecounter + = int (self.queueitem ['rice'])
print "iteration:", self.iterator
imprimir "número de hilo:", self.queueitem ['print'] ['threadnumber']
imprimir "targetword:", self.queueitem ['print'] ['targetword']
print "answer:", self.queueitem ['print'] ['answer']
imprimir "¿correcto?", self.queueitem ['print'] ['correct']
print "nivel de vocabulario:", self.queueitem ['print'] ['vocablevel']
imprime "arroz total esta sesión", self.ricecounter
imprime "arroz total todas las sesiones grabadas:", self.running_rice_total + self.ricecounter
print "porcentaje correcto esta sesión:", str (round (self.ricecounter / self.answer_value / self.iterator
* 100.0, 2)) + "%"
imprimir "iteraciones por segundo", str (self.iterator / (time.time () - self.starttime)), ";", "arroz por
segundo", str (self.ricecounter / (time.time () - self .hora de inicio))
impresión "******************************************"
Respuesta de Jeremy Douglass el 14 de febrero de 2010 a las 12:34 a.m.
Lisa,
Gracias por este excelente ejemplo: no estaba familiarizado con RiceMaker y FreeRice. Tengo
varias reacciones al respecto, algunas de las cuales comenzaron con las narraciones que se
relacionan con el guión de RiceMaker (especialmente su sección: "Consideraciones éticas") y el
servicio web FreeRice (por ejemplo, la defensa ofrecida en "FreeRice, una estafa"). beneficiarios ").
No estoy seguro de que esté listo para decir algo interesante sobre el código anterior que vaya más
allá de lo que dice sobre el envoltorio, pero tengo una idea de cómo abordaría el código.
Esencialmente, hay varias descripciones competitivas de lo que es "FreeRice". Uno es el conjunto
real de arreglos financieros que respaldan el sitio. Otra es la descripción pública (o aproximación)
de estos procesos de negocios como un arreglo de donación de proxy (con su dependencia implícita
de voluntarios corporativos impulsados por anuncios). Una tercera descripción es el software real
que maneja el servicio FreeRice (que hace que esta relación sea automática y de procedimiento), y
la forma en que se envuelve en una interfaz web que mueve al proxy-patrocinador al pie de página,
y le dice al usuario que están literalmente creando granos de arroz con cada interacción. Finalmente,
el código de RiceMaker es una especie de "reductio ad absurdum" / "propuesta modesta": responde
a la leve mentira blanca del servicio web al tomarlo completamente en serio, como si una señal de
Internet pudiera (ex nihilo) "hacer" granos de arroz.
Entonces, una forma en que podría abordar el código fuente de RiceMaker es: ¿cómo se imaginan
los procedimientos del código bot el programa de socios de las Naciones Unidas y cómo otras
descripciones duplican / impugnan esta descripción? No estoy seguro de si el código será
interesante o sorprendente aún, pero ya puedo imaginar otras formas en las que podría ser
interesante abordarlo, incluso si es bastante sencillo en cuanto a estructura, por ejemplo, si esa
estructura directa id similar a otros tipos de código (como CAPTCHA-cracking de spam-bots, o
evidencia conjunta de clientes de SETI @ Home) de los que no solemos hablar en los mismos
registros.
Respuesta de Evan Buswell el 13 de febrero de 2010 a las 8:17 p. M.
Entonces, he estado pensando en los videos de Climategate toda la semana, y finalmente descubrí lo
que me ha estado molestando. Fui al sitio web para los conjuntos de datos de temperatura de la
CRU y luego revisé cada uno de los documentos publicados que allí figuraban. El software apenas
se menciona.
Recíproco a la pregunta de esta semana es la pregunta: ¿Cómo no se lee el código, donde podemos
esperar que se lea?
In the case of “Climategate,” I see in the scientific research this overwhelming assumption that the
code is wholly secondary, that it is completely transparent insofar as any truth claims are concerned-
though I don’t know much about the climate research discourse, so correct me if I’m wrong. For
example, in the paper, “Uncertainty estimates in regional and global observed temperature
changes,” the computer and its programmer do creep in under the headings “Homogenization
Adjustment Error” and “Calculation and Reporting Error,” but the first error is treated as essentially
equivalent to choosing correct mathematical adjustment models, and the second is treated as
equivalent to correct calculation procedures on the part of the scientist. That is, as far as truth value
is concerned, the design (architecture) of the computer program is assumed to be epistemologically
equivalent to the use of the appropriate mathematical models, and the implementation of the
computer program is assumed to be epistemologically equivalent to the hand calculations of the
scientists.
Similarly, the pro-warming video ends by accusing the sceptics of “assuming far too much about the
scientists.” Not to read too much into that statement, but even after a thoughtful analysis of the
possible interpretations and contexts of the code, this video ends by emphasizing the value of what’s
not code: the scientists, as people.
As I’ve wrote and deleted several poorly-thought-out versions of this next paragraph, I’ll just post it
as a question. Here’s what I’m thinking about: is this emphasis on the scientists, this emphasis on
what’s not code, just a symptom of a culture that hasn’t caught up with code’s existence yet? Or is
there some vested interest-other than the obvious intellectual property interest-that wants the code
to be hidden or ignored?
Reply by David Shepard on February 14, 2010 at 6:12pm
Is this emphasis on the scientists, this emphasis on what’s not code, just a symptom of a culture that
hasn’t caught up with code’s existence yet? Or is there some vested interest-other than the obvious
intellectual property interest-that wants the code to be hidden or ignored?
I really like this question. I think the under-emphasis on code is a symptom of a larger under-
appreciation of, or lack of knowledge about, code. This is something I’m looking at in my
dissertation: fictional computer programmers tend to be evil sociopaths (e.g. The Net, Virtuosity),
freelancers who aren’t in charge of the schemes they implement (Swordfish, Live Free or Die Hard,
Firewall), or Frankenstein-like scientists who get trapped in their own machines (Colussus: the
Forbin Project, Terminator 2, Pi, and The Matrix). Technical knowledge rarely makes someone
heroic. To me, this illustrates a hope that even as computers endow us with greater power, they
don’t fundamentally change us because they only do what their programmers tell them. This trope is
generally associated with formal simplicity: stories that are themselves straightforward Hollywood
films or something we might write off as pulp fiction.
Some postmodern fiction exemplifies a counter-trope by mapping structuralist theories about
language onto code: language is a closed system that helps to structure thought, so if our brains are
cybernetic symbol-processing systems, they can be “reprogrammed” by reading the right sequences
of words. Language and code affect or create the ideas that can be expressed. The difficulty of
coding shows us that computers aren’t as powerful or easy to use as we would like, and that they
shape human existence significantly so as to undercut the idea of a stable core to human experience.
Some examples would be Burroughs’ novels (since Burroughs apparently thinks textual cut-ups can
help “deprogram” readers by showing them possibilities they wouldn’t otherwise see) or Don
DeLillo’s Ratner’s Star, about scientists creating a robot that speaks a programming language free
from ambiguity.
The response to the CRU code seems to show us that we want to believe that the code could only
show the intent of the scientists, even though it could deviate from this because of typos or language
strictures unknown to the programmer. Computing seems to be a bastion of representationalism;
even though we no longer trust the transparency of language, we want to believe in the transparency
of code, perhaps because the specialized knowledge required to write it. David Porush puts forth the
theory that cybernetics emerged to compensate for the uncertainty of quantum physics, and the
same desire - that we can represent processes or objects transparently through computing if not
through language or writing any more - persists in our understanding of code.
En el caso de "Climategate", veo en la investigación científica esta abrumadora suposición de que el
código es completamente secundario, que es completamente transparente en lo que respecta a
cualquier afirmación de verdad, aunque no sé mucho sobre el discurso de la investigación del clima,
así que corrígeme si me equivoco. Por ejemplo, en el documento, "Estimaciones de incertidumbre
en los cambios de temperatura observados regionales y globales", la computadora y su programador
se deslizan bajo los encabezados "Error de ajuste de homogeneización" y "Error de cálculo e
informe", pero el primer error se trata como esencialmente equivalente a elegir modelos correctos
de ajuste matemático, y el segundo es tratado como equivalente a los procedimientos correctos de
cálculo por parte del científico. Es decir, en lo que se refiere al valor de verdad, se supone que el
diseño (arquitectura) del programa de computadora es epistemológicamente equivalente al uso de
los modelos matemáticos apropiados, y se supone que la implementación del programa de
computadora es equivalente epistemológicamente al cálculos a mano de los científicos.
Del mismo modo, el video favorable al calentamiento finaliza acusando a los escépticos de "asumir
demasiado sobre los científicos". No leer demasiado en esa declaración, pero incluso después de un
análisis reflexivo de las posibles interpretaciones y contextos del código, este video Termina
enfatizando el valor de lo que no es código: los científicos, como personas.
Como escribí y borré varias versiones mal pensadas de este próximo párrafo, solo lo publicaré como
una pregunta. Esto es lo que estoy pensando: ¿es este énfasis en los científicos, este énfasis en lo
que no es código, solo un síntoma de una cultura que aún no ha alcanzado la existencia del código?
¿O existe algún interés creado -excepto el obvio interés de la propiedad intelectual- que quiere que
el código se oculte o se ignore?
Respuesta de David Shepard el 14 de febrero de 2010 a las 6:12 p.m.
¿Es este énfasis en los científicos, este énfasis en lo que no es código, simplemente un síntoma de
una cultura que aún no se ha puesto al día con la existencia del código? ¿O existe algún interés
creado -excepto el obvio interés de la propiedad intelectual- que quiere que el código se oculte o se
ignore?
Me gusta mucho esta pregunta Creo que el bajo énfasis en el código es un síntoma de un mayor
subestimación o falta de conocimiento sobre el código. Esto es algo que estoy viendo en mi
disertación: programadores informáticos ficticios tienden a ser sociópatas malvados (por ejemplo,
The Net, Virtuosity), trabajadores independientes que no están a cargo de los esquemas que
implementan (Swordfish, Live Free or Die Hard, Firewall ), o científicos parecidos a Frankenstein
que quedan atrapados en sus propias máquinas (Colussus: el Proyecto Forbin, Terminator 2, Pi y
The Matrix). El conocimiento técnico raramente hace a alguien heroico. Para mí, esto ilustra la
esperanza de que incluso cuando las computadoras nos dotan de mayor poder, no nos cambien
fundamentalmente porque solo hacen lo que les dicen sus programadores. Este tropo se asocia
generalmente con la simplicidad formal: historias que son en sí mismas películas de Hollywood o
algo que podríamos descartar como ficción pulp.
Parte de la ficción posmoderna ejemplifica una contratropa mapeando teorías estructuralistas sobre
el lenguaje en el código: el lenguaje es un sistema cerrado que ayuda a estructurar el pensamiento,
por lo que si nuestros cerebros son sistemas de procesamiento de símbolos cibernéticos, pueden
"reprogramarse" leyendo las secuencias correctas de palabras. El lenguaje y el código afectan o
crean las ideas que se pueden expresar. La dificultad de la codificación nos muestra que las
computadoras no son tan poderosas o fáciles de usar como quisiéramos, y que dan forma a la
existencia humana significativamente para socavar la idea de un núcleo estable para la experiencia
humana. Algunos ejemplos serían las novelas de Burroughs (ya que Burroughs aparentemente cree
que los cortes de texto pueden ayudar a "desprogramar" a los lectores mostrándoles posibilidades
que de otro modo no verían) o Ratner's Star de Don DeLillo, sobre científicos que crean un robot
que habla un lenguaje de programación gratuito de la ambigüedad
La respuesta al código CRU parece mostrarnos que queremos creer que el código solo podría
mostrar la intención de los científicos, aunque podría desviarse de esto debido a errores tipográficos
o de lenguaje desconocidos para el programador. La computación parece ser un bastión del
representacionalismo; aunque ya no confiemos en la transparencia del lenguaje, queremos creer en
la transparencia del código, tal vez porque el conocimiento especializado requerido para escribirlo.
David Porush plantea la teoría de que la cibernética surgió para compensar la incertidumbre de la
física cuántica, y persiste el deseo de que podamos representar procesos u objetos de forma
transparente a través de la informática si no a través del lenguaje o la escritura.
David Noble argues in Forces of Production that computerization doesn’t make workers more
efficient (and he’s not alone). However, the perception of the CRU code as epistemologically
equivalent to the scientists’ calculations suggests to me the persistence of the perception that
computers can be transparent machines - that they can simplify tasks without necessarily altering
the questions that can be asked.
Reply by Jeremy Douglass on February 15, 2010 at 12:35pm
Evan, very interesting observation on the presence or invisibility of code in the literature. If code is
the complex set of contingency strategies where the messy business of science is being effected,
then perhaps that mess is always effaced in the literature, which doesn’t enumerate the many
exceptions thrown, or who (if anyone) will catch them.
As to emphasizing people, not code, I see how you can feel that the second “Debunking” video falls
into this line of argument, and it may, although my sense was that this was not the author’s
intention. On the one hand, the video creator constructs an implied programmer, and makes
arguments about that programmer’s character and intention - and perhaps this is an over-
engagement with the tar-baby of intentionality. Yet this discussion seems to me to be by the wayside
of the debunker’s quite formalist stance, arguing that the code itself will tell us what it does. I see
this formalism signaled early in the objection that critics are relying on an “ad hominem” fallacy:
the programmer’s low opinion of his own work (which extends to logs, comments, etc.) is not proof
that the work itself functions poorly. This is strikingly similar to a New Critical position like
Wimsatt and Beardsley’s “intentional fallacy”, which dismisses the opinion of the author (and
indeed almost banishes the person of the author entirely) as irrelevant distraction from a discussion
of the work itself. Such moves are generally intended to focus attention on formal textual analysis.
Reply by José Carlos Silvestre on February 14, 2010 at 2:45pm
Technical evolution: What’s technical evolution here is sort of ill-defined. I like some theories of
technical evolution - Leroi-Gourhan, and especially Simondon - but I find it non-trivial to apply
them to software. Simondon speaks of a process of concretization: that the technical object starts as
an “abstract” machine (with independent, single-function parts easily reducible to boxes and arrows
on a black board) and then advances to a “concrete” form - in which all parts are interdependent and
cannot be thought of in isolation (so, for example, a component of an engine that had a single
function will also participate later, due to its placement and so forth, in heat dissipation: “In the
modern engine, each critical piece is so connected with the rest by reciprocal exchanges of energy
that it cannot be other than it is.”) According to Simondon, this is not a matter of economic
pressures or some such, but a process intrinsic to technics (“It is not the production-line which
produces standardization; rather it is intrinsic standardization which makes the production line
possible.”) At the same time that the concrete machine is fully integrated, Simondon also argues
that its perfection lies on “concealed margins of indetermination” and its capacity to adapt to and
engage with the environment: not “function by function,” but “synergy by synergy.”
So, as the assembly line is concrete and the artisan’s work is abstract, we could think that the
organization of OOP is more concrete in that everything has to be in its right place and this plays a
certain role, whereas in a language like PHP the single elements can be connected arbitrarily. Also,
high-level languages produce machine code (which is the closest to a “technical object” here) that is
optimized in its arrangement and thus more “concrete.” But then there are the margins of
indetermination and, as it was pointed out, OOP did not interact very well with the demands of the
environment that is the web. I am trying to put the points that were made here regarding technical
evolution in the terms we might inherit from the philosophy of technics.
David Noble argumenta en Forces of Production que la informatización no hace que los
trabajadores sean más eficientes (y no está solo). Sin embargo, la percepción del código CRU como
epistemológicamente equivalente a los cálculos de los científicos me sugiere la persistencia de la
percepción de que las computadoras pueden ser máquinas transparentes, que pueden simplificar las
tareas sin necesariamente alterar las preguntas que pueden hacerse.
Respuesta de Jeremy Douglass el 15 de febrero de 2010 a las 12:35 p.m.
Evan, observación muy interesante sobre la presencia o invisibilidad del código en la literatura. Si
el código es el conjunto complejo de estrategias de contingencia donde se está llevando a cabo el
desordenado negocio de la ciencia, tal vez ese desastre siempre se borre en la literatura, que no
enumera las muchas excepciones arrojadas, o quién (si alguien) las atrapará.
En cuanto a enfatizar a las personas, no al código, veo cómo se puede sentir que el segundo video
de "Desprestigio" cae en esta línea de argumentación, y puede, aunque tengo la sensación de que no
era la intención del autor. Por un lado, el creador de video construye un programador implícito, y
hace argumentos sobre el carácter e intención del programador, y tal vez esto es un exceso de
compromiso con el tar-baby de la intencionalidad. Sin embargo, esta discusión me parece estar al
borde de la postura bastante formalista del detractor, argumentando que el código mismo nos dirá
qué hace. Veo este formalismo señalado al principio de la objeción de que los críticos se basan en
una falacia "ad hominem": la baja opinión del programador sobre su propio trabajo (que se extiende
a registros, comentarios, etc.) no es prueba de que el trabajo funcione mal. Esto es
sorprendentemente similar a una posición Nueva Crítica como la "falacia intencional" de Wimsatt y
Beardsley, que descarta la opinión del autor (y de hecho casi destierra a la persona del autor por
completo) como una distracción irrelevante de una discusión sobre el trabajo en sí. Tales
movimientos generalmente tienen la intención de enfocar la atención en el análisis textual formal.
Respuesta de José Carlos Silvestre el 14 de febrero de 2010 a las 2:45 p.m.
Evolución técnica: la evolución técnica aquí está algo mal definida. Me gustan algunas teorías de la
evolución técnica, Leroi-Gourhan, y especialmente Simondon, pero considero que no es trivial
aplicarlas al software. Simondon habla de un proceso de concretización: que el objeto técnico
comienza como una máquina "abstracta" (con piezas independientes de una sola función, fácilmente
reducibles a cajas y flechas en una pizarra negra) y luego avanza a una forma "concreta", en la cual
todas las partes son interdependientes y no se puede pensar en forma aislada (por lo que, por
ejemplo, un componente de un motor que tenía una sola función también participará más tarde,
debido a su ubicación y demás, en la disipación de calor: "En el motor moderno, cada pieza crítica
está tan conectada con el resto mediante intercambios recíprocos de energía que no puede ser más
de lo que es ".) Según Simondon, esto no es una cuestión de presiones económicas o algo así, sino
un proceso intrínseco a la técnica (" no es la línea de producción que produce la estandarización,
sino que es la estandarización intrínseca la que hace posible la línea de producción. ") Al mismo
tiempo que la máquina concreta está completamente integrada, Simondon también argumenta que
su perfecti sobre las mentiras sobre "márgenes ocultos de indeterminación" y su capacidad para
adaptarse e interactuar con el entorno: no "función por función", sino "sinergia por sinergia".
Entonces, como la línea de montaje es concreta y el trabajo del artesano es abstracto, podríamos
pensar que la organización de OOP es más concreta en cuanto a que todo debe estar en su lugar
correcto y esto juega un cierto papel, mientras que en un lenguaje como PHP el los elementos
individuales se pueden conectar arbitrariamente. Además, los lenguajes de alto nivel producen
código de máquina (que es el más cercano a un "objeto técnico") optimizado en su disposición y,
por lo tanto, más "concreto". Pero luego están los márgenes de la indeterminación y, como se señaló
, OOP no interactuó muy bien con las demandas del entorno que es la web. Estoy tratando de poner
los puntos que se hicieron aquí con respecto a la evolución técnica en los términos que podríamos
heredar de la filosofía de la técnica.
which show our pure data patch projected onto our bodies before our performances. Its interesting
because before almost every single of our performances of technésexual, we’ve ended up showing
the patch onscreen because we’re trying to get all the parts of the technology to talk to each other.
Many times people ask us if it’s part of the performance or say that they felt like it was part of the
performance. So, that opens up a larger audience of people seeing our code and discussing it with us
as well.
Reply by Andrew Davis on February 23, 2010 at 4:48pm
We take quotes out of context in literature when they represent valuable complete thoughts.
Why isn’t code the same way? There are certainly well-known cases where the context is irrelevant
to understanding the complete thought and value of that thought in a snippet of code. Search for
‘Duff’s Device’ or go directly to http://en.wikipedia.org/wiki/Duff
%27s_devicehttp://en.wikipedia.org/wiki/Duff%27s_device.
It was profound not only because of its innate value in solving one particular problem, but because
it is the equivalent of a Japanese Koan to a professional programmer. It shocks the programmer so
thoroughly they must re-evaluate their understanding of the language it is implemented in. In fact it
was so shocking a juxtaposition of different constructs that several compilers failed to compile it
correctly. It was later added to the test suite of C standards for compliance.
Here is an entire collection of similar ‘valuable’ snippets of code without context
http://graphics.stanford.edu/~seander/bithacks.html. Specifically look for “Counting bits set, in
parallel.”
Every programmer I know learns new things when reading these code snippets. The sudden change
from ‘writing code’ to ‘crafting code’ occurs as they search out ways to apply the new knowledge…
or craft their own to share.
Surely the art or craft of a Koan is not limited to literature. Are there other forms or structural
dialects that repeat à la iambic pentameter, sure. How does one search for the form of code, rather
than the substance of it?
Respuesta de Jeff Nyhoff el 14 de febrero de 2010 a las 4:36 p.m.
Implícito en la pregunta "¿Quién lee el código?", También está la pregunta: "¿Quién no / no
debería / no debe leer el código?"
En la era previa a la interfaz gráfica de usuario de informática personal, la identidad de "usuario"
era aquella que permitía a un usuario conocer al menos el código, tal vez también examinar y leer el
código, quizás también modificar el código, quizás también componer el código original.
Sin embargo, desde 1984, la identidad del "usuario" se volvió a fabricar e instaló como el "usuario
final", que, por definición, no debe / no debe / no debe leer (y mucho menos escribir) el código.
En consecuencia, sugeriría también que el "código" se ha convertido, ante todo, en "algo que el
usuario final no / no debería / no debe ver".
De hecho, creo que podría decirse que el "código" se ha convertido en "CUALQUIER COSA que el
usuario final no / no debería / no debe ver".
¿Puede cualquier concepción de "código" en esta época soslayar de manera responsable este
"ocultamiento" implícito y, más específicamente, el "oculto-de-los-usuarios-finales" del código, que
restringe e interpela al usuario final para el rendimiento del papel de "ideal no lector" de código?
Respuesta de Micha Cárdenas / Azdel Slade el 15 de febrero de 2010 a las 8:35 p. M.
Jeremy, me encanta tu intervención sobre pasar de dos tipos de lectores a una multiplicidad de
lectores. Es una parte fundamental de la teoría queer, que rechaza el pensamiento binario, y ha sido
una parte importante de mi propio trabajo, explorar formas de desarrollar nuevos géneros fuera de la
marca y el sexo femenino. También traté de hacer esto un poco la semana pasada, pero gracias por
traer un poco más de atención. Por supuesto, también podríamos ver un montón de post-
estructuralismo, como el rechazo de Deleuze y Guattari a la teleología (¡estamos cansados de los
árboles!) Como una forma de alejarse de un sistema de pensamiento basado en dos puntos finales y
hacia un sistema rizomático ramificando en todas las direcciones.
Pero para unirme al proyecto de encontrar fragmentos de código y lectores de código que amplíen
nuestras nociones de quién está leyendo el código, tengo dos ejemplos.
El primero se encuentra en la base de datos de errores del proyecto de código abierto de Second
Life Viewer. La parte importante de este fragmento y la larga discusión que lo rodea es la función
solicitada, LLGetGender, y los muchos temores que esta función propuesta creó entre los diferentes
usuarios de Second Life, incluidas las repercusiones para la estructura social, las interacciones
sexuales y los impactos económicos.
El segundo ejemplo que quiero compartir es estas dos imágenes:
http://vimeo.com/9184862
que muestran nuestro parche de datos puro proyectado en nuestros cuerpos antes de nuestras
actuaciones. Es interesante porque antes de cada una de nuestras presentaciones de tecnésexual,
hemos terminado mostrando el parche en la pantalla porque estamos tratando de obtener todas las
partes de la tecnología para que hablen entre sí. Muchas veces las personas nos preguntan si es parte
del rendimiento o dicen que sintieron que era parte del desempeño. Entonces, eso abre una
audiencia más grande de personas que ven nuestro código y lo discuten con nosotros también.
Respuesta de Andrew Davis el 23 de febrero de 2010 a las 4:48 p. M.
Tomamos citas fuera de contexto en la literatura cuando representan pensamientos completos
valiosos.
¿Por qué no es el código de la misma manera? Ciertamente, hay casos bien conocidos en los que el
contexto es irrelevante para comprender el pensamiento completo y el valor de ese pensamiento en
un fragmento de código. Busque "Dispositivo de Duff" o vaya directamente a
http://en.wikipedia.org/wiki/Duff%27s_devicehttp://en.wikipedia.org/wiki/Duff%27s_device.
Fue profundo no solo por su valor innato para resolver un problema en particular, sino porque es el
equivalente de un Koan japonés a un programador profesional. Sorprende al programador tan
profundamente que debe reevaluar su comprensión del lenguaje en el que se implementa. De hecho,
fue tan impactante la yuxtaposición de diferentes constructos que varios compiladores no pudieron
compilarlo correctamente. Más tarde se agregó al conjunto de pruebas de estándares C para el
cumplimiento.
Aquí hay una colección completa de fragmentos de código "valiosos" similares sin contexto
http://graphics.stanford.edu/~seander/bithacks.html. Busque específicamente "Contar los bits
establecidos, en paralelo".
Cada programador que conozco aprende cosas nuevas cuando lee estos fragmentos de código. El
cambio repentino de "escribir código" a "crear código" ocurre cuando buscan formas de aplicar el
nuevo conocimiento ... o crean el suyo propio para compartir.
Sin duda, el arte o la artesanía de un Koan no se limita a la literatura. ¿Hay otras formas o dialectos
estructurales que repiten el pentámetro a layambico, claro? ¿Cómo se busca la forma de código, en
lugar de la sustancia del mismo?