7 Punkte von GN⁺ 2023-12-27 | 1 Kommentare | Auf WhatsApp teilen

Texteditor

  • Texteditoren werden täglich verwendet, aber weißt du tatsächlich, wie sie funktionieren? Beginne mit der Implementierung grundlegender Funktionen.
  • Die größte Herausforderung ist, wie ein Textdokument im Speicher abgelegt wird. Die Verwendung von Arrays bringt Performance-Probleme mit sich, daher lohnt es sich, verschiedene Datenstrukturen zu lernen, um diese zu lösen.
  • Lerne, wie sich der Textcursor verhält, und versuche dich nach der grundlegenden Editor-Implementierung an Undo/Redo sowie automatischem Zeilenumbruch für Wörter.

2D-Spiel – Space Invaders

  • Selbst für ein einfaches Spiel braucht man spezielle Datenstrukturen und Design Patterns. Konzentriere dich weniger auf Game Design und Art, sondern stärker auf die Gesamtimplementierung des Spiels.
  • Lerne das Zeichnen des Bildschirms, die Game Loop, die Verarbeitung von Benutzereingaben, das Erzeugen und Verwalten dynamischer Objekte sowie die Anwendung der Spiellogik.
  • Nach der Basisimplementierung lässt sich das Spiel um ein Titelbildschirm-Menü, einen Game-Over-Bildschirm, eine auf verschiedenen Computern gleichbleibende Geschwindigkeit oder auch KI erweitern.

Compiler – Tiny BASIC

  • Die Implementierung eines Compilers ist ein Projekt, das ein tiefes Verständnis von Programmierung erfordert. Beginne mit dem Schreiben eines Compilers für eine einfache Sprache wie Tiny BASIC.
  • Lerne die Schritte der Tokenisierung des Codes (lexical analysis), des Parsings (Strukturprüfung und Erzeugung eines Baums), der semantischen Analyse und der Codegenerierung.
  • Nach der grundlegenden Compiler-Implementierung kannst du sie um eine Standardbibliothek, eine Optimierungsphase oder bessere Fehlermeldungen erweitern.

Mini-Betriebssystem

  • Die Grundkonzepte von Betriebssystemen lassen sich in vielen Bereichen anwenden. Durch die Implementierung eines Betriebssystems vertiefst du dein Verständnis für Hardware.
  • Die Lernkurve ist zwar hardwareabhängig, aber wenn man einem Buch oder Tutorial folgt, kann man ein bootfähiges OS bauen.

Tabellenkalkulation

  • Eine Tabellenkalkulationsanwendung kombiniert die Herausforderungen von Texteditor und Compiler. Dabei lernt man, wie Zellinhalte im Speicher dargestellt werden und wie ein Interpreter für eine Programmiersprache für Formeln implementiert wird.

Emulator für Videospielkonsolen

  • Das Schreiben eines Emulators vereint die Herausforderungen von Compilern, Betriebssystemen und dem Compilerbau in einem einzigen Projekt. Echte Spiele im eigenen Emulator zu spielen, ist eine lohnende Erfahrung.
  • Eine echte Videospielkonsole zu emulieren bedeutet, eine virtuelle Maschine zu schreiben, die wie die betreffende CPU und andere Hardware-Komponenten funktioniert.

Meinung von GN⁺

  • Um Programmiergrundlagen zu festigen, hilft die Implementierung eines Texteditors oder eines einfachen Spiels sehr dabei, die internen Funktionsweisen von Software zu verstehen, die man tatsächlich verwendet.
  • Komplexe Projekte wie Compiler oder Betriebssysteme verlangen ein tiefes Verständnis von Programmiersprachen und Computerarchitektur, was wesentlich für die Entwicklung fortgeschrittener Software-Engineering-Fähigkeiten ist.
  • Solche Projekte bieten Programmierern interessante und herausfordernde Erfahrungen, wenn es darum geht, eine neue Sprache oder ein neues Framework zu lernen oder vorhandenes Wissen zu vertiefen.

1 Kommentare

 
GN⁺ 2023-12-27
Hacker-News-Kommentare
  • An Projekten wie einem Texteditor, Compiler, Betriebssystem oder Raytracer zu arbeiten, kann die Programmierfähigkeiten verbessern, aber nicht unbedingt die Software-Engineering-Fähigkeiten. Tatsächlich bergen solche Projekte das katastrophale Prinzip „Not Invented Here“ in sich und können sich für Software Engineering sogar kontraproduktiv auswirken.

    • Die Fähigkeit zu entscheiden, ob man etwas aus einer Bibliothek übernimmt oder selbst schreibt
    • Die Fähigkeit, hochwertige Bibliotheken und Frameworks zu identifizieren, die zu den Projektanforderungen passen
    • Die Fähigkeit zu entscheiden, wo Optimierung sinnvoll ist und wo nicht
    • Die Fähigkeit, Code zu schreiben, der auch in einigen Jahren noch lesbar ist
    • Die Fähigkeit, ein Projekt als groß angelegtes, komplexes System zu betrachten und dabei Software- und Nicht-Software-Abhängigkeiten zu berücksichtigen
    • Als alternative Herausforderung wird vorgeschlagen, eine Websuchmaschine zu bauen. Algorithmen für String-Matching und Ähnliches wurden bereits von anderen gelöst, daher ist das Ziel, eine tatsächlich funktionierende Suchmaschine (und einen Crawler) zu erstellen.
  • Für UI-/webbasierte Projekte werden folgende Dinge empfohlen:

    • Ein einfaches Videospiel mit Unity oder Unreal (da in Spielen 30–60 fps wichtig sind, hilft das auch dabei, an anderer Stelle performante Oberflächen zu bauen)
    • Ein einfaches JavaScript-Framework ähnlich wie React (hilft beim Verständnis von Datenfluss und Event-Verarbeitung)
    • Ein HTTP-Bibliotheks-Wrapper um XMLHTTPRequest herum (fetch existiert zwar, aber zu verstehen, wie HTTP-Anfragen von Grund auf gesendet und gelesen werden, hilft beim Debuggen von CORS-Problemen, OPTIONS-Requests usw.)
  • Positive Einschätzung zu einem Mini-Betriebssystem. Als Anwendungsentwickler ist man auf Betriebssystemfunktionen wie Speicherverwaltung, Dateisysteme usw. angewiesen und wird neugierig, wie diese Dinge im Hintergrund funktionieren. Mit xv6 in der Freizeit verschiedene Prozess-Scheduling-Algorithmen zu lernen und zu implementieren, ist eine sehr nützliche und unterhaltsame Erfahrung.

  • Der Wunsch, etwas Physisches anzufassen, zum Beispiel einen Roboter oder eine Drohne mit Autopilot, oder eine präzise Simulation der Flugdynamik eines Raumfahrzeugs mit programmierbaren GNC-Parametern. Das Buch „Fundamentals of Astrodynamics“ ist vorhanden und soll in dieser Ferienzeit genutzt werden. Gesucht werden gute Informationen zu GNC (Guidance, Navigation and Control).

  • Es hängt von persönlichem Geschmack und den Umständen ab, aber wenn man nach Ideen sucht, kann dies eine gute Ausgangsliste sein. Mit einem Sinclair ZX Spectrum wurden ein Noteneditor und Tracker, 2D-Spiele (Space Invaders) usw. erstellt. Auf dem ersten Computer (386) wurden ein Huffman-Komprimierer, ein B-Tree-Index, ein OOP-Formulargenerator, ein E-Mail-Checker für Dial-up und ein handgeschriebener Parser gebaut.

  • Diskussion über Texteditoren: Die größte Herausforderung ist, wie Textdokumente im Speicher abgelegt werden. Ein Array war der erste Gedanke, aber die Performance ist sehr schlecht, wenn Text nicht am Ende des Dokuments eingefügt wird. Trotzdem gab es bei der Verwendung von JavaScript-Strings und über zwei Jahren Nutzung des Editors keine Performance-Probleme. Natürlich gab es viele andere Probleme, zum Beispiel war das Rendern langer horizontaler Linien problematisch, weil der Optimierungsansatz davon ausging, dass das Rendern einzelner Zeilen günstig sei.

  • Es ist auch eine gute Idee, einen einfachen Spielzeug-Raytracer auszuprobieren. Einen Raytracer zu bauen, der Kugeln in Bitmap-Grafik sowie diffuse und spiegelnde Reflexionen rendert, kann ein relativ begrenztes Projekt sein, solange man es nicht zu komplex macht.

  • Wenn man glaubt, zum Schreiben von Space Invaders ein „Factory Pattern“ zu brauchen, dann gibt es ein Problem. Es ist kaum anzunehmen, dass im Originalspiel solche Designkonzepte verwendet wurden.

  • Meinung zu einem Texteditor, der Arrays als Datenstruktur verwendet. Beim Tippen braucht man hohe Geschwindigkeit, und es ändert sich jeweils nur eine Zeile. Wenn eine neue Zeile eingegeben wird, ist die zusätzliche Verzögerung für das Reorganisieren des Arrays nach dem Drücken von Enter selbst bei Millionen von Zeilen nicht spürbar. Der anspruchsvollere Teil eines Texteditors ist sicherzustellen, dass nur das gerendert wird, was der Benutzer tatsächlich sieht.