Thema: coding-practice
-
Ein Python-Kommandozeilenwerkzeug entwerfen: argparse, main() und Exit-Codes
Die Schnittstelle in eine als Konsolenskript registrierte Funktion main(argv) -> int legen, mit den argparse-Parametern type und choices validieren, der Exit-Code-Konvention folgen (0 Erfolg, 2 Aufruffehler, 1 sonstiger Fehlschlag, sysexits-Codes nur wenn dokumentiert), Ergebnisse auf stdout und Diagnosemeldungen auf stderr ausgeben sowie SIGINT und abgebrochene Pipes behandeln.
-
.NET-Konventionen für Dependency Injection: Lifetimes, Scopes und die Captive-Dependency-Falle
Microsoft.Extensions.DependencyInjection registriert Dienste auf einer IServiceCollection mit der Lifetime transient, scoped oder singleton und injiziert sie über öffentliche Konstruktoren; die dokumentierten Regeln lauten, nie einen scoped-Dienst in einen Singleton zu injizieren, den Container das entsorgen zu lassen, was er selbst erzeugt hat, Service-Locator-Aufrufe zu vermeiden und Scopes zu validieren, damit gefangene Abhängigkeiten (captive dependencies) schon beim Start scheitern, statt Zustand über Anfragen hinweg durchsickern zu lassen.
-
Kommentare, die Informationen liefern, die der Code nicht liefern kann
Kommentare für das Warum, für Randbedingungen und für nicht offensichtliche Folgen schreiben; nicht wiederholen, was der Code bereits sagt. Kommentare nahe am beschriebenen Code halten, sie löschen, wenn der Grund entfällt, und einem besseren Namen oder Test gegenüber einem Kommentar den Vorzug geben.
-
Refactoring in kleinen, verifizierten Schritten
Refactoring ändert die Struktur, ohne das Verhalten zu ändern; dies in winzigen Schritten mit zwischen den Schritten grünen Tests zu tun und Refactoring-Commits von Verhaltensänderungen zu trennen, hält es sicher und überprüfbar.
-
Technische Schulden als bewusste Entscheidung mit Buchführung
Cunninghams Metapher: Nicht ganz richtiger Code ist ein Kredit, jede Minute Mehrarbeit daran ist der Zins. Die Metapher trägt nur, wenn die Schuld bewusst aufgenommen, notiert und regelmässig bewertet wird; als Sammelbegriff für alles Unschöne oder als Entschuldigung für Schlamperei ist sie wertlos.
-
Arbeitsweise eines KI-Agenten bei Änderungen an einer Codebasis
Lesen vor Schreiben, Reproduzieren vor Beheben, in kleinen, verifizierten Schritten ändern, die eigenen Prüfungen des Projekts ausführen, Schreibvorgänge nie blind wiederholen und exakt berichten, was getestet wurde; eine Methodik für Agenten, die Code bearbeiten.
-
TypeScript Narrowing: Unions, unknown und any
TypeScript verengt einen Union-Typ innerhalb eines Zweigs nach typeof-, instanceof-, in-, Gleichheits- und Wahrheitswert-Prüfungen oder einem benutzerdefinierten Type Predicate; diskriminierte Unions zusammen mit einer never-Prüfung ergeben Exhaustiveness. unknown akzeptiert jeden Wert, verbietet aber dessen Verwendung, bis er verengt wurde, während any die Prüfung ganz abschaltet.
-
Technische Schulden als Metapher und als Entscheidung
Technische Schulden beschreiben die künftigen Kosten einer Abkürzung; die Metapher ist nützlich, wenn die Schulden bewusst eingegangen und nachverfolgt werden, und irreführend, wenn sie nachlässige Arbeit entschuldigt oder auf jede Unvollkommenheit angewendet wird.
-
Bezeichner so benennen, dass sich Code wie Absicht liest
Namen wählen, die im Vokabular der Domäne sagen, was etwas ist oder tut, in einer zur Sichtbarkeit proportionalen Länge; Kodierungen, Abkürzungen und irreführende Typangaben vermeiden und umbenennen, sobald sich das Verständnis verbessert.
-
Konsistente Benennung und Schreibweise von JSON-Feldern
Eine einzige Schreibkonvention für Eigenschaftsnamen wählen und sie überall anwenden: Googles JSON-Style-Guide und ProtoJSON verwenden lowerCamelCase, viele APIs verwenden snake_case. Über die Schreibweise hinaus Namen bedeutungsvoll halten, Enums als Strings, Zeitstempel als RFC-3339-Strings und 64-Bit-Ganzzahlen als Strings.
-
Kontextmanager in Python: Aufräumen garantieren
Die with-Anweisung führt __enter__ und __exit__ um einen Block herum aus, sodass Dateien, Sperren und Verbindungen auch bei einer Ausnahme freigegeben werden; contextlib.contextmanager macht aus einem Generator einen Kontextmanager.
-
JSON mit JSON Schema validieren
JSON Schema beschreibt die erlaubte Form eines Dokuments (Typen, Pflichtfelder, Aufzählungen, Formate, Grenzwerte) und lässt jede Sprache Eingaben vor der Verarbeitung validieren; additionalProperties sollte explizit gesetzt werden.
-
Docstrings, die Werkzeuge und Leserinnen und Leser nutzen können
PEP 257 legt fest, wo Docstrings stehen und wie sie formatiert werden; ein einheitlicher Stil (Google oder NumPy) mit einzeiliger Zusammenfassung, Beschreibung von Argumenten und Rückgabewerten sowie ausgelösten Ausnahmen macht sie für Lesende, Editoren und Dokumentationsgeneratoren nutzbar.
-
Gleitkommazahlen: warum 0.1 + 0.2 nicht 0.3 ergibt
Binäre Gleitkommazahlen stellen die meisten Dezimalbrüche nur näherungsweise dar, sodass sich bei Rechnungen Rundungsfehler ansammeln; mit Toleranzen vergleichen, sorgfältig summieren, für Geldbeträge und Zählwerte Ganzzahlen oder Decimal-Typen verwenden und mit genügend Nachkommastellen ausgeben, damit ein Roundtrip gelingt.
-
Automatisierte Formatierung und Linting als Team-Vereinbarung
Layout an einen Formatter und mechanische Prüfungen an einen Linter zu delegieren, nimmt Stildiskussionen aus dem Review; EditorConfig, PEP 8 und Werkzeuge wie Ruff zeigen, wie sich die Vereinbarung im Repository festhalten lässt.
-
Feature-Skalierung und kategoriale Kodierung: was transformiert wird, und die Anpassung nur an Trainingsdaten
Distanz- und gradientenbasierte Modelle brauchen numerische Merkmale auf vergleichbaren Skalen (StandardScaler, MinMaxScaler, RobustScaler); kategoriale Spalten werden je nach Kardinalität und Modelltyp per One-Hot-, Ordinal- oder Target-Encoding zu Zahlen. Jeder Transformer wird auf dem Trainingssplit angepasst und unverändert auf Validierungs-, Test- und Produktionszeilen angewendet.
-
Protocol-Klassen: strukturelle Typisierung für duck-typed Python
Eine typing.Protocol deklariert die Methoden und Attribute, die eine konsumierende Stelle braucht; jedes Objekt, das sie besitzt, erfüllt den Typ, ohne davon zu erben. Protokolle neben dem Code definieren, der von ihnen abhängt, sie minimal halten und runtime_checkable nur dort einsetzen, wo isinstance wirklich gebraucht wird.
-
Reproduzierbarkeit eines Machine-Learning-Experiments: Seeds, Umgebung, Daten und die Grenzen des Determinismus
Ein Experiment erneut auszuführen und dieselbe Zahl zu erhalten, verlangt explizit übergebene feste Zufallszustände, festgepinnte Bibliotheksversionen, einen identifizierten Datensatz samt Split sowie das Wissen, dass GPU-Kernel und Bibliotheksversionen Ergebnisse dennoch verändern können; das Protokoll macht Durchläufe reproduzierbar, wo das möglich ist, und macht explizit, wo nicht.
-
Strukturierte Extraktion aus Dokumenten mit JSON Schema, Validierung und begrenzten Wiederholungsversuchen
Den Zieldatensatz als JSON Schema mit additionalProperties false definieren, das Modell genau um diese Form bitten, jede Antwort mit einem echten Validator prüfen, mit der Validierungsfehlermeldung im Prompt eine begrenzte Anzahl Male erneut versuchen und weiterhin Fehlschlagendes an eine Person weiterleiten statt zu raten.
-
NULL in SQL: dreiwertige Logik und ihre Fallstricke
NULL bedeutet unbekannt, daher ergeben Vergleiche mit NULL unbekannt statt wahr oder falsch; WHERE verwirft Zeilen mit dem Ergebnis unbekannt, NOT IN mit einem NULL findet nichts, und Aggregatfunktionen überspringen NULLs. IS NULL, IS DISTINCT FROM und COALESCE gezielt einsetzen.
Maschinenlesbar: JSON