Die Freude daran, Toy-Software zu bauen
(blog.jsbarretto.com)- Das Bauen von Toy-Software ist eine Möglichkeit, die eigentliche Freude und Kreativität der Softwareentwicklung wiederzufinden
- In einer Zeit, in der durch AI und Industrialisierung die pure Freude an der Softwareentwicklung schwindet, kann das Entwickeln einfacher Spielzeugprogramme als persönliches Projekt zu praktischem Wissen und tieferem Verständnis führen
- Toy-Software folgt der 80:20-Regel: mit minimalem Code maximale Funktionalität erreichen; entscheidend ist, übermäßiges Design und den Zwang zur Perfektion zu vermeiden
- Die Erfahrung, ohne Abhängigkeit von AI-Tools wie LLM selbst anzuecken und etwas zu bauen, ist selbst die wesentliche Freude an Lernen und Wachstum
Warum man mehr Spielzeugprogramme bauen sollte
- Richard Feynmans berühmtes Zitat: „Was ich nicht bauen kann, verstehe ich nicht“ → die Erfahrung, selbst etwas zu erschaffen, führt zu tiefem Verständnis
- Anders als der Rat, man solle das Rad nicht neu erfinden, lehrt die Erfahrung, das Rad selbst zu bauen, oft mehr als Lesen oder theoretisches Lernen
- In letzter Zeit bedrohen AI und die Industrialisierung der Software die Freude und die Handwerkskunst des Entwickelns
- Das Bauen von Toy-Software stellt die einfache Freude wieder her, sich erneut in Computer zu vertiefen
Prinzipien von Spielzeugprogrammen: Keep it simple
- Toy-Software folgt dem 80:20-Prinzip: 80 % der Funktionalität mit 20 % des Aufwands erreichen
- Das Ziel ist nicht das Endprodukt, sondern Einfachheit und das direkte Umsetzen der grundlegenden Prinzipien
- Es wird davor gewarnt, over-engineering zu betreiben; betont wird ein Ansatz, bei dem nur der wirklich nötige Code geschrieben wird
- Empfohlen wird, nicht alle Codepfade von Anfang an zu implementieren, sondern die Implementierung bei Bedarf schrittweise zu erweitern
- Selbst Systeme, die klein wirken, erweisen sich in der Praxis oft als überraschend leicht umsetzbar
Zusätzliche Vorteile von Toy-Software
- Das in Toy-Projekten gewonnene Wissen hilft in der realen Arbeit oft stärker als erwartet beim Nachverfolgen von Problemen, Beheben von Bugs und Vermeiden von Fehlern
- Das direkte Erleben von Randbedingungen und Einschränkungen liefert Einsichten in das Wesen von Software und kann sogar zu innovativen Lösungen führen
Beispiele: Liste verschiedener Toy-Software-Projekte
Hier sind Arten von Toy-Projekten, die in den letzten 15 Jahren selbst umgesetzt wurden, nach Schwierigkeitsgrad und geschätztem Zeitaufwand geordnet. Jedes Projekt enthält eine kurze Beschreibung und zusätzliche Hinweise
- Regex-Engine (Schwierigkeit 4/10, 5 Tage) : POSIX-artige reguläre Ausdrücke interpretieren und passende Strings identifizieren; vermittelt ein tiefes Verständnis der internen Funktionsweise von Regex
- x86-OS-Kernel (Schwierigkeit 7/10, 2 Monate) : enthält CLI, einfache Treiber und Memory Manager; zusätzliche Herausforderungen sind In-Memory-Dateisystem, ELF-Executables, GUI, Prozessisolation usw.
- GameBoy/NES-Emulator (Schwierigkeit 6/10, 3 Wochen) : Verständnis einfacher Befehlssätze und Hardware, Implementierung von PPU, PSG und ungewöhnlichen Cartridge-Formaten
- GameBoy-Advance-Spiel (Schwierigkeit 3/10, 2 Wochen) : einfaches spritebasiertes Spiel, aktive GBA-Entwickler-Community, Systemarchitektur gut allein verständlich
- 2D-Physik-Engine (Schwierigkeit 5/10, 1 Woche) : grundlegende Newton-Mechanik und einfache Kollisionsbehandlung; ausbaubar um komplexe Formen, Trägheit, Lösungsalgorithmen, Soft Bodies und zusammengesetzte Interaktionen
- Dynamischer Interpreter (Schwierigkeit 4/10, 1–2 Wochen) : Tree-Walking-Interpreter; eine eigene Sprache zu bauen bringt technische und kreative Freude
- Compiler der C-Familie (Schwierigkeit 8/10, 3 Monate) : einfaches Typsystem und Zielumgebung, Architektur für verschiedene Optimierungen und Unterstützung mehrerer Backends
- Texteditor (Schwierigkeit 5/10, 2–4 Wochen) : beginnt bei einfachem Datei-I/O, UI-Toolkits wie QT/GTK sind nutzbar, bevorzugt wird oft die Konsole; zusätzliche Features sind Unicode, Syntax-Highlighting, Multi-Buffer, LSP usw.
- Async-Runtime (Schwierigkeit 6/10, 1 Woche) : im Fall von Rust Verarbeitung von
impl Future-Tasks und Umsetzung von Concurrency, plus I/O-Waking - Hash Map (Schwierigkeit 4/10, 3–5 Tage) : interne Funktionsweise, Closed und Open Addressing, Robin-Hood-Regel, Performance und Verständnis dafür, wann sie sinnvoll einsetzbar ist
- Rasteriser / Texture Mapper (Schwierigkeit 6/10, 2 Wochen) : Aufbau der 3D-Grafik-Pipeline lernen; vertiefbar bis zu Vektormathematik, Z-Buffer, Texture Mapping und Shading-Algorithmen
- Signed-Distance-Field-Rendering (Schwierigkeit 5/10, 3 Tage) : mathematische Raumdarstellung, einfache Visualisierung, Verständnis für Shader und Vektormathematik
- Voxel-Engine (Schwierigkeit 5/10, 2 Wochen) : mit Erfahrung in 3D-Grafik oder Spieleentwicklung leicht verständlich; zusätzliche Herausforderungen sind Texturen, prozedurale Generierung, Netzwerk usw.
- Threaded Virtual Machine (Schwierigkeit 6/10, 1 Woche) : schneller Interpreter, optimierte Ausführung ohne architekturspezifische Codegenerierung, mit potenziell compilerähnlicher Performance
- GUI-Toolkit (Schwierigkeit 6/10, 2–3 Wochen) : nach Erfahrung mit grundlegenden UI-Werkzeugen lassen sich Layout-Engine, Text Shaping, Accessibility und weitere vertiefte Funktionen selbst umsetzen
- Simulator für Orbitalmechanik (Schwierigkeit 6/10, 1 Woche) : Newtons Gravitationsmodell einfach implementieren, erweiterbar um Interaktionen mehrerer Himmelskörper, Integrationsalgorithmen, Visualisierung oder sogar NASA-Daten
- Bitwise Challenge (Schwierigkeit 3/10, 2–3 Tage) : ein Spiel, das sich allein mit einem 64-Bit-Zustand reproduzieren lässt; trainiert kreatives Zustandsmanagement, genaue Regeln auf GitHub verfügbar
- ECS-Framework (Schwierigkeit 4/10, 1–2 Wochen) : Entity-Component-System-Struktur selbst implementieren, in das Typsystem der Sprache integrieren, auf hohe Performance und passende Einschränkungen zuschneiden
- CHIP-8-Emulator (Schwierigkeit 3/10, 3–6 Tage) : einfache virtuelle Maschine aus den 1970ern, schnell implementiert, erlaubt das Beobachten und Ausführen verschiedener Fan-Games
- Schach-Engine (Schwierigkeit 5/10, 2–5 Tage) : beginnt bei den Regeln und entwickelt sich schrittweise weiter; von der selbstgebauten Engine geschlagen zu werden, ist ein Moment im Wachstum eines Entwicklers
- POSIX-Shell (Schwierigkeit 4/10, 3–5 Tage) : Prinzipien und Grenzen einer POSIX-basierten Shell, tiefes Verständnis durch Umsetzung echter Shell-Sprachkompatibilität und das Erleben zahlreicher Tricks
Hinweise zum Einsatz von Werkzeugen wie LLM
- Auch moderne Werkzeuge wie LLM sind nützlich, aber wirkliches Lernen wird tiefer, wenn man selbst direkt erkundet
- Statt bestehende Lösungen anzusehen, kann man im Erkunden unbekannten Terrains und im Finden eigener Antworten ein tieferes Gefühl der Erfüllung finden
- Wer Toy-Projekte ohne LLM angeht, findet es anfangs vielleicht ungewohnt und anstrengend, spürt mit der Zeit jedoch eine eigene technische Freude und ein hohes Maß an Erfüllung
- Wer mit dem Auto fährt, erlebt als Läufer kein „Runner’s High“ → tiefe Freude entsteht eher durch direkte Erfahrung statt Abkürzung
3 Kommentare
Ich kann das gut nachvollziehen, dass man es einmal ohne LLM versuchen sollte. Wenn keine schnelle Entwicklung nötig ist, macht es wohl mehr Spaß und ist erfüllender, alles Schritt für Schritt selbst zu verstehen und zu bauen.
Es ging also um ein Toy-Projekt. Nur anhand des Titels dachte ich, es gehe darum, Software für Spielzeuge zu entwickeln. Haha.
Hacker-News-Kommentare
Ich frage mich, wer LLMs wie eine Suchmaschine verwendet. Früher habe ich bei Google nach Dingen wie „pros cons mysql mongodb“ gesucht und dann offizielle Dokus, Foren, Blogs und sogar Stack Overflow gelesen, was viel Zeit gekostet hat. Die Zeit fürs Lesen und Lernen war aber immer willkommen. Heute gebe ich einem LLM etwas konkretere Prompts wie „Vor- und Nachteile von mysql vs mongodb zum Speichern von Fotos, bitte mit Referenzlinks“ ein. So kann ich die Kernaussagen schnell erfassen, und es ist gut, dass gleich Links dabei sind, sodass man sich nicht auf Halluzinationen verlassen muss. Manchmal stelle ich auch konkrete Anfragen wie „Entwirf ein data schema für das Speichern von Foto-Metadaten in postgres, ich möchte X in eine andere Tabelle auslagern“, aber das nutze ich nur, wenn ich genau weiß, welches Ergebnis herauskommen soll. Eigentlich verwende ich es nur, wenn mir Tipparbeit zu schade ist oder ich kurz die genaue Typbezeichnung vergessen habe (
intvsintegerusw.)Einer der besten Karriereschritte, die ich gemacht habe, war ein persönliches Projekt während einer sechsmonatigen Pause zwischen zwei Jobs. Ich hatte ursprünglich viele Projekte starten wollen, aber weil es keine Beschränkungen gab, wurde der Umfang immer größer, und am Ende wurde oft nichts fertig. Deshalb habe ich beschlossen, pro Projekt nur eine Woche zu investieren. Ich habe also nur so viel gebaut, wie in einer Woche machbar war. Aus dem Nichts heraus in einer Woche in einer neuen Sprache, einem neuen Framework oder einem unbekannten Bereich etwas Brauchbares zu bauen, war ein enormer Confidence-Boost. Es hat mich auch wieder daran erinnert, warum ich Programmieren ursprünglich mochte. Wenn man zwischen zwei Jobs ein paar Monate Zeit hat, wird man wahrscheinlich mehr darüber staunen, wie viel man schon weiß, wenn man einfach Toy-Projekte baut, statt sich auf Silicon-Valley-Interviews vorzubereiten
Toy-Software zu entwickeln ist wie an Fahrrädern, Autos oder Booten zu schrauben. Es macht Spaß. Aber das Fahrrad für den Arbeitsweg zu reparieren, ist stressig. Es ist schön, Toy-Software zu bauen, aber sobald ich sie irgendwann wirklich nutzen will, finde ich alle Bugs und habe keine Zeit, sie zu beheben — das ist das Dilemma
Ich bin überrascht, wie viele negative Meinungen es zu LLMs gibt. LLMs servieren einem Informationen auf dem Silbertablett. Wenn man ein neues Projekt beginnt, weiß man natürlich nicht von Anfang an alles. Man versucht sein Bestes, scheitert, lernt danach, versteht, warum es nicht funktioniert hat, und passt seinen Ansatz an — genau das ist echtes Lernen. Wenn man schon alles zu wissen glaubt und nur Tutorials nachbaut, erlebt man die Grenzen einzelner Methoden und ihre echten Vor- und Nachteile gar nicht. Wenn man zum Beispiel versucht, mit regulären Ausdrücken einen Parser zu bauen, merkt man selbst, dass rekursive Ausdrücke nicht gehen, und man lernt ganz konkret etwas über komplexere Strukturen oder Probleme der Zeitkomplexität. Wenn man einen optimierenden Compiler selbst implementiert und an allen möglichen Optimierungs-Tricks verzweifelt, versteht man, warum echte Compiler so entworfen sind. Wenn man selbst eine Layout-Engine schreibt, erlebt man sogar die Mühe, schon ein Konzept wie
widthsauber zu behandeln. Es gibt kaum etwas Wertvolleres als Lernen durch Trial-and-Error. Nur weil LLMs Fehler verhindern können, sollte man nicht auch die wichtigen Lerngelegenheiten verpassenIch habe selbst über Jahre hinweg an Wochenenden und nachts zahllose seltsame Projekte gemacht, um Computergrafik zu lernen. Kein Cent daran verdient, aber dadurch meinen Traumjob bekommen. Beispielarbeiten:
Ich finde, der hier vermittelte Geist der „Freude am Programmieren“ ist genau das, was wir brauchen. Im Zeitalter von AI-Agent-Coding sogar noch mehr. Allerdings wirken die vom Autor angesetzten Zeiten für Toy-Projekte auf mich deutlich zu kurz. Ich bin zwar vielleicht nicht repräsentativ, aber ich glaube, dass die meisten Dinge auf dieser Liste nicht in ein paar Tagen erledigt sind, wenn man nur jeweils 2–3 Stunden pro Tag arbeitet. Schon die Recherche vor dem Start dauert oft ziemlich lange. Als Beispiel: Ich habe vor Kurzem meinen Pelican-Blog durch meinen eigenen statischen Site-Generator Odin ersetzt, und selbst mit nur 2–3 Stunden pro Tag hat das zwei Wochen gedauert. Dabei war das noch eines der einfacheren Projekte auf der Liste
Ich stimme dem Rat „Verwende LLMs nicht für solche Projekte“ grundsätzlich zu, finde aber, man sollte ihn nicht zu extrem auslegen. Es ist interessant, dass sich Ratschläge dazu, wie man Hilfe von AI annehmen sollte, so anders anfühlen als Hilfe von Menschen. Wenn unter dem Blog stünde: „Wenn ihr einen Freund habt, der gut programmieren kann, bittet ihn auf keinen Fall um Hilfe“, wäre das seltsam. Ein erfahrener Freund versteht den Kontext und hilft einem so, dass man selbst auf die Lösung kommt. Kaum jemand bittet AI wirklich darum, „nicht das Problem für mich zu lösen, sondern mich wie ein erfahrener Freund anzuleiten“. Natürlich klappt das heute vielleicht noch nicht oder nur unvollkommen, aber in ein oder zwei Jahren könnte so eine Art der Anleitung ganz selbstverständlich sein. Deshalb wäre es gut, sich anzugewöhnen, klar zu sagen, welche Art von Hilfe man möchte. Man muss nicht mit der fixen Idee herangehen, dass LLMs einem immer nur falsche Antworten geben
Dank Claude-basiertem vibe coding habe ich nach langer Zeit wieder ein unterhaltsames Side-Projekt angefangen. Nachdem ich die Tools und den Prozess gelernt hatte, habe ich in wenigen Wochen schnell verschiedene Apps gebaut: ein Kalender-/Wetter-Dashboard für die Familie, eine Bluesky-Lese-App (blendet bereits gesehene Posts aus), ein gamifiziertes PM-Dashboard für die Firma, eine Chrome-Erweiterung, die Reddit-Posts nach einer bestimmten Zeit ausblendet, und eine Ersatz-App für ein nicht mehr gepflegtes WordPress-Plugin. Anfangs habe ich Claude vieles überlassen, etwa UI-Verbesserungen, aber inzwischen habe ich gelernt, auch mit 90 % Fertigstellung zufrieden zu sein und lieber neue App-Funktionen zu bauen, statt immer weiter zu verfeinern
Diese Liste ist wirklich beeindruckend. Viele der Projekte, die dem Autor leicht erscheinen, wären für mich deutlich schwieriger. Trotzdem motiviert mich das stark, meine eigenen Toy-Projekte wieder anzupacken. Bei der Schlussfolgerung zum Lernen mit LLMs sehe ich aber mehr Nuancen. Es hängt komplett davon ab, wie man sie einsetzt. Eine Anfrage wie „Implementiere dieses Problem einfach für mich“ ist fürs Lernen fatal, aber „Erkläre mir die Struktur von ELF auf höchster Abstraktionsebene und konzentriere dich auf das Warum“ kann ein enormer Lernbeschleuniger sein. Dass man nicht mehr jede Recherche selbst macht, kann ein Nachteil sein, aber wenn man wirklich intellektuell ernsthaft an die Sache herangeht, ist es ein riesiger Vorteil, jederzeit sokratische Frage-Antwort-Hilfe bekommen zu können
Die hier vorgestellten Projekte sind wirklich gute Ideen, aber mich interessiert keines davon auch nur im Geringsten. In solchen Momenten frage ich mich, ob ich Programmieren jemals wirklich gemocht habe