Viele schwierige LeetCode-Probleme sind einfach Constraint-Probleme

2025-09-12
Viele schwierige LeetCode-Probleme sind einfach Constraint-Probleme

Der Autor berichtet von einer frustrierenden Interviewerfahrung, bei der ein scheinbar einfaches Wechselgeldproblem ihn aufgrund fehlender Fähigkeiten in dynamischer Programmierung überfordert hat. Er argumentiert, dass viele herausfordernde LeetCode-Probleme tatsächlich leicht mit Constraint-Solvern wie MiniZinc, Z3 oder OR-Tools lösbar sind. Der Artikel zeigt anhand mehrerer Beispiele, darunter die Maximierung des Aktienprofits und die Suche nach dem größten Rechteck in einem Histogramm, die elegante Einfachheit und die Leistungsfähigkeit von Constraint-Solvern, insbesondere beim Umgang mit komplexen Constraints.

Mehr lesen
Entwicklung

Wie RSS ICE schlug: Einfachheit siegt über Komplexität

2025-09-08
Wie RSS ICE schlug: Einfachheit siegt über Komplexität

Dieser Artikel erzählt die Geschichte des Wettbewerbs zwischen RSS und ICE, zwei konkurrierenden Content-Syndication-Protokollen. Unterstützt von Giganten wie Microsoft und Adobe, bot ICE eine überlegene Funktionalität, war aber übermäßig komplex und geschlossen. RSS, das aus Netscape stammt, war einfach, benutzerfreundlich und gedieh aufgrund seiner offenen Natur. Letztendlich führte die Einfachheit von RSS und die Beiträge zahlreicher Blogger und Entwickler zu seinem Sieg über das leistungsstärkere ICE und wurde zum Industriestandard für die Content-Aggregation. Dies unterstreicht das Internet-Motto: Einfachheit siegt über Komplexität.

Mehr lesen
Technologie Content-Syndication

Warum ich reStructuredText Markdown vorziehe

2025-08-18
Warum ich reStructuredText Markdown vorziehe

Dieser Beitrag beschreibt, warum der Autor reStructuredText (rST) gegenüber Markdown für das Schreiben technischer Bücher bevorzugt. rST ist eine mittelgewichtige Repräsentation eines abstrakten Dokumentbaums und bietet im Vergleich zum leichten Ansatz von Markdown eine bessere Erweiterbarkeit und Anpassbarkeit. Der Autor veranschaulicht dies anhand von Beispielen zur Bilderstellung und zur Bearbeitung von Übungen und zeigt, wie benutzerdefinierte Direktiven und Transformationen des Dokumentbaums in rST komplexe Dokumentstrukturen und Funktionalitäten ermöglichen, die in Markdown schwer zu erreichen sind. Obwohl er die möglicherweise weniger intuitive Syntax von rST anerkennt, plädiert der Autor für seine Leistungsfähigkeit bei der Erstellung umfangreicher Dokumentation, insbesondere wenn benutzerdefinierte Erweiterungen und Transformationen erforderlich sind, wie in seinem Buch "Logik für Programmierer" gezeigt.

Mehr lesen
Entwicklung

Die JavaScript-Runtime-Explosion: Ein Jahrzehnt der Innovation

2025-07-28
Die JavaScript-Runtime-Explosion: Ein Jahrzehnt der Innovation

Das letzte Jahrzehnt hat eine Explosion neuer JavaScript-Runtimes und -Engines erlebt, die die Ausführung von JavaScript in verschiedenen Kontexten mit bemerkenswerter taskspezifischer Optimierung ermöglichen. Dies hat JavaScript in die Cloud, Edge Computing, Smart TVs, mobile Geräte und sogar Mikrocontroller gebracht. Dieser Artikel untersucht die Triebkräfte hinter dieser Vielfalt und warum keine einzige Runtime oder Engine alle Anforderungen erfüllt. Vom Aufstieg des Edge Computings und ressourcenschonender Engines für Mikrocontroller bis hin zu polyglotten Engines, die die Interoperabilität mit anderen Sprachen erleichtern, und der weitverbreiteten Verwendung in der Entwicklung nativer Anwendungen zeigen JavaScript-Runtimes eine unglaubliche Anpassungsfähigkeit und ein dynamisches Wachstum. Der Artikel beschreibt verschiedene Runtimes und Engines wie Node.js, Deno, Cloudflare Workers, Bun, React Native, NativeScript usw. und erläutert ihre zugrunde liegenden Technologien und Entwicklung.

Mehr lesen
Entwicklung

Caching: Abstraktion, nicht Optimierung

2025-07-04
Caching: Abstraktion, nicht Optimierung

Die gängige Meinung ist, dass Caching Software beschleunigt. Der Autor argumentiert, dass dies nur ein Teil der Geschichte ist. Nach der Arbeit mit Datenbewegungen zwischen Objektspeicher, Festplatte und Arbeitsspeicher, argumentiert der Autor, dass die wichtigere Rolle von Caching die Vereinfachung von Software ist. Der Artikel untersucht die Grenzen vorgefertigter Caching-Algorithmen (LRU, LFU usw.) und legt nahe, dass Caching eher als Abstraktionsschicht fungiert, die die zugrundeliegenden Speicherdetails verbirgt und Programmierer von der Sorge um den Speicherort der Daten befreit. Die Caching-Mechanismen von Datenbanken und Betriebssystemen veranschaulichen diese Abstraktion. Obwohl Caching Probleme haben kann, wie z. B. die falsche Verwendung des Betriebssystem-Seitencaches und fsync, bedeutet dies nicht, dass Caching aufgegeben werden sollte, sondern dass es besser verstanden und verwendet werden sollte.

Mehr lesen
Entwicklung

Die Einsamkeits-Epidemie: Ein Aufruf, das Haus zu verlassen

2025-06-29
Die Einsamkeits-Epidemie: Ein Aufruf, das Haus zu verlassen

Dieser Artikel behandelt das weit verbreitete Problem der Einsamkeit in der modernen Gesellschaft und argumentiert, dass das Verlassen des Hauses der Schlüssel zu ihrer Bekämpfung ist. Der Autor verwendet seine Erfahrung mit einem Hund und dem Engagement in der Gemeinschaft in einem Hundepark als Hauptbeispiel für den Aufbau von Verbindungen. Er hebt die Bedeutung städtischer Infrastruktur wie Bürgersteige hervor, um die Gemeinschaft zu fördern. Der Artikel kritisiert den späten Kapitalismus für seinen Profit und die Verschärfung der Einsamkeit und fordert die Leser auf, aktiv am Gemeinschaftsleben teilzunehmen und menschliche Verbindungen zu erleben.

Mehr lesen
Sonstiges

Lösen des LinkedIn-Damenproblems mit SMT: Einfacher als mit SAT!

2025-06-12
Lösen des LinkedIn-Damenproblems mit SMT: Einfacher als mit SAT!

Dieser Beitrag beschreibt die Lösung des „LinkedIn-Damen“-Puzzles – einer Variante des klassischen N-Damen-Problems mit zusätzlichen regionalen Einschränkungen – mithilfe des SMT-Solvers Z3. Der Autor zeigt, dass die Formulierung des Problems in SMT unter Verwendung ganzzahliger Variablen und Constraints deutlich einfacher ist als die äquivalente SAT-Formulierung, die viele boolesche Klauseln erfordert. Obwohl SMT-Solver möglicherweise langsamer sind als hochoptimierte SAT-Solver wie Glucose, macht die einfache Codierung SMT für viele bevorzugt. Der Beitrag enthält den vollständigen Code und hilfreiche Plausibilitätsprüfungen zur Überprüfung der Korrektheit des Modells. Dies liefert eine überzeugende Erklärung für die Präferenz der Branche für Tools, die zu SAT kompilieren, anstatt SAT direkt zu verwenden.

Mehr lesen
Entwicklung SMT-Solver

Unentscheidbarkeit: Die Pandora-Box der Programmierer

2025-05-28
Unentscheidbarkeit: Die Pandora-Box der Programmierer

Dieser Artikel erklärt klar das Konzept der "Unentscheidbarkeit" in der Informatik. Mit leicht verständlicher Sprache und konkreten Beispielen (wie der Bestimmung, ob eine Zahl die Summe zweier Primzahlen ist) erläutert der Autor Entscheidungsprobleme und die Rolle von Turing-Maschinen. Die wichtigste Schlussfolgerung ist, dass Unentscheidbarkeit nicht bedeutet, dass es unmöglich ist, festzustellen, ob ein Programm anhält, sondern dass es keinen universellen Algorithmus gibt, um das Halteverhalten aller Programme zu bestimmen. Dies macht viele Probleme (wie die Überprüfung von Programmeigenschaften) zu aufwändigen und möglicherweise unlösbaren Aufgaben und unterstreicht die Notwendigkeit von Bereichen wie formaler Verifikation und Programmanalyse.

Mehr lesen
Entwicklung

Property-Based Testing: Warum es Unit-Tests bei komplexen Eingaben übertrifft

2025-05-21
Property-Based Testing: Warum es Unit-Tests bei komplexen Eingaben übertrifft

Dieser Artikel diskutiert die Vorzüge von Property-Based Testing (PBT) gegenüber traditionellen Unit-Tests. Der Autor argumentiert, dass Unit-Tests für Funktionen mit einzelnen Eingaben ausreichen, aber die kombinatorische Explosion von Randfällen bei Funktionen mit mehreren Eingaben PBT, mit seiner zufälligen Eingabenerzeugung, überlegen macht, um versteckte Randfehler aufzudecken. PBT hat jedoch eine Lernkurve; die Beherrschung komplexer Strategien zur Eingabenerzeugung ist entscheidend. Die meisten PBT-Beispiele sind zu einfach, um ihre wahre Stärke bei der Behandlung komplexer Eingabebereiche zu zeigen.

Mehr lesen
Entwicklung

Das E-Mail-Wagnis der US-Post: Aufstieg und Fall von E-COM

2025-05-14
Das E-Mail-Wagnis der US-Post: Aufstieg und Fall von E-COM

Angesichts der Bedrohung durch E-Mail startete die US-Post 1982 E-COM, einen Dienst, der E-Mails ausdruckte und per Postzusteller auslieferte. Anfangs erfolgreich, scheiterte E-COM 1985 letztendlich aufgrund hoher Kosten, umständlicher Prozesse und mangelnder Flexibilität, was zu Verlusten von über 40 Millionen Dollar führte. E-COM trug jedoch unbeabsichtigt zur Popularisierung des Begriffs "E-Mail" bei und zeigte die Bemühungen der Post, sich an technologische Veränderungen anzupassen.

Mehr lesen
Technologie

Lebensmittelsicherheit in Amerika: Ein Kampf gegen Lügen und Geschichte

2025-04-30
Lebensmittelsicherheit in Amerika: Ein Kampf gegen Lügen und Geschichte

Dieser Artikel interviewt die Wissenschaftsjournalistin Deborah Blum und erforscht den aktuellen Stand und die Geschichte der Lebensmittelsicherheit in den USA. Blum weist darauf hin, dass die amerikanischen Bürger angesichts der grassierenden Fehlinformationen und der Deregulierung durch die Regierung mit Risiken für die Lebensmittelsicherheit konfrontiert sind, wobei Probleme wie die Lebensmittelverfälschung aus dem 19. Jahrhundert wieder auftauchen. Sie verwendet ihr Buch "The Poison Squad", um die Entstehung des Pure Food and Drug Act von 1906 zu veranschaulichen und wie der Chemiker Harvey Wiley durch ein "Gift-Trupp"-Experiment Probleme der Lebensmittelsicherheit aufdeckte. Blum fordert die Öffentlichkeit auf, sich mit der Lebensmittelsicherheit auseinanderzusetzen, und kritisiert den individualistischen Ansatz, der die Verbraucher für durch Lebensmittel verursachte Krankheiten verantwortlich macht, wobei sie die Verantwortung der Regierung betont, Grundrechte zu gewährleisten.

Mehr lesen

Anforderungen ändern sich, bis sie es nicht mehr tun: Formale Methoden und Systementwicklung

2025-04-28
Anforderungen ändern sich, bis sie es nicht mehr tun: Formale Methoden und Systementwicklung

Dieser Artikel untersucht, wie man ständig wechselnde Anforderungen in der Softwareentwicklung bewältigt. Während eine umfangreiche formale Modellierung im Vorfeld bei häufigen Änderungen unpraktisch sein kann, argumentiert der Autor, dass formale Methoden entscheidend werden, wenn Systeme eine gewisse Größe erreichen oder Architekturänderungen (Phasenübergänge) durchlaufen. Formale Spezifikation und Verifikation stellen sicher, dass Verbesserungen bestehende Funktionalitäten nicht beeinträchtigen. Am Beispiel des Wechsels von synchronen zu asynchronen Aktualisierungen zeigt der Autor, wie formale Methoden überprüfen können, ob ein neues System bestehende Anforderungen erfüllt, und betont die Bedeutung der Softwarewartung und die Vermeidung des stillen Ausfalls von Funktionen.

Mehr lesen

Lösung des Propositionalen Salon-Rätsels von Blue Prince mit Logik

2025-04-21
Lösung des Propositionalen Salon-Rätsels von Blue Prince mit Logik

Dieser Artikel beschreibt, wie man ein Logikrätsel aus dem Spiel Blue Prince automatisch mit Hilfe der Aussagenlogik löst. Das Rätsel beinhaltet drei Boxen (blau, weiß, schwarz), die jeweils Aussagen treffen, und Regeln, die besagen, dass mindestens eine Box vollständig wahr ist, mindestens eine vollständig falsch ist und der Preis sich in genau einer Box befindet. Der Autor modelliert das Problem in der Aussagenlogik, verwendet einen Brute-Force-Ansatz, um alle erfüllenden Zuweisungen zu finden, und bestimmt so den Ort des Preises. Der Artikel enthält eine Implementierung in JavaScript und diskutiert die Optimierung des Codes.

Mehr lesen
Spiele

Googles AMP für E-Mail: Ein mutiges Scheitern

2025-04-18
Googles AMP für E-Mail: Ein mutiges Scheitern

Google versuchte, E-Mails mit AMP (Accelerated Mobile Pages) zu revolutionieren und interaktive Erfahrungen wie Hotelbuchungen oder Antworten auf Google Docs-Kommentare direkt in E-Mails zu ermöglichen. Dieses Vorhaben scheiterte jedoch. Der Artikel analysiert die Gründe für das Scheitern von AMP für E-Mails, darunter hohe Entwicklungskomplexität, schlechte Kompatibilität und Konflikte mit den Eigenschaften von E-Mails. Das Misstrauen der Entwickler gegenüber Googles Vorgehen trug erheblich zum Scheitern bei. Interaktive E-Mails sind zwar nicht unmöglich, sollten aber Kompatibilität und Beständigkeit priorisieren, nicht auf Kosten von Einfachheit und Zuverlässigkeit. Der anhaltende Erfolg von E-Mails beruht auf Einfachheit und Dezentralisierung.

Mehr lesen
Technologie

Jenseits von NP: Ein intuitiveres Komplexitätsproblem

2025-04-17
Jenseits von NP: Ein intuitiveres Komplexitätsproblem

Der Autor hinterfragt die Verwendung des Halteproblems als kanonisches Beispiel für ein Problem, das schwieriger ist als NP-vollständig, und argumentiert, dass es verwirrend und unintuitiv ist. Obwohl unentscheidbar, kann die Überprüfung einer "Ja"-Antwort auf das Halteproblem durch Ausführen des Programms für eine endliche Anzahl von Schritten erfolgen. Eine leichter verständliche Alternative wird vorgestellt: das Bewegen einer Spielfigur auf einem unendlichen Gitter, um einen Zielpunkt zu erreichen. Dieses Problem ist PSPACE-vollständig in niedrigeren Dimensionen, aber seine Komplexität explodiert mit zunehmender Dimension und erreicht schließlich ACKERMANN-Vollständigkeit, was visuell eine Komplexität weit über NP-Problemen hinaus demonstriert.

Mehr lesen

Elegantes Lösen eines Layton-Rätsels mit Prolog

2025-04-08
Elegantes Lösen eines Layton-Rätsels mit Prolog

Der Autor hat das Kapitel über logische Programmiersprachen in seinem Buch "Logik für Programmierer" überarbeitet und die Leistungsfähigkeit von Prolog anhand eines Rätsels im Stil von 'Layton' demonstriert. Das Rätsel besteht darin, die Punktzahl des vierten Schülers anhand der Punktzahlen der ersten drei Schüler zu bestimmen. Mit prägnantem Prolog-Code (nur 15 Zeilen!) löst der Autor das Problem elegant, indem er die Mustererkennung und die Bidirektionalität von Prolog nutzt, um alle möglichen Antwortmöglichkeiten zu finden und schließlich die Punktzahl des vierten Schülers mit 6 zu bestimmen. Ein Vergleich mit einer längeren und weniger effizienten Lösung wird gezogen. Obwohl der Autor gegen die Verwendung von Rätseln im Unterricht argumentiert, zeigt dieses Beispiel das praktische Anwendungspotenzial von Prolog.

Mehr lesen
Entwicklung Rätsellösung

Es ist Zeit, auf den Bau von KV-Datenbanken zu verzichten

2025-03-25
Es ist Zeit, auf den Bau von KV-Datenbanken zu verzichten

Der Autor kritisiert Key-Value-Datenbanken als zu einfach und ausdruckslos, was sie schwierig in der Anwendung macht. Obwohl sie bei Anbietern von Speicher-Engines beliebt sind, dienen KV-Datenbanken lediglich als Bausteine für vernünftige Datenmodelle. Benutzer müssen diese Modelle von Grund auf neu erstellen, oft mit suboptimalen Ergebnissen. Der Autor schlägt einen Mittelweg vor: eine eingebettete Datenbank mit typisierten Datensätzen, die logische und physische Schemas trennt, aber Abfragen gegen das physische Schema schreibt. Dies vermeidet komplexe Query Planner, unterstützt asynchrone Schemaänderungen und Layoutwechsel. Dieser Ansatz gleicht Datenunabhängigkeit mit der für eingebettete Systeme notwendigen Einfachheit aus und bietet eine überzeugende Alternative sowohl zu einfachen KV-Speichern als auch zu den Komplexitäten vollwertiger relationaler Datenbanken.

Mehr lesen
Entwicklung

Verifikationsorientierte Entwicklung: Über Test Driven Development hinaus

2025-03-18
Verifikationsorientierte Entwicklung: Über Test Driven Development hinaus

Dieser Artikel untersucht die verifikationsorientierte Entwicklung (VFD), ein Paradigma, das die Einrichtung von Verifikationsmechanismen vor dem Schreiben von Code betont. Dies kann das Schreiben von Tests, das Definieren von Typinvarianten, das Hinzufügen von Verträgen oder andere Methoden umfassen. VFD unterscheidet sich von Test Driven Development (TDD), welches ein Sonderfall von VFD ist und sich auf die Verwendung von Tests zur Steuerung des Code-Designs konzentriert. Die Vorteile von VFD beinhalten die Verringerung der Wahrscheinlichkeit, die Verifikation zu überspringen, frühzeitige Fehlererkennung und verbesserte Codequalität. VFD hat jedoch auch Nachteile: Es kann die Entwicklung verlangsamen, explorative Programmierung behindern und Verifikationsmethoden können das Code-Design beeinflussen. Der Autor argumentiert, dass VFD als Technik, nicht als Paradigma, flexibler ist und sich leicht in andere Ansätze integrieren lässt.

Mehr lesen

Fünf Arten von Nichtdeterminismus: Praktische Einblicke aus formalen Methoden

2025-02-20
Fünf Arten von Nichtdeterminismus: Praktische Einblicke aus formalen Methoden

Dieser Artikel untersucht fünf Arten von Nichtdeterminismus in der Systemmodellierung: wahre Zufälligkeit, Nebenläufigkeit, Benutzereingabe, externe Kräfte und Abstraktion. Der Autor erklärt jeden Typ klar mit praktischen Beispielen. Wahre Zufälligkeit, obwohl oft mit Pseudozufallszahlengeneratoren simuliert, wird in der Modellierung in der Regel als nichtdeterministische Wahl behandelt. Nebenläufigkeit ist eine Hauptquelle für Nichtdeterminismus und erfordert aufgrund der Zustandsraumexplosion eine spezielle Behandlung. Benutzereingabe und externe Kräfte werden als nichtdeterministische externe Einflüsse behandelt. Im Wesentlichen vereinfacht die Abstraktion komplexe deterministische Prozesse zu nichtdeterministischen Entscheidungen, vereinfacht Modelle und erhöht die Empfindlichkeit gegenüber potenziellen Fehlern. Dies liefert wertvolle Einblicke in das Verständnis von Nichtdeterminismus und seinen Anwendungen in der Softwareentwicklung.

Mehr lesen
Entwicklung Softwaremodellierung

Effizienz vs. Horizontale Skalierbarkeit: Ein notwendiger Kompromiss?

2025-02-12
Effizienz vs. Horizontale Skalierbarkeit: Ein notwendiger Kompromiss?

Dieser Artikel untersucht den Konflikt zwischen Effizienz und horizontaler Skalierbarkeit von Software. Der Autor argumentiert, dass für Skalierbarkeit optimierte Software in Single-Machine-Umgebungen oft schlecht performt und umgekehrt. Dies liegt an Amdahls Gesetz, Koordinationsaufwand und Einschränkungen gemeinsamer Ressourcen. Effiziente Algorithmen beruhen oft auf Annahmen über das System und das Problem, die bei horizontaler Skalierung nicht mehr gelten. Der Autor diskutiert auch kulturelle Aspekte und Aufgabentypen, die die Wahl beeinflussen, und veranschaulicht dies mit Beispielen wie der Tigerbeetle-Datenbank und dem GIL von CPython. Letztendlich ist ein tiefes Verständnis des Problems und der Umgebung entscheidend für hohe Effizienz und Skalierbarkeit.

Mehr lesen
Entwicklung

Die kuriose Geschichte der Anker in regulären Ausdrücken: Warum `$` und `^`?

2025-01-21
Die kuriose Geschichte der Anker in regulären Ausdrücken: Warum `$` und `^`?

Dieser Beitrag beleuchtet die historischen Ursprünge der Verwendung von `$` und `^` als Zeilenanker in regulären Ausdrücken. Rückblickend auf den Texteditor QED, stand `$` ursprünglich für das Ende des Puffers und wurde später von Ken Thompson an das Zeilenende in Regex angepasst. Die Wahl von `^` resultierte wahrscheinlich aus dem begrenzten Zeichensatz der Teletype Model 35 Schreibmaschine, wobei `^` bereits in ASCII-67 vorhanden war. Es war keine brillante Designentscheidung, sondern eher eine Folge der Hardware- und Zeichensatzbeschränkungen dieser Zeit und wurde zu einer Konvention in regulären Ausdrücken.

Mehr lesen
Entwicklung

Mathematische Modellierung zeigt, wie schlecht das Dreidel-Spiel ist

2024-12-18
Mathematische Modellierung zeigt, wie schlecht das Dreidel-Spiel ist

Letztes Jahr verwendete der Autor die probabilistische Modellierungssprache PRISM, um das traditionelle Feiertagsspiel Dreidel zu modellieren und dessen Mangel an Spaß zu beweisen. Dieses Jahr verfeinerte er das Modell, um das gesamte Spiel bis zum Ende zu simulieren. Das neue Modell behebt den vorherigen Fehler, nur die Eliminierung des ersten Spielers zu simulieren, und verbessert die Berechnungslogik für Einsätze und Spielereliminierung. Durch Modellsimulation stellte der Autor fest, dass ein Vier-Spieler-Spiel im Durchschnitt 760 Drehungen benötigt, um zu enden, wobei das längste Spiel sogar über 6 Stunden dauern kann. Dies beweist eindeutig, dass das Dreidel-Spiel lang, langweilig und frustrierend ist.

Mehr lesen