Schlanke Codepfade
Beginnen Sie mit einem echten Vorgang. Was zeigt der Aufrufer an oder worauf handelt er? Verfolgen Sie dieses Bedürfnis durch die API, den Dienst, die Middleware, das ORM und das ausgeführte SQL. Eliminieren Sie unnötige Arbeit am frühestmöglichen Punkt auf dem betroffenen Pfad. Verwenden Sie unkomplizierten, kostengünstigen Code in der Routineentwicklung. Lokalisieren Sie den Engpass, bevor Sie eine komplexere Optimierung einführen.
Implementierungsregeln
- Verwenden Sie Daten wieder, die der Anfrage bereits zur Verfügung stehen. Bündeln Sie Abfragen, Schreibvorgänge und entfernte Aufrufe, wann immer der Vorgang dies unterstützt. Teilen Sie Batches an tatsächlichen Grenzen auf. Überprüfen Sie, was eine Bulk-API intern tut. Parallele Aufrufe pro Element verursachen weiterhin einen Roundtrip pro Element.
- Wählen Sie Datenstrukturen für das Zugriffsmuster. Durchsuchen Sie eine vorhandene Sammlung für eine einzelne Nachschlageoperation. Erstellen Sie einmal eine Schlüsselkarte für wiederholte Treffer. Verschieben Sie invariante Parsing- und Berechnungsoperationen aus Schleifen heraus. Eliminieren Sie auf heißen Pfaden wiederholte Sortierungen, große Kopien und ungenutzte Zwischensammlungen. Übergeben Sie vorhandene Werte innerhalb eines Prozesses, anstatt sie durch JSON zu schicken, um zwischen identischen Formaten zu konvertieren.
- Parsen und validieren Sie externe Eingaben dort, wo sie eintreten. Interne Funktionen können Werte verwenden, die der Eintrittspunkt bereits auf Vorhandensein, Typ oder Bereich überprüft hat. Bevor Sie einen defensiven Zweig hinzufügen, identifizieren Sie einen erreichbaren Input und den Fehler, den der Zweig verhindert. Fangen Sie einen Fehler dort, wo der Code sich erholen, nützlichen Kontext hinzufügen oder ihn in einen anderen Fehlervertrag übersetzen kann.
- Fügen Sie nach Möglichkeit die Eigentümerschaft in das Lese- oder Schreibprädikat ein. Übergeben Sie verifizierte Aufgabenidentität, Eigentümerschaft und Argumente durch vertrauenswürdige Module, Planer und Ausführer. Eine Übergabe, ein Callback oder eine Delegation innerhalb derselben Aufgabe erfordert an sich keine weitere Überprüfung oder Nachschlageoperation. Wenn eine neue Eingabe oder eine unabhängige Vertrauensgrenze betroffen ist, überprüfen Sie die Garantien, die der Empfänger nicht erben kann. Erzwingen Sie veränderliche Bedingungen wie Kontostand, vorherigen Zustand und Idempotenz atomar bei dem Schreibvorgang, der von ihnen abhängt.
- Verwenden Sie eine geeignete Framework-Standardeinstellung oder definieren Sie einmal eine feste Regel, wo sie hingehört. Fügen Sie eine Konfigurationseinstellung nur für einen echten Bereitstellungsunterschied, einen unabhängigen Abstimmungsbedarf oder eine explizite Benutzeranfrage hinzu. Verwenden Sie zuerst den vorhandenen Konfigurations- oder Secret-Speicher. Erstellen Sie eine Datei nur dann, wenn der vorhandene Mechanismus die Anforderung nicht erfüllen kann. Fügen Sie Funktionsschalter nur auf Anfrage hinzu.
- Bevorzugen Sie eindeutige Constraints, bedingte Schreibvorgänge, atomare Inkremente und kurze Transaktionen. Bevor Sie eine Anwendungssperre hinzufügen, identifizieren Sie die konkurrierenden Vorgänge, das falsche Ergebnis und warum vorhandene Mechanismen es nicht verhindern können. Sperren Sie die kleinste Ressource für das kürzeste Intervall. Überprüfen Sie jeden Schreiber und jedes späte Ergebnis, bevor Sie eine vorhandene Sperre entfernen.
- Bewahren Sie Zugriffsregeln, Reihenfolge, Paginierung, Semantik bei teilweisem Erfolg, Ausgabequalität und Wiederherstellung. Besprechen Sie wesentliche Änderungen des Verhaltens oder der Kosten mit dem Benutzer. Verwenden Sie die Middleware des Projekts, die Testeinstiegspunkte und die Akzeptanzkriterien wieder.
Lesen Sie die relevante Referenz
- Für SQL, ORM-Verhalten, Indizes, Bulk-Operationen, Transaktionen und Sperrung lesen Sie Datenbankzugriff und Transaktionen.
- Für API-Feldauswahl, Middleware, Caching, Warteschlangen, große Dateien oder Frontend-Laden lesen Sie den relevanten Abschnitt von Laufzeit und Middleware.
Verifizierung
- Testen Sie geänderte APIs über den tatsächlichen Anwendungseinstiegspunkt in einer autorisierten Testumgebung. Überprüfen Sie die Antwort, die betroffenen Aufrufer und den endgültigen Geschäftszustand. Wenn Sie Felder trimmen, überprüfen Sie die tatsächliche Nutzlast und, bei datenbankgestützten Pfaden, das ausgeführte SQL. Vergleichen Sie beim Batchen die Abfrageanzahl für eine kleine und eine vollständige Batch. Testen Sie den relevanten Wettlauf, doppelte Anfrage oder Wiederherstellungspfad, wenn Seiteneffekte betroffen sind. Verifizieren Sie Hintergrundjobs und lokale Berechnungen über ihre normalen Einstiegspunkte und überprüfen Sie ihre Ausgaben. Befolgen Sie die erforderlichen Projektprüfungen und CI.
- Der Benutzer ist für visuelle und manuelle Webakzeptanz verantwortlich. Übergeben Sie die Seite, Aktionen und erwarteten Ergebnisse und markieren Sie die Akzeptanz als ausstehend. Führen Sie für Frontend-Änderungen die relevanten Build-, Typ- oder Interaktionsprüfungen durch. Wenn der Benutzer Browsertests delegiert, decken Sie den angeforderten Umfang ab.
- Untermauern Sie Geschwindigkeitsbehauptungen mit Vorher-Nachher-Messungen in derselben Umgebung unter äquivalenten Daten und Parallelität. Notieren Sie Stichprobengröße und Cache-Zustand. Wählen Sie Metriken, die die untersuchten Kosten offenlegen, wie z. B. Tail-Latenz, Durchsatz, Abfrageanzahl, gescannte Zeilen, übertragene Bytes oder Spitzenspeicher. Unterscheiden Sie bei asynchroner Arbeit zwischen Akzeptanz, Warteschlangenverzögerung und Abschluss. Melden Sie einen einzelnen Durchlauf als einzelnen Durchlauf. Ohne vergleichbare Basislinie melden Sie nur, was gemessen wurde. Halten Sie die Verifizierung proportional zur Änderung.