Lernen Sie programmieren in zehn Jahren!

Von Peter Norvig.  Teach Yourself Programming in Ten Years.
übersetzt von Stefan Ram.
kanonische URI dieser Seite: http://www.purl.org/stefan_ram/html/21-tage


Warum hat es jeder so eilig?

Gehen Sie in irgendeine Buchhandlung und Sie werden sehen, wie man der Aufforderung Lernen Sie Java in 7 Tagen! nachkommen kann. Es gibt es endlose Varianten dieses Titels, die anbieten Visual BasicWindows, das Internet  und so weiter in wenigen Tagen oder Stunden zu erlernen. Ich richtete die folgende erweiterte Suchanfrage an Amazon.com:

 pubdate: after 1992 and title: days and (nach 1992 veröffentlicht und "Tage" im Titel) (title: learn or title: teach yourself) ("Lerne" oder "Lehre Dich" im Titel) 

Ich erhielt 248 Treffer. Die ersten 78 waren Computer-Bücher (Nummer 79 war Learn Bengali in 30 days [Lernen Sie Bengali in 30 Tagen]). Ich ersetzte „Tage“ durch „hours“ (Stunden) und erhielt bemerkenswert ähnliche Ergebnisse: 253 weitere Bücher, mit 77 Computer-Büchern gefolgt von Teach Yourself Grammar and Style in 24 Hours (Lernen Sie Grammatik und Stil in 24 Stunden) an Stelle 78. Von den ersten 200, waren 96 % Computer-Bücher.

Das Ergebnis ist, daß die Leute es entweder sehr eilig haben, mehr über Computer zu lernen, oder, daß Computer irgendwie sagenhaft einfacher zu erlernen sind als irgend etwas anderes. Es gibt keine Bücher, um Beethoven, Quantenphysik oder wenigstens die Hundepflege in wenigen Tagen zu erlernen.

Untersuchen wir, was ein Titel wie Learn Pascal in Three Days (Lernen Sie Pascal in drei Tagen) bedeuten könnte:

  • Lernen Sie: In drei Tagen werden Sie keine Zeit dafür haben, um bedeutende Programm zu schreiben und aus den dabei erlebten Erfolgen und Fehlern zu lernen. Sie werden keine Zeit dafür haben, mit einem erfahrenen Programmierer zusammenzuarbeiten und zu verstehen. wie es ist, in der dazugehörigen Umgebung zu leben. Kurzum, Sie werden gar keine Zeit haben, um viel zu lernen. Daher können Sie dann nur von einer oberflächlichen Bekanntschaft, aber nicht von einem tiefen Verstehen, sprechen. Wie Alexander Pope sagt, ist ein wenig zu lernen eine gefährliche Sache [1].

  • Pascal: Sie könnten in der Lage sein, in drei Tagen die Syntax von Pascal zu erlernen (falls Sie schon eine ähnliche Sprache kennten), aber Sie können nicht viel darüber lernen, wie diese Syntax verwendet wird. Kurzum, wenn Sie, sagen wir, ein BASIC-Programmierer wären, könnten Sie lernen, Programme im BASIC-Stil mit Pascal-Syntax zu schreiben, aber Sie könnten nicht lernen, wofür Pascal eigentlich gut (und schlecht) ist. Worum geht es also? Alan Perlis sagte einmal: „Eine Sprache, die die Art und Weise, wie Sie über Programmieren denken, nicht beeinflußt, ist es nicht wert, erlernt zu werden.“ Ein mögliches Argument wäre es, daß Sie etwas Pascal (oder vielleicht eher etwas VisualBasic oder JavaScript) erlernen sollten, weil Sie eine Verbindung zu einem vorhandenen Programm herstellen müssen, um eine bestimmte Aufgabe zu erledigen. Aber dann lernen Sie nicht programmieren: Sie lernen, diese Aufgabe zu erledigen.

  • in drei Tagen: Leider reicht das nicht, wie der nächste Abschnitt zeigt.

Lernen Sie programmieren in zehn Jahren!

Forscher (Hayes und Bloom) haben gezeigt, daß die Entwicklung von Kompetenz in irgend einem Gebiet aus einer großen Vielfalt von Gebieten, wie Schach spielen, Musik komponieren, malen, Klavier spielen, schwimmen, Tennis spielen, neuropsychologische Forschung oder Topologie ungefähr zehn Jahre benötigt. Es scheint keine richtigen Abkürzungen zu geben: Selbst Mozart, der mit vier Jahren ja ein musikalisches Wunderkind war, brauchte 13 weitere Jahre, bevor er anfing, Musik der Weltklasse zu schreiben. Auf einem anderen Gebiet schienen die Beatles damals plötzlich in die Szene zu platzen als sie 1964 in der Ed-Sullivan-Show auftraten. Aber sie spielten schon seit 1957, und obwohl sie von Anfang an viele Anhänger hatten, erschien ihr erster großer und entscheidender Erfolg, Sgt. Peppers, 1967. Samuel Johnson glaubte, es bedürfe sogar noch mehr als zehn Jahre: „Herausragende Leistungen auf jedem Gebiet können nur durch die lebenslange Arbeit erreicht werden, sie können nicht für einen kleineren Preis erworben werden.“ Und Chaucer beschwert sich: „Das Leben ist so kurz und das Erlernen des Handwerks so langwierig!“.

Hier ist mein Rezept für Erfolg beim Programmieren

  • Fangen Sie damit an, sich für Programmieren zu interessieren, und programmieren Sie etwas, weil es Ihnen Spaß macht! Stellen Sie sicher, daß es dauerhaft so viel Spaß macht, daß Sie dadurch mindestens zehn Jahre investieren wollen!
  • Reden Sie mit anderen Programmierern: Lesen sie andere Programme! Das ist wichtiger als jedes Buch oder Seminar.
  • Programmieren Sie! Die beste Art zu lernen ist learning by doing (Lernen durch Machen). Um es technischer zu sagen: „Das höchste Leistungsniveau auf einem bestimmten Gebiet erreichen Menschen nicht automatisch als Folge umfassender Erfahrung, aber das Leistungsniveau kann auch von sehr erfahrenen Personen durch entschlossenes Bemühens um Verbesserung gesteigert werden.“ (Seite 366) und „Das effektivste Lernen verlangt eine wohlbestimmte Aufgabe eines einer bestimmten Person angemessenen Schwierigkeitsgrads, hilfreiche Rückmeldungen und Gelegenheiten zur Wiederholung und Korrektur von Fehlern.“ (Seiten 20-21) Das Buch Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life (Kognition in der Praxis: Geist, Mathematik und Kultur im Alltag) ist ein interessanter Beleg für diese Sichtweise.
  • Wenn Sie wollen, verbringen Sie vier Jahre an der Hochschule oder mehr in einem Aufbaustudium. Das erlaubt ihnen den Zugang zu einigen Tätigkeiten, für die ein Studium verlangt wird und gibt Ihnen ein tieferes Verständnis des Gebiets, Falls Ihnen eine solche Ausbildung aber keinen Spaß macht, können Sie (mit etwas Bemühen) auch ähnliche Erfahrungen in einem Beruf machen. Jedenfalls wird es nicht reichen, aus Büchern zu lernen. „Die Informatik kann nicht aus jedem einen Programmierexperten machen, genausowenig wie das Studium von Pinseln und Pigmenten große Maler hervorbringen kann“ sagt Eric Raymond, Autor von The New Hacker’s Dictionary (in „Das neue Computerspezialisten-Wörterbuch“). Einer der besten Programmierer, den ich jemals eingestellt hatte, hatte nur Abitur; Er hat viel großartige Software geschrieben, besitzt seine eigene Usenet-Gruppe und ist durch Aktienoptionen sicher viel reicher geworden als ich es jemals sein werde.
  • Bearbeiten Sie Projekte gemeinsam mit anderen Programmierern! Seien Sie der beste Programmierer bei einigen Projekten, seien sie der schlechteste bei anderen! Wenn Sie der beste sind, dann probieren Sie aus, wie Sie Ihre Fähigkeiten bei der Leitung eines Projekts zeigen und wie Sie andere mit Ihren Visionen inspirieren können. Wenn Sie der schlechteste sind, lernen Sie was die Meister tun und Sie lernen, was sie nicht gerne tun (weil sie es von Ihnen erledigen lassen).
  • Arbeiten Sie an Projekten nachdem andere Programmierer diese bearbeitet haben. Bemühen Sie sich um Verständnis eines Programms, das von jemand anders geschrieben wurde. Finden Sie heraus, was man braucht, um es zu verstehen, und reparieren Sie es, während der ursprüngliche Programmierer nicht da ist. Denken Sie darüber nach, wie Sie Ihre Programme so gestalten, daß Sie es Personen, welche diese nach Ihnen pflegen, leichter machen.
  • Lernen Sie mindestens ein halbes Dutzend Programmiersprachen. Darunter sollte wenigstens jeweils eine Sprache sein, welche die folgenden Abstraktionen unterstützt: Klassen (wie in Java oder C++), funktionale Abstraktion (wie in LISP oder ML), syntaktische Abstraktion (wie in LISP), Deklarative Spezifikationen (wie in Prolog oder C++-Schablonen), Koroutinen (wie in Icon oder Scheme) und Parallelität (wie in Sisal).
  • Erinnern Sie sich daran, daß die Informatik ihre heutige Bedeutung nicht ohne Computer hätte. Lernen Sie wie lange Ihr Computer braucht, um eine Anweisung auszuführen, um ein Speicherwort aus dem Speicher zu holen (mit und ohne Verfehlung des Pufferspeichers [cache miss]), aufeinanderfolgende Speicherworte von der Festplatte zu lesen und zu einer neue Stelle auf der Festplatte zu positionieren. (Antworten hier.)
  • Beteiligen Sie sich an Bemühungen um die Standardisierung einer Sprache. Es könnte der ANSI-C++-Ausschuß sein, oder es könnte sein, zu entscheiden, ob Ihr lokaler Codierungs-Stil 2 oder 4 Leerrzeichen zum Einrücken verwendet. In jedem Fall lernen Sie, was andere an einer Sprache mögen, wie sehr sie sich dabei engagieren und vielleicht sogar ein bißchen darüber, warum sie dies tun.
  • Seien Sie so klug, die Bemühungen um die Standardisierung so schnell wie möglich wieder aufzugeben.

Bedenkt man dies alles, ist es fragwürdig, wie weit Sie durch Lernen mit Büchern kommen können. Bevor mein erstes Kind zur Welt kam, las ich alle Ratgeber-Bücher und fühlte mich immer noch wie ein ratloser Novize. Wendete ich mich 30 Monate später, als mein zweites Kind unterwegs war, wieder den Büchern zu, um mein Wissen aufzufrischen? Nein! Statt dessen verließ ich mich auf meine persönliche Erfahrung, die sich als viel nützlicher und beruhigender für mich erwies als Tausende von Seiten, die von Experten geschrieben wurden.

Fred Brooks beschrieb in seinem Essay Keine Wunderwaffe (No Silver Bullets) einen dreigeteilten Plan, um bedeutende Software-Gestalter zu finden:

  1. Erkennen Sie Spitzen-Gestalter auf systematische Weise und so früh wie möglich.
  2. Übertragen Sie die Verantwortung für die Entwicklung des Kandidaten und die sorgfältige Führung einer Karriereakte einem Karriere-Mentor.
  3. Bieten sie den Gestaltern Möglichkeiten, miteinander in Kontakt zu treten und sich gegenseitig anzuspornen.

Dabei wird angenommen, daß einige Menschen bereits über die notwendigen Eigenschaften verfügen, um ein bedeutender Gestalter zu werden; die Aufgabe besteht dann darin, sie richtig zu führen. Alan Perlis sagt es kurz und bündig: „Jedem kann das Bildhauern beigebracht werden: Michelangelo hätte man beibringen müssen, nicht zu bildhauern. So ist es auch mit den großen Programmierern.“

Also, gehen Sie los und kaufen Sie dieses Java-Buch! Sie werden wahrscheinlich einen Nutzen daraus ziehen können. Sie werden aber nicht Ihr Leben oder ihre wirkliche Gesamtkompetenz als Programmierer in 24 Stunden, Tagen oder sogar Monaten ändern.

Quellen

Bloom, Benjamin (ed.) Developing Talent in Young People, Ballantine, 1985.

Brooks, Fred, No Silver Bullets, IEEE Computer, vol. 20, no. 4, 1987, p. 10-19.

Hayes, John R., Complete Problem Solver  Lawrence Erlbaum, 1989.

Lave, Jean, Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life, Cambridge University Press, 1988.

Antworten

Zeiten für verschiedene Operationen auf einem typischen 1-GHz-PC im Sommer 2001:

einzelne Anweisung ausführen 1 ns = (1/1.000.000.000) s
Datenwort aus dem L1 Pufferspeicher (Cache) holen 2 ns
Datenwort aus dem Hauptspeicher holen 10 ns
Datenwort aus aufeinanderfolgenden Festplattenstellen lesen 200 ns
Datenwort aus neuer Festplattenstelle lesen (seek) 8.000.000 ns = 8 ms

Fußnoten

Diese Seite ist dank yomoyomo auch in einer japanischen Übersetzung, dank Carlos Rueda auch in einer spanischen Übersetzung, dank P.E.Allary auch in einer französischen Übersetzung, dank Xiaogang Guo auch in einer chinesischen Übersetzung, dank Jason Chen auch in einer traditionell-chinesischen Übersetzung und dank Çağıl Uluşahin auch in einer türkischen Übersetzungverfügbar.

T. Capey weist darauf hin, daß die Seite Complete Problem Solver von Amazon inzwischen sowohl „Teach Yourself Bengali in 21 days“ als auch „Teach-Yourself-Grammar-and-Style“-Bücher in dem Abschnitt „Customers who shopped for this item also shopped for these items“ haben. Ich vermute, daß ein großer Teil der Leute, die sich dieses Buch ansehen, von dieser Seite kommen.

[1] a little learning is a dangerous thing


Peter Norvig (Copyright 2001 [für den ursprünglichen Text])


Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s