[PYTHON] 33 Auswahlen, die der Soshage-Ingenieur bei der Überprüfung von Codes hervorhebt [jederzeit hinzugefügt]

Codeüberprüfung für Frieden an Samstagen und Sonntagen

Social Games sind aufgrund der Konzentration des Benutzerzugriffs und der damit einhergehenden Zunahme der Benutzerdaten in der Regel dramatisch überlastet (hauptsächlich samstags und sonntags).

Abhängig von dem von Ihnen erstellten Szenario wird der problematische Code möglicherweise auch bei Lasttests nicht gefunden. Ich denke, Codeüberprüfungen sind auch wichtig, um solche unsichtbaren Ängste zu zerstreuen.

[Atemberaubender Punkt] ・ Befreien Sie die Zeitbombe von der Explosion an Samstagen und Sonntagen, indem Sie auf die Quelle schauen ・ Wenn Mitglieder durch das Teilen von Fähigkeiten aufsteigen, verringert sich die Wahrscheinlichkeit, zeitgesteuerte Bomben zu installieren, die samstags und sonntags explodieren

Gut zusammenzufassen Das ist alles (4 Jahre alter Sohn reden)

Jetzt, da wir ein leistungsstarkes Überprüfungstool namens git pull request haben, ist der Schwellenwert viel niedriger, daher empfehle ich ihn!

5 Punkte zu überprüfen

Wenn ich eine Codeüberprüfung durchführe, höre ich oft Leute sagen * "Ich weiß nicht, was ich überprüfen soll" *, deshalb habe ich die Punkte zusammengefasst, die ich bei der Überprüfung beachte.

Die folgenden 5 Punkte sollten vorrangig geprüft werden.

  1. Verlangsamt sich die Ausführungsgeschwindigkeit?
  2. Gibt es ein Problem mit der Datenintegrität?
  3. Gibt es ein Problem während des Betriebs?
  4. Verringert sich die Wartbarkeit?
  5. Ist es in Ordnung für nicht autorisierten Zugriff?

Überprüfen Sie die Details

Im Folgenden sind die Details aufgeführt, die für jede Kategorie überprüft werden müssen. Klicken Sie hier für die vorausgesetzte Umgebung.

Die Wichtigkeit der Prüfung wird übrigens durch Piktogramme ausgedrückt. : rage :: Absolut richtig : schreien :: Lass es reparieren, es sei denn du hast einen guten Grund : confounded :: Durch, wenn es einen guten Grund gibt

MySQL Edition

Die Hauptprüfung lautet ** "Ist der Index ordnungsgemäß an die Ausführungs-SQL angehängt?" **. Ich habe den Eindruck, dass viele Leute es ignorieren, wahrscheinlich weil die Verbreitung von ORM es schwierig gemacht hat, SQL zu sehen. Da dies einen großen Einfluss auf die Ausführungsgeschwindigkeit hat, konzentrieren wir uns auf die Überprüfung.

Referenz: Wichtige Punkte bei der Erklärung

*: rage: ** Wird ein Index für die Ausführung von SQL verwendet? ** ** ** Das Abrufen von Daten ohne Index verlangsamt sich mit der Datenmenge erheblich. *: rage: ** Wenn ein zusammengesetzter Index verwendet wird, wo werden alle Spalten verwendet? ** ** ** Wenn nur einige Spalten indiziert sind, verlangsamt sich dies mit der Datenmenge. Erklären und prüfen Sie bei komplexem SQL, ob key_len geeignet ist. *: rage: ** Ist bei Tabellen, bei denen Integrität wichtig ist, ein eindeutiger Schlüssel angebracht? ** ** ** Verhindert, dass Daten aufgrund von Codefehlern inkonsistent werden. *: rage: ** Wenn Sie select for update verwenden, ziehen Sie Lückenschlösser in Betracht? ** ** ** Wenn Sie für die Aktualisierung nicht vorhandener Daten auswählen, kann ein Deadlock aufgrund einer Lückensperre auftreten. *: schreien: ** Ist die Reihenfolge nach Spalte auch indiziert? ** ** ** Wenn die zu sortierende Spalte nicht indiziert ist, tritt eine Dateisortierung auf, die langsam ist. *: schreien: ** Sind nicht verwendete Spalten indiziert? (Gibt es unnötige Indizes?) ** Wenn viele unnötige Indizes vorhanden sind, dauert es einige Zeit, bis der Index zum Zeitpunkt des Einfügens neu generiert wird. *: verwirrt: ** Indizieren Sie Spalten mit geringer Kardinalität? ** ** ** Spalten mit geringer Kardinalität (viele doppelte Daten) sind aufgrund der schlechten Indexeffizienz langsam. *: confounded: ** Geht der Deckungsindex verloren, weil Sie unnötige Spalten erhalten? ** ** ** Da MySQL ein Cluster-Index ist, ist es schneller, wenn die Auswahlspalte vom Index abgedeckt wird. *: verwirrt: ** Ist die erwartete Anzahl von Datensätzen in der Tabelle zu groß? ** ** ** Wenn die Anzahl der Daten groß ist, sind die Erfassungsgeschwindigkeit und die Ausführungsgeschwindigkeit von ALTER TABLE langsam. Werden Maßnahmen wie Partitionierung und Sharding ergriffen? bestätigen.

Redis Ausgabe

Die Hauptsache, die überprüft werden muss, ist ** "Gültigkeit der verwendeten Speichergröße" **. Wenn der verwendete Speicher maxmemory überschreitet, besteht die Sorge, dass ein Fehler auftritt (aufgrund der Einstellung für die maxmemory-Richtlinie) oder dass die HIT-Rate aufgrund von Vibrationen abfällt.

*: rage: ** Ist expire (TTL) eingestellt? ** ** ** Wenn expire nicht festgelegt ist, wächst der Speicher, bis er beendet ist. *: rage: ** Wenn Sie mehrere Befehle ausführen, verwenden Sie die Rohrauskleidung? ** ** ** Das individuelle Ausführen mehrerer Befehle wird verlangsamt.

Schlechtes Beispiel


#Schleife und registriere eins nach dem anderen
for key, value in data_dict.items():
    redis_connect.set(key, value)

Rohrauskleidung verwenden


with redis_connect.pipeline() as pipe:
    #Schleife und Registrierung in der Pipeline, dann Stapelregistrierung
    for key, value in data_dict.items():
        pipe.set(key, value)
    pipe.execute()

*: schreien: ** Ist die angenommene Speichergröße zu groß? ** ** ** Wenn die Speichernutzung im Vergleich zum vorbereiteten Server zu groß ist, bitten Sie sie, die Verwendung des Hash-Typs in Betracht zu ziehen. *: confounded: ** Verwenden Sie es als Speicher (als Persistenzannahme), nicht als Cache? ** ** ** Grundsätzlich handelt es sich um NG. Wenn dies jedoch unvermeidbar ist, z. B. die Verwendung eines sortierten Satztyps usw., fragen Sie nach einer dedizierten DB-Nummer. Dies liegt daran, dass es im Notfall schwierig ist, das System zu leeren, wenn es sich in derselben DB-Nummer befindet wie der als Cache verwendete Schlüssel. Stellen Sie außerdem sicher, dass Sie über AOF-Einstellungen (keine Codeüberprüfung), einen Generierungsstapel und eine Möglichkeit zum Umgang mit Datenpersistenz und -wiederherstellung verfügen.

Logikausgabe

*: rage: ** Wenn die erfassten Hauptdaten geloopt und verarbeitet werden, gibt es ein Geschwindigkeitsproblem, selbst wenn die erfassten Hauptdaten zu einer großen Datenmenge werden? ** ** ** Wenn Sie SQL im Verarbeitungsteil ausführen oder komplizierte Berechnungen durchführen, wird es während des Betriebs aufgrund von Gründen wie einer Erhöhung der Stammdaten erheblich verlangsamt. Bitten Sie sie zu prüfen, ob die in der Verarbeitung verwendeten Daten im Voraus zusammengefasst werden können. *: rage: ** Gibt es nicht viel SQL-Ausführung? ** ** ** Selbst wenn jede SQL schnell ist, ist die Antwort langsam, wenn sie sich ansammelt, und es wird auch eine Belastung für den DB-Server sein. Kann man bei select zusammenstellen? Ist es möglich, im Falle eines Einsatzes einen Masseneinsatz zu machen? Ich werde Sie bitten, darüber nachzudenken. *: Wut: ** Ist der wichtige Teil protokolliert? ** ** ** Ohne Protokolle können Sie nicht untersuchen, wann ein Benutzer nachfragt. *: rage: ** Ist es in Ordnung, wenn mehrere Benutzer gleichzeitig auf dieselben Daten zugreifen? ** ** ** Wenn beispielsweise mehrere Benutzer denselben Datensatz aktualisieren können, z. B. die Verarbeitung der Genehmigung durch Freunde, besteht die Möglichkeit eines Deadlocks, sofern nicht die ausschließliche Verarbeitung oder Anpassung der Aktualisierungsreihenfolge durchgeführt wird. *: schreien: ** Hast du die Räder nachgebaut? Ist es trocken? ** ** ** Wenn eine ähnliche Verarbeitung zunimmt, treten Probleme aufgrund erhöhter Arbeitskräfte und fehlender Korrektur auf, wenn Spezifikationsänderungen auftreten. *: schreien: ** Gibt es eine magische Zahl? ** ** ** Wenn es eine magische Zahl gibt, kann der Code nur von der Person gelesen werden, die sich die Spezifikationen merkt. Wenn sich der Wert ändert, treten Korrekturauslassungen auf.

Schlechtes Beispiel


if mission_type == 1331:
    #Was für eine Mission ist der Prozess? ??

Leicht zu verstehen mit Enum etc.


if mission_type == MissionType.PlayerLevel:
    #Es stellt sich heraus, dass es sich um eine Mission auf Spielerebene handelt

*: verwirrt: ** Wird es überarbeitet? ** ** ** Eine der wichtigsten Umgestaltungen ist die Extraktionsmethode. Wenn eine große Menge Code in einer Methode geschrieben wird, ist die Verschachtelung in der Regel tief und es wird für Mitglieder schwierig zu verstehen, was beim Lesen von wo nach wo getan wird. *: confounded: ** Negative Boolean Gibt es einen negativen Zweig der Variablen? ** ** ** Welches ist das Innere des if-Satzes? Sogar die Person selbst ist verwirrt, so dass die Möglichkeit, einen Defekt einzuführen, zunimmt.

Extremes Beispiel


if not_equip != False:
    #Wann kommst du hierher? ??

Code-Ausgabe

*: Wut: ** Gibt es Rechtschreibfehler? ** ** ** Unnötig zu erwähnen. *: rage: ** Ist der Methodenname angemessen? ** ** ** Wenn Sie auch aktualisieren, während Sie get_xxx sagen, sind die Mitglieder beim Lesen des Codes verwirrt. *: verwirrt: ** Befolgen Sie die Code-Konventionen? ** ** ** Die Wichtigkeit variiert je nach Site. Wenn jedoch die Regeln befolgt werden, verbessert sich die Lesbarkeit. Im Fall von Python gibt es einen allgemeinen Konventions-Pep, daher ist es in Ordnung, wenn er den Anforderungen entspricht. *: verwirrt: ** Sind Zeichen in voller Breite durchgehend geschrieben? ** ** ** Wenn Zeichen voller Breite, die für den Benutzer sichtbar sind, fest im Code geschrieben sind, muss der Code geändert werden, wenn mehrere Sprachen unterstützt werden. Ich denke, die meisten Frameworks haben i18n-Unterstützung, daher möchte ich, dass Sie diese verwenden. Referenz: Django Internationalization Es werden jedoch zusätzliche Arbeitskräfte erforderlich sein. Wenn in Zukunft keine Internationalisierung erforderlich ist, werden wir diese weiterleiten.

Transaktionsausgabe

*: rage: ** Ist der Transaktionsbereich angemessen? Ist es in dem Maße gebunden, in dem es festgeschrieben / zurückgesetzt werden sollte? ** ** ** Wenn der Bereich falsch ist, sind die Daten nicht konsistent, wenn eine Ausnahme auftritt. Wenn Sie separate DBs haben, beachten Sie, dass Sie auch XA-Transaktionen verwenden. *: rage: ** Wenn MySQL- und Redis-Updates in derselben Anforderung gemischt sind, berücksichtigen Sie, wann eine Ausnahme auftritt? ** ** ** Wenn Sie beispielsweise Redis zuerst aktualisieren und beim Aktualisieren der Datenbank eine Ausnahme auftritt, wird Redis nicht zurückgesetzt, wodurch die Konsistenz mit der Datenbank beeinträchtigt wird.

API-Edition

*: rage: ** Wenn der Parameter ein Array ist, ist es in Ordnung, die Anzahl illegal zu erhöhen? ** ** ** Wenn beispielsweise beim Batch-Empfang von Geschenken die Ziel-ID in einem Array empfangen wird und die Anzahl der Arrays nicht auf eine Obergrenze festgelegt ist, kann sich die Serverlast aufgrund eines Angriffs erhöhen, der von einem böswilligen Benutzer mit einer großen Datenmenge manipuliert wurde. Es gibt Sex. *: rage: ** Ist es in Ordnung, dass derselbe Benutzer dieselbe Anfrage mehrmals hintereinander sendet? ** ** ** Wenn eine Anforderung, die einmal hätte gestellt werden sollen, zweimal hintereinander gesendet wird, geht die Integrität der Daten verloren, wenn keine ausschließliche Kontrolle durchgeführt wird. *: rage: ** Gibt es Maßnahmen, wenn ein unmöglicher Parameter gesendet wird? ** ** ** Wenn ein böswilliger Benutzer einen Parameter ändert und die API ausführt, wird die Datenintegrität beeinträchtigt, wenn die Konsistenzprüfung nicht durchgeführt wird.

Kommentar

*: rage: ** Entspricht der Kommentar der Verarbeitung? ** ** ** Mitglieder können den Code falsch lesen, wenn der Kommentar falsch ist oder wenn Sie vergessen, den Kommentar zu ändern, wenn Sie den Prozess ändern. *: rage: ** Haben die entsprechenden Kommentare später die Schlüsselwörter TODO: und FIXME:? ** ** ** Es wird oft vergessen und begraben. Fügen Sie daher unbedingt ein Schlüsselwort hinzu, damit Sie später nachfragen können.

Recommended Posts

33 Auswahlen, die der Soshage-Ingenieur bei der Überprüfung von Codes hervorhebt [jederzeit hinzugefügt]
Rufen Sie den Python-Debugger jederzeit auf
Grep, damit grep zum Zeitpunkt von grep nicht angezeigt wird