Wenn du mit dem Programmieren anfängst, möchtest du natürlich möglichst schnell Ergebnisse sehen. Ein paar Zeilen Code schreiben, Programm starten und schon passiert etwas. Genau deshalb werden Sprachen wie Python häufig als ideale Einsteigersprachen empfohlen. Die Syntax ist übersichtlich, viele Dinge funktionieren mit erstaunlich wenig Code und erste kleine Programme entstehen innerhalb kürzester Zeit.

Ich sehe das trotzdem anders.

Wenn dein Ziel nicht nur darin besteht, möglichst schnell Programme zu schreiben, sondern Programmieren wirklich zu verstehen, halte ich Java für eine der besten Sprachen, mit denen du anfangen kannst. Nicht obwohl Java an einigen Stellen ausführlicher ist, sondern gerade deswegen.

Java zwingt dich relativ früh dazu, dich mit Dingen zu beschäftigen, die andere Sprachen zunächst vor dir verstecken. Datentypen, Klassen, Methoden, Sichtbarkeiten, Interfaces, Vererbung oder Exceptions wirken am Anfang vielleicht wie zusätzlicher Ballast. Tatsächlich lernst du damit aber viele grundlegende Konzepte, die dir später auch in anderen Programmiersprachen immer wieder begegnen werden.

 

Java zwingt dich dazu, genauer hinzusehen

Eine der ersten Sachen, die bei Java auffällt, ist die vergleichsweise ausführliche Syntax. Schon bei einfachen Variablen musst du angeben, welchen Datentyp sie besitzen.

String name = "Marcy";
int age = 42;
boolean active = true;

In Python könnte das deutlich kürzer aussehen.

name = "Marcy"
age = 42
active = True

Natürlich bedeutet das nicht, dass Python keine Datentypen besitzt. Selbstverständlich sind auch dort Strings, Integer oder Boolean Werte unterschiedliche Typen. Python verlangt nur nicht von dir, diese Typen an dieser Stelle ausdrücklich hinzuschreiben. Das ist bequem. Gerade am Anfang kann diese Bequemlichkeit aber auch dazu führen, dass du dich mit dem eigentlichen Konzept weniger beschäftigst.

In Java wirst du zwangsläufig damit konfrontiert, dass eine Variable einen bestimmten Typ besitzt. Wenn du einer int Variable plötzlich einen String zuweisen möchtest, funktioniert das nicht. Wenn eine Methode einen String erwartet, kannst du ihr nicht einfach irgendein Objekt übergeben. Der Compiler weist dich bereits darauf hin, bevor dein Programm überhaupt läuft. Dadurch lernst du früh, darüber nachzudenken, mit welchen Daten dein Programm eigentlich arbeitet.

Das Gleiche passiert bei Methoden. Du definierst Parameter und Rückgabewerte ausdrücklich.

public int add(int a, int b) {
    return a + b;
}

Du siehst sofort, dass diese Methode zwei Integer Werte erwartet und anschließend wieder einen Integer zurückgibt. Natürlich lässt sich dasselbe Konzept auch in anderen Sprachen ausdrücken. Java macht es nur sehr schwer, es zu ignorieren. Genau diese Explizitheit empfinde ich beim Lernen als Vorteil.

Java nimmt dich stärker an die Hand, allerdings nicht dadurch, dass es dir Arbeit abnimmt. Es zwingt dich vielmehr dazu, bestimmte Entscheidungen bewusst zu treffen.

 

Die ausführliche Schreibweise ist kein unnötiger Ballast

Moderne Programmiersprachen versuchen häufig, wiederkehrende Konstrukte möglichst kompakt auszudrücken. Das ist grundsätzlich etwas Gutes, wenn du die zugrunde liegenden Konzepte bereits kennst.

Ein gutes Beispiel ist Kotlin. Kotlin läuft ebenfalls hervorragend auf der JVM und kann eng mit Java zusammenarbeiten. Es wäre allerdings fachlich falsch, Kotlin einfach nur als Kurzschreibweise für Java zu bezeichnen. Kotlin ist eine eigenständige Programmiersprache mit eigenen Konzepten und eigenen Sprachentscheidungen. Trotzdem lässt sich daran sehr gut erkennen, was ich mit einer kompakteren Sprache meine.

Eine einfache Java Klasse könnte beispielsweise so aussehen:

public class User {

    private final String name;

    public User(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }
}

In Kotlin lässt sich ein vergleichbares Ergebnis wesentlich kompakter formulieren.

class User(val name: String)

Das ist angenehm. Ich würde in einem normalen Projekt auch nicht verlangen, absichtlich möglichst viel Code zu schreiben.

Für das Lernen hat die ausführliche Java Variante aber einen entscheidenden Vorteil. Du siehst den Konstruktor. Du siehst das Feld. Du siehst dessen Sichtbarkeit. Du erkennst, dass das Feld nach der Initialisierung nicht mehr verändert werden soll. Du siehst eine Methode, über die der Wert nach außen verfügbar gemacht wird. Wenn du später Kotlin verwendest, kannst du die kompakte Schreibweise viel besser einordnen. Du weißt bereits, welches Problem damit gelöst wird und welche Bestandteile dir die Sprache abnimmt. Das gilt aber nicht nur für Kotlin.

Viele moderne Sprachfeatures sind letztlich komfortablere Möglichkeiten, bekannte Programmierkonzepte auszudrücken. Typinferenz erspart dir wiederholte Typangaben. Properties reduzieren den Aufwand für Getter und Setter. Lambda Ausdrücke machen bestimmte Funktionskonstrukte kompakter. Pattern Matching kann komplexe Fallunterscheidungen deutlich lesbarer machen. Das sind großartige Werkzeuge. Aber ein Werkzeug ist wesentlich leichter zu verstehen, wenn du bereits weißt, welches Problem es eigentlich löst.

Wenn du ausschließlich die Kurzform kennst, weißt du möglicherweise, wie du etwas schreibst. Das bedeutet noch nicht automatisch, dass du verstanden hast, warum es funktioniert.

 

Warum ich Python deshalb nicht für den besten Einstieg halte

Python ist eine sehr gute Programmiersprache. Sie wird in unzähligen professionellen Projekten eingesetzt und eignet sich hervorragend für Automatisierung, Datenverarbeitung, wissenschaftliche Anwendungen, Webentwicklung und viele andere Bereiche. Meine Kritik richtet sich deshalb nicht gegen Python selbst, wobei ich zugeben muss, dass ich seit Jahren gern einen ziemlich unfairen Satz über Python benutze:

"Ich kann keine Programmiersprache ernst nehmen, die eine bestimmte Anzahl von Leerzeichen braucht, damit der Code überhaupt funktioniert."

Natürlich ist das bewusst überspitzt. Und fachlich steckt dahinter auch kein echtes Argument gegen Python. Einrückungen sind dort schlicht Teil der Syntax und ersetzen unter anderem die geschweiften Klammern, mit denen beispielsweise Java Blöcke kennzeichnet.

Trotzdem steckt in diesem kleinen Seitenhieb auch etwas von dem, was mich an Python als Einsteigersprache stört. Die Sprache versucht sehr konsequent, Code knapp und optisch einfach zu halten. Das ist für produktives Arbeiten oft angenehm. Beim Lernen möchte ich aber gar nicht unbedingt, dass möglichst viel verschwindet.

Ich halte Python deshalb nicht für die beste Sprache, wenn dein wichtigstes Ziel darin besteht, die Grundlagen der Softwareentwicklung möglichst deutlich kennenzulernen. Python macht dir den Einstieg sehr leicht. Genau das ist gleichzeitig seine große Stärke und aus meiner Sicht seine Schwäche als erste Programmiersprache. Du kannst beispielsweise sehr schnell Daten aus einer Datei lesen, JSON verarbeiten, HTTP Requests verschicken oder kleine Werkzeuge bauen. Dank der umfangreichen Standardbibliothek und des riesigen Ökosystems erreichst du mit wenigen Zeilen Code erstaunlich viel. Das sorgt für schnelle Erfolgserlebnisse. Dabei besteht allerdings die Gefahr, dass du lernst, wie du ein bestimmtes Ergebnis erzeugst, ohne die dahinterliegenden Konzepte vollständig zu verstehen.

Das bedeutet ausdrücklich nicht, dass du mit Python keine objektorientierte Programmierung, Datentypen, Fehlerbehandlung oder sauberes Softwaredesign lernen kannst. Natürlich kannst du das. Python zwingt dich nur an vielen Stellen weniger stark dazu, dich frühzeitig mit diesen Themen auseinanderzusetzen.

Java ist in dieser Hinsicht wesentlich unnachgiebiger: Eine Methode erwartet einen bestimmten Typ. Klassen besitzen definierte Sichtbarkeiten. Ein Interface beschreibt einen Vertrag. Der Compiler kontrolliert viele Entscheidungen bereits während der Entwicklung. Und bei geprüften Exceptions verlangt Java sogar ausdrücklich, dass du dich entscheidest, ob du sie behandelst oder weitergibst. Manchmal nervt das. Gerade wenn du anfängst, wirst du vermutlich häufiger vor Fehlermeldungen sitzen und dich fragen, warum Java deinen vollkommen logisch aussehenden Code nicht akzeptiert. Und genau diese Situationen können aber enorm lehrreich sein.

Warum kann dieses Objekt dort nicht verwendet werden? Warum ist diese Methode nicht sichtbar? Warum funktioniert die Zuweisung zwischen diesen beiden Typen nicht? Warum muss diese Exception behandelt werden? Du wirst dadurch gezwungen, Antworten auf Fragen zu finden, die dir eine flexiblere Sprache möglicherweise erst deutlich später stellt. Und sobald du diese Antworten kennst, werden viele andere Sprachen plötzlich wesentlich einfacher.

 

Fazit

Java ist nicht deshalb eine gute Einsteigersprache, weil Java besonders einfach wäre. Es ist eine gute Einsteigersprache, weil es viele wichtige Dinge sichtbar macht. Du lernst relativ früh, was Typen sind, wie Methoden funktionieren, warum Klassen bestimmte Verantwortlichkeiten besitzen, wie Sichtbarkeiten eingesetzt werden, was Interfaces leisten und warum der Compiler manche Dinge nicht akzeptiert. Dabei wirst du mit Sicherheit Code schreiben, der sich später wesentlich kürzer lösen ließe. Das ist vollkommen in Ordnung.

Beim Lernen geht es aber nicht darum, möglichst wenige Zeichen zu tippen. Es geht darum, ein mentales Modell davon aufzubauen, was dein Programm eigentlich macht. Wenn dieses Modell einmal vorhanden ist, kannst du später problemlos zu kompakteren Sprachen wechseln. Dann empfindest du Typinferenz, Properties, Lambda Ausdrücke oder andere Komfortfunktionen nicht als Magie. Du erkennst, welche bekannten Konzepte dahinterstehen und warum die Sprache dir bestimmte Arbeit abnimmt.

Deshalb würde ich auch niemandem grundsätzlich von Python, Kotlin oder einer anderen modernen Sprache abraten. Im Gegenteil. Gerade wenn du Java verstanden hast, macht es großen Spaß zu entdecken, wie andere Sprachen dieselben Probleme lösen. Java gibt dir dafür ein solides Fundament. Und genau deshalb ist die manchmal etwas umständliche Schreibweise für mich kein Argument gegen Java als erste Programmiersprache - sie ist eines der stärksten Argumente dafür.