Montag, Februar 25, 2008

Wie lerne ich eine Programmiersprache an einem Tag?


(Foto von jbvkoos)

Lassen Sie sich mal an einem Tag für acht oder zehn Stunden, oder wenn es Sie so richtig gepackt hat, für 12 Stunden auf eine neue Programmiersprache ein! Sie werden sehen, dass Sie erstaunlich weit kommen. Weiter als Sie es vielleicht für möglich gehalten haben. Das geht, wenn Sie sich der Sache ein wenig mit System nähern. Hier ein paar Tipps und Vorschläge. Ich beziehe mich im Folgenden beispielhaft auf JavaScript.

Bevor es los geht, ein kleiner Hinweis: Sie werden keine Sprache an einem Tag lernen können, wenn Sie nicht bereits mit mindestens einer modernen Programmiersprache gut vertraut sind. Die erste Hürde muss also schon genommen sein. Ab der ersten Hürde wird es immer leichter ;-)

Vorbereitung: Besorgen Sie sich ein Buch zu der Programmiersprache, die Sie interessiert. Am besten in Papierform -- mit Papier lässt sich sehr schnell und zügig arbeiten. Legen Sie sich für Ihre Streifzüge durch das Buch Stift und Textmarker bereit. Beschaffen Sie sich den Standard zu Ihrer neuen Programmiersprache. Meist finden sie ihn frei zugänglich im Web. Ein Standard ist ein technisches Dokument, das die Programmiersprache genau beschreibt und definiert. Manchmal gibt es keinen formalen Standard, sondern ein Buch oder Dokument, das die Sprache verbindlich definiert. Suchen Sie danach. Und zu guter letzt: Installieren Sie sich die neue Sprache auf Ihrem Rechner, damit Sie sofort damit herumspielen können. Ja, spielen -- die Sache soll Spaß machen!

Um all das kümmern Sie sich am besten ein paar Tage bevor Sie sich mit der Sprache dann für einen Tag beschäftigen wollen. Los geht's!

Syntax anschauen: Beginnen Sie mit einen Blick in die Syntax, also den Regeln, wie gültige Programme aussehen dürfen. Die Syntaxregeln werden Sie vermutlich im Standard finden, meist im Anhang. Viele Bücher zu Programmiersprachen verzichten bedauerlicherweise sogar auf eine klare Angabe der Syntaxregeln; jetzt wissen Sie, warum Sie ihn sich beschaffen sollten. Schauen Sie zum Beispiel in den Annex A des Standards zu JavaScript, ECMA-262, 3rd Edition. Auf wenigen Seiten erfahren Sie interessante Dinge über die Sprache, etwa eine Liste reservierter Schlüsselwörter (keywords). Von "break", "case", "catch", ... bis hin zu "var", "void", "while", "with". Ganze 25 Schlüsselwörter gibt es zu erkunden. Damit gibt es ein erstes klares Arbeitsprogramm: Verstehen, wofür jedes dieser Schlüsselwörter da ist. Verbergen sich hier neue, interessante Konzepte?

In der Syntaxbeschreibung werden Sie bei JavaScript zum Beispiel auch entdecken, dass reguläre Ausdrücke zur Sprache gehören. Wenn Ihnen das nichts sagt: unbedingt lernen! Nicht jetzt, an diesem Tag -- sonst kommen wir nicht durch -- aber reguläre Ausdrücke sind ein mächtiges Werkzeug bei der Suche nach Mustern in Zeichenketten. Muss man können! Hat praktisch jede moderne Sprache mindestens als Bibliothek im Gepäck.

Welche Datentypen gibt es? Jetzt kann Ihr Buch zum Einsatz kommen. Blättern Sie durch das Inhaltsverzeichnis, verschaffen Sie sich einen Überblick über die Themen. Beschränken Sie sich rein auf Kapitel zu Ihrer neuen Sprache. Ignorieren Sie Bibliotheken, Erweiterungen oder Spezialanwendungen. Das ist jetzt alles uninteressant. Fangen Sie an mit den Datentypen: Welche Basistypen gibt es, welche "Sammeltypen" gibt es? JavaScript hat lediglich drei primitive Datentypen: Zahlen, Zeichenketten und Booleans. Dazu kommen noch zwei triviale Typen: null und undefined. Daneben gibt es noch den Datentyp des Objekts als Sammeltyp. Und das war es schon -- JavaScript präsentiert sich erstaunlich einfach. Hätten Sie's gedacht? Zwar redet man auch von Arrays, die jedoch ebenfalls Objekte sind; Funktionen, Zeitwerte, reguläre Ausdrücke und Fehler sind lediglich besondere Arten von Objekten.

Ein wichtiger Punkt ist noch: Wie wird mit Typen umgegangen? Handelt es sich bei Ihrer neuen Programmiersprache um dynamische oder statische Typen? Sie wissen vielleicht, das dynamisch typisierte Sprache, wie Python, Ruby oder JavaScript, zunehmend an Boden gewinnen. Die Art mit solchen Sprachen zu arbeiten ist eine gänzlich andere als mit statisch typisierten Sprachen wie Java oder C#. Noch wichtiger jedoch ist: Wie werden Datenwerte manipuliert? Wie heißt es so schön im Informatik-Slang: by value oder by reference? Wie werden Daten zugewiesen, wie wird beim Aufruf von Methoden, Prozeduren, Funktionen mit ihnen umgegangen? In JavaScript ist die Welt einfach geregelt: Primitive Typen werden "by value" behandelt, Objekte "by reference". Nur Strings passen nicht so ganz in das Schema. Strings sind immutable, nicht veränderbar, weshalb es keine Rolle spielt, wie sie behandelt werden.

Welche Anweisungen gibt es? Viele Anweisungen werden Ihnen bekannt vorkommen, wie z.B. "if", "switch", "while", "break", "return" etc. Suchen Sie nach Abweichungen, nach Anweisungen und/oder deren Verwendung, die Sie so aus Ihnen bekannten Sprachen nicht kennen. Den meisten ist die "for"-Schleife aus JavaScript bekannt, nicht jedem jedoch das "for/in".

Wie wird mit Variablen umgegangen? Müssen Variablen deklariert werden? Muss der Typ einer Variablen mit angegeben werden? Wie ist der Scope einer Variablen? Wenn Sie noch nie etwas vom lexikalischen Scope gehört haben -- jetzt müssen Sie sich damit auseinander setzen, denn die meisten Programmiersprachen arbeiten mit lexical scope, so auch JavaScript. Allerdings kennt JavaScript keinen Block-Scope, wie er sich zum Beispiel durch ein Schleifenkonstrukt wie "for" ergibt.

Fundamental ist das Konzept der Variablen, wenn Sie sich als Kenner einer imperativen (anweisungsorientierten) Sprache plötzlich mit einer funktionalen Sprache, wie z.B. Haskell oder Scheme/Lisp, beschäftigen. Plötzlich halten Variablen ihre Werte nicht über die Lebensdauer eines Funktionsaufrufs hinaus. Dauerhafte Wertzustände werden nicht mehr durch Objekte gekapselt; überhaupt arbeitet man in der funktionalen Welt niemals mit impliziten Zuständen. Scheme und Lisp erlauben zwar Ausnahmen, aber Sprachen wie Haskell sind da sehr konsequent und bringen einen mit vollkommen neuen Dingen in Berührung wie zum Beispiel der Zustandsmonade.

Welche Operatoren gibt es? Plus "+", Minus "-", Objekt-Schöpfung "new" etc., all das sind Operatoren. Ohne Operatoren läuft nicht viel. Hier verstecken sich die eigentlichen Arbeitsknechte. Meist sind für Operatoren Vorrangsregeln definiert (wie "Punkt- vor Strich-Rechnung"), die man grob kennen sollte. Ganz wichtig ist es zu klären, was in Ihrer neuen Sprache Gleichheit (equality) von Identität (identity) unterscheidet -- hier spielen "by value" und "by reference" wieder eine wichtige Rolle. Ein anderer wichtiger Operator ist die Zuweisung.

Welche speziellen Konzepte gibt es, die wesentlich für die Sprache sind? Für diese Frage ist es sehr schwer, eine Richtschnurr vorzugeben. Sie müssen zum Kern der Sprache vordringen. Was ist hier anders? Welche Konzepte, welche Konstrukte gibt es, die wesentlich den Charakter und die Denke der Programmiersprache prägen? In JavaScript sind es Funktionen (JavaScript hat ein sehr funktionales Herz) und Objekte/Arrays. JavaScript ist nicht, wie Sie es vermutlich von den meisten OO-Sprachen her kennen, klassen-basiert, sondern prototyp-basiert -- und kennt auch eine Form der Vererbung. Wenn das neu für Sie ist, dann ist hier ein Einstieg gefunden in die Welt von JavaScript. In den Objekten und Funktionen liegt der andere Ansatz verborgen, der JavaScript auszeichnet. Sie beherrschen JavaScript nicht, wenn Sie an dieser Stelle auf einen Abstieg in die Tiefen von JavaScript verzichten. Wenn Sie sich danach noch mit Modulen und Namensräumen beschäftigen, dann haben Sie JavaScript erobert.

Spielen Sie herum -- aber bleiben Sie fokussiert! Tippen Sie kleine Programmschnipsel in einen Editor oder eine IDE, machen Sie Ihre ersten Gehversuche mit der neuen Sprache. Dann prägen sich mache Dinge schneller ein oder man kann sein Verständnis für das eine oder andere Feature austesten. Aber lassen Sie sich nicht ziellos treiben. Ihr Ziel ist, an diesem einen Tag eine neue Sprache so gut und systematisch zu erfassen, wie möglich. Wenn Ihnen etwas Interessantes über den Weg läuft, notieren Sie es sich für später.

Wie geht es nach so einem Tag weiter? Das hängt ganz davon ab, warum Sie sich mit der neuen Sprache auseinander gesetzt haben. Wenn Sie sich weiter mit der Sprache beschäftigen wollen, nutzen Sie die Sprache für Ihr nächstes kleines Projekt oder Vorhaben. Learning by doing ist noch immer der erfolgreichste Weg.

Natürlich bedarf es einiger Wochen bis Monate, bis Sie sich in eine neue Sprache wirklich eingefunden haben; bis sie anfangen, in der Sprache zu denken und fließend in ihr zu sprechen. Mir sind schon des öfteren Talente über den Weg gelaufen, die in acht bis zwölf Wochen von Neulingen zu echten Experten in einer Sprache heranwuchsen. Das gelingt aber nur zusammen mit einem Projekt, das einem täglich die Auseinandersetzung mit der neuen Sprache abfordert.

---

Verraten Sie es mir: Hat Ihnen dieser Beitrag und seine Thematik gefallen? Haben Sie noch weitere Tipps für das Erlernen einer Programmiersprache?

Kommentare:

Till hat gesagt…

Danke.

Ich fand den Artikel interessant.
Ich denke auch, das es wichtig ist als Entwickler verschiedene Sprachen zu kennen und deren Sichten und Konzepte. Auf meiner Liste der "Sprachen, die du dir noch angucken wolltest":

-Ruby
-Erlang
-ECMAScript

dh hat gesagt…

Dann nehmen Sie sich doch einfach mal drei Tage Zeit ;-)

Aaron hat gesagt…

Ich fand den Artikel auch sehr aufschlussreich.

Was mir persönlich sehr hilft ist fremden Code lesen. Am Besten irgend was kleineres was man überschauen und gleich damit rumspielen kann. Ich denke je mehr Sprachen man sich aneignet (oder zummindest schon mal gesehen hat), desto leichter fällt es einem sich in weitere Sprachen einzuarbeiten, da viele Konzepte ähnlich sind. Z.B. ist es einfacher F# zu verstehen wenn man sich davor schon mal mit CLisp und Ruby beschäftigt hat.

Allerdings denke ich das man sich an einem Tag nur den groben Umriss der Sprache aneignen kann. Die richtig coolen Sachen kommen erst durch Anwenden der Sprache zum Vorschein :)

dh hat gesagt…

Ich gebe Ihnen Recht: Mit diesem einen Tag ist es nicht getan. So richtig erschließt sich eine Sprache mit ihren Features erst nach einer Weile. Aber ich möchte die Einstiegshürde nehmen. An einem Tag kommt man viel weiter als die meisten glauben mögen. Für die schlechteste Strategie halte ich, sich ein Einführungsbuch von 300 Seiten zu nehmen und es von vorne nach hinten durchlesen zu wollen. Das macht keinen Spaß. Wenn man sich den "Abtaucher" von einem Tag gönnt, dann kann man am zweiten Tag schon viel besser und auf höherem Niveau weitermachen. Denn man hat einen guten Überblick über die Sprache gewonnen.

bernoulli hat gesagt…

Kleine Spitzfindigkeit meinerseits zu tills Kommentar: "... verschiedene Klassen von Sprachen ..."

scnr

Till hat gesagt…

@bernoulli: richtig. Meine ich im Grunde auch. Mir ist nur keine sinnvolle Unterteilung eingefallen.

Für mein Repertoire wünsche ich mir auf jeden Fall noch:

- funktionale Sprache
- objektorientierte Sprache
- statisch typisierte Sprache
- dynamisch typisierte Sprache

Meine erste Begegnung mit erlang war übrigens recht verwirrend, da ich zuerst Code (Module unseres Jabber-Servers) begegnet bin und mich dann versucht habe in diesen einzuarbeiten. Mit den obigen Tipps wäre es unter Umständen leichter gewesen.

Naja, Java-Kid meets functional language: "Wie?! Ich kann der Variablen nicht nochmal einen Wert zuweisen?!"

Ach, gerade gefunden:Scala

JaCk hat gesagt…

Kennste eine, kennste alle.

Christian Berendt hat gesagt…

Beitrag hat mir gut gefallen. Gerne mehr davon.