Grundlagen

Der Forschungsstand zur Auseinandersetzung mit Code aus geisteswissenschaftlicher Perspektive ist bisher kaum strukturiert. An dieser Stelle wird daher ein Überblick über die theoretischen Grundlagen sowie die zur Umsetzung verwendeten Technologien geliefert.

Theorie

Für diese Arbeit sind vor allem zwei Forschungsbereiche zentral: Die Critical Code Studies und Computational Notebooks. Die Critical Code Studies liefern eine alterative Perspektive auf den Umgang mit Code. Die Computational Notebooks bieten einen Ansatz für die nachvollziehbare Publikation von Code.

Critical Code Studies

Der Begriff Critical Code Studies wurde durch den gleichnamigen Text von Mark Marino (2006) geprägt. Darin schlägt er vor, die geisteswissenschaftliche Tradition der Textanalyse auf Code zu übertragen:

“I would like to propose that we no longer speak of the code as a text in metaphorical terms, but that we begin to analyze and explicate code as a text, as a sign system with its own rhetoric, as verbal communication that possesses significance in excess of its functional utility.” (Marino 2006)

Die Critical Code Studies sind vor allem aus der Wahrnehmung entstanden, dass Computer und Software in der Gesellschaft zwar mittlerweile weit verbreitet sind – sich aber kaum jemand damit beschäftigt, welche gesellschaftlichen Annahmen darin stecken. Durch die Analyse von Code soll deren Bedeutung im gesellschaftlichen Kontext analysiert werden.

Code Literacy

Um Code analysieren und im Anwendungskontext verstehen zu können, ist eine Grundkompetenz im Umgang damit notwendig. In Anlehnung an Lese- und Schreibkompetenz in natürlicher Sprache wird dabei der Begriff Code Literacy verwendet. Damit wird auch die Fähigkeit verbunden, Code kontextualisieren und kritisch analysieren zu können (Vee 2013). Insgesamt wird davon ausgegangen, dass Programmieren mehr als ein Handwerk ist, bei dem aus einer begrenzten Menge möglicher Befehle die jeweils richtigen ausgewählt werden. Stattdessen wird Programmieren als kreative Handlung verstanden, bei der Modelle über bestimmte Ausschnitte der Welt entworfen werden (Kirschenbaum 2009). Bei der Codeanalyse geht es u. a. darum, diese Modelle zu interpretieren.

Semantik von Code

Es gibt verschiedene Perspektiven auf die “Bedeutung” von Code. Auch in der Informatik wird der linguistische Term “Semantik” verwendet. Allerdings steht dabei vor allem die Bedeutung von Code für die Maschine, auf der er ausgeführt wird, im Fokus (Fehr 1989). Diese ist u. a. für die Formulierung mathematischer Beweise oder das Schreiben von Compilern relevant.
Im Gegensatz dazu befasst sich die linguistische Semantik mit der Bedeutung von Text für Menschen. Ihr liegt die Annahme zugrunde, dass die Bezeichnung für Objekte auf der Welt willkürlich und ihre Bedeutung das Ergebnis gesellschaftlicher Konventionen ist (Saussure 2019). Aus einer Perspektive der Critical Code Studies heraus kann dieser Umgang mit Text auf Code übertragen werden. Programmiersprachen sind zwar keine natürlichen Sprachen, ihre Wörter haben festgelegte Bedeutungen. Dennoch enthält auch Code natürliche Sprache (z. B. in Form von Kommentaren oder Variablennamen).

Defactoring

Wie kann Code praktisch im Sinne der Critical Code Studies analysiert werden? Zundert und Burton haben mit der Defactoring-Methode einen konkreten Vorschlag dafür gemacht (2019). Beim Defactoring wird der Code einer bereits durchgeführten Studie umstrukturiert und einem neuen Dokument zusammengeführt. Zusätzlich wird der Code durch erklärenden Text kontextualisiert. Dadurch erstellen Zundert und Burton ihrer Aussage nach die erste Edition von Code. Das Ergebnis kann hier nachvollzogen werden.
Die Methode basiert stark auf Jupyter Notebooks, einem Computational Notebook. Deren Besonderheiten werden im folgenden Abschnitt erklärt.

Computational Notebooks

Computational Notebooks sollen computergestützte Forschung unterstützen, indem sie die Kombination von Text, Code und Visualisierung in einem Dokument ermöglichen. Manche sehen darin die Nachfolger wissenschaftlicher Paper (z. B. Somers 2018). Computational Notebooks führen den Ansatz des Literate Programming fort. Das Konzept stammt von Donald Knuth und sieht vor, dass Code vor allem für Menschen verständlich sein sollte (Knuth 1984).


Technologie

Die wichtigste Technologie für die Durchführung von Critical Code Studies in dieser Arbeit ist Jupyter Notebooks. Computational Notebooks haben vor allem durch die Anwendung Jupyter Notebooks enorm an Beliebtheit gewonnen und sind besonders in der Data Science weit verbreitet. Eine Sammlung von Notebooks mit wissenschaftlichen Fragestellungen aus verschiedenen Disziplinen befindet sich auf Github.

Jupyter Notebooks

Jupyter Notebooks ist eine Anwendung aus dem Kontext des Project Jupyter. Sie ermöglicht das zellbasierte Ausführen von Code und das Kombinieren von verschiedenen, durch den Browser darstellbaren Elementen in einem Dokument. Das Programm ist Open Source und setzt auf die Verwendung offener Standards. Dadurch gibt es mittlerweile viele Erweiterungen, wodurch die Funktionalität der Standardanwendung individuell ausgebaut werden kann.

Folgende Aspekte von Jupyter sind für die Codeanalyse im Sinne der Critical Code Studies besonders relevant:

Jupyter Zenodo Binder

In Kombination mit Github, Zenodo und Binder ist es z. B. möglich, online verfügbare, ausführbare und zitierbare Notebooks zu erzeugen.

Dafür werden sämtliche für das Notebook benötigte Daten und Code auf Github veröffentlicht. Das Verzeichnis wird anschließend in Zenodo integriert und mit einem Digital Object Identifier versehen. Wenn dieser DOI in Binder eingegeben wird, wird daraus ein interaktives Notebook erzeugt. Eine vollständige Anleitung befindet sich hier. Binder arbeitet intern mit der Virtualisierungsanwendung Docker.
Ein Bespiel für ein solches Notebook ist hier zu finden. Es hat den DOI 10.5281/zenodo.3242074.