Wie so bin ich so schlecht?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet
Alle anderen Projekte habe ich immer nur mit YouTube Videos programmiert, (...)

Man kann mittels Tutorials zwar einige Tools lernen (z.B. Funktionen in einer IDE, bestimmte Features/Bibliotheken/... einer Programmiersprache, ...), doch das Lösen von Problemen lernst du weniger bis gar nicht. Dabei ist gerade das der tatsächliche Kern der Programmierung.

Programmcode abtippen bringt dich in der Tat nicht weiter, denn du bleibst ja weitestgehend abhängig von anderen.

(...) weil ich sonst irgendwie nicht so richtig weiß nach was ich suchen soll wie ich anfangen soll (...)

Fange in so einem Fall erst einmal damit an, zu analysieren, was du überhaupt machen möchtest bzw. was das Kernproblem ist.

Beispiel: Ich möchte ein Pacman-Spiel entwickeln.

Beschreibe das Problem noch weiter (sei es in kurzen Sätzen oder Stichpunkten), denn aus dieser Beschreibung kannst du einige Informationen herausziehen. Zum Beispiel die Anforderungen, was das Problem lösen soll. So eine Anforderungsliste würde sich vermutlich im Laufe der Analyse noch erweitern.

Wenn man ein objektorientiertes System entwickeln möchte, könnte man sich aus der Beschreibung ebenso die Subjekte, Adjektive und Verben herausziehen, denn sie sollten die Objekte im System mitsamt ihrer Eigenschaften sowie Fähigkeiten/Beziehungen verkörpern.

Beispiel: Bei Pacman steuert man eine Spielfigur durch ein Labyrinth. Die Figur muss im Labyrinth verstreute Früchte fressen, um das Spiel zu beenden. Während dieser Zeit darf sie nicht mit einer der Geisterfiguren kollidieren, die auf dem Spielfeld patrouillieren.

Daraus lassen sich diese Elemente ableiten:

  • Player: move, eat, collide, die
  • Ghost: patrol
  • Fruit
  • Board: fields
  • Field: isWall, hasFruit
  • etc. ...

Das wäre schon die erste Grundlage für ein Objektdiagramm, welches sich noch durch weitere Elemente ergänzen lässt und anschließend zu einem Klassendiagramm erweitert werden kann. Es geht hier übrigens nicht darum, extrem korrekt irgendwelche UML-Regeln anzuwenden, um solche Diagramme zu bauen, sondern um eine Orientierung, wie man sich einen Plan vom Projekt erstellen kann. Programme wie NClass oder StarUML können an dieser Stelle übrigens ganz hilfreich sein.

Progammabläufe (z.B. Methoden) kann man wiederum erst einmal mit einem Programmablaufplan oder einem Struktogramm beschreiben. Ein hilfreiches Tool an dieser Stelle ist der PapDesigner.

Auch an dieser Stelle geht es erst einmal darum, ein Problem (Bsp.: Frucht fressen) zu analysieren und herunterzubrechen. Wenn möglich, formuliert man die Lösungschritte (Bsp.: Entferne Frucht von Feld). Sofern die noch zu komplex sind, kann man sie erneut zerlegen. So lange, bis ihre jeweiligen Teilschritte einfach genug erscheinen (vielleicht, weil sie nur die Änderung eines Zustands beinhalten oder du bereits eine Funktion aus der Java SE kennst, die den Schritt lösen kann). Im Beispielfall solltest du merken, dass du erst wissen müsstest, auf welchem Feld sich die Spielfigur befindet, denn dann bräuchte sie nur deren Zustand (hasFruit) ändern. Sofern man die Information noch öfter braucht, wäre es eine gute Lösung, der Spielfigur noch eine Eigenschaft currentField zuzuordnen, welche in move gesetzt wird.

Im Anschluss wäre es sinnvoll, die Algorithmen, die man da gerade gebildet hat, nochmals durchzugehen und auf Logikfehler zu prüfen.

Erst dann beginnt die Umsetzung mit einer Programmiersprache. Umso genauer die Planung war, umso einfacher sollte die Implementation nun fallen. Im besten Fall ist es lediglich eine Eins-zu-eins-Übersetzung.

Vorteilhaft bei dieser Vorgehensweise ist:

  • Du schaffst dir einen eigenen Leitfaden für die Implementation und hast einen Ablauf, mit dem du Probleme lösen kannst
  • Du kannst Anforderungen und Sonderfälle früh finden und behandeln
  • Die Wahrscheinlichkeit, auf logische oder strukturelle Probleme zu stoßen, wird verringert

Allerdings muss so eine Herangehensweise und vor allem das Bilden von Algorithmen geübt werden. Für den Alltagsmensch ist das eine Umstellung, denn wir formulieren unsere Tätigkeiten ja nicht ständig in Einzelschritten. Wenn du jemanden die Anweisung gibst, irgendwohin zu laufen, musst du ihm nicht erst beschreiben, wie er seine Beine dafür vorwärts bewegen muss. Es ist überhaupt erst einmal Herausforderung in so einer Situation, zu erfassen, welche Einzelschritte es überhaupt gibt.

In manchen Fällen kann es daher hilfreich sein, Aktionen mit Vergleichsgegenständen nachzuspielen (sofern möglich). Ein klassisches Beispiel wäre die Implementation einer Datenstruktur (Liste, Stack, Queue, ...). Da kann man sich parallel ein Kartendeck auf den Tisch platzieren und Aktionen wie add, insert, remove mit den Karten Schritt für Schritt nachlegen.

Für die nächste Zeit wäre es nun sinnvoll, wenn du dir kleinere Projekte / Aufgaben suchst, die du selbst versuchst zu lösen.

Ein paar Klassiker, die ich empfehlen kann (wobei nicht alle ein objektorientiertes System brauchen):

  • Quersummenberechnung für dreistellige Zahlen (versuche mehr als nur einen Lösungsweg zu finden)
  • eigene Implementation bestimmter String-Methoden (substring, indexOf, lastIndexOf, trim, ...)
  • Ver-/Entschlüsselung von Nutzereingaben via Caesar-Chiffre, Vigenère-Chiffre oder ROT13
  • Sortierfunktionen (Bubblesort, Insertionsort, Selectionsort, Quicksort)
  • Rekursive Funktionen (Wort umdrehen, Berechnung einer Zahl aus der Fibonacci-Reihe, Palindrom-Prüfer, Pascalsches Dreieck)
  • Datenstrukturen selbst implementieren (Liste, Stack, Queue, AVL Tree, Graph), ohne Zuhilfenahme eines Arrays
  • Binäre Suche über deine Tree-Implementation
  • Traversion über deine Tree-Implementation
  • Ein einfaches Kartenspiel wie Mau-Mau, Uno oder Black Jack
  • Schiffe versenken
  • Türme von Hanoi
  • Brettspiele wie Mensch ärgere dich nicht, Dame oder Mühle
  • Tic-Tac-Toe mit Negamax-KI
  • Schach mit Minimax-KI

Des Weiteren eignen sich vor allem Minispiele oft sehr gut als Übung. In dem Zuge würde ich dir empfehlen, dir einmal Processing anzuschauen. Das ist eine Programmiersprache, die auf Java aufbaut und eine einfache Grafik-API zur Verfügung stellt. Mit der kannst du ziemlich gut Spiele / Simulationen wie:

  • Pong
  • Breakout
  • Conways Game Of Life
  • Snake
  • Space Invaders
  • Pacman
  • Super Mario
  • Peg Solitaire

entwickeln.

Bei Bedarf kann man Java-Klassen einem Processing-Projekt hinzufügen. Andernfalls sollte es umgekehrt auch noch immer möglich sein, die Kernbibliothek von Processing in ein Java-Projekt zu integrieren.

(...) dann fehlt mir ja die Kentniss über die Libraries die ich benötige (...)

Arbeite erst einmal nur mit dem, was dir die Java SE bietet und halte deine Projekte für den Anfang klein. Viele Übungen kann man auf der Konsole absolvieren. Für Spiele kannst du wie gesagt auf Processing zurückgreifen.

Für die Anfangszeit mit Java solltest du dich darauf konzentrieren, mit der API-Referenz zurechtzukommen. Als Übung könntest du bspw. nach der Eigenimplementation von Sortierverfahren und Datenstrukturen einmal schauen, was es in Implementationen dafür in Java schon gibt. Oder andersherum: Du suchst nach einer bestehenden Implementation einer Datenstruktur in der SE und nutzt deren Methodenliste als Vorgabe für deine eigene Implementation.

Es ist klar, dass man kaum alle Klassen, Interfaces und Methoden auswendig lernen kann, die es in der SE bereits gibt. Es ist normal, dass man ab und an darin nachschlagen muss. Doch wäre es gut, einen ungefähren Überblick zu haben, was es in der SE schon geben könnte und wie man danach sucht. Wenn man beispielsweise in einem Text nach einem Wort suchen möchte, wäre es doch nicht abwegig, einmal nachzuschlagen, was die String-Klasse schon alles in petto hat.

Mit der Zeit dürfte sich ein kleines Toolset (oft genutzter Klassen/Methoden) so und so im Gedächtnis verankern.

Spezielle Bibliotheken/Frameworks brauchst du in der Regel erst dann, wenn du dich auf bestimmte Themenbereiche oder sehr spezielle Funktionalitäten fokussieren möchtest (Beispiele: Webentwicklung, IoT oder ML).

Im Übrigen spricht auch nichts dagegen, bei einer Recherche mehrere Quellen (Foren, Tutorials, ...) einzuschließen. Nur solltest du lernen, dich auch ohne sie behelfen zu können.

Eine Schach-Engine zu programmieren würde auch mehr Erfahrung benötigen. Auch ein Programm das nur alle legalen Züge zu einer gegebenen Position findet ist nicht so einfach, wie man zunächst denkt. Man denke an folgende Regeln:

Rochade, En-Passent, Umwandlung, 3-Malige Stellungwiederholung, 50 Züge-Regel, Remis durch Mangel an Figuren. Dann gibt es unmögliche Stellungen.