RSS Der tägliche WTF Notiz

RSS Der tägliche WTF

Daily WTF ist ein humorvoller Blog zum Thema Programmierung, der von Alex Papadimoulis auf Basis von Geschichten über Softwareentwicklung und die Technologie-Welt erstellt wurde. Er konzentriert sich hauptsächlich auf Anekdoten, die auf Projektschwierigkeiten, Codebeispiele und lustige Geschichten im IT-Bereich basieren. Die Webseite enthält eine umfassende Sammlung dieser realen Erfahrungen vieler Entwickler, die ihre seltsamen und lustigen Erlebnisse bei der Arbeit teilen, sei es technisch oder persönlich, aber immer in Verbindung mit dem Technologiebereich.

Notizfaden

CodeSOD: Das Bob-Verfahren

Joe arbeitete an einem jahrzehntealten Finanzsystem, das ursprünglich mit Oracle Forms erstellt wurde. Das System entwickelte sich weiter und wechselte zu Java für die Benutzeroberfläche, während die Oracle-Datenbank beibehalten wurde und stark auf PL/SQL basierte. Diese lange Lebensdauer führte zu angesammeltem "Kruft", einschließlich veralteter Prozeduren wie der "BOB"-Funktion. Die "BOB"-Prozedur, ein einfacher Print-Statement-Wrapper, hat überraschenderweise zahlreiche System-Upgrades und -Migrationen überstanden. Ihre Existenz datiert vor der verfügbaren Quellcode-Historie, was darauf hindeutet, dass sie seit über zwanzig Jahren im Code enthalten ist. Trotz ihrer Nichtbenutzung verbleibt die Funktion in der Codebasis, ein Beweis für ihre Langlebigkeit. Der Autor, Joe, staunt über das Überleben der Prozedur und die mysteriöse Identität des ursprünglichen Entwicklers, ebenfalls namens Bob. Der Code wurde von zahlreichen Unternehmen zur Verwaltung von Krediten verwendet. Der Artikel hebt die dauerhafte Wirkung scheinbar kleiner Coding-Entscheidungen im Laufe der Zeit hervor. Joe erkennt die Bedeutung selbst kleinster Details in Software an, die eine so lange Lebensdauer hat.

CodeSOD: Die Dateiübertragung

"SQL Server Integration Services (SSIS) ist Microsofts ETL-Tool, der eine visuelle Oberfläche für die Datenmanipulation bietet. Es ermöglicht Benutzern, Datenflüsse zu entwerfen, einschließlich Transformationen und verschiedenen Operationen, wodurch die Notwendigkeit komplexer Skripting eliminiert wird. Die Fähigkeiten von SSIS erstrecken sich auf Datenmigration, Systemintegration und sogar das Extrahieren in Excel-Tabellen. Bemerkenswerterweise ermöglicht SSIS die Ausführung von .NET-Code in seiner Umgebung. Der Text hebt eine problematische Implementierung hervor: ein "Datei verschieben"-Speicherprozedur innerhalb von SSIS. Diese Speicherprozedur verwendet xp_cmdshell, eine potenziell gefährliche Funktion, die es SQL Server ermöglicht, Shell-Befehle auszuführen. Diese Speicherprozedur verwendet `mv`- und `cp`-Befehle, die die Installation von GNU Core Utils unter Windows erfordern, wodurch eine undokumentierte Abhängigkeit entsteht. Da xp_cmdshell aus Sicherheitsgründen normalerweise deaktiviert ist, stellt diese Konfiguration ein erhebliches Sicherheitsrisiko dar. Der anfängliche Umzug auf neue Hardware ließ diesen Ansatz scheitern und hob seine Einschränkungen hervor. Stattdessen sollte die geeignetere "Dateiübertragungsaufgabe" in SSIS-Paketen anstelle dieser unsicheren Methode verwendet werden. Der Text endet mit einer Werbung für eine Paketverwaltungslösung."

Fehler'd: Wir haben keine Bananen

Es gibt eine Sammlung von Vorfällen, bei denen Unternehmen Tests in der Produktion durchführen, was ein wichtiger Teil des Entwicklungsprozesses ist. Tests in der Produktion ermöglichen es Unternehmen, Probleme zu erkennen, bevor ihre Kunden dies tun, aber sie sollten so durchgeführt werden, dass die Kunden nicht beeinträchtigt werden. Wenn Tests in der Produktion schiefgehen, kann dies für das Unternehmen peinlich und für die Kunden frustrierend sein. Eine Reihe von Beispielen wird angeführt, darunter Vorfälle von Firestone Auto Care, Crunchyroll und Engadget, bei denen Tests in der Produktion schlecht durchgeführt wurden. In jedem dieser Fälle waren die Tests für die Kunden sichtbar, was nicht ideal ist. Weitere Beispiele sind ein Testartikel in einem Live-Webshop, eine Standard-Testnachricht und ein undichter Produktionstest von Amazon Prime Video. Diese Vorfälle unterstreichen die Bedeutung von Tests in der Produktion, aber auch die Notwendigkeit, diese sorgfältig und diskret durchzuführen. Die angeführten Beispiele stammen von verschiedenen Unternehmen und Branchen, was zeigt, dass Tests in der Produktion eine gängige Praxis sind. Der Artikel schließt mit einer Werbung für ProGet, ein Tool, das Sicherheits- und Zugriffskontrollen für NuGet-Feeds bietet. Insgesamt betont der Artikel die Bedeutung von Tests in der Produktion und zeigt gleichzeitig Beispiele dafür, wann diese schiefgehen.
CdXz5zHNQW_0GoSFKOcEN.jpeg

CodeSOD: Ein JSON Serialisierer

Carols Code demonstriert einen schlechten Ansatz zur JSON-Serialisierung durch manuelles Konstruieren von Strings. Diese Methode ist fehleranfällig und unnötig, da C# über integrierte JSON-Serialisierungsfunktionen verfügt. Der Code versucht, Datentypen für die Serialisierung durch Inspektion von String-Darstellungen abzuleiten. Er behandelt insbesondere Tupel, indem er Klammern in eckige Klammern umwandelt. Er versucht auch, Werte als Zahlen oder Boolesche Werte zu parsen, um ihre JSON-Darstellung zu bestimmen. Jeder andere Wert wird als String behandelt und in Anführungszeichen gesetzt. Ein kritischer Fehler ist das Fehlen einer ordnungsgemäßen Maskierung für Zeichen innerhalb von Strings, was potenziell zu fehlerhaftem JSON führen kann, wenn Anführungszeichen in den Daten vorkommen. Der Code hat auch einen Fehler, bei dem ein zusätzliches Komma an den JSON-String angehängt wird, das dann mit einer bedingten Überprüfung entfernt wird. Diese manuelle String-Manipulation ist ein Zeichen schlechter Praxis. Entwickler sollten immer vorhandene Bibliotheken oder Sprachfunktionen für Aufgaben wie die JSON-Serialisierung nutzen. Wenn eine komplexe Codegenerierung wirklich erforderlich ist, ist der Aufbau eines Syntaxbaums der richtige Ansatz.

Ein einzigartiger Fehler

Henrik stieß auf einen hartnäckigen Fehler, bei dem ein Drittanbieterdienst inkonsistente Ergebnisse lieferte. Von Henriks Unternehmen gesendete Updates spiegelten sich manchmal nicht korrekt wider, und Lesevorgänge zeigten unerklärliche Daten. Der Anbieter schob zunächst die Schuld auf Henriks Team, aber Henrik war nicht überzeugt. Er arbeitete mit Kollegen und dem Anbieter zusammen und entwickelte über mehrere Wochen reproduzierbare Testfälle. Diese Tests deuteten stark darauf hin, dass der Dienst des Anbieters schuld war. Nach einer Phase des Schweigens räumte der Produktverantwortliche des Anbieters das Problem ein. Sie identifizierten die Ursache als die API, die gelegentlich die Eigentümerschaft von Datensätzen falsch identifizierte. Ihr Lösungsvorschlag war die Implementierung eindeutiger, sich niemals wiederholender IDs für Entitäten. Dieser innovative Ansatz war tatsächlich das etablierte Konzept von Primärschlüsseln und eindeutigen Identifikatoren. Der Anbieter war trotz des allgemeinen Wissens über diese Konzepte offenbar nicht darüber informiert.

Beispielzeile: Auflistung der Probleme

Mike teilte eine Zeile Java-Code, die zwar kein WTF an sich ist, aber auf zugrunde liegende Probleme hinweist. Der Code deklariert ein Array von ArrayLists: ArrayList[] data = new ArrayList[dataList.size()]. Dies erstellt ein Array von ArrayLists mit einer Größe, die der von dataList entspricht. Der Autor vermutet, dass dies ein Versuch sein könnte, Objektorientierung mit Listen zu nutzen. Es könnte sein, dass jedes Objekt in dataList in eine ArrayList seiner Werte umgewandelt wird. Der Code könnte älter als Java Generics sein oder absichtlich eine nicht-generische Version für diese Konvertierung verwenden. Ohne weiteren Kontext bleibt dies Spekulation. Solcher Code signalisiert erfahrenen Programmierern jedoch oft ein Problem. Diese Zeile dient als Warnsignal für potenzielle Komplexitäten oder Designfehler. Die Anwesenheit dieser Zeile deutet auf tiefere Probleme innerhalb der Codebasis hin.

CodeSOD: Eine monatliche Ergänzung

Bert arbeitete Ende der 90er Jahre für ein Softwarelösungsunternehmen, das hauptsächlich einen Kunden bediente. Dieser Kunde bat um Hilfe bei der Behebung einer langsamen Helpdesk-Planungsanwendung, die sie selbst entwickelt hatten. Anfangs stellte Bert fest, dass die Planung von nur fünf Mitarbeitern aufgrund ineffizienten VBA-Codes eineinhalb Stunden dauerte. Ein Beispiel für diese schlechte Programmierpraxis war eine lange Reihe verschachtelter IF-Anweisungen zur Umwandlung von nullindizierten in einsindizierte Monate. Bert war der Meinung, dass die Software grundlegend fehlerhaft war und er nicht die richtige Person sei, um sie zu reparieren. Sein Chef bestand jedoch aus finanziellen Gründen darauf, den Kunden zufriedenzustellen. Über mehrere Wochen hinweg gelang es Bert, die Planungszeit auf dreißig Minuten zu verkürzen. Diese Verbesserung wurde von seinem Chef als ausreichend erachtet, um dem Kunden Erfolg zu melden. Trotzdem wurde das Programm letztendlich nie genutzt und aufgegeben. Später erfuhr Bert, dass der Kunde geplant hatte, die kundenspezifischen Softwaredienste einzustellen und die Aufgabe einem neuen, nicht-programmierenden Mitarbeiter aus seiner Buchhaltungsabteilung zu übertragen. Dies deutet darauf hin, dass die eigene interne Lösung des Kunden möglicherweise von jemandem entwickelt wurde, der keinen Programmierhintergrund hatte.

Fehler'd: Weder hier noch dort

Der Beast in Black erlebte einen unklaren Propangasstand, den er mit Quantensuperposition verglich. Darren hinterfragte die Sortierung der Aufrufzahlen auf YouTube und deutete auf eine Diskrepanz in der Interpretation von Zahlen hin. Christian L. äußerte sich begeistert über Neuigkeiten von GitLab. Eine anonyme Person bemerkte, dass die Sommerzeit das Wetter negativ beeinflusst und zu Temperatursenkungen und Wind führt. B.J.H. überlegte, welche Kommentar-Syntax angemessen wäre, und schlug verschiedene Optionen vor. Ironischerweise schlug B.J.'s früherer Versuch mit einem Serverfehler fehl, den der Autor stets als Serverproblem bezeichnet. B.J. glaubte, dass seine auskommentierte Betreffzeile einen Parse-Fehler verursacht habe. Der Text endet mit einer Werbung für ProGet, die eingeschränkte NuGet-Feed-Berechtigungen bewirbt, um unbefugten Zugriff auf Produktionsumgebungen zu verhindern. Dies impliziert die Notwendigkeit einer robusten Zugriffskontrolle in der Softwareentwicklung.
CdXz5zHNQW_ijAzRj74ds.png

Geschichten aus dem Vorstellungsgespräch: Tic Tac Whoa

Der Artikel bespricht ein schlecht durchgeführtes technisches Screening, bei dem ein Kandidat problematischen Code eingereicht hat. Der Interviewer, der als Einreicher fungierte, fand den Code verwirrend und vermutete, dass er mit einem Tic-Tac-Toe-ähnlichen Spiel zusammenhing. Der Code enthielt Syntaxfehler und logische Mängel, was darauf hindeutet, dass der Kandidat versuchte, drei in einer Reihe vertikal zu überprüfen. Der Einreicher spekuliert über die beabsichtigte Funktionalität, stellt jedoch die Unvollständigkeit und Fehlerhaftigkeit der Implementierung fest, was dazu führte, dass der Kandidat kein Angebot erhielt. Der Autor wendet sich dann Ratschlägen zur Verbesserung technischer Screenings sowohl für Interviewer als auch für Kandidaten zu. Sie betonen, dass Screenings Gespräche fördern und es den Kandidaten ermöglichen sollten, ihre Denkprozesse zu diskutieren. Interviewer werden ermutigt, Fragen zu stellen und aktiv mit den Kandidaten in Kontakt zu treten, wobei das Screening als gemeinsame Anstrengung betrachtet wird. Kandidaten sollten sich wohl dabei fühlen, Fehler zu machen und Code zu schreiben, der leicht refaktorierbar ist, da dies Teil des Lern- und Entwicklungsprozesses ist. Ein wichtiger Ratschlag für Screenings ist, ihre Denkweise von "Joker aussortieren" auf das Sammeln von Beweisen zur Unterstützung des Kandidaten zu verlagern. Das Ziel sollte sein, Gründe zu finden, warum ein Kandidat *gut* geeignet ist, vorausgesetzt, er hat diese Phase des Prozesses erreicht. Interviewer sollten nach diesen positiven Beweisen suchen und den Kandidaten jede Gelegenheit geben, sich zu beweisen. Wenn nach einem gründlichen Screening nicht genügend positive Beweise gefunden werden, deutet dies auf eine Nichtübereinstimmung hin und nicht auf ein Versagen der inhärenten Fähigkeiten des Kandidaten. Abschließend bittet der Autor humorvoll um einzigartig schreckliche Code-Einreichungen für zukünftige "Geschichten aus dem Interview"-Beiträge.

CodeSOD: Immobilienflips

Kleyguerth stieß auf einen verwirrenden Fehler, bei dem ein `_hasPicked`-Flag unerwartet aktiviert wurde. Dieses Problem rührte von einem kürzlichen, massiven Commit mit einem vagen Kommentar her. Das Kernproblem lag in der Art und Weise, wie TypeScript Eigenschaften behandelt, die auch Funktionen mit Gettern und Settern sein können. Ursprünglich war `checkAndPick` ein privater Getter, der einfach den Wert von `_hasPicked` zurückgab. Später wurde er zu `return this._hasPicked || (this._hasPicked = true);` geändert. Diese Version veränderte `_hasPicked` zu true, wenn es false war, und gab immer true zurück. Obwohl dies aufgrund von Zustandsänderungen in einem Getter als schlechte Praxis galt, funktionierte es wie erwartet. Die Situation verschlimmerte sich, als der Code weiter zu `return this._hasPicked || !(this._hasPicked = true);` geändert wurde. Diese Version setzte `_hasPicked` auf true, gab aber false zurück, was zu weitreichenden Problemen führte. Der grundlegende Fehler liegt in der Verwendung von Property Accessors für Zustandsänderungen, die für Setter reserviert sein sollten. Komplexe oder auch einfache Logik sollte nicht innerhalb von Property Accessors liegen.

CodeSOD: Ein Date mit Gregory

Kalender sind willkürliche Konstrukte, die Menschen zur Organisation der Zeit aus Bequemlichkeit nutzen. Der Kalender des antiken Roms wurde vom Pontifex Maximus verwaltet, einem religiösen Führer, der auch ein Politiker sein konnte. Julius Cäsar nutzte diese Doppelrolle zu seinem politischen Vorteil und manipulierte Feste, um seine Gegner zu stören. Seine Bemühungen führten zum Julianischen Kalender, der etwa 1500 Jahre lang als Hauptkalender diente. Papst Gregor überarbeitete später den Kalender, korrigierte die Schaltjahrberechnungen und richtete ihn neu an den Jahreszeiten aus, was das Überspringen von dreizehn Tagen erforderte. Der Text betont, dass Daten historisch gesehen keine inhärente Logik hatten. Anschließend wird ein problematischer Java-Code-Schnipsel vorgestellt, der `GregorianCalendar` und `XMLGregorianCalendar` verwendet. Dieser Code versucht, einen `GregorianCalendar` in einen `XMLGregorianCalendar` und dann wieder zurück zu konvertieren und die beiden zu vergleichen. Trotz der scheinbaren Logik, die einen wahren Vergleich nahelegt, ist der Konvertierungsprozess zu `XMLGregorianCalendar` verlustbehaftet. Folglich gibt die Funktion im Code-Schnipsel immer false zurück. Der Autor hinterfragt den Zweck und den Nutzen einer solchen Überprüfung und hebt die menschliche Fehlbarkeit beim Programmieren hervor. Der historische Kontext dient dazu, zu veranschaulichen, dass Zeitsysteme schon immer Veränderungen und Unannehmlichkeiten unterworfen waren.

CodeSOD: Contracting Space

Ein dringendes Ticket meldete fehlerhafte Leerzeichen in Produktionsdaten. Mike P. verfolgte das Problem zu einer benutzerdefinierten `trim`-Funktion in `Strings.java`. Diese selbst entwickelte Funktion war ineffizient und fehlerhaft und ersetzte unnötigerweise Leerzeichenfolgen durch einzelne Leerzeichen. Bemerkenswert ist, dass sie für Zeichenketten, die ausschließlich aus Leerzeichen bestanden, `null` zurückgab, was nicht dem beabsichtigten Benutzerverhalten entsprach. Das Kernproblem ergab sich aus Entwicklern, die Anforderungen erfanden, die Benutzer nie wünschten, was zu unerwarteter Datenmanipulation führte. Die benutzerdefinierte `trim`-Funktion versagte auch bei der Handhabung verschiedener Leerzeichen über Unicode 20 hinaus. Benutzer, die an das frühere Verhalten der Anwendung gewöhnt waren, gerieten in Panik, als die Leerzeichen zu verschwinden begannen. Die ursprüngliche Absicht war wahrscheinlich, führende/nachfolgende Leerzeichen zu kürzen, nicht die internen Abstände zu entfernen. Dieser Fehler blieb aufgrund der Historie der Anwendung und des Mangels an Tests für solche Randfälle unbemerkt. Die Situation verdeutlicht die Gefahren, bestehende Funktionalitäten mit fehlerhaften benutzerdefinierten Implementierungen neu zu erfinden.

Fehler: Pickerl-Pedanten

Ein Qualitätsanalyst und Audiophiler stieß auf napalmrecords.com auf ein Problem, bei dem die Aktualisierung seiner Rechnungsadresse eine große Hausnummer erforderte. Diese große Nummer bestand zusammen mit einem Platzhalternamen überraschenderweise die Validierung. Richard P. entdeckte einen Substitutionsfehler in einer Beschreibung eines Lego-Sets, die einen vorlagenbasierten Produktnamen enthielt. Mark T. bemerkte, dass kurze Geschwisternamen für eine Sicherheitsfrage nicht zulässig waren. Tim R. meldete eine Sicherheitslücke, bei der Sainsbury/Argos drei Informationen zur Abholung von Artikeln benötigt. Er hob hervor, dass das Versenden aller drei Informationen in derselben E-Mail den Zweck der Sicherheitsmaßnahme untergräbt. Der Autor kontrastiert humorvoll sein entspanntes Bedrohungsmodell für Lebensmitteleinkäufe mit Tims Bedenken. Der Text enthält dann eine Anzeige für einen Leitfaden zu NuGet-Best Practices für Unternehmen. Das übergreifende Thema ist die Meldung verschiedener Website- und Systemfehler.
CdXz5zHNQW_LBr2pBXF89.png

CodeSOD: Hoch gespannt

Viele Programmiersprachen bieten Komfortfunktionen, um zu prüfen, ob ein String null oder leer ist. C# hat ebenfalls eine solche Funktion, aber Entwickler können sie dennoch falsch implementieren. Jasons `StringValid`-Funktion ist zwar funktional, aber ineffizient, da sie eine unnötige bedingte Anweisung verwendet. Ein besserer Ansatz wäre, den booleschen Ausdruck direkt zurückzugeben oder die integrierte Funktionalität zu nutzen. Dereks Ansatz verwendet eine Einzeiler `"".Equals(Port)`, was eine umgekehrte und weniger intuitive Methode zur Prüfung auf Nullheit ist. Dieses Muster wurde verstreut im Code gefunden, was auf die Verwendung eines Code-Snippets hindeutet. Die invertierte `"".Equals`-Syntax könnte von Sprachen wie Python beeinflusst worden sein. Malfists Java-Beispiel beinhaltet eine Funktion namens `checkNull`, die irreführend benannt ist. Diese Funktion ist tatsächlich eine Coalesce-Funktion, die einen Standardstring zurückgibt, wenn die Eingabe null ist. Ein erheblicher Fehler ist, dass sie den nicht-nullen Eingabestring trimmt, aber nicht den Standardstring. Darüber hinaus prüft sie nicht, ob der Standardstring selbst null ist, was potenziell zu weiteren Nullreferenzfehlern führen kann. Der Autor äußert Frustration über die Komplexität der String-Handhabung und schlägt deren Abschaffung vor.

CodeSOD: Durch die 4. Dimension

Der bereitgestellte Codeausschnitt veranschaulicht eine benutzerdefinierte Datumsformatierungsfunktion aus dem 4th Dimension (4D) Datenbanksystem. 4D, ursprünglich "Silver Surfer" genannt, war ein RDBMS, eine IDE und eine Programmiersprache, die in den 1980er Jahren entwickelt wurde. Es begann auf Apple-Hardware und wäre fast ein Apple-Produkt geworden, bevor der Druck der Anbieter eingriff. 4D erweiterte sich im Laufe der Zeit um Server/Client-Bereitstellungen, plattformübergreifende Kompatibilität mit Windows und Webanwendungsunterstützung. Trotz dieser Fortschritte hinkte 4D bei Funktionsveröffentlichungen oft hinter Wettbewerbern wie FileMaker und Access zurück. Das System integrierte schließlich SQL- und PHP-Unterstützung, und das Unternehmen existiert weiterhin mit unregelmäßigen Updates. Das Kernproblem war nicht der Datumshandlungscode selbst, sondern die Unzulänglichkeit der integrierten Datumsformatierungsoptionen in Brewsters Version von 4D. Infolgedessen musste Brewster das gewünschte Datumsformat manuell erstellen, was eine Einschränkung der 4D-Plattform aufdeckte. Der Auszug hebt ein reales Beispiel dafür hervor, dass aufgrund von Mängeln in den Werkzeugen benutzerdefinierter Code geschrieben werden musste.

CodeSOD: Eine letzte ID

Chris's Unternehmen sah sich mit einem unerwarteten Anstieg der Datentransferkosten konfrontiert, als ihre Webanwendung, die bei Cloud Provider B gehostet wurde, mit einer MySQL-Datenbank bei Cloud Provider A interagierte. Sie rechneten monatlich nur mit Gigabytes an Datentransfer. Stattdessen verzeichneten sie Terabytes, was ihr Budget erheblich überschritt. Die Untersuchung ergab, dass jede Einfügeoperation eine enorme Datenmenge abrief. Die Ursache war eine fehlerhafte SQL-Abfrage: SELECT last_insert_id() FROM some_table_name. Diese Abfrage sollte nicht nur die zuletzt eingefügte ID abrufen, sondern angewiesen wurde sie, diese ID für jede einzelne Zeile in der angegebenen Tabelle zurückzugeben. Da die Tabelle Millionen von Zeilen enthielt, führte dies zu Millionen von Wiederholungen der zuletzt eingefügten ID, die bei jeder Einfügung zurückgesendet wurden. Folglich erzeugte jede Einfügeoperation einen erheblichen Datentransfer von etwa 30 MB. Die technische Behebung war unkompliziert. Die Koordination der Änderung mit dem Webentwicklungsunternehmen und ihrer Hosting-Umgebung, einschließlich Tests und Bereitstellung, dauerte jedoch sechs Wochen. Ein Teil dieser Zeit wurde darauf verwendet, die Webentwickler davon zu überzeugen, dass das Problem tatsächlich auftrat und durch ihren Code verursacht wurde.

CodeSOD: Identifiziere ein Nickerchen

Ein Entwickler stieß auf einen merkwürdigen Bug, bei dem das Speichern neuer Einträge manchmal zu Fehlern aufgrund doppelter Primärschlüssel führte. Dieses Problem rührte von dem benutzerdefinierten Nachrichten-ID-Generator der Anwendung her, der den aktuellen Zeitstempel verwendete. Der Generator versuchte, schnelle Anfragen zu verarbeiten, indem er für eine Sekunde schlief, wenn Zeitstempel kollidierten. Dieser Ansatz war jedoch ineffizient und im Wesentlichen ein komplizierter Autoincrement-Zähler. Ein kritischer Fehler war, dass die `previousId` nie aktualisiert wurde, was bedeutete, dass Kollisionen nicht verhindert wurden. Das Problem wurde dadurch verschärft, dass die Anwendung auf mehrere Server verteilt war. Diese Verteilung bedeutete, dass selbst eine korrekt aktualisierte `previousId` ID-Kollisionen zwischen verschiedenen Knoten nicht verhindern würde. Mögliche Lösungen beinhalten die Einbeziehung maschinenspezifischer Kennungen wie MAC-Adressen oder die Verwendung großer Zufallszahlen. Alternativ schlägt der Entwickler vor, sich auf die native Auto-Increment-Funktionalität der Datenbank zu verlassen, anstatt auf benutzerdefinierten Code. Der aktuelle Durchsatz war niedrig genug, dass die Datenbank die ID-Generierung wahrscheinlich effektiv verwalten konnte.

Fehler: Redest du mit mir?

The Beast in Black hebt Fehler und amüsante Beobachtungen über unsere moderne Welt hervor. Weather.com präsentiert eine Temperaturdiskrepanz und zeigt einen faktischen Fehler in seiner Berichterstattung. Eine humorvolle Beobachtung über die Inkonsistenz der Temperaturdaten wird präsentiert. Ein Benutzer meldet eine Fehlfunktion der Download-Schaltfläche in einem S3-Bucket und erwähnt deren ähnliche Absurdität zu einem referenzierten Artikel. Herr TA schwelgt in seinen finanziellen Gewinnen und teilt seine positive Einstellung. David B. reflektiert humorvoll über die Paketlieferverzögerungen der USPS. Die Passage räumt die Unsicherheit hinsichtlich des Lieferplans ein. Der Autor scherzt über die unvorhersehbare Natur der USPS. Der Text endet mit einer kurzen Werbung für eine Softwarelösung.
CdXz5zHNQW_BuHeNDJ8JQ.jpeg

CodeSOD: Ein Echo hier drin

Der Text kritisiert ein Stück Code, das von "Tobbi" geschrieben wurde und JavaScript und PHP auf schlechte Weise kombiniert. Der Code verwendet PHP, um JavaScript-Strings zu generieren, was als Anti-Pattern gilt. Dieser spezielle Code-Schnipsel macht AJAX-Aufrufe, wobei PHP JavaScript-Code ausgibt, der die AJAX-Anfragen definiert. Der Autor weist darauf hin, dass das ausgegebene JavaScript direkt hätte geschrieben werden können, wodurch die Notwendigkeit von PHP entfällt. Tobbis mangelnde Voraussicht beim Schreiben dieses Codes wird vom Autor verspottet. Der Code, obwohl harmlos, wird als "Gehirnfurz" bezeichnet, der auf schlechte Programmierpraktiken hinweist. Der Autor schlägt vor, dass der Fehler aufgrund fehlender Code-Reviews oder schwacher Ausführung passiert ist. Der Autor kommt zu dem Schluss, dass organisatorische Versäumnisse es ermöglichen, dass solcher fehlerhafter Code integriert wird. Der Text endet mit einer Werbung für ein Produkt im Zusammenhang mit Softwareentwicklung.

Repräsentative Zeile: Machen Sie sich gefasst

Brody erbte eine große, unkommentierte Regierungs-Codebasis mit unglaublich langen Funktionen. Mitten in einer Funktion von etwa 500 Zeilen fand Brody eine einzelne, auskommentierte schließende Klammer: `// }`. Dies deutet darauf hin, dass der ursprüngliche Entwickler während der Kompilierung Schwierigkeiten mit dem Klammerabgleich hatte. Der Entwickler kommentierte wahrscheinlich Klammern aus, bis der Code kompilierte, und ging dann weiter, ohne den Kommentar zu entfernen. Diese Praxis unterstreicht eine gängige Programmierabkürzung, um Fehler schnell zu beheben. Der Kommentar offenbart einen überstürzten Ansatz beim Debugging, bei dem eine schnelle Lösung Vorrang vor der Klarheit des Codes hatte. Die auskommentierte Klammer deutet darauf hin, dass der ursprüngliche Entwickler Schwierigkeiten hatte, die Klammern in seinem Code auszubalancieren. Der einsame Kommentar dient als stilles Zeugnis der Schwierigkeiten, die bei der Erstellung des Codes aufgetreten sind. Er unterstreicht mangelnde Liebe zum Detail und eine ordnungsgemäße Code-Struktur. Die Geschichte dient als warnendes Beispiel für die Bedeutung von sauberem, gut kommentiertem Code. Die letzte Zeile sowie die Werbung sind für die primäre Erzählung nicht relevant.

Repräsentative Linie: Reduziert auf eine Union

Clemens stieß auf einen UI-zerstörenden Bug in einem System, das zuvor jahrelang korrekt funktioniert hatte. Das Problem wurde nicht durch eine Bereitstellung ausgelöst, was auf ein datenbezogenes Problem hindeutete. Die Anwendung verwaltete Widgets, die Zonen zugewiesen waren, welche die Zonen eines Endprodukts bestimmten. Der fehlerhafte Code verwendete eine `reduce`-Funktion mit `_.union`, um die Zonen des Produkts zu berechnen. Diese falsche Verwendung von `_.union` führte dazu, dass der Akkumulator nur die letzte Zone behielt. Diese fehlerhafte Logik funktionierte überraschenderweise lange Zeit, da Produkte nicht auf Zonen aufgeteilt waren. Als das Unternehmen expandierte, begannen Produkte, sich über mehrere Zonen zu erstrecken, wodurch der Bug aufgedeckt wurde. Die falsche Zonenberechnung lieferte plötzlich falsche Ergebnisse und zerstörte die UI. Die einfache Lösung bestand darin, die `_.union`-Funktion korrekt auf den Zonen-Arrays zu verwenden. Dies unterstreicht die Bedeutung der korrekten Funktionsverwendung und die Auswirkungen von Datenänderungen auf Legacy-Code. Die Werbung bewirbt eine Lösung für sichere NuGet-Feeds.

CodeSOD: Funktional ein Datum

Daten sind komplexe Datentypen, im Gegensatz zu einfacheren mathematischen Entitäten wie Ganzzahlen, und stellen oft unerwartete Herausforderungen dar. Trotz dieser Komplexität können funktionale Programmierprinzipien effektiv auf die Datenverarbeitung angewendet werden. Einige Entwickler haben jedoch damit zu kämpfen, wie ein problematisches Java-Codebeispiel zeigt. Dieses Beispiel verwendet eine Liste von drei Lambda-Funktionen, um zwei `LocalDateTime`-Objekte nach Jahr, Monat und Tag zu vergleichen. Es streamt diese Funktionen, wendet sie auf die Daten an und gibt die erste gefundene Differenz ungleich Null zurück, wobei standardmäßig Null verwendet wird, wenn alle Differenzen Null sind. Der Autor drückt seine starke Missbilligung dieses Ansatzes aus und hält ihn für unnötig kompliziert und grundsätzlich fehlerhaft, obwohl er die korrekte Ausgabe erzeugt. Der Einreicher des Codes ersetzte diese gesamte komplexe Logik durch eine einzige, elegante Codezeile. Diese überlegene Lösung verwendet die eingebaute `compareTo`-Methode, nachdem die `LocalDateTime`-Objekte in `LocalDate`-Objekte konvertiert wurden. Dies zeigt eine idiomatischere und effizientere Art und Weise, Datumvergleiche in Java zu handhaben.

Fehler: Freie Vögel

Brian stieß trotz seiner hohen Punktzahl auf unverständliche Ergebnisse aus den Berechnungen von SkillCertPro. Maia erlebte eine Zeitparadoxie mit ihrem E-Mail-Client und las zukünftige Nachrichten. Jason lernte Mailspring für rechtzeitige Musikbestellungen zu nutzen, was scheinbar eine Zeitmaschine beinhaltete. Peter G. berichtete humorvoll über Probleme mit E-Mail und Telefonnummern und hob verbesserte Fehlermeldungen hervor. Adam R. entdeckte einen Browser-Zoom-Fehler und blieb bei einem Zoom-Level von NaN% hängen. Der Text zeigt humorvolle Anekdoten über technische Störungen und unerwartetes Verhalten. Die Probleme reichen von mathematischen Anomalien bis hin zu Fehlfunktionen von E-Mail-Clients und Browser-Eigenheiten. Der Gesamtton ist unbeschwert und anekdotisch und konzentriert sich auf die Benutzererfahrungen mit Technologie. Eine Werbung für BuildMaster unterbricht die Benutzererfahrungsgeschichten. Der kurze Text präsentiert eine Sammlung amüsanter technischer Schwierigkeiten.
CdXz5zHNQW_1E6wuKbrTX.png

CodeSOD: Der Getter Setter Getter

Der bereitgestellte Java-Code-Ausschnitt beginnt mit einer `getExtractedDataMap`-Methode, die eine `setExtractedDataToMap`-Methode aufruft. Dies ist verwirrend, da Java-Konventionen vorschreiben, dass Getter Werte abrufen und Setter diese verändern, was einen Getter, der einen Setter aufruft, unkonventionell macht. Die `setExtractedDataToMap`-Methode konvertiert ein `PayloadDto`-Objekt in eine `Map`. Die `getExtractedDataMap`-Methode fungiert dann einfach als unnötiger Vermittler. Das Kernproblem ist, dass dies zwei schlecht benannte Methoden sind, bei denen eine einzige, gut benannte Methode ausreichen würde. Ein gravierenderes Problem ist die Konvertierung eines Java-Objekts in eine `Map`, was nach Code-Geruch riecht und auf Unbehagen mit objektorientierten Prinzipien hindeutet. Diese Konvertierung ist für Serialisierungszwecke nicht gerechtfertigt, da Java über integrierte Serialisierer verfügt, die dies transparent handhaben. DTOs selbst sind für eine einfache Datenserialisierung konzipiert. Der Autor äußert Verwirrung über den Zweck dieses Codes und wiederholt damit die Meinung des Entwicklers, der ihn entdeckt hat. Der ursprüngliche Entwickler gab ebenfalls auf, zu versuchen, den Workflow zu verstehen, für den dieser Code gedacht war.

CodeSOD: Upsert Yours

Ein Programmierer teilte einen Code-Ausschnitt aus einem .NET Framework zu .NET Core Migrationsprojekt. Der Code zeigt einen `CustomerController` mit einer Aktionsmethode, die ein `Customer`-Objekt verarbeitet. Innerhalb der Methode prüft eine Bedingung `customer.someProperty`, um zu entscheiden, welche überladene `UpsertSomething`-Methode aufgerufen werden soll. Die `UpsertSomething`-Methode wird mit einer sehr langen Liste von Parametern aufgerufen, von denen viele null oder boolesche Standardwerte sind. Der Autor weist darauf hin, dass sich die beiden Aufrufe von `UpsertSomething` fast gleichen und sich nur in einem booleschen Parameter unterscheiden. Dies deutet darauf hin, dass die `if/else`-Anweisung unnötig war. Stattdessen hätte der Wert von `customer.someProperty` direkt als Argument an einen einzigen `UpsertSomething`-Aufruf übergeben werden können. Der Autor hebt dies als Paradebeispiel für weniger ideale Programmierpraktiken hervor. Der bereitgestellte Ausschnitt ist repräsentativ für die breitere Codebasis, auf die während der Migration gestoßen wurde. Der Beitrag dient als Beispiel dafür, wie Codekomplexität manchmal durch einfachere Designentscheidungen vermieden werden kann.

Kurzsichtiger Fokus

Chops, ein Entwickler bei Initrode, wurde von seinem Manager Gary für einen kürzlichen Commit in der Taskmaster-Anwendung gerügt. Gary war verärgert, weil Chops' Commit die Anzahl der Unit-Tests reduziert hatte. Taskmaster, eine kritische Anwendung mit jahrzehntelanger Nutzung, hatte kürzlich einen Absturz erlebt, den Chops untersuchte. Die Untersuchung deckte fehlerhafte Logik in der Art und Weise auf, wie Taskmaster eindeutige IDs zuwies, was zu potenziellen Abstürzen und Endlosschleifen führte. Chops ersetzte den problematischen Code durch eine UUID-Implementierung und entfernte die alten, problematischen Unit-Tests. Gary, der eine bestimmte Metrik (Anzahl der Unit-Tests) priorisierte, forderte, dass die Änderung rückgängig gemacht wird. Chops war gezwungen, den fehlerhaften Code wiederherzustellen und einen temporären Fix zu implementieren. Infolgedessen nahm die Stabilität von Taskmaster ab, was Zeit und Ressourcen verschwendete. Letztendlich erhöhte diese Entscheidung das Risiko sowohl für interne als auch für externe Benutzer. Gary priorisierte die Metrik über die Gesundheit der Anwendung.
CdXz5zHNQW_ftsNh7c2Oj.jpeg

CodeSOD: Pretty Little State Machine

Zustandsautomaten sind wertvolle Werkzeuge zur Strukturierung von Code und zur Vereinfachung komplexer Probleme. Ein gut gemeinter Zustandsautomat kann jedoch schnell schwer verständlich werden, wenn er schlecht implementiert ist. Der bereitgestellte Codeausschnitt zeigt einen Zustandsautomaten mit zahlreichen definierten Übergängen. Der Autor hat Schwierigkeiten, die Funktionalität des Codes zu entschlüsseln, da die Variablennamen unklar und beschreibende Kommentare fehlen. Die Funktionen `tk` und `sp` bleiben mehrdeutig und erschweren das Verständnis ihres Zwecks innerhalb des Zustandsautomaten. Der Autor identifiziert den dritten Parameter von `tk` als Konstanten, die Aktionen darstellen, was die Lesbarkeit leicht verbessert. Leider macht die inkonsistente Verwendung von großgeschriebenen Konstanten den Code verwirrender. Insgesamt kritisiert der Autor die Unleserlichkeit des Codes, was den Zustandsautomaten schwer verständlich macht. Die Frustration des Autors unterstreicht die Bedeutung klarer Namenskonventionen und umfassender Kommentare. Die Anzeige bewirbt eine Release-Management-Plattform zur Verwaltung von Anwendungsreleases.

Error'd: Überflüssige U's

Dieser Eintrag behandelt humorvolle technische Fehler und Designfehler, beginnend mit einer Anspielung auf die DSGVO und europäisches Englisch. Ein Mitwirkender bemerkt ein "heißes Softwaremuster" im Zusammenhang mit Pickleball-Veranstaltungen. Ein anderer hebt Rechtstechnik-Probleme hervor, darunter verwirrende Softwareversionierung und falsch konfigurierte Webserver. Ein Autor aus Australien scherzt über ungewöhnliche Solarmodulnutzung aufgrund umgekehrter Jahreszeiten. Jemand anderes teilt ein humorvolles DHL-Liefer-Update mit einem "DHeLorean". Das Konzept von "Error'd"-Material wird untersucht, wobei die Frage aufgeworfen wird, ob absichtlich schlechtes Design qualifiziert. Ein konkretes Beispiel betrifft eine Cookie-Gesetz-Komponente mit schlecht differenzierten Umschaltfarben, was Fragen der Barrierefreiheit und Absicht aufwirft. Der Autor schließt mit der Überlassung des Urteils über diesen speziellen Fall an die Leser und fragt sich, ob es sich um einen echten Fehler oder nur um eine fragwürdige Designentscheidung handelt.
CdXz5zHNQW_yJM0VFGI71.png

Coded Smörgåsbord: Im Grunde ein Smörgåsbord

"Boolesche Variablen können entweder wahr oder falsch enthalten, aber ihre Namen sind oft nicht aussagekräftig. Das Beispiel `boolean isTrue = false;` verdeutlicht dieses Problem, bei dem "it" undefiniert bleibt. C# bietet sowohl `string` als auch `String`-Typen, die identisch sind, was zu potenziell verwirrendem Code führen kann. Ein Java-Snippet zeigt die Handhabung von Null-Werten, indem es null zurückgibt, wenn der Eingabeparameter `val` null ist. Der Kommentar in diesem Java-Code ist jedoch redundant, da die Rückgabe von `val` bei Null bereits das erklärte Ziel erreicht. Ein besonders unhilfreicher Kommentar in einer Codebasis lautet "// Basically, ..." gefolgt von Tausenden von Zeilen ohne Kommentare. Dieser Kommentar könnte angesichts des Mangels an Erklärungen als Kapitulation oder als ironischer Witz interpretiert werden. Das bereitgestellte CSS-Snippet `.comment { border: none; }` bezieht sich wahrscheinlich auf die Formatierung von Kommentaren auf einer Webseite. Eine Werbung bietet einen kostenlosen Leitfaden zur Planung von .NET 9-Migrationen mit Zuversicht. Dieser Leitfaden soll "Migrations-Migräne" für Entwickler verhindern. Der gesamte Text teilt humorvolle und aufschlussreiche Beobachtungen über Programmcode und Kommentare."

CodeSOD: Hinzufügen zum Argument

David begegnete einem verwirrenden Pull-Request mit umfangreichen Kommentaren, die sich auf eine scheinbar einfache Änderung konzentrierten: das Hinzufügen eines einzelnen Parameters zu einer JavaScript-Funktion. Die ursprüngliche Funktion hatte bereits sieben Parameter, was möglicherweise auf eine Refactoring-Gelegenheit hindeutete, um ein Objekt zu verwenden. Die erste Revision führte eine bedingte Anweisung ein, die an einen neuen Parameter `notArg8` gebunden war. Wenn `notArg8` wahr war, übermittelte der Code `arg8: !notArg8` an den Kontext. Der Autor konnte diese komplizierte Herangehensweise nicht verstehen, da man den Parameter einfach direkt hinzufügen konnte. David kommentierte den schlechten Code, aber der ursprüngliche Entwickler hörte auf zu antworten. Ein Junior-Entwickler genehmigte den verwirrenden Code-Wechsel, aber er wurde nie zusammengeführt. Ein anderer Entwickler strukturierte die Lösung anschließend um und fügte einfach `arg8` hinzu und übermittelte es an den Kontext. Der vereinfachte Code funktionierte, bestand die Tests und machte jeden glücklich. Die ursprüngliche Absicht des Entwicklers und die Begründung für die komplizierte bedingte Anweisung bleiben ein Rätsel. Das Ende deutet darauf hin, dass die ursprüngliche Vision des Entwicklers unerfüllt bleibt.

Die moderne Jobsuche: Teil 1

Ellis, die von ihrer monatelangen, fruchtlosen Jobsuche überwältigt war, besuchte ein kostenloses Seminar über die Online-Jobsuche. Das Seminar lieferte gute Informationen, hinterließ sie aber aufgrund der harten Realitäten des Arbeitsmarktes, einschließlich Betrug und Automatisierung, deprimiert. Ellis griff auf ihre Bewältigungsmechanismen gegen Angst zurück und beschloss, spazieren zu gehen, um ihre negativen Emotionen zu verarbeiten. Sie erkannte, dass die Vernachlässigung dieser Gefühle zu Lähmung und Hoffnungslosigkeit führen könnte. Nach ihrer Rückkehr schrieb sie ihre negativen Gedanken über die Jobsuche auf. Mithilfe einer Umdeutungs-Technik analysierte und hinterfragte Ellis jede negative Aussage. Sie deutete ihre schwierige Jobsuche als Lernprozess um und verglich sie mit einem Suchalgorithmus, der sich durch ein Labyrinth navigiert. Ellis fand auch Sinn in ihrem Kampf und betrachtete ihn als Akt des Widerstands gegen den herausfordernden Markt. Sie begann, das Potenzial zu erkennen, ihre Erfahrungen zu teilen und anderen zu helfen. Diese Arbeitslosigkeitsphase bot Ellis auch die Gelegenheit, neue Möglichkeiten zu erkunden, wie z. B. die Ausweitung ihrer freiberuflichen Schreibkarriere.
CdXz5zHNQW_TrBsYpHMmd.jpeg

Best of…: Klassiker WTF: Wir sind keine Fleischroboter!

"Der Tag der Arbeit, ein Tag zur Feier der Arbeitnehmer, beleuchtet einen Konflikt am Arbeitsplatz. Jordan, ein Entwickler, beaufsichtigte verschiedene Aspekte eines E-Commerce-Produkts. Vertrieb und Entwicklung hatten innerhalb des Unternehmens widersprüchliche Ziele und Methoden. Der Inhalt der Website fiel überraschenderweise unter die Verantwortung des VP of Sales. Ein Problem entstand, als die Lagerarbeiter Jordan wegen der Website konfrontierten. Ihr Problem rührte von einer "Über uns"-Seite her. Der VP of Sales hatte die Lagerarbeiter als "Fleischroboter" bezeichnet. Die Lagerarbeiter fühlten sich durch diese Beschreibung entehrt. Der bedauerliche Kommentar des VP wurde auf Alkohol zurückgeführt. Obwohl das Unternehmen schließlich mit den Bestellungen aufholte, war dies mit dem Austausch von Lagerarbeitern verbunden. Der VP of Sales blieb jedoch mit einem aufgewerteten Titel angestellt."
CdXz5zHNQW_8sccJ1G3g8.jpeg

Fehlerfrei: Betrugsicher

"Gordon S. schlägt humorvoll vor, dass KI Fehler einführt, um den Eindruck zu erwecken, Probleme zu lösen. Michael R. teilte einen Link zu daybreaker.com/alive/ und deutete auf einen möglichen Repost hin. Michael R. kommentierte auch ein Paket-Mistracking-Tool und äußerte Mitgefühl für den DHL-Fahrer, während er die Richtung des Fahrzeugs in Frage stellte. Morgan traf auf unhilfreiche Fehlermeldungen in einer Waschmaschinen-App, obwohl das Gerät korrekt funktionierte. Morgan hinterfragte die Logik der App und hob widersprüchliche Fehlermeldungen hervor. Stuart spekulierte, dass ein Filter möglicherweise etwas als Betrug eingestuft hatte, weil das Wort "Betrug" vorhanden war. Er hinterfragte die Annahme, dass alle Betrügereien das Wort "Betrug" enthalten. Der Text enthält auch eine Anzeige für ProGet, ein Tool zur Verwaltung von Paketen und Docker-Containern. ProGet bietet Schwachstellen-Scans und Zugriffskontrolle. Eine kostenlose Version ist verfügbar, mit Upgrade-Optionen für weitere Funktionen."
CdXz5zHNQW_4LpGMVo1vC.png

Repräsentative Zeile: Federn sind optional

"Optionale Typen wurden eingeführt, um Nullreferenz-Ausnahmen, oft als "Billionen-Dollar-Fehler" bezeichnet, zu vermeiden. Sie funktionieren, indem sie einen Wert umschließen und sicherstellen, dass die Option selbst immer existiert. Dies ermöglicht es Entwicklern, sicher auf die Anwesenheit eines tatsächlichen Wertes zu prüfen. Gut gestaltete optionale Implementierungen bieten nützliche Methoden zur Wertmanipulation. Das Konzept kann jedoch missbraucht werden, wie die Erstellung von statischen optionalen Konstanten für WAHR und FALSCH zeigt. Diese Praxis ist fragwürdig, insbesondere in Sprachen, die bereits solche booleschen Konstanten bereitstellen. Die Erstellung von Konstanten wie Optional.of(Boolean.TRUE) kommt im Wesentlichen dem gleich, was TRUE = TRUE bedeutet. Solche Implementierungen deuten auf zugrundeliegende Designfehler hin. Der Autor stieß darauf in einer Spring Web-API-Anwendung, bei der benutzerdefinierte Filter implementiert wurden, anstatt die Funktionen des Frameworks zu nutzen. Das Beispiel für statische optionale Deklarationen für WAHR und FALSCH unterstreicht ein breiteres Problem der Neuerfindung bestehender Lösungen. Es impliziert ein Missverständnis des ursprünglichen Problems und des Werkzeugs, das zu dessen Lösung bestimmt ist. Diese unnötige Komplexität kann zu verwirrendem und ineffizientem Code führen."

CodeSOD: Der HTML-Printwert

Matt erbte einen schlecht geschriebenen VB.Net-Code von einer früheren Kostensparmaßnahme. Der Code enthielt ein problematisches Muster zur Generierung von HTML, das in einer Session-Variable gespeichert wurde. Dieses HTML sollte dann über einen clientseitigen Redirect auf einer separaten Druckseite angezeigt werden. Die für die HTML-Generierung zuständige Funktion, GenerateHTMLOfItem, akzeptierte überraschenderweise keine Parameter, da die Artikel-ID bereits in einer Session-Variable gespeichert war. Der Redirect-Mechanismus selbst war ineffizient und verursachte, dass der Browser eine neue Anfrage für die Druckseite stellte. Die Microsoft-Dokumentation rät von der Überladung von Response.Redirect ab, die verwendet wurde, da sie den Thread beendet und die Leistung negativ beeinflusst. Die empfohlene Alternative besteht darin, false an den endResponse-Parameter zu übergeben und CompleteRequest aufzurufen. Angesichts zahlreicher Probleme priorisierte Matt andere Aufgaben und ließ diesen speziellen Code-Schnipsel mit einer frustrierten Bitte auskommentiert. Trotz der Ineffizienzen wurde diese Praxis scheinbar von Entwicklern übernommen, was den Code weiter verkomplizierte.

Repräsentative Zeile: Nicht das, was sie meinten, indem sie „Andor“ beobachteten

Der Text diskutiert eine problematische Funktion aus einem dreißig Jahre alten C++-Forschungswerkzeug. Dieses Werkzeug, an dem hauptsächlich Doktoranden der Informatik gearbeitet haben, weist schlechte Programmierpraktiken auf. Das hervorgehobene spezifische Beispiel ist eine Funktion namens `isFooOrBar`, die tatsächlich eine UND-Operation zwischen `isFoo()` und `isBar()` durchführt. Diese Diskrepanz zwischen dem Namen der Funktion und ihrem Verhalten ist ein erhebliches Problem. Darüber hinaus argumentiert der Autor, dass selbst wenn der Name korrekt wäre, der explizite Ausdruck `isFoo() && isBar()` klarer wäre als eine dedizierte Funktion. Die betreffende Funktion wurde 2010 als neuer Code eingecheckt, was auf eine bewusste Entscheidung und nicht auf einen einfachen Fehler hindeutet. Der ursprüngliche Autor hat wahrscheinlich die Logik von OR auf AND geändert, ohne den Namen zu aktualisieren. Diese Entscheidung wurde getroffen, um die Aktualisierung aller Aufrufstellen zu vermeiden, obwohl die Funktion nur an einer Stelle verwendet wurde. Der Autor vermutet, dass die eigentliche Absicht darin bestand, Verhalten zu kapseln, was hier nicht erreicht wurde.

Das C-Level-Ticket

Ein Mitarbeiter des technischen Supports wird gerufen, um einen defekten Drucker zu untersuchen, der von CEO Lawrence Gibbs gemeldet wurde. Bei seiner Ankunft findet der Mitarbeiter ein Konferenzzimmer ungewöhnlich kalt vor, in dem viele Mitarbeiter anwesend sind. Der Drucker hat unerklärlicherweise Dutzende leere Seiten mit Kaffeering-Ausdrucken produziert. Der Mitarbeiter verdächtigt den CEO, aber fürchtet Repressalien, wenn er ihn direkt konfrontiert. Die neue Leiterin des Personalwesens, Leila, bietet diskret Hilfe und Vertraulichkeit an. Leila erklärt, dass Gibbs versehentlich auf den Drucker gelehnt hat, unbeabsichtigt den Scan-Button gedrückt und damit die Scans ausgedruckt und per E-Mail versendet hat. Der Mitarbeiter entwickelt einen Plan, den Drucker entfernen zu lassen, indem er behauptet, dass er umfangreiche Reparaturen benötigt. Er schafft es, den Drucker erfolgreich entfernen zu lassen und in einem Schrank zu platzieren. Als Ergebnis enthält die Onboarding-Präsentation des Unternehmens jetzt ein Kaffeering-Ausdruck als Lektion über die Respektierung von Geräten. Der Mitarbeiter erkennt Leilas Rolle bei der Lösung des Problems an.
CdXz5zHNQW_1ofeETprE7.jpeg

Fehler aufgetreten: 8 Days a Week

"Mark R. stellt ein Worträtsel mit den Buchstaben "housucops" und schlägt eine spielerische Herausforderung vor. Der Text hebt problematische Technologie oder Benutzererlebnisse hervor. Gordon ersetzt eine Maschine mit begrenztem Speicherplatz und ist skeptisch gegenüber der Kapazität der neuen, möglicherweise aufgrund einer involvierten LLM. Ein anonymer Nutzer kritisiert die Greenmobility UX und bezeichnet sie als "Alptraum". Jeffphi, ein Cineast, gibt einer Filmvorschau eine negative Bewertung und findet sie langweilig. Manuel H. äußert den Wunsch nach häufigeren langen Wochenenden und wünscht sich einen zweiten Sonntag pro Woche. Der Text enthält Beispiele für Benutzerfrustration und Unzufriedenheit mit Technologie. Es wird auf KI-Halluzinationen hingewiesen, die auf mögliche Fehler oder irreführende Informationen hindeuten. Der Autor kommentiert eine Situation, die einer früheren Einreichung ähnelt. Die Anzeige bewirbt die Sicherheitsfunktionen von ProGet für NuGet-Feeds. Der Gesamtton wechselt zwischen spielerisch, kritisch und aspirativ und spiegelt verschiedene Benutzererlebnisse wider."
CdXz5zHNQW_6Alg9Haisc.png

Eine abzählbare Menge

"In den Anfängen des Webs waren Gästebücher und Besucherzähler gängige Website-Funktionen. Heutzutage verfolgen Unternehmen weiterhin Daten, insbesondere Download-Zahlen. Justin bemerkte eine Download-Anzahl in den Analysedaten seines Teams und auf ihrer Download-Seite, was ihm zunächst nicht bemerkenswert erschien. Er bemerkte auch häufige nächtliche Commits von einem Benutzer namens "MrStinky". Justin, zunächst abgelenkt, untersuchte schließlich die Git-Logs und sah ein Muster von kleinen, inkrementellen Aktualisierungen der Download-Zahl. Diese Aktualisierungen wurden von einem Bot generiert, der jedes Mal die Analysedaten abfragte, wenn ein Benutzer auf den Download-Link klickte. MrStinky erstellte dann Commits, bündelte sie, genehmigte, mergte und deployte die Änderungen über Nacht neu. Als Justin diesen Prozess hinterfragte, erklärten Teamkollegen, dass dies die einfachste und schnellste Lösung sei oder dass eine direkte Datenbankintegration noch nicht implementiert worden sei. Letztendlich priorisierte Justin, wie der Rest seines Teams, andere Probleme gegenüber dieser eigenartigen Methode zur Download-Zählung."

CodeSOD: Kopie einer Kopie von einem

Jessica arbeitet an einer älteren Windows Forms-Anwendung, die eine veraltete API verwendet. Ihr wurde die Aufgabe übertragen, einen leistungsschwachen Bericht zu untersuchen. Der Code wird als Spaghetti-Code mit vielen Ineffizienzen beschrieben. Jessica entdeckte eine Methode namens `GetReportDiscounts`, die eine SQL-Abfrage ausführt, aber paradoxerweise eine Zusammenfassung in C# durchführt, die bereits in der SQL enthalten ist. Diese Methode ignoriert auch ihre eigenen Datumsparameter und verwendet eine magische Zahl für die Filterung. Eine weitere Methode, `GetReportTotals`, ist fast identisch, verwendet jedoch eine andere magische Zahl. Beide dieser Methoden leiten sich von einer früheren Methode, `GetCancelledInvoices`, ab, die Datumsparameter korrekt verwendet. Allerdings führt auch `GetCancelledInvoices` die Filterung in C# anstelle der Datenbankabfrage durch. Jessica stellte fest, dass der eigentliche problematische Bericht eine Variante dieser Methoden war, die auf clientseitiger Verarbeitung für die Datenmanipulation beruhte. Durch die Refaktorierung dieses Berichts in eine SQL-Stored-Procedure mit entsprechender Indizierung verbesserte sich die Leistung erheblich. Der Artikel hebt das häufige Problem des Kopierens und Einfügens von Code und der ineffizienten Durchführung von Datenbankoperationen innerhalb der Anwendungsschicht hervor.

CodeSOD: Ich bin nicht 200

HTTP-Statuscodes haben theoretische Kategorien zur Vereinfachung der Verwendung: 100er für Informationen, 200er für Erfolge, 300er für Weiterleitungen, 400er für Client-Fehler und 500er für Server-Fehler. Allerdings weichen viele reale Implementierungen von diesen Standards ab. Zum Beispiel verwendet LinkedIn einen nicht standardmäßigen 999-Code für nicht autorisierten Zugriff. Shopify hat eigene benutzerdefinierte Codes eingeführt, und Apache hat sogar einen 218-Code. WebDAV verkompliziert die Angelegenheit weiter, indem es neue Statuscodes und HTTP-Anfrage-Verben hinzufügt. Ein Stück generierter Code versucht, HTTP-Statuscodes zu behandeln, indem er überprüft, ob der Statuscode durch 100 geteilt nicht gleich 2 ist. Dieser Ansatz behandelt jeden Statuscode außerhalb des 200-Bereichs als Fehler. Der Autor kritisiert diese Methode, insbesondere die Division durch 100, da sie falsch nicht fehlerhafte Antworten wie 300er als Fehler kennzeichnet. Zum Beispiel würde ein 304-Code (Nicht geändert), der anzeigt, dass zwischengespeicherte Inhalte noch gültig sind, fälschlicherweise als Fehler identifiziert. Diese clevere, aber fehlerhafte Logik führte zu unnötigen fehlgeschlagenen Anforderungen, was eine Vorliebe für mathematische Trickserei über robuste Fehlerbehandlung zeigt.

CodeSOD: Verrückt werden

Yusufs Firma erlebte nach einem routinemäßigen Neustart einen plötzlichen Anstieg von Paniknachrichten. Es wurden keine Code- oder Konfigurationsänderungen bereitgestellt, sodass die Ursache ein Rätsel blieb. Das Problem rührte von einer Funktion her, die für die Einrichtung eines Dokumentendatenbank-Clients zuständig war. Diese Funktion, `setupDocDBClient`, nutzte `docdb.NewClient`, um...

Fehler aufgetreten: Abbruch, Abbrechen, Fehlen?

Technische Fehler sind weit verbreitet. Ein Benutzer berichtet von einem "Off-by-900"-Fehler, ein anderer hebt ein "Abbrechen-Dialogfeld" im KDE Partition Manager hervor. Es gibt Spekulationen, dass ein großes Medienunternehmen seine zahlenden Abonnenten aufgrund der Nachrichtenflaute im August vernachlässigen könnte. Eine weitere Anmerkung äußert die Besorgnis, dass "Null eine gefährliche Idee ist". Der Text endet mit der Aussage "Fehlgeschlagen? Bis zum nächsten Mal" und einer Werbung für BuildMaster.
CdXz5zHNQW_wX9ZY7uR36.png

CodeSOD: Eine Anordnung von Parametern

Der bereitgestellte Codeausschnitt demonstriert eine problematische Programmierpraxis, bei der eine ArrayList verwendet wird, um mehrere Parameter an eine Methode zu übergeben. Die Methode erwartet, dass die ArrayList bestimmte Datentypen und Werte in einer vordefinierten Reihenfolge enthält. Dieser Ansatz opfert die Typprüfung zur Kompilierzeit zugunsten potenzieller Laufzeitfehler. Die Begründung für dieses Design war die Berücksichtigung möglicher zukünftiger Änderungen an der zugrunde liegenden Datenbank, ohne die Methodensignatur zu ändern. Dies umgeht jedoch Standard-Sprachfeatures wie optionale Argumente, die eine sicherere und besser wartbare Lösung geboten hätten. Der Entwickler glaubte fälschlicherweise, dass die Übergabe einer ArrayList auf diese Weise den Code flexibler mache. Dieses Muster der Verwendung von ArrayLists als Parameter-Container ist im gesamten Codebestand verbreitet. Die Alternative von optionalen Parametern hätte Typsicherheit zur Kompilierzeit und eine klarere Absicht geboten. Die aktuelle Implementierung stützt sich auf implizite Annahmen über Datenreihenfolge und -typ, was zu sprödem Code führt. Diese Praxis gilt als Antipattern in der Softwareentwicklung.

CodeSOD: VibeError auslösen

"Vibe-Coder", Entwickler, die sich auf LLMs verlassen, werden immer häufiger. Diese Entwickler lesen, testen oder verstehen KI-generierten Code oft nicht. Sie missachten auch die Codierungsstandards des Unternehmens. Ein Beispiel-Snippet zeigt ein problematisches Muster bei der Verwendung von `isinstance`-Prüfungen. Während das Protokollieren von Fehlern für fehlende Felder akzeptabel ist, ist die Ausnahmebehandlung höchst problematisch. Der Code löst eine Ausnahme aus, nur um sie sofort abzufangen und nichts damit zu tun. Dieses spezifische Verhalten ist charakteristisch für LLMs, die statistisch wahrscheinlichen, aber funktional nutzlosen Code generieren. Das Beispiel veranschaulicht, wie LLMs Anweisungen wörtlich interpretieren könnten, ohne logisches Schlussfolgern anzuwenden. Nach Ronans Erfahrung wurde dieser spezielle Vibe-Coder entlassen. Ihr KI-generierter Code wurde nie in das Projekt integriert. Der Entwickler hat jedoch bereits begonnen, sich mit KI-generierten Lebensläufen um neue Anstellungen zu bewerben. Dies unterstreicht eine breitere Besorgnis über die Fähigkeiten und Praktiken von LLM-abhängigen Entwicklern.

CodeSOD: Runde Streifen

JavaScript mangelt es an einer integrierten Funktion zum Runden auf beliebige Dezimalstellen. Entwickler erstellen oft eigene Lösungen, wie die bereitgestellte Funktion `stripExtraNumbers`. Diese Funktion wandelt die Zahl zunächst in eine Zeichenkette um, um nach einem Dezimalpunkt zu suchen. Wenn kein Dezimalpunkt vorhanden ist, wird die ursprüngliche Zahl zurückgegeben. Der Code verarbeitet dann potenzielle Zeichenketteneingaben, indem er sie in Zahlen parst. Er verwendet `toFixed(4)`, um die Zahl auf vier Dezimalstellen zu runden und gibt eine Zeichenkette zurück. Die Funktion wandelt diese Zeichenkette dann wieder in eine Zeichenkette um, um nachgestellte Nullen mithilfe eines regulären Ausdrucks zu entfernen. Schließlich parst sie das Ergebnis wieder in eine Fließkommazahl. Der Autor kritisiert diesen Ansatz als ineffizient und übermäßig komplex und hebt hervor, dass nachgestellte Nullen ein Formatierungsanliegen und kein numerisches sind. Das Beispiel veranschaulicht, wie missverstandene Codeausschnitte zu verschlungenen Lösungen führen können. Ein einfacherer, direkterer Ansatz könnte dasselbe Ergebnis mit weniger Codezeilen erzielen.

CodeSOD: Ein einzelnes Lint-Problem

Der bereitgestellte C++-Code demonstriert eine fehlerhafte Singleton-Implementierung, die für Utility-Funktionen verwendet wird. Eine Klasse namens CUtilities wird deklariert, die Utility-Methoden und einen globalen Zeiger, g_Utility, enthält. Der Konstruktor von CUtilities initialisiert g_Utility, um auf die aktuelle Instanz zu verweisen. Allerdings verhindert diese Einrichtung nicht die Erstellung mehrerer Instanzen, was zu Speicherlecks führt, wenn neue Instanzen den Zeiger überschreiben. Eine Initialisierungsklasse namens CUtilityInit wurde verwendet, um eine Instanz von CUtilities zu erstellen und damit ihren Konstruktor aufzurufen. Das Problem entsteht, weil das CUtilities-Mitglied innerhalb von CUtilityInit von einem Linter als nicht verwendet markiert wurde. Eine Mitarbeiterin namens Olivia entfernte dieses nicht verwendete Mitglied. Diese Aktion brach das Programm, weil der globale Zeiger g_Utility nie initialisiert wurde. Die korrekte Lösung bestand darin, g_Utility direkt mit einer Instanz bei der Programmstart zu initialisieren, anstatt auf die fehlerhafte Singleton-Ansatz zu vertrauen. Der Text betont, dass Singletons im Allgemeinen eine schlechte Praxis sind und schlecht implementierte Singletons erhebliche Probleme verursachen. Entwicklern wird geraten, Design-Muster nicht einfach nur um ihretwillen zu verwenden.

Irrtümlich: Voluntold

Der Autor glaubt, dass das Geständnis, selbst wenn es unfreiwillig erfolgt, geplagte Seelen heilen kann, insbesondere die von Webentwicklern. Er zielt darauf ab, diese Probleme aufzudecken und zu beheben. Leider wurde ein Beitrag von Sam anonymisiert, wodurch die Probleme von xxxxxxxxxxte.com unbehandelt blieben. Allerdings wird erwartet, dass drei andere Entwickler von diesem Prozess profitieren werden. Reinier B. hat Probleme mit der E-Mail-Verifizierung, um einen Zoo zu besuchen und nach Verwandten zu sehen. Alex A. kämpft mit der Zahlung von Zollgebühren. Sam B. bemerkt die Schwierigkeit, gute Entwickler zu rekrutieren, und schlägt vor, dass sie sich nicht genug anstrengen. Peter G. findet ein Netzwerk-Stromversorgungsgerät von Aliexpress aufgrund seines Markennamens problematisch. Jan B. wird für einen Beitrag hervorgehoben, der "Flubstitutionen" gekonnt mit Null-Referenz-Fehlern kombiniert. Jan B. wird vor eine schwierige Wahl zwischen zwei Null-Optionen für eine Standortbestimmungsnachricht gestellt.
CdXz5zHNQW_Ceu0VKQmmZ.png

Göttliche Komödie

Der bereitgestellte Text beschreibt eine problematische gespeicherte Prozedur in MariaDB, die von einem Entwickler namens Salagir dokumentiert wurde. Dieses Verfahren, das für das Abrufen von Übersetzungen entwickelt wurde, wird aufgrund zahlreicher Probleme als warnendes Beispiel dargestellt. Der Code wird als "toter Code" markiert, aber aufgrund seines historischen Wertes und der Lektionen, die er bietet, beibehalten. Salagirs Kommentar hebt mehrere Schwierigkeiten hervor, angefangen bei Syntax-Inkompatibilitäten zwischen Datenbankumgebungen. Eine wesentliche Hürde war eine globale Servereinstellung, die für die Ausführung der Prozedur erforderlich war und leicht übersehen wurde. In dem Kommentar wird auch detailliert beschrieben, wie eine falsche Indexverwendung aufgrund von Datentypkonflikten zu vollständigen Tabellenscans führte. Das Debuggen dieses Verfahrens war äußerst schwierig, so dass die Entwickler auf die Überwachung von Datenbankprozesslisten zurückgreifen mussten. Das schwerwiegendste Problem war die Prozedur, die nicht löschbare Datenbanksperren verursachte, die eine vollständige Neuerstellung der Datenbank erforderlich machten. Letztendlich wurde das Verfahren durch eine einfachere Unterabfrage ersetzt, wodurch alle aufgetretenen Probleme behoben wurden. Der Autor schlägt vor, dass eine solche Funktion eine unnötige Komplikation für eine Aufgabe darstellte, die von Standard-Datenbankoperationen leicht zu bewältigen war.

CodeSOD: Ein heruntergeladenes Datenset

"Werkzeuge für objektorientierte Abbildung von Datenbanken bieten Vorteile wie Typsicherheit durch die Abbildung von Datenbankbeziehungen auf Programmiersprachentypen. Ein spezifisches Beispiel zeigt jedoch schlechte Programmierpraktiken. Der Code durchläuft ein getrenntes ADO.NET-Dataset, das Datenbankdaten im Speicher modelliert. Der Zugriff auf Tabellen über den Index (z.B. Table(0)) anstelle des Namens ist ineffizient. Noch bedeutender ist, dass die Datenabrufkette überflüssig verbose und fehleranfällig ist. Der Code ruft wiederholt Methoden wie ToUpper und ToString auf Datenfeldern auf. Diese Kette wird absurd mit redundanten ToUpper-Aufrufen für "Tachometer". Ein Ausnahmehandler wird für potenzielle Nullwerte verwendet, nicht für Datenbankverbindungsfehler. Dieser Handler fehlt spezifische Ausnahmefehlerprüfung und geht davon aus, dass nur Nullwerte Probleme verursachen. Eine Änderung des Tabellenschemas brach den Code, indem sie die Spaltenindizierung änderte, aber der Handler maskierte den Fehler. Benutzer erlebten fehlerhafte Funktionalität, wie fehlende "Pumpenhalter"-Einträge, ohne klare Fehlermeldungen. Die auskommentierte Meldungbox suggeriert, dass häufige Null-Fehler die Benutzer überwältigten."