Warum 0.1 + 0.2 Nicht 0.3 Ergibt: Gleitkommazahlen Erklärt

Führen Sie 0.1 + 0.2 in einer Python-Shell aus, kommt nicht 0.3 heraus, sondern 0.30000000000000004. Probieren Sie es in JavaScript, Java, Go, C oder Rust, und Sie bekommen denselben sechzehnstelligen Schwanz. Jede dieser Sprachen tut genau das, was der Hardware-Standard vorschreibt. Eine Zahl, die unendlich viele Binärstellen bräuchte, wird in 64 Bit gepresst, und irgendetwas muss nachgeben. Warum sich 0.1 nicht exakt binär speichern lässt Computer speichern Gleitkommazahlen zur Basis 2. In Basis 2 hat der Bruch 1/10 eine periodische Entwicklung, genau wie sich 1/3 in Basis 10 endlos wiederholt (0.3333...). Ausgeschrieben beginnt 0.1 binär so: ...

6. Oktober 2026 · 6 Minuten · 1078 Wörter · SpaghettiCoder

LocalStorage, SessionStorage oder Cookies: Was wofür

Ein Login-Endpunkt liefert ein JWT zurück, und Sie haben drei Orte, um es abzulegen: ein Cookie, localStorage oder sessionStorage. Wählen Sie den falschen, und entweder trägt ein XSS-Bug das Token davon, oder das Token erreicht Ihre API nie. Alle drei speichern Strings im Browser. Sie unterscheiden sich darin, wer sie lesen kann, wie lange sie bestehen und ob der Server sie überhaupt zu sehen bekommt. Worin sich localStorage, sessionStorage und Cookies unterscheiden localStorage und sessionStorage sind dieselbe API, das Storage-Interface: setItem, getItem, removeItem, clear, String-Keys und String-Werte. Der Unterschied liegt in der Lebensdauer. localStorage überlebt das Schließen des Browsers und einen Neustart der Maschine und bleibt bestehen, bis etwas es löscht. Safari ist die Ausnahme: Mit aktivierter Tracking-Prevention löscht es skriptgeschriebenen Speicher für eine Seite, mit der der Nutzer seit sieben Tagen nicht interagiert hat. sessionStorage gehört einem einzelnen Tab und stirbt, wenn dieser Tab geschlossen wird. Geben Sie dieselbe URL in einem zweiten Tab ein, bekommen Sie ein frisches, leeres sessionStorage; nur “Tab duplizieren” kopiert den Inhalt mit. ...

5. Oktober 2026 · 7 Minuten · 1396 Wörter · SpaghettiCoder

Big-O-Notation Erklärt mit Code-Beispielen

Ein Zugriff auf ein Python-Dictionary dauert etwa 100 Nanosekunden, egal ob das Dictionary 1.000 oder 1.000.000 Schlüssel enthält. Eine verschachtelte Schleife, die eine Liste auf Duplikate prüft, braucht eine halbe Millisekunde bei 200 Elementen und 136 Millisekunden bei 3.200. Sechzehnmal die Eingabe, fast 280-mal die Wartezeit. Gleiche Maschine, gleiches Python. Die Big-O-Notation ist der Name für diesen Unterschied. Was die Big-O-Notation misst Big O beschreibt, wie die Laufzeit (oder der Speicherverbrauch) eines Codestücks wächst, wenn die Eingabe größer wird. Es ist keine Stoppuhr-Messung, und es ist egal, ob Ihr Laptop schnell oder langsam ist. Entscheidend ist die Form der Wachstumskurve: Verdoppelt sich die Zeit, wenn Sie die Eingabe verdoppeln, vervierfacht sie sich, oder bewegt sie sich kaum? ...

4. Oktober 2026 · 8 Minuten · 1588 Wörter · SpaghettiCoder

Git Reset, Revert, Restore: Änderungen rückgängig machen

Führen Sie git reset --hard auf einem Commit aus, den Ihr Team schon per Pull geholt hat, und Ihre Historie weicht ab sofort von der der anderen ab. Führen Sie git revert auf einen Tippfehler aus, den Sie noch nicht gepusht haben, und Sie haben dem Log einen überflüssigen Commit hinzugefügt. Git hat vier Befehle zum Rückgängigmachen, restore, reset, commit --amend und revert, und sie sind nicht austauschbar. Wählen Sie den falschen, passiert entweder gar nichts, oder es passiert deutlich mehr, als Sie wollten. ...

3. Oktober 2026 · 7 Minuten · 1376 Wörter · SpaghettiCoder

SQL-JOIN-Typen Erklärt mit Beispielen

Ein falsch geschriebener JOIN wirft keinen Fehler. Er läuft durch, liefert ein Ergebnis, und die Zeilen sind falsch: fehlende Kunden, aufgeblasene Summen, unsichtbare verwaiste Datensätze. Meistens hat die Abfrage genau das bekommen, was sie verlangt hat, und der Autor hat den falschen Join-Typ gewählt oder an der falschen Stelle gefiltert. Ein Join kombiniert Zeilen aus zwei Tabellen anhand einer Bedingung, die Sie schreiben. Welche Zeilen übrig bleiben, hängt vom Join-Typ ab, und die sechs Typen unten liefern sechs unterschiedliche Antworten aus denselben zwei Tabellen. ...

2. Oktober 2026 · 9 Minuten · 1868 Wörter · SpaghettiCoder

Was ist Dependency Injection? (Mit Beispielen)

Hier ist eine Klasse, die Sie ohne eine laufende Datenbank und einen funktionierenden SMTP-Server nicht unit-testen können: 1 2 3 4 5 6 7 8 9 10 11 public class OrderService { private readonly SqlOrderRepository _repository = new SqlOrderRepository("Server=prod-db;Database=Orders;..."); private readonly SmtpEmailSender _emailSender = new SmtpEmailSender("smtp.company.com"); public void PlaceOrder(Order order) { _repository.Save(order); _emailSender.Send(order.CustomerEmail, "Order confirmed"); } } OrderService baut sich seine eigenen SqlOrderRepository- und SmtpEmailSender-Instanzen mit new, Connection-String und allem. Jeder Test, der PlaceOrder berührt, braucht eine echte Orders-Datenbank und einen echten Mailserver, sonst scheitert er, bevor Ihre Assertion überhaupt läuft. Die Logik, die Sie testen wollen, sind zwei Zeilen: die Bestellung speichern, die Bestätigung senden. Sie ist an zwei konkrete Klassen geschweißt, die Sie nicht austauschen können. ...

1. Oktober 2026 · 8 Minuten · 1509 Wörter · SpaghettiCoder

Virtuelle Python-Umgebungen: venv, pip und uv

Installieren Sie zwei Python-Projekte auf derselben Maschine, kann das zweite das erste zerstören. Eines braucht requests==2.28, das andere requests==2.32, und pip hat genau ein systemweites site-packages-Verzeichnis, in das es schreibt. Die letzte Installation gewinnt, lautlos. Sie merken es, wenn das andere Projekt Fehler wirft, die nichts mit dem Code zu tun haben, den Sie gerade geändert haben. Eine virtuelle Umgebung gibt jedem Projekt sein eigenes site-packages. Nichts Globales wird berührt, und zwei Projekte können von inkompatiblen Versionen derselben Bibliothek abhängen, ohne dass eines das andere stört. ...

30. September 2026 · 7 Minuten · 1387 Wörter · SpaghettiCoder

Unit-Tests vs Integrationstests vs End-to-End-Tests

Eine Funktion kann 100 % Unit-Test-Abdeckung haben, und die Seite, die sie aufruft, kann in Produktion trotzdem einen 500er zurückgeben. Das ist kein Widerspruch. Unit-, Integrations- und End-to-End-Tests prüfen unterschiedliche Dinge, und eine Testsuite, die bei einer Ebene stark und bei einer anderen schwach ist, hat ein bestimmtes, vorhersehbares Loch. Was Unit-, Integrations- und End-to-End-Tests jeweils prüfen Nehmen Sie eine Registrierungsfunktion: Eine Funktion validiert die Eingabe, schreibt eine Zeile in eine Datenbank und verschickt eine Willkommens-E-Mail. Drei Tests können das abdecken, und jeder beantwortet eine andere Frage. ...

29. September 2026 · 11 Minuten · 2131 Wörter · SpaghettiCoder

Async/Await und die Event Loop in JavaScript Erklärt

Führen Sie das in Node oder einer Browser-Konsole aus: 1 2 3 4 console.log("1"); setTimeout(() => console.log("2"), 0); Promise.resolve().then(() => console.log("3")); console.log("4"); Die Ausgabe ist 1 4 3 2. Ein setTimeout mit 0ms Verzögerung läuft trotzdem nach dem Promise-Callback, und beide warten auf jede Zeile synchronen Codes darunter. async/await baut auf dieser Reihenfolge auf, nicht auf einem neuen Mechanismus. Die meisten überraschenden Verhaltensweisen in asynchronem JavaScript entstehen, weil man await so schreibt, als würde es das gesamte Programm anhalten, obwohl es nur die Funktion anhält, in der es steht. ...

28. September 2026 · 8 Minuten · 1543 Wörter · SpaghettiCoder

Wie Datenbankindizes Funktionieren und Wann Sie Nutzen

Bei einer Tabelle mit einer Million Zeilen kann dieselbe SELECT-Abfrage fünfzig Millisekunden dauern oder deutlich unter einer. Der einzige Unterschied ist, ob die Datenbank jede Zeile liest, um die gesuchten zu finden, oder direkt zu ihnen springt. Ein Index macht diesen Sprung möglich, und Sie bezahlen dafür bei jedem Schreibvorgang. Konkret ist ein Index eine zweite, sortierte Kopie einer oder mehrerer Spalten, die neben der Tabelle gespeichert und bei jeder Änderung der Tabelle automatisch aktualisiert wird. Die Datenbank nutzt ihn, um passende Zeilen zu erreichen, ohne den Rest anzufassen. ...

27. September 2026 · 9 Minuten · 1771 Wörter · SpaghettiCoder