Meine Ansichten zum Lernen der Programmierung


Zunehmend treffe ich in Foren auf Posts der Art: "Wie kann ich programmieren lernen?" Eine gute Frage, aber ich finde, eine Antwort darauf ist nicht ganz so leicht zu geben. Daher möchte ich mit dieser Seite mal anschneiden, was meine ganz persönliche Meinung zu diesem Thema ist. Diese ist nicht der Weisheit letzter Schluß und auch nicht generell und allgemein bindend gültig, sondern eben nur meine Meinung. Ich habe einfach schon oft genug erlebt, daß Leute auf diese Weise wirklich brauchbare Programmierer wurden.

Zunächst einmal gibt es da einen herrlichen Artikel von Dr. Heinz M. Kabutz im "Java (tm) Specialists Newsletter":
http://www.javaspecialists.co.za/archive/newsletter.do?issue=100&locale=en_US.
Im Großen und Ganzen stimme ich durchaus mit dem Autor überein (in einigen Punkten allerdings habe ich das Gefühl, daß er etwas am Rad dreht).
Die Erfahrung hat mich gelehrt, daß die typische erste Reaktion auf den oben genannten Link und dessen Inhalt ist: "Bäh, das ist so viel Text und dann auch noch Englisch. Geht das nicht einfacher?". Zusammengefasst geht es in dem Artikel darum, wie man ein Super-Mega-Java-Starprogrammierer wird. Ein paar der Ansichten (z.B. 90 Stunden die Woche am Computer sitzen) halte ich für sehr weltfremd. Aber - wie schon erwähnt - sind ein paar phantastische Analogien und Tips vorhanden, z.B.:

Die Beckham-Analogie zum Programmieren
Stell dir mal für einen Moment vor, ein Fan fragt David Beckham folgende Frage:
Fan: "Hallo, Mr. Beckham, mein Sohn strebt eine Karriere als Fußballspieler an. Welchen Ratschlag hätten Sie denn für ihn?"
Beckham: "Spielt er in einer Jugendmannschaft?"
Fan: "Oh nein, er spielt kein Fußball, sieht es sich aber oft im Fernsehen an."
Beckham: "Aaah... welche anderen Sportarten betreibt er denn?"
Fan: "Er spielt Golf. An seinem Computer. Ansonsten haben wir mal früher Tischtennis gespielt."
Beckham: "Aha. So nebenbei: Wie alt ist Ihr Sohn eigentlich?"
Fan: "Er ist 35."
Beckham: "Also, Ihr Sohn spielt weder Fußball noch betreibt er einen anderen Sport, er ist bereits 35 Jahre alt aber er will ein Profifußballer werden. Was ist der wirkliche Grund dafür? Der wirkliche, echte Grund?"
(Und die Antwort ist immer die gleiche.)
Fan: "Ich habe gehört, daß man als Fußballspieler eine Menge Geld verdienen kann."

Jedem halbwegs normalem Menschen wird der vollkommene Wahnsinn der oben beschriebenen Situation sofort einleuchten. Aber warum glauben manche, daß es beim Programmieren anders ist?
Sehr gerne werden auch Analogien zu Autos gezogen, da diese auch technische Geräte sind und jeder weiß, worum es geht:

Jemand, der Auto fährt, wird sich nicht automatisch und sofort einbilden, er sei auch ein KFZ-Meister.
Aber es gibt unglaublich viele Leute, die sich bei Aldi einen PC zulegen und dann meinen, sie seien die IT-Experten.

Einen der richtig guten Tips aus obigem Artikel fand ich (sinngemäß zitiert):
"...Fang an zu programmieren. Und zwar gratis. Jawohl: Gratis. Schreib Programme für alles und jeden ohne Vergütung. Klingt irre? Was wäre wohl gewesen, wenn Beckham nur dann Fußball gespielt hätte, wenn er dafür bezahlt worden wäre? Er hätte es nie wirklich gelernt! Mit dem Programmieren ist es nicht anders..."
Der Autor meint auch, Programmieren sei eine Lebenseinstellung. Auch diesen Gedanken teile ich zu einem Großteil. Nicht ganz so extrem, wie es im Artikel beschrieben wird - aber ich bin ja auch kein Superstar-Programmierer. Ich halte mich selbst für einen brauchbaren, teilweise ganz guten Programmierer. Und das reicht mir.

Es bleibt aber immer noch die Frage offen: Wie lerne ich jetzt Programmieren?

Zunächst muß die Motivation stimmen.

Wenn du scheißviel Geld verdienen und mit 30 in den vorgezogenen Ruhestand gehen willst, dann vergiß das mit dem Programmieren. Dann schlage lieber eine Karriere als Politiker, Banker oder Manager ein.
Wenn du vor deinen Freunden und Bekannten angeben willst, wie toll du dich mit Computern auskennst - auch dann vergiß das mit dem Programmieren. Du wirst niemals die Langzeitmotivation besitzen, die notwendig ist.
Oder willst du vielleicht ein Superstar sein, der das nächste Blockbusterspiel entwickelt, über das jeder reden wird?
Vergiß es. Ein solches Spiel wird niemals von Programmieranfängern sondern von absoluten Profis entwickelt und geschrieben. Anfänger dürfen vielleicht ein oder zwei unwichtige Unterroutinen zusammen frickeln, aber die wichtigen Kernkomponenten werden von Leuten entwickelt, die Ahnung davon haben.
Die richtige Motivation zum Lernen des Programmierens ist Freude an der digitalen Technik und Informationsverarbeitung. Das bedeutet Begeisterung auch für so Dinge wie Parsertechniken, Strukturen, Objekten etc.pp. Wem allein schon diese Begriffe zu abstrakt klingen, der weiß, daß er kein Programmierer werden wird.

Neugierde und Lernbereitschaft sind absolut unabdingbar.

Wer denkt "Uff, endlich ist die Schule vorbei, jetzt hat sich's was mit dem Büffeln und Pauken", der ist in der Programmiererschiene denkbar falsch gelandet. Als Programmierer lernt man sein Leben lang. Nein, es hört niemals auf. Ein Programmierer kann niemals sagen: "Jetzt weiß ich alles, was ich brauche. Das reicht mir." Denn die Technologie entwickelt sich permanent weiter. Bill Gates sagte mal: "Kein Mensch wird je mehr als 640 Kb Hauptspeicher brauchen." Hätte er auch stur an dieser Aussage festgehalten, dann wäre er blitzschnell pleite gegangen. In 640 Kb kann man heutzutage nicht mal mehr einen Maustreiber unterbringen. Die Systeme sind immer größer und komplexer geworden. Entsprechend mussten sich die Programmierer auch weiter bilden. Noch vor wenigen Jahren konnte ich einfach den Grafikmodus $013 aktivieren und dann am Bildschirm loslegen, Spielfelder zu zeichnen etc. Heutzutage kann ich mir das sauber von der Backe wischen, das Computerumfeld hat sich für mich komplett geändert. Ich muß mir die PC-Resourcen mit anderen Programmen teilen (Multitasking) und meine Programme in mehreren verschiedenen Bildschirmauflösungen anbieten. Und ich kann keineswegs immer davon ausgehen, daß mir der gesamte Bildschirmplatz alleine gehört. Evtl. soll das Programm in einem Fenster laufen etc.pp.
Sehr, sehr viele Anfänger denken, sie könnten sich von anderen Programmierern Sourcecodes besorgen, diese in ihren Editor tippen, irgendwie das Programm zum Laufen bringen und würden dabei etwas lernen.
Falsch!
Dabei lernt man extrem wenig bis gar nichts. Vielleicht ein wenig die Schalter des Compilers. Mehr aber auch nicht. Die meisten guten Programmierer haben so angefangen, daß sie sich eines Tages einen Computer kauften - und diesen zerlegten! Und zwar ohne gleich im Internet oder irgendwelchen Foren zu schreien: "Wäh! Mein PC bootet nicht mehr! Brauche Hilfe!!!einself!". Nein, Leute, die sich wirklich für die Technik begeistern und damit Grundvoraussetzungen für einen Programmierer mitbringen, setzen sich in so einem Fall hin und versuchen, die Kiste wieder selber zum Laufen zu bringen.
Und wenn dabei ein paar Teile kaputt gehen?
Schon mal den Begriff "Lehrgeld" gehört? Ich weiß nicht mehr, wieviel DM/Euro ich für Ersatzteile ausgegeben habe, die ich entweder benötigte, um Dinge wieder zum Laufen zu bringen, die ich selbst kaputt gemacht hatte oder die ich am Ende dann doch überhaupt nicht gebraucht habe. Aber was ich dadurch gelernt habe, lässt sich rein mit Geld gar nicht mehr aufwiegen.
Und hier noch eine reine Horrornachricht: Um ein guter Programmierer zu werden, reicht es nicht aus, sich nur mit Computern und IT zu beschäftigen. Minimal Mathematik muß auch dabei sein. Der Schrecken, der Horror! Aber es ist so. Wer keine Ahnung von Vektoren, Matrizenberechnungen oder Zahlenräumen hat (z.B. Komplementärzahlen), der kann auch entsprechende Techniken niemals als Programmierer verwenden oder umsetzen. (Kleiner Tip am Rande: Für 3D-Programmierung, wie in aktuellen Egoshootern, sind Vektoren und Matrizentransformationen das A und O, um ein entsprechendes Verständnis kommt man auch nicht durch Einsatz von OpenGL, DirectX oder sonstigen Spielbaukästen herum.)

Es gibt (fast) immer eine Lösung

Egal, um welches Problem es sich handelt, es gibt so gut wie immer eine Lösung. Und für den Anfänger fällt sogar die Einschränkung weg und die Aussage kann lauten: Es gibt immer eine Lösung.

Problem: Du hast ein Tutorial zu einem speziellen Problem gefunden, aber es ist in Englisch und du kannst kein Englisch.
Lösung: Lern Englisch.

Problem: Die Lösung eines bestimmten Programmierproblems ist nur in einer Programmiersprache vorhanden, die du nicht verstehst.
Lösung: Lerne diese andere Programmiersprache.

Problem: Dein Betriebssystem stürzt ab und führt dein Programm nicht aus.
Lösung: Korrigiere dein Programm.

Problem: Du weisst nicht, wie und an welcher Stelle zu dein Programm korrigieren sollst.
Lösung: Lerne Debugging und finde heraus, an welcher Stelle dein Programm abstürzt.
etc.pp.

Es ist kein Zufall, daß oben dauernd steht: "Lerne, lerne, lerne...". Das Lernen ist für einen Programmierer eine solche Grundvoraussetzung wie das Laufen für einen Fußballspieler. Wenn du zum Lernen und Lesen zu faul bist, dann gleichst du einem Fußballspieler, der zu faul zum Laufen ist. Und der wird niemals ein millionenschwerer Profi werden.

Durch die dauernde Betonung des Lernens bedingt sich noch etwas anderes:

Fang frühzeitig an mit dem Lernen.

Mit 30 oder noch später fällt das Erlernen des Programmierens sehr viel schwerer. Unmöglich ist es sicher nicht, aber die Chancen, daß du noch ein richtig guter Programmierer wirst, wenn du erst mit 30 damit anfängst, sind verschwindend gering. Bis du die ganzen Grundlagen im Kopf hast, vergehen schon einige Jahre und dann sollst du noch immer mehr und mehr und mehr Wissen in den Schädel bekommen? Als junger Mensch schafft man das durchaus, aber ab einem gewissen Alter nimmt die Lernfähigkeit immer weiter ab.

Zu guter Letzt ist noch zu sagen, daß ein guter Programmierer sehr selbstsändig ist. Denn immer wieder stößt er auf neue Probleme und muß sich die Lösungen dafür zusammensuchen oder selbst erarbeiten. Denn das ist - verdammt nochmal! - der Job eines Programmierers! Ein Programmierer findet Lösungen. Er sitzt nicht in seinem Büro, zählt Geldbündel und hat gelegentlich mal einen dermaßen genialen Einfall, daß sich alle ob dieses Geistesblitzes geblendet abwenden müssen. Ein Programmierer denkt, forscht und entwickelt Lösungen für informationstechnische Probleme.
Wenn du also wirklich das Programmieren lernen willst, dann hör' auf, andere mit deinen technischen Problemen vollzuheulen und fang an, deine Probleme selbst zu lösen. Und zwar alle. Wenn du etwas nicht weißt, dann schlag und lies es selber nach. Im Gegensatz zu früher gibt es heute eine unglaubliche Vielzahl an Informationsquellen: Suchmaschinen, Foren, Newsgroups, Literatur (ja, Bücher, diese komischen, analogen Dinger zum Aufklappen) und eine ganze Menge von Leuten, die sich mit ähnlichen Problemen beschäftigen. Es ist ja nicht so, daß du immer und generell nur im stillen Kämmerchen vor dich hinwerkeln sollst, aber als Anfänger kannst du einfach keine technisch genauen Fragen stellen. Das lernst du erst noch und zwar sehr viel später (und damit ist nicht gemeint: Nach 2 Wochen. Viel eher bezieht sich das "viel später" auf: Nach 2 Jahren!).


Welche Tips habe ich also für jemanden, der das Programmieren lernen will?

1. Mach den Computer aus.
Bevor du auch nur in der Lage bist, ein Programm zu schreiben, das über ein "Hello World" oder das stupide Abtippen eines Tutorials hinausgeht, hast du so viel zu lernen, daß deine Tastatur wahrscheinlich Staub ansetzen wird, bevor du sie wieder anfassen musst.

2. Lerne Ehrlichkeit.
So brutal das klingt, aber die meisten haben sich heutzutage dermaßen das Selbstbelügen und irgendwelchen "political correctness"-Blödsinn angewöhnt, daß sie gar nicht mehr in der Lage sind, kurz, klar und präzise das zu sagen, was sie auch meinen. Interpretationsfrei. Aber genau das erwarten Computer. Und andere Programmierer übrigens auch. Wenn in einem Forum behauptet wird "ich habe schon bei Google nachgeschaut...", dann dauert es maximal ca. 60 Sekunden, um zu schauen, ob es wirklich im Internet keine Hilfe zum Thema gibt. Wer dann als Lügner enttarnt wird, bekommt so schnell keine Hilfe mehr.

3. Wenn du ehrlich dir selbst gegenüber bist, stelle dir die Frage, warum du Programmierer werden willst.
Wenn du nur reich werden willst - lass es sein. Ansonsten habe ich mich schon weiter oben darüber ausgelassen.

4. Lerne Englisch.
Es gibt Literatur und Tips nicht immer in deiner Landessprache. Neben dieser solltest du unbedingt auch Englisch beherrschen, damit du dich auch international ausdrücken kannst. Nein, an Englisch führt kein Weg vorbei. Definitiv nicht.

5. Lerne Mathematik.
Das heisst nicht, daß du Ungleichungen mit komplexen Zahlen im Kopf lösen können musst. Aber du solltest auf alle Fälle den Mathematikstoff, der an Gymnasien gelehrt wird, durchgearbeitet und verstanden haben. Egal, wie lange es dauert. Es schadet auch überhaupt nichts, wenn du schon mal ein wenig in Mathematik auf Hochschulniveau reinschaust. Wenn du mit dem einfachen Dreisatz oder Bruchumwandlungen Probleme hast, dann arbeite an dir, lerne auf Teufel-komm-raus und werde besser.
Mathematik ist das tägliche Brot in der Programmierung.

6. Hör auf andere zu nerven und hilf dir selbst.
Du willst ein Problemlöser werden. Also benimm dich auch so. Suche selbst nach Lösungen und erwarte nicht dauernd, daß dir alles vorgekaut wird.

7. Entscheide dich für eine anfängliche Programmiersprache
Da gibt es hetzutage eine ganze Menge. Wenn du dir nicht sicher bist, dann kannst du im nächsten Programmierforum einen Post zu diesem Thema verfassen. (Wie? Du kennst keine Programmierforen? Siehe Punkt 6: Dann such dir gefälligst eins!). Wenn du dich dann für eine Sprache entschieden hast, mach dich schlau, was du alles brauchst, um diese Sprache zu lernen.
IDE, z.B. VisualStudio? Oder Eclipse? Spezielle Plugins? Bibliotheken? Besondere Editoren?
Besorg dir alle notwendigen Arbeitsmittel und richte sie dir selbstständig auf deinem Rechner ein.

8. Besorge dir Einstiegshilfen und Tutorials
Und auch hier wieder: Jammer nicht in irgendwelchen Foren rum: "Wo find ich'n Tutorial?". Such dir selber eins. Besorg dir Bücher. Ja, die Dinger sind teuer (wie war das mit dem Lehrgeld?). Und du wirst dir mit Sicherheit auch das ein oder andere ziemlich teure Buch zulegen, mit dem du nichts anfangen kannst, weil es einfach schlecht geschrieben ist. Überraschung: Ein anderer kommt genau mit diesem Schreibstil viel besser zurecht. Finde selber heraus, auf welche Art du am Besten lernst. Lies gute und schlechte Bücher. Dadurch bekomsmt du nicht nur einen didaktischen Vergleich, auch dein Wissen um die Materie vertieft sich.
Lass dir keine Tutorials von anderen vorkauen, sondern arbeite sie selber durch. Du hast ein Beispiel aus dem Tutorial abgetippt und es funktioniert nicht? Dann schreibe nicht gleich wieder Hilfsgesuche in irgendwelche Foren. Finde selber heraus, warum es nicht klappt, auch wenn das sehr, sehr lange dauert. Das Erfolgserlebnis wird sich dir in's Gedächtnis einbrennen und du wirst wieder etwas gelernt haben.

9. Hör auf, andere um Sourcecodes anzubetteln
Denn einerseits nervst du damit andere Programmierer, andererseits lernst du dadurch nichts. Wenn du ein Problem hast und hier und jetzt eine Lösung dafür haben willst - dann beauftrage einen anderen Programmierer. Entgeltlich versteht sich. Denn immerhin macht er deine Arbeit. Irgendwann wirst auch du soweit sein, daß du ein ganz spezifisches Problem hast und dich auch präzise genug ausdrücken kannst, um anderen dein Problem zu schildern. Dann wirst du von ganz alleine Sourcecodes bekommen und damit etwas anfangen können. Es hat auch schon Anfänger gegeben, die sich selbstständig um eine Problemlösung bemüht haben und zu kleinen Detailproblemen höflich Fragen stellten und als Antwort extra für sie geschriebene, 50-seitige Tutorials bekommen haben. Das waren dann aber keine, die in einem Forum geschnorrt haben: "Hasse ma'n Source?".

10. Wenn alle Voraussetzungen bis hierher erfüllt sind, programmiere.
Und zwar nicht alle Jubeljahre mal sondern dauernd. Nicht nur im Job, auch privat. In deiner Freizeit. Und lerne weiter. Es heißt nicht umsonst "Übung macht den Meister". Wenn du immer nur liest und nie versuchst, das Gelesene auch umzusetzen, dann verkümmern deine Fähigkeiten wieder. Als Programmierer wirst du immer am Ball bleiben müssen. 6 Monate Untätigkeit können schon ausreichen, daß du wieder ganz von vorne anfangen darfst.
Wenn du ein Problem hast und dir ein Programm fehlt oder eine bestimmte Software etwas nicht so macht, wie du dir das vorstellst, dann schreibe dir selber ein Programm, welches das Problem genau so löst, wie du dir das vorstellst. Ja, du wirst dabei diverse Male "das Rad neu erfinden". Das ist für einen Anfänger auch nicht schlimm. Später wirst du dann lernen, existierende Komponenten, Bibliotheken und Hilfen zu verwenden. Aber du willst ja das Programmieren lernen. Und da ist es nie verkehrt auch die einfachsten Probleme, die schon tausendfach gelöst wurden, selber nochmal zu lösen. Hinterher kannst du dann deine Lösung mit der von anderen vergleichen und erkennen, wo du etwas hättest besser machen können. So lernst du dann, dich selbst zu verbessern.


Geschrieben Ende 2008 in der Hoffnung, daß dadurch vielleicht einem Programmieranfänger geholfen wird.