Programmieren ist das neue Latein (oder: Musikmachen mit Clojure & Overtone)

Babbage_Difference_Engine_(Being_utilised)

Let the computing begin! (Foto von Jitze Couperus, Los Altos Hills, California, USA, 21.01.2010, CC Attribution 2.0 Generic

Ich wollte schon lange einmal das Programmieren lernen. Doch es gibt Gründe, die dagegen sprechen:

  • Mathematik habe ich noch nie richtig gekonnt.
  • Das ist so kompliziert. Ich verstehe das alles nicht.
  • Warum soviel Zeit investieren? Ich will doch nicht wirklich Programmierer werden.

Die Jesuiten, die sich meisterhaft auf das Publikum verstanden, haben bei ihren Aufführungen kaum ein aussschließlich lateinkundiges Auditorium gehabt. Sie durften der alten Wahrheit sich überzeugt halten, daß die Autorität einer Äußerung sowenig von ihrer Faßlichkeit abhängt, daß sie durch Dunkelheit vielmehr gesteigert werden kann. 1

Wer heutzutage nicht programmieren kann, der steht wahrscheinlich ähnlich unwissend da, wie der vormals Lateinunkundige; so jedenfalls legt es die Formulierung nahe, Programmieren sei das neue Latein. Über lange Zeit wurde Latein dazu verwendet, Wissen, Macht und Einfluss zu kodieren und weiterzutragen. Wer Latein konnte, der konnte Bücher lesen, der konnte am Kulturleben der gehobenen Klassen teilhaben: er oder sie verstand den Code, mit dem Bildung zugänglich war. Latein war die Amtssprache des römischen Reichs und die Sprache der Bildung bis in die Neuzeit hinein. Bis ins 19. Jahrhundert wurden Vorlesungen an europäischen Universitäten in Latein gehalten 2, und wenn ich mich recht erinnere, hätte auch ich meine Magisterarbeit an der Kölner Uni 1994 in Latein einreichen können. Vermutlich würde ich heute noch schreiben. Gut, dass ich kaum Latein konnte.

Der Vergleich zwischen Latein und Programmieren – nimmt man ihn ernst – zielt darauf hin, dass im einen wie im anderen Prozeduren, Regeln und Erkenntnisse mit z.T. weitgehenden Konsequenzen niedergelegt wurden und werden. Das der Code Gesetz ist, ist wahrscheinlich mehr als nur ein Metapher. Eins ist sicher: die Bedeutung von Code steht im umgekehrten Verhältnis zu unserem Verständnis desselben. Programme und Algorithmen steuern unsere beschleunigte Welt, und wir können sie nicht lesen.

Das Programmieren ist also eine Geheimwissenschaft und bleibt einer Kaste von Auserwählten, Begabten oder besonders Leidensfähgien vorbehalten – und außerdem: Muss man das wirklich auch noch lernen, nur weil alles heutzutage per Computer gemacht wird?

Man kann behaupten, dass ein Programm, das bestimmt, welche Suchergebnisse wir sehen, welche Facebook-Nachrichten angezeigt werden, und welche Bücher uns empfohlen werden, alleine dadurch einen vorschreibenden Charakter erhält, dass wir nicht wissen (wollen), dass uns etwas vorenthalten wird; und selbst wenn wir es wissen (wollen), so wissen wir dennoch nicht, was genau uns vorenthalten wird. Anders gesagt: Die Macht der Bequemlichkeit, mit der wir finden, macht uns empfänglich dafür, was uns geboten wird, oder auch: was wir bei Google nicht finden, das existiert auch nicht.

Die negative Macht eines Suchalgorhitmus (letztlich: eines jeden Programms) besteht darin, sein eigenes Wirken zu verdecken. Genauso ist es von Herstellern und Anwendern in vielen Fällen auch gewollt. Die Sache wird jedoch zunehmend problematisch. Zuletzt hat Snowden die vielen Ahnungen eine Realität bestätigt. Es passiert zuviel hinter unserem Rücken. Wer das Programmieren lernt – verstanden nicht als berufliche belastbare Qualifikation sondern als Metapher für einen bestimmten Grad an technischem Verstehen – hat die Basis für eine gesunde Praranoia gelegt: Er weiss ungefähr, was vor sich geht 3. Soweit der politische Aspekt.

Aber motiviert mich das längerfristig? Worin genau soll das Ziel bestehen? Im Detail zu wissen, wie Google sucht, um dann in Mountain View profunde Vorschläge einzureichen, wie man die Suche demokratischer, gerechter oder einfach besser macht? Oder die NSA hacken?

Die Sprache, so vernahm ich neulich in einem Radiofeature, ist die privilegierte Methode, wenn es darum geht auf Gehirne zuzugreifen. Beides, Latein und Programmieren, ist eine Kulturtechnik und als solche ein Prinzip menschlicher Weltaneignung 4 auf der Basis von Symbolen. Programmieren lernen bedeutet also ganz prosaisch: Ich eigne mir eine Denkweise an, die mir fremd ist. Das ist schon interessanter. Es ist mir nicht wichtig, jetzt schon zu wissen, wozu genau das gut sein soll. Spaß machen, soll es aber schon.

Das Programmieren ist im Gegensatz zum Lateinischen keine Sprache, sondern bedient sich vieler und sehr unterschiedlicher Sprachen. Aber in allen Programmiersprachen gibt so etwas wie einen gemeinsamen Kern, den Kyle Kingsbury in seinem Aufsatz Core Language Concepts auch für Unwissende wie mich sehr anschaulich darstellt.

Neulich sah ich mir ein Gespräch zwischen Rich Hickey und Brian Beckman an. Beide sind Entwickler, Beckman als Chefentwickler bei Amazon, Hickey freischaffend und Erfinder eines neuen Lisp-Dialekts mit dem Namen Clojure. Ich schätze, dass ich ungefähr drei Prozent von dem verstanden habe, was dort geredet wurde, war aber deshalb nicht weniger fastziniert und schon gar nicht gelangweilt. Doch meine Interesse beruht nicht lediglich auf dem Eindruck, dass hier Großes geraunt wird, von dem ich eben nur grade soviel vestehe, um es bedeutsam zu glauben. Es gibt noch mindesten drei andere Gründe.

  1. Ich habe mich entschlossen, Clojure zu lernen und stolperte bei der Recherche über dieses Gespräch. Ich hoffte auf diese Weise ein paar Antworten auf Fragen zu gewinnen, die sich aufgrund vorheriger Lektüre eingestellt hatten. So kam mir beispielsweise das Konzept der zu vermeidenden Wirkungen von Programmen spanisch vor. Was anderes als Wirkungen sollte man von einem Computer und dem darin ablaufenden Programm erwünschen? Warum diese dann vermeiden 5? Wie des öfteren, wenn ich von einer Sache keine Ahnung habe, trug der Vortrag kurzfristig nicht zur Klärung dieser Fragen bei, sondern befähigte mich dazu, neue zu stellen.
  2. Mich fasziniert, dass die Programmierung sehr formal und logisch Konzepte beschreibt, die uns aus der nicht-mathamatischen Welt nur allzu bekannt sind, wie z.B. Identität und Wert. Mich interessiert also die formale Denkweise, die für das Programmieren typisch ist und weiter: Was genau sie mit meiner nicht so formal durchstrukturierten Welt zutun hat oder haben kann.
  3. Schließlich ist das das Programmieren nicht nur eine ingenieursmäßige Methode, sondern eine Form des Ausdrucks 6. Ähnlich, wie man eine Sprache einerseits dazu verwenden kann, um seine Mitmenschen direkt zu beeinflussen (der appellative Charakter der Sprache) oder, auf der anderen Seite, Gefühle und Befindlichkeiten ausdrücken kann, ohne die Absicht einer bestimmten Wirkung (die Selbstkundgabe). In diesem Kontext ist das Programmieren eher Kommunikation oder vielleicht sogar Kunst und weniger angewandte Mathematik.

Das Objekt der Begierde: Was ist Clojure?

Clojure ist ein Dialekt von Lisp (von LISt Processing), einer Sprache, die 1958 am MIT entstand 7. Unter anderem ist der Texteditor Emacs in Lisp geschrieben, und so kam ich mit Lisp in Berührung. Emacs ist kein fertiges Programm, sondern eher eine Musteranwendung innerhalb einer sog. (Lisp-)Laufzeitumgebung, ungefähr so wie ein Garten, in dem schon ein paar Wege und Beete angelegt sind, aber auch noch viel Arbeit wartet, wenn es darum geht, diesen an die eigenen Vorstellungen und Bedürfnisse anzupassen. So taucht denn auch (bei vielen, die Emacs einsetzen) frühzeitig der Wunsch auf, Emacs und woraus er gebaut ist, besser zu verstehen und beeinflussen zu können. Und Schwupps: Will man programmieren lernen.

Overtone – Collaborative Musical Programming

Allerdings wartete ich bislang auf eine Gelegenheit, bei der das Programmieren näher an dem liegt, was ich mit Kreativität verbinde: beispielsweise Musik machen. So war es der Wink Schicksals als ich einen Blogbeitrag von Bastien Guerry entdeckte, der von Clojure und Overtone berichtete und mich auf einen sehr inspirierenden Vortrag von Chris Ford mit dem Titel Functional Composition  hinwies; Chris Ford ist einer der Kern-Entwickler von Overtone.

Wer flott wissen will, was man mit Overtone machen kann, dem sei die kurze Präsentation Quick Intro to Live Programming with Overtone von Sam Aaron, empfohlen. Sam Aaron arbeitet an der Cambridge University und realisierte dort ein Projekt, bei dem Schulkinder programmieren lernten, indem er sie mit Tönen experimentieren liess. Aaron kam damals zupass, dass Jeff Rose schon damit begonnen hatte, den Computer, Klänge und die funktionale Programmierung miteinander im Projekt zu verbinden.

Mit der Programmiersprache Clojure werden die Anweisungen geschrieben, die vom Rechner in Töne umgesetzt werden. Overtone ist eine Sammlung von Funktionen (Bibliotheken), die in Clojure geschrieben sind und die Hervorbringung von Klängen ermöglichen; Overtone wiederum basiert auf SuperCollider, welches eine „Programmierumgebung und Programmiersprache für Echtzeit-Klangsynthese und algorithmische Komposition“ ist. Man sieht also, das Ganze ist nicht wenig voraussetzungsreich, doch man/frau muss nicht alles davon gleich zu Anfang verstehen. Dass Clojure auf Java aufbaut, sei hier am Rande erwähnt: Ohne Java-Laufzeitumgebung (JRE) geht also nichts.

Unter Mac OSX ist die Intallation relative harmlos. Unter Linux gibt es unter Umständen kleinere Probleme; diese hängen jedoch nicht direkt an Overtone, sondern daran, dass die Echtzeit-Audiosynthese für den Rechner viel Arbeit bedeutet. Das Standardsystem unter Linux für den Sound ist PulseAudio. PulseAudio ist prima für die Wiedergabe von Musik, Filmen usw.; wenn es jedoch darum geht, Töne (womöglich noch mehrere gleichzeitig) zu synthetisieren, dann braucht man das JACK Audio Connection Kit 8. Unter Linux muss man also normalerweise nachrüsten.

Nach erfolgreicher Installation gehe ich nun stückweise die vielen Beispiele durch, die Aaron, Ford und andere mit Overtone mitliefern. Das geht als blutiger Anfänger nur schrittweise, weiss ich doch wenig über Klangsynthese (wie setzt man Töne zusammen) und noch weniger über die Programmierung mit Clojure.

Overtone bietet viele Möglichkeiten:

  1. Als Experimentalumgebung für Musik und Komposition: Die vielen mitgelieferten Beispiele enthalten den Nachbau eines Bach’schen Kanons (vgl. den Vortrag von Chris Ford); es gibt vorgefertigte Bibliotheken für den Umgang mit Tonarten, Tonleitern, Rhythmus etc.
  2. Als Kompositionsrahmen für Minimal- und elektronische Musik: Es gibt Beispiele für Dubstep, Jazz, Ambient sowie Modelle einiger Experimente Steve Reichs
  3. Als Notationssystem für Musik: Aaron weist darauf hin, dass aktuelle Musik in vielen Fällen nicht mehr herkömmlich notierbar ist; schreibt man Musik in Clojure, so ist jedes Detail der Hervorbringung von Klänge nicht nur dokumentiert, sondern kann ausgetauscht und weiterentwickelt werden: Overtone ist also eine Open Source-Umgebung für Musik.
  4. Als Intrument für Live-Auftritte; der Programmierer wird zum Blendling von DJ und Musiker: Aaron tritt mit seiner Live Coding Band Meta X in Clubs auf – „the only Clojure-powered band in the world“.

Mich interessiert im Moment v.a. Punkt 1. Einige Experimente habe ich schon im Kopf. Jetzt muss ich leider Schluss machen, weil ich weiter Clojure lernen will…

Für Interessierte hier eine Linkauswahl:

Footnotes:

1 Benjamin, Walter (1974): Ursprung des deutschen Trauerspiels, Gesammelte Schriften, Bd. I/1, hrsg. v. Rolf Tiedemann und Hermann Schwepphäuser, Frankfurt a. M.: Suhrkamp, S. 381

3 „A paranoid is someone who knows a little of what’s going on. A psychotic is a guy who’s just found out what’s going on.“ William S. Burroughs

4 Vgl. dazu die Definition des Begriffs der Technik, http://de.wikipedia.org/wiki/Technik

5 Diese Spezialität der funktionalen Programmierung beschreibt ungefähr folgendes Dilemma: Jeder Programmierer möchte mit den Komponenten eines Programms irgendwelche Änderungen bewirken; bewirkt ein Programmteil nichts ausserhalb seines Bereichs, dann läuft lediglich die CPU heiss. Man könnte sagen, das Programm ‚meditiert‘ dann über sich selbst. Das Gegenteil, es gibt eine Wirkung wie z.B. die Veränderung bestimmter Werte mit denen das Programm weiterarbeitet, ist durchaus erwünscht aber auch gefürchtet, da es an vielen Stellen zu ‚Nebenwirkungen‘ kommen kann. Dies steigert die Komplexität des Codes, erschwert die Fehlersuche und führt letztlich dazu, dass man nicht mehr klar sieht, was genau das Programm tut. Vgl. dazu den Artikel Funktionale Programmierung in der Wikipedia: „Funktionale Programmierung ist ein Programmierparadigma, bei dem Programme ausschließlich aus Funktionen bestehen. Dadurch werden die aus der imperativen Programmierung bekannten Nebenwirkungen vermieden.“

6 Siehe dazu auch den lohenswerten Vortrag von Sam Aaron auf der Code Mesh in Lonon 2013: The Programming Language as a Musical Intrument, http://vimeo.com/85930562. Dort beschreibt Aaron seine Vorstellung von Programmieren als Arbeit mit dem Material (seine Metapher ist das Töpfern) und Programmieren als (künstlerischer) Ausdruck.

7 Unter den Programmiersprachen ist sie eine der akademischen und gehört dem Bereich der sog. funktionalen Programmierung an. Wer mehr über Lisp erfahren möchte, dem sei der Artikel The Roots of Lisp (vollständiger Artikel als Postscript-Datei) von Paul Graham ans Herz gelegt.

8 Eine Einführung zum Thema gibt Florian Eitel unter: http://feitel.indeedgeek.de/2012/7/sound_unter_linux/

Kategorie: Allgemein, Bildung, Howto, Kunst, Musik, Netz, Open Source Kommentare deaktiviert für Programmieren ist das neue Latein (oder: Musikmachen mit Clojure & Overtone)

Kommentarfunktion ist deaktiviert.