[LINUX] Tigerwicklung, die keinen Unfall verursacht

"Hinzufügen (korrekter) Funktionen" "Keine Unfälle". Der schwierige Teil eines "Ingenieurs" ist, dass Sie "beides" tun müssen. Bist du bereit? Ich bin fertig. </ b>

Definition des Unfalls

Der hier beschriebene Unfall bezieht sich auf ein Ereignis, das die Nutzung des Dienstes durch den Benutzer behindert, und auf ein Ereignis, bei dem das Vertrauen des Dienstes verloren geht </ b>. Das Folgende sind Beispiele für mögliche Unfälle.

  • Infrastrukturfehler (Netzwerkfehler, Serverfehler) </ b>
  • DB-Fehler (Dateninkonsistenz, Deadlock) </ b>
  • Sicherheitsanfälligkeit (Informationsverlust, Injektion, Manipulation, unbefugter Zugriff) </ b>
  • Falsche Übertragung von Mail / SNS </ b>
  • Implementierungsfehler (doppelte Abrechnung, Serverfehler, Inoperabilität, unbeabsichtigtes Verhalten) </ b>

Die erste Voraussetzung, dass ein Unfall ausreicht, ist das Problem der Skala </ b>. Wenn Sie den Ausfall des von 10 Personen genutzten Dienstes mit dem Ausfall des von 1 Million Personen genutzten Dienstes vergleichen, ist letzterer eindeutig der schwerwiegendere Unfall. Als nächstes muss das Ausmaß des Unfalls berücksichtigt werden, ob es sich um einen Fehler handelt, der den gesamten Dienst betrifft, oder um einen Fehler, der nur eine kleine Anzahl von Benutzern betrifft. (Wenn der Maßstab zu klein ist, kann die Unfallursache beiseite gelegt werden und die Reaktion kann eine Einigung sein.) Zweitens hängt es von der Wichtigkeit der Informationen ab, die vom Dienst </ b> verarbeitet werden. Wenn es sich beispielsweise um einen Dienst handelt, der keine persönlichen Informationen verarbeitet, kann nichts gestohlen werden, sodass Sie nicht viel über Sicherheit nachdenken müssen (obwohl es heutzutage fast keine solchen Dienste gibt). Wenn es sich um ein Bankensystem handelt, müssen Sie natürlich alle Netzwerkzugriffsprotokolle führen. Es gibt und es ist notwendig, Manipulationen und unbefugten Zugriff zu verhindern.

Menschen sind Kreaturen, die Fehler machen. Solange Sie dies manuell tun, werden Sie eines Tages denselben Fehler machen, oder eine andere Person wird denselben Fehler machen. In beiden Fällen wäre es besser, wenn die Prüfung sowohl automatisiert </ b> als auch manuell erfolgen könnte. Als ein Faktor, der einen Unfall verursacht, gibt es viele Fälle, die außerhalb des Bereichs der Annahme des Implementierers </ b> liegen. Wenn Sie also ein großes System betreiben, teilen Sie Informationen zwischen Mitgliedern. Es ist wichtig, die Schlüsselwortsuche und -vorstellung </ b> zu verwenden, um herauszufinden, wo </ b> und Korrekturen Sie beeinflussen. (Wenn beispielsweise eine Änderung nicht nur das Hauptsystem, sondern auch Subsysteme außerhalb des Verantwortungsbereichs ändert) Es ist wichtig, einen Überwachungs- und Benachrichtigungsmechanismus zu erstellen und Fehlermeldungen </ b> zu lesen. Beim Erstellen eines Systems mit Cloud-Diensten wie AWS und GCP wird empfohlen, Datadog zu verwenden.

Insbesondere die Sprach- und Ausführungsplattform kann alles sein, aber ich schreibe unter der Annahme eines allgemeinen Webdienstes, der mit der PaaS-Cloud erstellt wurde.

Infrastrukturausfall

Unfälle treten wahrscheinlich hauptsächlich aufgrund falscher Einstellungen im Netzwerk und Authentifizierung / Autorisierung </ b> und unzureichender Serverressourcen </ b> auf. Es wird in diejenigen eingeteilt, die einmal überprüft werden müssen, und diejenigen, die jedes Mal aufgrund von Funktionsänderungen überprüft werden müssen, und diejenigen, die eine ständige Überwachung erfordern.

Falsche Einstellungen für private Netzwerke

Beim Aufbau eines virtuellen privaten Netzwerks für den Zugriff zwischen Servern mithilfe von VPC (Virtual Private Cloud) unter AWS usw. Ein Unfall, der die Kommunikation zwischen Servern verhindert, die zuvor kommunizieren konnten. Überprüfen Sie als Gegenmaßnahme die Kommunikation zwischen den einzelnen Servern im festgelegten Netzwerk und vom Server zum Internet. Einmal bestätigt, kann dies nur beim Wiederaufbau des Netzwerks geschehen.

Falsche DNS-Eintragseinstellungen

Ein Unfall, der auftritt, wenn Sie beim Festlegen des CNAME-Eintrags, eines Eintrags, eines TXT-Eintrags usw. einen Fehler machen, wenn der DNS-Eintrag in einem Dienst wie Route53 von AWS festgelegt ist. Ein Unfall tritt auf, wenn Sie beim Ändern der Domäne vergessen haben, die Kommunikation einzustellen oder zu bestätigen. Einmal bestätigt, kann dies nur passieren, wenn Domänen oder Datensätze geändert werden.

SSL-Zertifikat abgelaufen

Einige Jahre nach Ablauf des SSL-Zertifikats wurde die https-Kommunikation plötzlich unmöglich und es wurde eine Browser-Warnung ausgegeben. Es ist erforderlich, Maßnahmen zu ergreifen, z. B. die automatische Erneuerung des SSL-Zertifikats festzulegen oder vor dem Ablaufdatum zu benachrichtigen.

Falsche Authentifizierungs- / Autorisierungseinstellungen

Ein Unfall, der auftritt, wenn die Zugriffsberechtigung für einen Cloud-Dienst beim Hinzufügen oder Ändern von Cloud-bezogenen Funktionen fälschlicherweise geändert wird. Wenn Sie beispielsweise AWS IAM verwenden, geschieht dies, wenn die S3-Zugriffsberechtigung nur Leseberechtigung und Schreibberechtigung ist. Führen Sie es als Gegenmaßnahme tatsächlich mit dem Programm oder der festgelegten Benutzerberechtigung aus und prüfen Sie, ob darauf zugegriffen oder geschrieben werden kann.

Falsche Cache-Einstellung (CDN-Einstellung)

Sie können einen Cache für einen bestimmten URL-Pfad in einer CDN-Einstellung wie CloudFront haben. Durch einen Cache ist es möglich, ab dem zweiten Mal eine Antwort mit hoher Geschwindigkeit zurückzugeben. Wenn die Einstellung des Whitelist-Parameters nicht erfolgt, tritt ein Unfall auf, bei dem der Parameter nicht an ALB oder den Server übergeben wird. Beachten Sie beim Erstellen eines API-Caches, dass Sie beim Hinzufügen eines Implementierungsparameters diesen auch zur Whitelist hinzufügen müssen. </ b>

Serverausfall

Der Server, auf den hier Bezug genommen wird, umfasst einen API-Server, einen DB-Server und dergleichen. Beide erfordern eine ständige Überwachung. Im Prinzip erstellen Sie keinen einzelnen Fehlerpunkt </ b>. (Wenn beispielsweise nur ein Server vorhanden ist und der Server gelöscht wird, wird das gesamte System gestoppt.) Die folgenden Serverressourcen sind ein Problem

  • Verzögerung aufgrund unzureichender CPU-Leistung des Servers </ b>
  • Unzureichender Serverspeicher </ b>
  • Unzureichende Serverfestplatte </ b>

Insbesondere gibt es die folgenden Maßnahmen

Erhöhen Sie die CPU-Spezifikationen

Wenn die CPU aufgrund einer Verarbeitung mit hoher Last, wie z. B. einer Endlosschleife, weiterhin bei 100% bleibt, kann keine andere Verarbeitung durchgeführt werden und die Leistung sinkt. Es ist erforderlich, die CPU-Auslastungsrate und die API-Antwortzeit zu überwachen. Wenn die CPU-Ressourcen nicht ausreichen, korrigieren Sie die unter Last stehende Verarbeitung oder erhöhen Sie die CPU-Spezifikationen. Beachten Sie außerdem, dass t2-Instanzen von AWS und Dyno von Heroku eine Obergrenze für CPU-Ressourcen haben und der Server angehalten wird, wenn der Vorgang die Obergrenze überschreitet. Sie müssen CPU Boost oder Charge verwenden.

Swap Space erstellen

Durch Erstellen eines Auslagerungsbereichs können Sie den Festplattenbereich vorübergehend verwenden, wenn Ihnen der Speicher ausgeht. Da der Swap-Bereich ein Festplattenbereich ist, tritt eine E / A-Verarbeitung auf und die Leistung sinkt, aber der Speicherbereich ist beschädigt und der Server stoppt im schlimmsten Fall nicht. (Ich möchte den Speicher vergrößern, bevor ich den Swap-Bereich verbrauche ...) Wenn der Speicher beschädigt ist, können Sie die Datei nicht mit einem Editor wie vim öffnen. Starten Sie den Server neu oder öffnen Sie die Datei mit weniger und bearbeiten Sie sie. (Weniger war die leichteste Erfahrung in der Vergangenheit)

Protokollrotation festlegen, Upload-Dateien werden nicht auf dem API-Server gespeichert

Wenn Sie mit der Protokolldatei nichts anfangen, wird sie die Serverfestplatte belegen und schließlich die Festplatte beschädigen. Alte Protokolldateien können regelmäßig mit dem Befehl logrotate gelöscht werden. (Dies verhindert Einstiche in der Protokolldatei.) Wenn der Dienst das Hochladen von Dateien übernimmt, laden Sie ihn auf einen Dateispeicherdienst wie S3 hoch, anstatt ihn direkt auf den Server hochzuladen.

Hinterlassen Sie ein Backup

Wenn Sie AWS EC2 verwenden, können Sie die gesamte EC2-Instanz auf dem AWS-Einstellungsbildschirm sichern. Wenn es ein Problem gibt, das nicht sofort behoben werden kann, rollen Sie es hauptsächlich zusammen mit der DB-Sicherung zurück.

Nehmen Sie Überwachungseinstellungen vor

In Bezug auf CPU, Speicher, Festplatte, keine Reaktion auf die Integritätsprüfung für einen bestimmten Zeitraum usw. Es ist möglich, Benachrichtigungen (E-Mail, Slack) zu überspringen, wenn der Schwellenwert mit Datadog überschritten wird.

Redundanz, Autoskala

Wenn Sie mehrere Server konfigurieren und über einen Load Balancer darauf zugreifen, können Sie diesen auch dann mit einem anderen Server abdecken, wenn einer ausfällt, sodass Sie das System nicht stoppen müssen. (Der Server wird lebend durch die Integritätsprüfung des Load Balancers überwacht.) Wenn die Last zunimmt, erhöhen Sie die Anzahl der Server und die automatische Skalierung. Wenn es auf einem serverlos verwalteten Dienst wie AWS Lambda oder Firebase Functions ausgeführt wird, wird es automatisch skaliert und Sie müssen nur Speicher einrichten. Wenn Sie einen Server mit einem Docker-Container erstellen, können Sie den Docker-Container auch mit AWS Fargate automatisch skalieren.

Überprüfen Sie die Cloud selbst auf Fehler

In seltenen Fällen kann der Cloud-Dienst selbst ausfallen. AWS:AWS Service Health Dashboard GitHub:GitHub Status Wenn es langfristig nicht wiederhergestellt wird, sind die Auswirkungen auf das Geschäft sehr groß. Gegenmaßnahmen umfassen die vorübergehende Verteilung der Regionen und deren Redundanz.

Gegenmaßnahmen gegen Implementierungsfehler

Dies ist die häufigste Unfallursache. Dies tritt häufig auf, weil der Implementierer die Systemspezifikationen, Sprachspezifikationen und Bibliotheken </ b> schlecht versteht. Wenn technische Schulden angehäuft werden und Konstruktionsfehler, Lesbarkeit, Einheitlichkeit und Durchsuchbarkeit des Codes verloren gehen, ist es wahrscheinlicher, dass Unfälle auftreten. Was Sie in der Codeüberprüfung sehen sollten, ist in Codeüberprüfung Tiger Volume zusammengefasst.

Sicherheitsunfall

Ein Unfall, der das Vertrauen des Benutzersystems schädigt. Dies führt auch zum Verlust persönlicher Daten und zum schlimmsten finanziellen Schaden. Wenn es sich um http handelt, wird es natürlich abgehört (oder besser gesagt, der Browser gibt eine Warnung aus), sodass eine https-Kommunikation durchgeführt wird. Achten Sie besonders auf den Bereich um die Formulareingabe, den der Benutzer relativ frei eingeben kann, da es sich in der Regel um eine Sicherheitslücke handelt.

--XSS: Senden Sie eine Form eines böswilligen JS-Skripts, das ein böswilliger Benutzer im Browser ausführen und in der Datenbank speichern kann. Wenn ein anderer Benutzer die in der Datenbank gespeicherten Daten durchsucht, wird ein schädliches JS-Skript ausgeführt und Informationen wie das im Browser gespeicherte Anmeldetoken werden an den böswilligen Benutzer gesendet. Als Gegenmaßnahme wird es zum Zeitpunkt der Eingabe codiert und auf der Front-End-Seite nicht als Ausführungscode angezeigt. Wenn Sie ein Framework wie React verwenden, wird es automatisch entgiftet. (Ausgenommen gefährlich setinnerhtml) --SQL-Injection: Ein Vorgang, bei dem ein böswilliger Benutzer eine SQL-Anweisung sendet, um DB-Informationen zu stehlen oder zu manipulieren. Anstatt den Benutzereingabeinhalt direkt in die Abfrage einzubetten, gibt es eine Methode, ihn nicht auszuführen, wenn bei der Abfrage ein Problem auftritt, indem die Platzhalterfunktion verwendet wird.

  • Sitzungsentführung: Stehlen oder Erraten des Anmeldetokens eines anderen Benutzers und Ermöglichen, dass Sie sich als anderer Benutzer anmelden. In diesem Fall können Sie sich als ein anderer Benutzer ausgeben und Informationen abrufen. Implementieren Sie das Anmeldetoken nicht, ohne es zu manipulieren oder zu verlieren, oder wechseln Sie Sitzungen mit leicht zu erratenden Informationen wie id = 1, ohne das Anmeldetoken für jeden Benutzer auszugeben. Verwenden Sie Unveränderliches Json-Web-Token als Anmeldetoken. --CSRF: Wenn der API-Server CORF zulässt, können Sie ein Formular von einer externen Site senden. Daher kann es als Mittel zum Stehlen von Benutzerinformationen verwendet werden, indem eine Anfrage an die reale Serverseite an einem Angelplatz gestellt wird. Insbesondere wird jedes Mal, wenn das Formular angezeigt wird, ein einmaliges Token in das Formular eingebettet, das wichtige Informationen wie Anmeldeinformationen sendet, und es wird bestätigt, ob das Formular ein legitimes Formular ist. --DoS-Angriff: Ein Angriff, der versucht, einen Server mit bedeutungslosem Massenzugriff herunterzufahren. Es gibt Maßnahmen wie das vorübergehende Sperren der IP mit der Firewall-Funktion. Verwenden Sie für AWS WAF usw.

Es gibt viele andere Dinge, aber das Passwort wird roh gehasht, ohne es in der Datenbank zu speichern. Es ist wichtig, APIs, für die eine Authentifizierung erforderlich ist, von APIs zu trennen, für die keine Authentifizierung erforderlich ist.

Unfälle rund um das Routing

Tritt auf, wenn beim Hinzufügen von Pfaden andere Pfade zwischengespeichert oder überschrieben werden

Überschreiben Sie andere Routen, wenn Sie eine Route hinzufügen

Wenn beispielsweise ein API-Pfad hinzugefügt wird, wird das vorhandene Routing überschrieben und auf die Ziel-API kann nicht zugegriffen werden. (Im Fall von SPA gibt es einen Unfall, bei dem die Zielseite nicht angezeigt werden kann, indem die Route des Pseudo-Routings wie React Router überschrieben wird.)

POST /api/hoge
POST /api/hoge/:id //← Hinzufügen
POST /api/hoge/:key //← Obwohl die URL-Parameter unterschiedlich sind, hat die oben genannte API hinsichtlich des Pfads Priorität und kann nicht erreicht werden.

Beim Hinzufügen ist es wichtig zu überprüfen, ob der Zugriff auf andere Pfade überschrieben wird, die Reihenfolge zu ändern oder zu einem anderen Pfad zu wechseln. Insbesondere ist es möglich, rekursive Tests mit CI durchzuführen, indem ein API-Aufruf-Test erstellt wird. Da es sich um einen Aufruftest für einen bestimmten Pfad handelt, kann die erwartete aufzurufende Funktion verspottet werden.

Löschen Sie alte APIs und Seitenpfade, obwohl ein Cache vorhanden ist

Wenn Sie die alte API oder Seiten-URL löschen, bleibt der Browser-Cache erhalten und es wird auf die alte API oder Seiten-URL zugegriffen, was ein Problem darstellt. Insbesondere im Fall von SPA bleibt die alte Datei bundle.js so lange bestehen, bis der CDN-Cache und der Browser-Cache verschwinden und der Browser neu geladen wird. Daher muss der CDN-Cache gelöscht und die alte API auf die neue API umgeleitet werden. Außerdem haben Google Bot usw. einen Cache des alten Pfades, sodass der Zugriff auf den alten Pfad erfolgt. Wenn Sie den Cache verwenden, müssen Sie auf die neue Seite umleiten, da diese auf die alte API und Seite zugreift.

Unfälle durch externe API

Wenn Sie die API eines externen Dienstes aufrufen, müssen Sie die Spezifikationen der externen API überprüfen.

Verarbeitung zum Zeitpunkt des Fehlers

Es neigt dazu, übersehen zu werden. Sie müssen steuern, auch wenn Sie nicht wissen, welche Art von Fehler zurückgegeben wird, selbst wenn Sie sich die API-Spezifikationen ansehen oder wenn ein Kommunikationsfehler vorliegt. Sie müssen auch entscheiden, ob Sie eine spätere Verarbeitung durchführen möchten, wenn ein Fehler auftritt.

API-Anforderungslimit

Dies wird auch häufig übersehen, wenn Sie sich die API-Spezifikationen nicht ansehen und wenn es lokal ist, gibt es kein Problem mit einer kleinen Anzahl von Anforderungen. Wenn Sie es jedoch in der Produktionsumgebung bereitstellen, können Sie eine große Anzahl von Anforderungen stellen und ein Fehler auftreten. In vielen Fällen kann die Obergrenze durch Abrechnung angehoben werden. Wenn es jedoch eine alternative Methode gibt, ist sie auf Fälle beschränkt, in denen sie nicht verwendet wird oder die Kosten bezahlt werden können. Wenn die Obergrenze nicht angehoben werden kann, gibt es eine Methode zum Einreihen (Batch), damit die Obergrenze der Anzahl der API-Anforderungen nicht überschritten wird, oder zum Zurückgeben als Fehler (Warten auf den Benutzer), wenn Echtzeitleistung erforderlich ist.

API-Aufrufkontositzung abgelaufen, Sitzungslimit

Bei statusbehafteten APIs, die nicht zustandslos sind (Rest-API), möchten Sie möglicherweise Sitzungen mit Ihrem Benutzerkonto beibehalten. Wenn die Sitzung abläuft, müssen Sie sich erneut anmelden, sodass Sie Maßnahmen zur erneuten Anmeldung ergreifen müssen. APIs mit Sitzungen für externe Dienste müssen das Sitzungslimit usw. nicht überschreiten.

Speicherleck

Sprachen ohne GC (Garbage Collection) (C, C ++ usw.) werden natürlich verwendet, wenn der dynamische Speicher gesichert ist, und der Speicherbereich wird belegt, sofern der Speicher nicht explizit freigegeben wird. Selbst in einer Sprache mit GC (JavaScript usw.) wird die Instanz mit neuem Speicher belegt Wenn ein Zirkelverweis ausgeführt wird, wird der Speicher auch von GC nicht freigegeben und es tritt ein Speicherverlust auf. Es gibt eine Methode zum Erkennen des Speicherverlusts und zum Verwenden einer schwachen Referenz (WeakRef) oder eines intelligenten Zeigers bei zirkulärer Referenzierung. Erstens ist es auch eine gute Idee, nicht so viel Neues wie möglich zu verwenden und es nicht zu einem Zirkelverweis zu machen.

Übrigens, im Fall von JavaScript existiert WeakRef in der Vorschlagsphase NodeJS Memory Leak Detection-Methode ist hilfreich.

Unfall wegen schlechter Leistung

Achten Sie auf die Leistung von Tabellen mit einer großen Anzahl von Datensätzen. Die Backend-Verarbeitung verlangsamt die Antwortzeiten und hängt das System auf, wenn die Leistung beeinträchtigt wird. Zum Lesen wird ein Index an die Felder angehängt, die häufig für die Suche in der Tabelle verwendet werden, und für das Massenschreiben im Migrationsskript und in der Stapelverarbeitung ist eine Massenverarbeitung erforderlich, und es sind Maßnahmen zum Schreiben in kurzer Zeit erforderlich. Danach kann die vorläufige Lastverteilung erfolgen, indem der Server für die Anzahl der CPU-Kerne in einem Multiprozess (Cluster) gestartet wird. Geben Sie einen Framegraph aus, um systemweite Leistungsengpässe zu ermitteln.

Zum Beispiel verfügt NodeJS über eine gut organisierte Forschungsmethode in Node.js Leistungsoptimierung ab 0.

Dateninkonsistenzunfall

Wenn Sie bei der Implementierung eines Datenmigrationsskripts einen Fehler machen, z. B. das Einfügen von Daten oder ein Fehler in der Mitte, der zu Dateninkonsistenzen führt, implementieren Sie ihn in einer Transaktion und setzen Sie ihn zurück, wenn ein Problem auftritt. Sichern Sie außerdem die Daten vor der Ausführung, falls nach der Ausführung ein Problem auftritt. Darüber hinaus werden wichtige Prozesse, die das Schreiben in mehrere Tabellen erfordern, wie z. B. die Abrechnung, gehandelt, um Inkonsistenzen zu vermeiden.

API-Migrationsunfall

Wenn Sie auf die API des Subsystems vom Hauptsystem aus verweisen und die API des Subsystems aktualisieren müssen, um andere Daten zurückzugeben Grundsätzlich ist es nicht möglich, das Subsystem und das Hauptsystem genau zur gleichen Zeit freizugeben, daher müssen Schritte unternommen werden.

  1. Implementieren Sie die neue API des Subsystems und löschen Sie die alte API noch nicht. Geben Sie das Subsystem frei.
  2. Implementieren Sie die Verarbeitung des neuen API-Aufrufs des Subsystems im Hauptsystem und löschen Sie die alte API. Das Hauptsystem wurde freigegeben.
  3. Löschen Sie die alte API des Subsystems. Geben Sie das Subsystem frei.

Unfälle, bei denen Änderungen Subsysteme betreffen

Überlegen Sie, ob sich die Änderungen nicht nur auf das Hauptsystem, sondern auch auf die Subsysteme auswirken. Dieser Bereich ist streng, wenn das gesamte System nicht bekannt ist und es keine andere Wahl gibt, als es von Experten zu implementieren und zu überprüfen. Es ist ein System für den regelmäßigen Informationsaustausch erforderlich. Dies ist besonders wahrscheinlich, wenn DB-Tabellenfelder geändert oder gelöscht werden. Ein Unfall kann auftreten, wenn BI-Tools wie Redash abgefragt oder Daten automatisch mit einem anderen System wie Salesforce synchronisiert werden.

Exklusiver Kontrollunfall

DB-Transaktionen, exklusive Multithread-Steuerung usw. blockieren die Verarbeitung. Wenn Sie also vergessen, sie abzubrechen, bleibt das System hängen. (Sackgasse) Zum Beispiel gibt es eine Maßnahme wie das Umschließen mit Try-Syntax zu Beginn der Transaktion und das Entsperren mit der finally-Anweisung.

Unfälle im Zusammenhang mit Aktualisierungen der Bibliotheksversion (OSS)

Dies geschieht, wenn eine Bibliothek eines Drittanbieters mit einem Paketmanager-Tool wie npm oder gem verwaltet wird Sie können die Bibliothek nur verwenden, wenn ein Vorteil vorliegt, der die Wartung übersteigt, da die Bibliothek mit zu hohen Spezifikationen Speicherplatz belegt (insbesondere wenn der Benutzer die Anwendung oder die JS-Datei herunterlädt) und ein Upgrade der Bibliothek obligatorisch ist. Implementieren Sie zunächst mit Sprachspezifikationen und Standard-APIs, ohne unnötige Bibliotheken einzuschließen. Die Version der Bibliothek wird repariert, ohne sie wahllos anzuheben, bis der Vorgang bestätigt wird (Hauptversion, Nebenversion, Patch-Version). Außerdem werden Dateien, die detaillierte Abhängigkeiten wie package-json.lock und yarn.lock verwalten, als die Version der Bibliothek aufgeführt, von der die Bibliothek eines Drittanbieters abhängt. Löschen Sie sie daher nicht wahllos. Dies liegt daran, dass beim Löschen dieser Dateien die Version der Bibliothek, von der die Bibliothek eines Drittanbieters abhängt, beim erneuten Installieren abgerufen wird, was (einmal) zu einem Unfall führen kann.

Technische Schulden

Es kann keine direkte Ursache des Unfalls sein, aber es kann ein Faktor sein, der einen Unfall verursacht, wenn er vernachlässigt wird.

Implementieren Sie in einer getippten Sprache

Insbesondere sollte das Backend in einer typisierten Sprache implementiert werden (NodeJS + TypeScript, go, Java). Der Grund ist, dass statische Kompilierung unachtsame Fehler verhindern kann.

  • Die Typprüfung verhindert, dass unbeabsichtigte Typparameter an Argumente übergeben werden
  • Die Typprüfung verhindert, dass vergessen wird, Parameter an Argumente zu übergeben ――Mit einem Typ können Sie leicht feststellen, ob es sich um primitive Daten oder um einen Klassen- oder Objekttyp handelt.
  • Die Typprüfung zeigt an, ob es sich um ein optionales Argument handelt oder nicht (im Fall von TypeScript).
  • Verstehen Sie den Rückgabetyp

Für die Implementierung in TypeScript ist Code für TypeScript bereinigen hilfreich.

Design

Denken Sie an KISS </ b> (einfaches Design und Implementierung). Ändern Sie bei der Verwendung von Klassen die Spezifikationen, indem Sie auf SOLID Principles und Demeter's Law achten. Es ist auch stark und leicht zu testen. (Trennung von Abhängigkeit und Interesse)

  • Geben Sie ein Standardargument an, um die Ausfallsicherheit zu gewährleisten. Wenn Sie jedoch eine leere Funktion als Standardargument angeben, senden Sie ein Fehlerprotokoll, ohne Fehler zu quetschen, und benachrichtigen Sie sie, damit sie sofort gefunden werden können.
  • Direkte Änderungen und Löschungen von DB-Tabellenfeldern verursachen einen Unfall. Fügen Sie daher ein weiteres Feld hinzu und migrieren Sie die Verarbeitung und Daten, bevor Sie das ursprüngliche Feld löschen.
  • Eine ähnliche Verarbeitung ist für Funktionen gemäß DRY üblich. Dienstprogramme mit wenigen Änderungen können standardisiert werden, aber eine übermäßige Standardisierung erweitert den Einflussbereich unnötig ... Verstehen Sie das DRY-Prinzip falsch?
  • Achten Sie beim Ändern von Funktionen und Tabellenfeldern, die häufig aufgerufen werden, auf den Einflussbereich. Erfassen Sie mit Abhängigkeitsdiagramm mit Tool ausgeben usw.
  • Es ist wünschenswert, die Geschäftslogik mit einer Schnittstelle und einer Zusammenfassung zu abstrahieren, da es einfacher ist, auf Spezifikationsänderungen zu reagieren. Die Implementierung wird delegiert, aber die Arten von Argumenten und Rückgaben sind garantiert.

Lesbarkeit, einfache Suche

Vereinheitlichen Sie Namens- und Codierungsregeln. Es ist gut, wenn das Projekt klein ist, aber wenn das Projekt groß ist, wird die Arbeitseffizienz offensichtlich verringert, wenn die Datei nicht sofort durchsucht werden kann. Vereinigen Sie den Kamelkoffer, den Schlangenkoffer usw. zu einem (nicht mischen!). Überraschenderweise ist es wichtig, Tippfehler zu vermeiden, nicht denselben Variablennamen oder Funktionsnamen zu verwenden, obwohl er in einem anderen Sinne verwendet wird, und Notationsschwankungen zu beseitigen. Dies ist auf die Vermeidung von Auslassungen und Missverständnissen zurückzuführen. (Vereinheitlichen Sie das Domänenmodell) Sie können die Fuzzy-Suche wie fzf verwenden, um nach vorhandenen Tippfehlern im Projekt zu suchen. Die Anzahl der Fehler nimmt proportional zur Menge des Codes zu. Denken Sie also immer an YAGNI </ b> (nicht unnötig implementieren, nicht verlassen).

  • Fügen Sie Flusen ein, um die Codierungsregeln zu vereinheitlichen --Geben Sie entsprechende Kommentare ein (hauptsächlich Erläuterungen zu Funktions- und Geschäftslogikspezifikationen) und schreiben Sie so präzise wie möglich
  • Vereinheitlichen Sie die Namensregeln für Dateinamen, Variablennamen und Funktionsnamen und geben Sie leicht verständliche Namen an (keine Tippfehler)
  • Vertiefen Sie keine Funktionsaufrufe (Aufrufstapel), da dies das Befolgen des Codes erschwert --Nesting ist nicht tief (vorzeitige Rückkehr der bedingten Verzweigung, asynchrone Rückrufverarbeitung warten)
  • Keine doppelten Mittelwerte für Variablen und DB-Tabellenfelder
  • Priorisierung der Synthese vor Vererbung (Vererbung verringert das Risiko, unnötige Variablen und Methoden zu erben, und verringert die Lesbarkeit und Wartbarkeit), Vererbung Es besteht keine Notwendigkeit, sich selbst zu verbieten, aber ich denke, die Grenze liegt in der Vererbung von Kindern

PR-Regeln

PR-Regeln zur Vermeidung von Unfällen haben nicht mehrere PR-Rollen (Einzelverantwortung) Da die Anzahl der Fehler proportional zur Codemenge zunimmt, sollte die Korrekturmenge reduziert werden. Insbesondere ist es gefährlich, viele Korrekturen über Quelldateien hinweg oder stark abhängige Korrekturen vorzunehmen. Mischen Sie daher die Korrekturen nicht so weit wie möglich. Checkliste für Elemente, die Arbeiten nach der Veröffentlichung und wichtige Korrekturen erfordern.

Prüfung

Schreiben Sie einen Test </ b>, der zu einem Asset wird, und führen Sie einen rekursiven Test </ b> mit CI durch.

--Schreiben Sie einen Komponententest für normales System, Grenzwert und abnormales System

  • Schreiben Sie keine doppelten Tests
  • Führen Sie so viele parallele Tests wie möglich durch ――Da es schwieriger zu reproduzieren ist, je komplizierter die Bedingungen sind, machen Sie es zu einer Struktur, die durch einen Komponententest abgedeckt werden kann und ein Komponententest sein kann
  • Schreiben Sie keine unterschiedlichen Testarten wie Komponententests und API-Tests in dieselbe Datei (trennen Sie sie in Ordner). ――E2E-Test ist fragil, aber sehr umfassend. Verwenden Sie ihn daher genau für die Kernfunktionen von Diensten usw.
  • Der visuelle Regressionstest eignet sich für den Anzeigedifferenztest (er kann dem Versions-Upgrade der UI-Bibliothek folgen).