Technology
12. August 2015

Programmieren für Nicht-Programmierer

Passende Themen: Programmieren

Einführung

Wenn ich Spezifikationen schreibe, denke ich oft, der Leser würde meine “Schreibe” verstehen. Wenn ich also schreibe: „Ich als Buchhalter möchte Währungen mit ihrem internationalen ISO-Standard-Kürzel eingeben, so dass ich nicht durch andere Angestellte missverstanden werde“, würde jedermann verstehen, was ich mit ISO-Standard meine?

Natürlich würde ich im obigen Beispiel einfach die Referenz eingeben und sagen: „Lese das Handbuch“. Leider ist es oft nicht so einfach. Um verständliche Spezifikationen zu schreiben, muss man die Leser der Spezifikationen verstehen – also insbesondere die Programmierer. Und das ist die Herausforderung: Sie sind kein Programmierer und das Denken von Programmierern ist wirklich sehr speziell.

Daher versuche ich in diesem Blogbeitrag die Programmier-Prinzipien zu erläutern. Es ist nicht daran gedacht, aus Ihnen einen Programmierer zu machen. Aber möglicherweise fällt es Ihnen dann leichter, Spezifikationen zu schreiben, die von Programmierern verstanden werden.

Ein wirklich dummer Roboter

RobotGoUm zu verstehen, wie Programmierung funktioniert, benutzen wir für die Erklärung einen wirklichen dummen Roboter. Bitte verstehen Sie mich richtig: Roboter sind dumm, aber dieser hier ist noch ein bisschen dümmer. Sie müssen ihm alles sagen, was er machen muss. Nichts, wirklich gar nichts ist gegeben. Wenn Sie sagen: „Geh!“, wird er gehen und nicht springen. Sogar wenn ein Stein im Weg ist, er wird versuchen zu gehen, weil Sie nicht gesagt haben: „Springe!“

Die Programmier-Prinzipien können sehr gut an Hand eines solchen Roboters erläutert werden. Für diejenigen unter Ihnen, die noch interessierter sind, habe ich ein wenig weiterführende Informationen im Anhang hinzugefügt.

Variablen

Variablen sind sehr hilfreich, wenn man programmiert, weil man mit ihnen fast alles speichern kann, was wir in einem Computer speichern möchten. Variablen können Zahlen, einfache Buchstaben, einen Text oder aber auch komplexe Strukturen wie eine Aufgabenliste mit Fälligkeitsdatum oder eine Wetterkarte darstellen.

Unser Roboter hat nur zwei Variablen: Schritte und Energie. Die Schritt-Variable gibt ihm die Anzahl der Schritte vor, die er in einer Runde gehen kann. Die Energie-Variable enthält die Energie, die er übrig hat. Wenn der Roboter einen Schritt geht, ist die Energie bei einem Teil reduziert. In einem Programm würde dies wie folgt aussehen:

energy=5;
step=2;

Möglicherweise wundern Sie sich, dass jede Zeile ein Semikolon am Ende hat. Das kommt daher, dass ich sehr oft C-ähnliche Sprache wie C# (ausgesprochen „Cie“ sharp), Java oder Objective-C benutze. Alle diese Sprachen wurden auf der Grundlage der Programmiersprache C entwickelt, welche in den 1970ern eingeführt wurde. Diese Sprachen zeigen das Ende eines Kommandos mit einem Semikolon an. Wahrscheinlich haben Sie schon Visual Basic Code – wie er in Excel benutzt wird – gesehen. Dort wird das Ende des Kommandos einfach durch das Ende der Zeile angezeigt, ganz ohne zusätzliches Zeichen.

Okay, aber unserer Roboter tut einfach gar nichts. Habe ich schon erwähnt, dass er wirklich dumm ist? Wir haben ihm zu sagen, was er mit seinen Variablen machen soll. Das tun wir in Funktionen.

Funktionen

Funktionen erzählen dem Computer, was er tun muss. Wenn unser Roboter gehen soll, brauchen wir eine Funktion, die ihm erzählt, wie viele Schritte er vorwärts gehen soll und wie sich seine Energie bei jedem Schritt reduziert. Die Anzahl der Schritte werden der Funktion in Parametern übergeben. Wenn wir diese Funktion aufrufen, müssen wir die Anzahl der Schritte übergeben, damit der Roboter weiß, wie viele Schritte er gehen muss.

Eine solche Funktion sieht ungefähr so aus:

Programmierer Function Go

Nun muss ich Einiges erläutern:

  1. Da ist ein void vor unserer Funktion. Funktionen geben Werte zurück, z.B. gibt eine Funktion die Summe von zwei Werten, die als Parameter übergeben wurden, zurück. Unsere Funktion gibt nichts zurück – der Roboter soll ja nur GEHEN. Daher haben wir ein void vor die Funktion geschrieben, das heißt jedoch nicht, dass wir im Nichts der Programmierung verloren sind.
  2. Wir haben geschweifte Klammern benutzt. Geschweifte Klammern erzählen unserem Computer, wo eine Funktion beginnt und endet. So können wir jede Menge Funktionen nacheinander schreiben, ohne dass wir das Ende einer Funktion und den Anfang einer anderen Funktion durcheinander bringen.
  3. Wir haben die Wörter function und go benutzt. Function erzählt dem Computer, dass der folgende Text eine Funktion ist. Solche Wörter sind „Schlüsselwörter“ und sind für jede Programmiersprache gut definiert. Und: void ist auch ein solches Schlüsselwort.
  4. „for(int steps=…“ ist eine Schleife. Schleifen werden in der Programmierung sehr oft benutzt. Kein Programmierer will die gleichen Dinge wieder und wieder schreiben müssen. Daher benutzen sie Schleifen. Schleifen werden solange ausgeführt, wie eine bestimmte Bedingung erfüllt ist – in unserem Fall, solange die Variable „steps“ kleiner ist als „numberOfSteps“. Alle diese Dinge gehören zu den Parametern der Schleife, welche durch die runden Klammern angezeigt wird. Die geschweiften Klammern hingegen zeigen an, was getan werden soll, solange die Schleife wiederholt wird.
  5. Das gleiche ist gültig für Kürzel. Weil Programmierer normalerweise faul sind, wollen sie nicht zu viel schreiben. Anstatt steps=steps+1, schreiben sie steps++. Das meint nichts anderes, steps ist lediglich um eins erhöht, solange die Schleife wiederholt wird. Das gleiche gilt für energy. Es wird jedes Mal um eins reduziert, wenn die Schleife durchlaufen wird

Mit dieser Funktion können wir unseren Roboter zwei Schritte laufen lassen:

static int energy=5;
int steps=2;
go(steps);

Nachdem der Roboter seine Arbeit getan hat, ist die Energie um zwei reduziert, weil sie um eins für jeden Schritt innerhalb der Funktion go() reduziert wird. Wir haben eine Variable außerhalb der Funktion definiert. Normalerweise können Variablen nur innerhalb des Kontextes (angezeigt durch die geschweiften Klammern), in dem sie definiert wurden, benutzt werden. Aber wir haben eine globale Variable energy, die überall benutzt werden kann, definiert – daher ist dies eine globale Variable.

Objekte

Objekte sind sehr bedeutend, wenn Sie moderne Programmiersprachen benutzen wollen. So genannte Objekt-orientierte Programmiersprachen wurden Ende der 1980er eingeführt. Davor waren die Programmiersprachen rein prozedural.

Das bedeutet: Programmierer haben „nur“ Prozeduren oder Funktionen definiert und sie dann auf Daten angewandt. Das hat oft Fehler verursacht, weil die Funktionen auf die gerade im Speicher vorhandenen Daten nicht anwendbar waren. Z.B. macht es keinen Sinn, unsere Funktion go() für Daten aufzurufen, die ein Haus repräsentieren, weil sich ein Haus normalerweise nicht bewegen kann.

Objekt-orientiertes Programmieren (oder kurz OOP) hat dieses Problem gelöst. Wir definieren Daten und die Funktionen, die auf sie anwendbar sind, zusammen. In unserem kleinen Beispiel definieren wir die Funktion go zusammen mit dem Objekt, auf die sie angewendet werden kann – den Roboter.

Übrigens werden in Objekt-orientierten Programmiersprachen Funktionen „Methoden“ genannt. Das heißt nichts anderes, aber als der neue Programmierstil (oder besser: die neuen Programmier-Denkmuster) eingeführt wurde, wollte man einen anderen Namen für diese andere Art haben.

Wenn wir eine Klasse definieren, definieren wir eine Klasse. Eine Klasse ist eine Schablone für ein Objekt. Es erzählt dem Computer, wie ein Objekt zu erzeugen ist. Wenn wir mehrere Roboter benötigen, wenn unser Programm läuft, muss ich dies nur einmal definieren, wenn ich programmiere.

Call Robot Programmierung

Das Schöne an OOP ist, dass Objekte andere Objekte enthalten können. So enthält unser dummer Roboter einen Kopf, einen Körper, Arme und Beine. Um die Funktion goforward() zu implementieren, sollten wir einige Bewegungen zumindest der Arme und Beine implementieren. Der Körper und der Kopf sollten sich auch bewegen, ansonsten würde unser Roboter seinen Kopf zurücklassen.

Debugging

Lassen Sie uns annehmen, dass wir die Methode goforward() mit dem folgenden Code implementiert haben.

GoForward Programmierung

Programmierung Bug Robot

Jetzt können wir unser kleines Programm laufen lassen und sehen, was passiert.

Oh je – unser Roboter ist zusammengebrochen. Das nennen wir Bug. Das Programm, das wir erstellt haben, läuft nicht so, wie wir es erwartet haben. Jetzt müssen wir den Bug durch Debuggen finden – das heißt, wir lassen das Programm Zeile für Zeile ablaufen.

  1. leftleg.up() – OK, der Roboter hebt sein linkes Bein
  2. rightar.moveforward() – OK, der Roboter bewegt seinen rechten Arm vorwärts
  3. rightleg.up() – Das ist nicht OK, der Roboter ist in der Luft und zerbricht.

Wir haben unseren Fehler gefunden: Wir haben vergessen, das linke Bein abzusetzen, bevor wir das rechte Bein heben, so dass der Roboter wirklich gehen kann. OK – wir bugfixen unser Programm (das heißt, wir berichtigen den Fehler).

Go Forward Robot Programmierung

Success ProgrammierungWir lassen unser kleines Programm nach dem Debugging wieder laufen und sehen, dass es funktioniert.

Zusammenfassung

Ich hoffe, Sie hatten genauso viel Spaß wie ich mit unserer kleinen Geschichte und verstehen nun besser, wie Programmierer denken. Natürlich war dies ein wirklich einfaches Beispiel, aber es zeigt, dass Programmieren wirklich harte Arbeit ist. Und dass es manchmal wirklich frustrierend sein kann, wenn sich mehr Bugs im Code befinden, als man dachte. Bitte lassen Sie es mich wissen, wenn Sie noch mehr über Programmierung oder Software-Entwurf wissen möchten.  

Anhang: Verschiedene Programmier-Sprachen

Es gibt unterschiedliche Programmier-Sprachen, die ähnlich aussehen, aber sehr unterschiedlich sind. Da wir unterschiedliche Betriebssysteme haben, benötigen wir auch unterschiedliche Programmier-Sprachen.

Unser Beispiel in Java:

Java wird oft benutzt, um Server-Aufgaben zu programmieren, z.B. wenn Sie eine Nachricht durch einen Benutzer empfangen wollen, der durch einen anderen Benutzer gesendet wurde. Normaler-weise wählt man hier Java, da die meisten Server-Betriebssysteme Java verstehen. Aber es wird auch zum Programmieren von Android Smartphones benutzt.

Public Class Robot

Unser Beispiel in Objective C:

Objective C ist eine Programmiersprache, die durch Apple eingeführt wurde. Sie wird für alle Apple-Geräte wie Mac, iPhone und Apple Watch benutzt.

Interface Robot

annegret

Dr. Annegret Junker

Dr. Annegret Kampe arbeitete bis Ende Oktober 2017 als Enterprise Architect Cloud bei SupplyOn.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.

10 + 4 =

Zum Seitenanfang