Start > Algorithmik > Voraussetzungen

Was benötigt ein Programmierer?

Programmieren setzt nicht besonderes mathe­matisches Wissen oder spezielle Rechen­kenntnisse voraus, wie viele argwöhnen. Am Anfang reicht die Beherrschung der vier Grund­rechen­arten.

Will man später größere Programme schreiben, wird man sich intensiver mit den Mitteln der Programmier­sprache befassen. Dazu gehören z.B. logische und binäre Operatoren, aber auch grundlegende Kenntnisse der Betriebssysteme (Datei- und Speicher­verwaltung, wichtige Formate).

Höhere mathematische Kenntnisse braucht man natürlich, wenn man ein Mathematik­programm, 3D-Programme oder eine Tabellen­kalkulation schreiben will etc. Dann sollte einem Vektor- und Matrizen­rechnung sowie die Infinitesimal­rechnung nicht fremd sein.

Unbedingt erforderlich zum Erlernen einer Programmier­sprache ist hingegen

  1. die Fähigkeit zum logisch-analytischen Denken
  2. die Fähigkeit zum selbstständigen Arbeiten
  3. (und wie bei allem :-) Motivation.

Logisch-analytisches Denken

Speziell in der Programmierung benötigt man die Fähigkeit zum Denken in

Beispiel 1

Ein (zugegebenermaßen sehr triviales) Beispiel für logisches Denken: Wenn rote Flamingos Fisch fressen, und jedes Tier, das Fische frißt, auch Frösche frißt, fressen dann auch rote Flamingos Frösche?

Beispiel 2

Ein Programm soll eine Schleife zehn mal durchlaufen. Außerdem gibt es eine Variable x mit einem Anfangswert von Zehn. Bei jedem Schleifendurchlauf soll x um Eins erhöht, mit Zwei multipliziert und dann in Abhängigkeit vom Wert von x entweder GERADE oder UNGERADE auf dem Bildschirm ausgegeben werden. Wie oft erscheint die Meldung UNGERADE auf dem Bildschirm?

Beispiel 3

Eine Grund­voraussetzung für alle Renten­bezüge ist, daß der Versicherte eine Mindestanzahl an Jahren in die Renten­kasse eingezahlt (MIN gezahlt) hat. Darüber hinaus muß er entweder das Renten­alter erreicht (MIN alt) haben oder erwerbs­unfähig (EU) oder berufs­unfähig (BU) geworden sein. In einem Pseudocode schaut das in etwa so aus:

WENN person_will_rente DANN
  (
  WENN min_gezahlt UND ( min_alt ODER eu ODER bu ) DANN
    zahle_rente
  )

Frage: Welche Personen beziehen demnach keine Rente? Nur eine Antwort ist richtig:

  1. Alle, die nicht EU sind
  2. Alle, die nicht BU sind
  3. Alle, die nicht EU und nicht BU sind
  4. Alle, die nicht EU oder nicht BU sind
  5. Alle, die nicht MIN gezahlt haben
  6. Alle, die nicht MIN alt sind
  7. Alle, die nicht MIN gezahlt haben oder nicht MIN alt sind
  8. Alle, die nicht MIN gezahlt haben und: nicht EU oder nicht BU sind
  9. Alle, die nicht MIN gezahlt haben oder: MIN alt und nicht EU und nicht BU sind
  10. Alle, die nicht MIN gezahlt haben und nicht MIN alt sind
  11. Alle, die nicht MIN gezahlt haben oder: nicht MIN alt und nicht EU und nicht BU sind
  12. Alle, die nicht MIN gezahlt haben und nicht EU und nicht BU sind
  13. Alle, die nicht MIN gezahlt haben oder: nicht MIN alt oder nicht EU und nicht BU sind
  14. Alle, die nicht MIN gezahlt haben oder: nicht EU und nicht BU sind
  15. Alle, die nicht MIN gezahlt haben und nicht MIN alt sind oder: nicht EU und nicht BU sind
  16. Alle, die nicht MIN gezahlt haben und nicht MIN alt sind und nicht EU und nicht BU sind
  17. Alle, die MIN gezahlt haben und nicht EU und nicht BU sind

„Was hat das mit Programmierung an sich zu tun?“, wird sich mancher fragen. Nun, Genau dieser Personen­kreis wird in folgendem Ausschnitt eines Renten­berechnungs­programms im ANDERENFALLS-Zweig adressiert:

WENN person_will_rente DANN
  (
  WENN min_gezahlt UND ( min_alt ODER eu ODER bu ) DANN
    zahle_rente
  ANDERENFALLS
    drucke_ablehnung
  )

„Ja und?“, kann man wieder fragen, „wird doch alles automatisch durch den ANDERENFALLS-Zweig abgedeckt. Wozu brauche ich diese logische Spielerei?“

Korrekt, bis hierher hätten wir uns diese Übung sparen können. Muß man aber den Personen, die keine Rente bekommen, je nach fehlender Renten­voraussetzung auch noch unterschiedliche Ablehnungs­briefe schreiben, wird das Problem manifest.

Der Schreiber des nachfolgenden Beispiels hat sich nicht die Mühe gemacht, darüber nachzudenken, wer genau nun alles Ablehnungs­schreiben bekommen soll. Er hat einfach alle vier Einzelgründe aufgeführt:

WENN person_will_rente DANN
  (
  WENN min_gezahlt UND ( min_alt ODER eu ODER bu ) DANN
    zahle_rente
  ANDERENFALLS
    (
    WENN NICHT min_gezahlt DANN
      drucke_ablehnung_keine_kohle
    WENN NICHT min_alt DANN
      drucke_ablehnung_zu_jung
    WENN NICHT bu DANN
      drucke_ablehnung_zu_gesund
    WENN NICHT eu DANN
      drucke_ablehnung_immer_noch_zu_gesund
    )
  )

Was passiert nun? Man kann es sich denken:

Alle, die nicht mindestens min_gezahlt haben, bekommen schon mal ein Ablehnungsschreiben unter Angabe des korrekten Ablehnungsgrundes. So weit, so gut.

Alle, die nicht mindestens min_alt sind, bekommen ebf. ein Ablehnungs­schreiben mit Bezug auf das zu junge Alter. Das Problem ist nur, wenn jemand einen Rentenantrag gestellt hat (und die Renten­versicherung den Grad seiner Behinderung als zu geringfügig für EU oder BU einstuft, und er ebf. zu jung ist für eine Altersrente), wird er äußerst verwundert sein zu erfahren, er sei abgelehnt auf Grund des zu jungen Alters: bei BU oder EU spielt nämlich das Alter keine Rolle! Der korrekte Vorgang wäre hier eine Ablehnung aufgrund mangelnden Alters (für die Altersrente) UND mangelnder Voraus­setzungen für BU UND mangelnder Voraus­setzungen für EU.

Das gleiche Dilemma findet sich natürlich bei drucke_ablehnung_zu_gesund und drucke_ablehnung_immer_noch_zu_gesund. Es sei an dieser Stelle dem Leser überlassen, den korrekten Algorithmus für die Ablehnungsbescheide zu finden – die obige Übung.

Beispiele wie dieses finden sich zu Dutzenden in jedem Gebiet. Sobald man anfängt, größere Mengen mit Kontroll­strukturen wie CASE oder IF zu modellieren, steht man vor diesem Problem.

Hat logisches Denken mit Intelligenz zu tun?

Ein entschiedenes Jein. Nein, weil Intelligenz nicht gleich logischem Denken ist. Ja, weil es neben Erinnerungs­vermögen, Merk­vermögen, räumlichem und zeitlichem Vorstellungs­vermögen, Abstraktions­fähigkeit, Assoziations­fähigkeit, Kreativi­tät, „sozialer„ Intelli­genz und etwa zwanzig weiteren Komponenten ein Bestand­teil von Intelli­genz ist. Aber: Es gibt Menschen, die sehr gut abstrahieren oder logisch denken können, und dennoch vom (auch fragwürdigen) IQ-Wert schlechter liegen als Menschen, die nur über ein geringes logisches Denken verfügen, aber dafür eine ausgezeichnete soziale Kompetenz aufweisen oder im multi­medialen, künst­lerischem oder allgemein kreativem Umfeld besonders gut sind (Graphiker, Designer etc.). Ein gutes Beispiel für erstere sind Theoretiker, die einem ganz hervorragend die 2. Ableitung von y = f(x) = 4/3 ln(x)3 herbeten können oder den logischen Term ¬ (a ∧ b ∨ c) verein­fachen können, aber sich praktisch nicht im Leben zurechtfinden.

Ich gehe sogar so weit, zu behaupten, logisches Denken ist dem Menschen zutiefst fremd. Mir ist es zumindestens völlig fremd. Menschen denken assoziativ und in Bildern. Logisches Denken impliziert maschinelles Denken. Manche können Deduktions­mechanismen der Form WENN-DANN gut „emulieren“, manche nicht.

Wer an solchen Logikspielen Gefallen findet, kann weitere logische Aufgaben ausprobieren.

Fazit

Logisch-analytisches Denken kann man nur wenig erlernen; man hat es oder hat es nicht, aber „diszi­pliniertes“ Denken läßt sich erlernen. Für logische Reduktionen gibt es zudem Formeln (z.B. die Transformation nach de Morgan für obiges Beispiel), die einem z.T. Froh das Denken abnehmen können. Darüber hinaus gibt eine Grenze, die durch das eigene Gehirn festgelegt ist.

Programmierung als Kunst

Sehr gute Programmierer sind Künstler: nicht nur im Sinne von Können, sondern auch unter ästhetischen Kategorien. Ein sehr gut geschriebenes Programm ist meist auch ein Programm mit ästhetisch ansprechendem Quell­text: mit ausgewogenen Propor­tionen und klaren Strukturen. Es ist schön, soweit man so etwas von Quell­texten behaupten darf – auch wenn die Ästhetik eine sehr kühle und kristalline ist; manche würden sie blutleer nennen. Auch im Modellieren der Realität – nichts anderes ist Programmieren – steckt ein wenig Kunst, wie bei einem Bildhauer oder Maler auch, der die Natur abformt. Und je nach Persön­lich­keit des „Erbauers“ wird die Realität ein wenig anders modelliert.

Freude

Begeisterung bzw. Motivation, eine Programmier­sprache erlernen zu wollen? Das klingt selbstverständlich, ist es aber nicht. Ich hatte öfter Schüler, die intelligent waren, aber keine Lust hatten, sich mit der Sprache auseinander zu setzen („Das nehme ich so nebenbei mal mit, ich bin ohnehin so intelligent“). Ohne Motivation geht nichts, denn nur die Motivation treibt dich dazu an, zu üben. Und wie in den menschlichen Sprachen geht ohne Üben nichts. Auch ein Genie kann eine Programmiersprache nicht in wenigen Tagen lernen.

Die Motivation ist auch die Basis für

Selbstständiges Arbeiten

Aktives Entwickeln und Ausprobieren eigener Programme ist die Voraus­setzung, daß man seine Kenntnisse weiter­entwickelt. Wenn du wartest, daß immer der Lehrer vorbei kommt und sagt, ob du das Programm richtig geschrieben hast, dann stagnierst Du. Du wirst auf deinem Stuhl sitzen und dich fürchterlich langweilen. Nach meiner Erfahrung verfügen solche Menschen mit reiner passiver Erwartungs­haltung auch über eine deutlich schlechtere soziale Kompetenz, d.h., sie tun sich im Leben auch schwerer, selbst etwas in die Hände zu nehmen und auf Menschen aktiv zuzugehen. Am besten ist es, sich einer Programmier­sprache spielerisch zu nähern und sie einfach auszu­probieren.

© 2002, 2003 asdala.de: Kon­takt & Daten­obhut