Dank des zärtlichen, solidarischen Drucks, den die Featurette neuerdings auf mich ausübt, sollte ich nicht allzu lange den nächsten Blogpost vor mir herschieben. (Vielen Dank nochmal, Kadda!)
Allerdings lässt sich das, was ich mitteilen möchte und zukünftig wohl auch werde eher schwer in die bisherigen Kategorien einordnen. Es ist viel geschehen, aber statt eure Reader mit 10 kleinen Posts zu füttern, arbeite ich jetzt einfach die Themen in einem Post ab.
Als Erstes der Leistungsnachweis, Freunde und Freundinnen der Leistungsgesellschaft! Wie steht es um C? Die letzten Kapitel, die ich durchgearbeitet habe handelten von Feldern, Zeichenketten (Kapitel 7 aus “C – Programmieren von Anfang an”, Erlenkötter) und Variablen und Konstanten (Kapitel 8).
Datenfelder
Durch Datenfelder (engl. arrays) lassen sich Variablen definieren, unter deren Namen mehrere Werte gespeichert sind. Zum Beispiel
double temperatur[31]
für die Temperaturwerte eines Monats. Ich kann natürlich auch für die Temperaturdurchschnittsformal august1+august2+august3…usw. schreiben, weil ich z.B. den August ganz besonders mag. Ich kann aber auch so ein Feld verwenden und mir und allen LeserInnen wertvolle Augustzeit schenken. Hier wurden 31 Plätze für Zeichen des Typs double reserviert. Allerdings rufe ich den Wert des 03. Augusts (Der Geburtstag von Martin Sheen, Martha Stewart und vermutlich vielen mehr) mit august[2] auf, da selbstverständlich die erste Indexnummer in C bei 0 beginnt.
Zeichenketten sind auch ein Datenfeld, allerdings vom Typ char und sie speichern Texte. Wenn ich im Programm die User dazu auffordere, ihr Lieblingswort einzugeben, kann ich mit der Funktion “gets” den Satz in das Datenfeld einfügen. Das sieht dann bspw. so aus:
#include <stdio.h>
#include <string.h> /*(1)/
main()
{
char wort[20]; /*(2)/
printf("\nGuten Morgen Tim, was ist dein Lieblingswort?\n");
gets(wort); /*(3)/
printf("\n%s", wort); /*(4)/
}
(1) Die Datei string.h wird benötigt, sobald Funktionen zur Verarbeitung von Zeichenketten eingesetzt werden.
(2) Hier werden 20 Zeichen reserviert für den Text, der eingelesen werden soll. Wenn ich aber tatsächlich ein Wort mit 20 Zeichen eingeben möchte, z.B. “Amphetaminmissbrauch”, müsste ich 21 Zeichen reservieren, da ein Platz für die reserviert ist.
(3) Die Funktion gets liest den eingegebenen Satz und gibt in in das Datenfeld ein. Außerdem kümmert sie sich um die winkende Null.
(4) Unschwer zu erkennen, dass %s der Plathalter für die Zeichenketten, also “strings” ist.
Das Zeichenfeld hat jetzt vier Zeichen gespeichert:
0 1 2 3 4 E p i ḱ "\ 0"
Das Programm gibt aber nur so viele Zeichen aus, bis es die binäre Null am Ende findet.
/’ Dieses Beispiel beruht auf einer wahren Geschichte. /
Es gibt noch weitere Funktionen mit denen die Zeichenketten kopiert, verknüpft und verglichen werden können. Eine schöne Übersicht gibt es hier.
Variablen Vol. 9000
Im Achten Kapitel wird nochmal das Thema Variablen aufgegriffen. Die Grunddatentypen char, int, float und double können durch die Modifizierer unsigned, signed, short und long deklariert werden. Manchmal ist das notwendig, wenn die Datentypen für eine bestimmte Aufgabe zugeschnitten werden müssen.
Als Beispiel: Der Unterschied zwischen einem signed char und einem unsigned char liegt in den Bereichen von Minimalwert bis Maximalwert. Der Minimalwert von einem signed char liegt bei -128 und der Maximalwert bei 127. Bei einem unsigned char erstreckt sich die Bandbreite von 0 bis 255. Allerdings nimmt der Compiler standardmäßig an, dass die Typen vorzeichenbehaftet sind, deswegen reicht auch char ohne Modifizierer von -128 bis 127.
Weiterhin weist der Autor im Kapitel darauf hin, dass man bei der Bildung von geschweiften Klammern darauf achten muss, dass sie die Gültigkeit von Variablen einschränken. Wird eine Variabel innerhalb der Klammer definiert, so gilt diese Definition auch nur dort. Außerhalb muss sie erneut deklariert werden. Eine Variable, die nur innerhalb einer Funktion verwendet wird, und daher innerhalb der zugehörigen geschweiften Klammern deklariert wird, ist eine lokale Variable. Wird sie allerdings außerhalb der Funktion. bspw. ganz am Anfang des Programms definiert, so ist sie eine globale Variable und behält ihren Wert auch zwischen den Funktionsaufrufen bei.
Also lokal:
——————————-
function()
{
int x;
blablatudiestudas;
}
——————————
Und global:
—————————–
int x;
function()
{
blablatudiestudas;
}
————————–
Wie weiter im Quelltext?
Sehr viel weiter bin ich noch nicht im Buch gekommen und habe damit etwa die Hälfte durchgearbeitet. Die nächsten Kapitel handeln vom Präprozessor, Pointern, Kommandozeilenparametern und davon, wie ich Dateien in C verwende. Die möchte ich gerne noch durchlesen, werde sie aber nicht ganz so gründlich durcharbeiten wie die vorherigen Kapitel. Dann ist es nach anderthalb Monaten Verspätung auch endlich Zeit für Python.
Es mag noch ein wenig verfrüht für ein Resümee sein, aber so richtig zufrieden bin ich nicht mit dem Ergebnis des C-Abschnitts meiner Programmier-Genese. Ich habe das Gefühl, zu wenig gelernt zu haben, um wirklich in C programmieren zu können. In den bisherigen Kapiteln konnte ich die meisten Übungsaufgaben recht schnell lösen. Aber im letzten Kapitel stand ich vor einer Wand, als ich versuchte, mir Programme zu überlegen, mit denen ich die eigentlich relativ leichten Aufgaben lösen könnte. Das war recht frustrierend und führte zu den üblichen Gedanken in Richtung “Ach, Programmieren und ich, naja”. Vielleicht wäre das anders verlaufen, wenn ich enger mit Plom und Erlehmann zusammengearbeitet hätte und ich mehr Fragen gestellt hätte, als mein Unwissen so im Raum stehen zu lassen.
Aber es gibt auch gute Gründe, weswegen Frustration eigentlich abwegig ist.
Zum Einen war das Programmieren in C auch nicht mein erklärtes Ziel. Meine Absicht war es nach wie vor, eher ein Gespür dafür zu bekommen, was C eigentlich ist. Ich hoffe einfach, dass der nächste Abschnitt Python mir in demselben Maße leichter fallen wird, wie es C nach Assembler tat. Und dass ich nächstes Jahr mehr Zeit habe, um mein C-Wissen zu vertiefen. Aber ein wenig Zeit habe ich ja noch, um das C-Wissen bspw. in einer praktischen Anwendung zu vertiefen und zu überprüfen.
Speaking of “Zeit“. Ein weiterer Grund, weswegen es mir legitim vorkommt, mir die Defizite nachzusehen ist, dass ich in den vier Monaten nicht jeden Tag Programmieren konnte. Zwar hatte ich Semesterferien, aber die Programmier-Lerneinheiten waren immer etwas, was ich zwischen etliche andere Dinge schieben musste. Es war also weniger ein Freie-Zeit-Füllen, als eine Beschäftigung, für die anderen Dingen Zeit entzogen wurde.
Aber diese anderen Dinge waren nicht nur so computerlose Hobbys wie Band und Hausarbeiten, sondern auch die Lektüre von Büchern, die durchaus etwas mit Computer zu tun haben. Neben dem Buch “Theorien des Internets” habe ich auch “Computerphilosophie” begonnen. Und das ist etwas, was ich auch zuletzt bei einem Vortrag in der “Open Tech School” angesprochen und betont habe – das Programmierenlernen hat nicht nur etwas mit dem Aneignen von spezifischer Syntax einer Programmiersprache zu tun. Es eröffnet auch den Zugang zu Themenkomplexen, die vorher wenig naheliegend und unangetastet blieben. Dadurch beschäftige ich mich plötzlich auch mit Netztechnologie, Netztheorie, Konzepten von Berechenbarkeit, Formaler Logik undundund… Dabei bleibt es nicht nur bei der Erkenntnis, dass es doch irgendwie notwendig ist, den ganzen Kram endlich mal zu verstehen, ich interessiere mich auch brennend dafür! Das hätte ich vor einem Jahr, als ich mit meinem Ethnologiestudium vor allem mit meinem Selbstverständnis als Fotografin begann, nicht gedacht…
Speaking of “Uni“. Mir graute es bis vor Kurzem noch ziemlich vor dem Beginn des Semesters. Nicht wenige Tage meiner Semesterferien begannen um 9 Uhr und endeten um Mitternacht, viele Absätze der Lektürenotizen später. Zwischendurch hörte ich Podcasts zur Netzpolitik, las Artikel auf Hacker News, diskutierte mit vielen tollen Menschen über das Programmierenlernen (naja, meistens läuft es doch darauf hinaus, dass ich besoffen den Assembler-Ansatz verteidigen muss) und bereitete Vorträge für ProgrammieranfängerInnen vor. Wie kriege ich das unter bei 22 Seminarstunden plus täglich ca. 4-8 Stunden Lektüre der Texte, Referate, etc.?
Aber der schöne Nebeneffekt des Ganzen ist, dass ich mich zumindest im Uni-Kontext nach und nach zu einer Expertin gemausert habe. Das sagt natürlich auch viel über mein Institut aus, aber es birgt für mich vor allem die Chance, auf das Vertrauen meiner DozentInnen zu setzen und ihre Unterstützung zu erhalten. Die Europäische Ethnologie als Gesellschaftswissenschaft, die sich vor allem mit der Alltagskultur auseinandersetzt, bietet eine Infrastruktur, die mir intellektuelle Grundlagen, Methoden und eine Plattform zur Kommunikation vermittelt, ohne dass ich dabei von meinen eigenen Interessen abrücken müsste. Gerade das Erlernen einer Kulturwissenschaft und die parallele Beschäftigung mit Themen aus der Informationswissenschaft schafft eine Schnittstelle, die m.E. viel zu selten hergestellt wird. Und mit dieser Meinung stehe ich sicher nicht alleine da.
Und es ist auch sicher die Stärke eines kleinen Instituts, wo auch Studierende mit Namen gegrüßt werden, dass ich ein Gespräch mit einem Dozenten führen kann, um mein Projekt, meine Interessen und meine Bedürfnisse an das Studium zu besprechen. Und im Endeffekt Zeit und Punkte für meine Arbeit an FLP aushandeln kann
Was eine riesengroße Erleichterung ist. Denn es gibt doch einen großen Unterschied zwischen Zeit nehmen müssen oder Zeit haben. Ich werde also die nächsten Monate einen oder zwei Tage die Woche zur Verfügung haben um mich mit dem ganzen Kram zu beschäftigten, theoretisch und praktisch. Insofern werden die nächsten Blogposts öfter Mal abgesehen von Code auch theoretische Überlegungen beinhalten, wenn ein Text sich anbietet, entsprechend kontextualisiert zu werden. Das Buch “Technogene Nähe”, das ich als nächstes lesen werde, wird sicher noch ein paar Mal Erwähnung finden…
Bleibt zu erwähnen, dass heute der Ada-Lovelace-Day ist. Ada Lovelace gilt als die erste Programmiererin bzw. programmierende Person überhaupt. Wenn ihr es bis hier unten geschafft habt, schaut euch mal diese Seite an. Es geht um die Sichtbarkeit von Frauen in den MINT-Bereichen und damit um weibliche Vorbilder, die in Mathematik, Informatik, Naturwissenschaften und Technik tätig waren.
Soweit also der Stand. Coole Sache das Alles. Ich bin selber gespannt darauf, worin die Zusammenführung von Ethnologie und Programmieren fruchten kann. Und wie das wird, wenn ich auf diesem Blog in Zukunft auch mal als Ethnologin schreibe. An Gedanken mangelt es zumindest nicht.

Liebe Fiona, da wo du jetzt bist war ich auch mal.
Ein Teil des Problems der Unzufriedenheit ist, dass du mit Übungsaufgaben keine realen Probleme löst, die in “dem Code da draussen” auftauchen oder du das programmierst, was du wirklich haben möchtest.
Das Lösen von Übungsaufgaben ist nur ein winziger Teil des Programmierens und ich würde sogar sagen: kein sonderlich sinnvoller.
Wenn du versuchst “Programmieren” zu denken, ist ein grosser Schritt beim Lernen von Idee zu realem Code zu gelangen. Wie separierst du die Einzelteile des Programms? Was musst du genau dafür tun? Und warum ist Lösung A besser als Lösung B? Warum sagen Leute oft “So macht man das nicht!”?
Wenn du ergründen möchtest, was C zu C macht, ist das nicht bloss eine technische Frage, sondern auch eine Kulturfrage. Wo ist C? Was hat C mit Unix zu tun? Welche Code-Kultur steckt dahinter? Was für Programmier-Ideen und Konzepte? Du wirst beispielsweise – sobald du ein wenig C und Code lesen kannst – erschüttert sein, wie klein und (vergleichsweise) leicht so ein ganzes Unix als Source zu lesen ist, wenn du einfach mal “The Lion’s Book” durchgehst.
Und: Programmieren lebt heute vom Environment – das heisst, wenn du C machst, machst du auch “libraries” und “makefiles” und all sowas. “C programmieren” passiert ja nicht nackt so im luftleeren Raum (das genau ist, was dieses unzufriedene Gefühl von “hm, ich habe lauter Aufgaben gelöst, warum habe ich nicht das Gefühl, programmieren zu können?”, sondern durch einen Anlass oder eine Idee.
Das heisst, solange du C nicht einbettest in Kontext wie “Ich will einen eigenen Windowmanager hacken” oder “Ich wollte schon immer mal meinen eigenen Webserver haben” oder du sagst “C? Will ich nur noch für Spezialplattformen wie Arduino!” und viiiiiel Code liest (eine wichtige Programmier-Kulturtechnik ist Code lesen können. Viel Code. Hässlicher Code.) wird das Gefühl der Unzufriedenheit bleiben.
Hinzu kommt, dass der eigentliche Code im Sinne von “das was du da hinschreibst” nur ein Viertel des Programms ist – ein Teil ist Architektur, Konzepte, technische Gegebenheiten (z.B. File I/O oder Netzwerke oder GUI..), Environment, notwendige Bibliotheken und so weiter und so fort. Erst das zusammen macht ein Stück Code zu einem Programm.
Zu guter Letzt hilft dir vielleicht, C im historischen Kontext anzugucken: C ist eng mit Unix verbunden was wiederum mit dem Erfinden und Aufbauen des Internets (in technischer Hinsicht) zusammenfällt. Damit verbunden sind bestimmte Leute und Ideen und Ideale, was “guter Code” ist (Google mal Richard Gabriels “Worse is Better”, das gibt dir eine Idee, was da eigentlich diskutiert worden ist). C ist unglaublich einflussreich – Programmiersprachen werden von manchen Leuten in ihrer Qualität an “familarity” gemessen und da ist die Messlatte: C.
Vergegenwärtige dir ausserdem, dass du mit C eine DER Programmiersprachen schlechthin am Wickel hast – das ist nichts, womit man so lau mal zwei, drei Wochen rumhantiert – du hast vielleicht im Internet öfter mal am Rande die “mind-blowing-ness” von Lisp mitbekommen (was im Übrigen meiner Meinung nach zusammen mit C und Smalltalk und Unix (Shell) sozusagen die kulturellen Big Player sind, die man lernen muss – quasi die Platos und Ciceros und Kants ..
– C eröffnet einem eine komplette Welt in einer ganz anderen Art.
Zum Trost: C ist _hervorragend_ dokumentiert; die Bücher die es da gibt sind Sternstunden technischer Dokumentation in Klarheit, Genauigkeit und Lesbarkeit.
Wenn es dir ausserdem um den von unten nach oben Stack von Programmiersprachen geht, die von maschinennah immer weiter nach oben wegabstrahieren (du hast glaube ich mit Assembler angefangen, bist jetzt bei C und willst zu Python) vergiss nicht, dass Lisp und Smalltalk gleichberechtigt mit C nur ganz anders ihren Weg gegangen sind und dass vor Python die Shell und Shell-Skripte liegen (ein Weg, nicht mehr so nackt mit C rumpointern zu müssen und das hatte einen Grund, warum man das haben wollte) und natürlich die einflussreiche Mutter Perl, die Sprachen wie Ruby, Python etc. stark beeinflusst hat. (Ich bin heute sicher, dass man mit Assembler, C, Lisp, Smalltalk, Unix/Shell, Perl, SQL und irgendwas stack-orientiertem wie Postscript beispielsweise eine spitzenmässige Programmierausbildung für sich hin basteln kann.. )
Ich würde versuchen, noch ein bisschen dabei zu bleiben und mir etwas suchen, was ich wirklich haben will und mich daran abarbeiten..
(Und wo ich es oben schon erwähnt habe.. SQL… it’s magic
Viel Spass beim Weiterhacken.
Ethnologie und Informatik. Interessante Beziehung.
a) Informatik als Helferlein für die Ethnologie, z.B. bioinformatische Verfahren in der Molekurlargenetik um Informationen über die historische Entwicklung des Menschen zu gewinnnen.
b) Informatik als Studiengegenstand der Ethnolginnen. Z.B. was passiert, wenn eine Ethnologin auf Informatiker trifft oder umgekehrt.
Datenstrukturen und C:
Was bleiben sollte: C hat von Haus aus so gut wie keine Datenstrukturen.
Im wesentlichen kann man Stücke Speicher reservieren und dort mit Zeigern oder Array Indizierung Daten manipulieren. Nicht sehr bequem und unsicher, wenn man Fehler macht oder nicht an allle Fälle denkt. Da lebt eine ganze Sicherheitsindustrie von.
Dafür kann man sehr flott, sparsam und nah an der Hardware arbeiten.
Im Endeffekt ist es eine Sprache für Spezialisten innerhalb der Entwicklerzunft geworden,
für die diejenigen, die Betriebsysteme, Spieleengines, Gerätetreiber oder kritische Teile von Programmiersprachen entwickeln oder für eingebettete Geräte entwickeln.
Als ich sah, dass du gets() nutzt, fragte ich mich, ob es ausnutzbar ist und fand ein Dokument mit lustigen Aufgaben. Schau mal ab Seite 4.
Nochwas zu gets().
fasteh ich nicht. Musst du mir bei Gelegenheit mal erklären.