[PYTHON] Wie kann ich ein gutes Programm schreiben?

Ich komme nicht aus der Informationswissenschaft, also musste ich viel lernen, nachdem ich einen Job als Programmierer bekommen hatte. Jetzt arbeite ich als Backend-Ingenieur in einem Team für maschinelles Lernen, um Junior-Code zu überprüfen und zu unterrichten (Überraschung!).

Die Art zu lernen war jedoch nicht effizient und ich glaube, ich habe viel Zeit verschwendet. Ich kann es nicht ertragen, meine Junioren das Gleiche tun zu lassen, deshalb schreibe ich diesen Artikel mit der Absicht, es möglich zu machen, meine Gedanken während des Programmierens zu verbalisieren. Es kann für diejenigen natürlich sein, die können.

Vor diesem Artikel möchte ich über die Werte und Einstellungen eines Programmierers sprechen, z. B. "Wie man ein Hacker wird" und "Ausgezeichnet". Tipps, um ein guter Programmierer zu werden ".

Neben dem Programmieren gibt es viele Dinge zu lernen, aber da es kein Ende gibt, werde ich eine weitere Gelegenheit nutzen.

Wie gehe ich mit dem Fehler um?

Ich bekomme immer einen Fehler. Manchmal ist es schwierig, die Arbeit zu erledigen, ohne zu wissen, wie man damit umgeht. In solchen Zeiten handeln Programmierer (ob bewusst oder unbewusst) gemäß dem folgenden "Hypothesentest" -Prozess.

  1. Lesen Sie die Fehlermeldung
  2. Machen Sie eine Hypothese der Ursache
  3. Finden Sie es heraus und versuchen Sie es
  4. Wenn es nicht funktioniert, stellen Sie eine andere Hypothese auf und untersuchen Sie sie

Wenn Sie immer noch nicht verstehen, fragen Sie jemanden, der mehr zu wissen scheint. Bei der Überprüfung ist das offizielle Dokument genauer als Qiita oder Stackoverflow. Überprüfen Sie dies daher zuerst. Insbesondere AWS und Python, die wir häufig verwenden, sind gut dokumentiert.

Beispielsweise kann in einem Batch-Prozess wie "Einfügen des numerischen Berechnungsergebnisses in MySQL" aus irgendeinem Grund ein Timeout-Fehler nur in der Produktionsumgebung auftreten. Stellen Sie zu diesem Zeitpunkt zunächst die Hypothese auf, dass "der Zeitlimit-Einstellwert zwischen der Testumgebung und der Produktionsumgebung unterschiedlich sein kann", und bestätigen Sie, dass dies tatsächlich der Fall ist. Da ein ausreichend langer Wert festgelegt ist, wird "numerischer Wert" angegeben. Ich denke, dass die Verbindung vor dem Berechnungsprozess eingefügt wurde und schon lange eingefügt wurde. "

Sobald Sie sich an diese Gewohnheit gewöhnt haben, können Sie das Wissen über die nächstniedrigere Ebene erlernen, während Sie mit Fehlern umgehen. Wenn Sie diese Idee nicht verstehen, egal wie viele Jahre Sie Programmierer waren, bleiben Sie bei geringem Wissen.

Um jedoch nicht endlos als [Yak-Rasur] zu untersuchen (https://www.s-arcana.co.jp/tech/2011/10/yak-shaving.html) Bitte lassen Sie die Idee "einmal fertig"!

Das Programm ist langsam! Wie kann ich schneller werden?

Es gibt Zeiten, in denen "ich funktionieren konnte, aber es ist seltsam langsam und unbrauchbar ...". Ergreifen Sie in diesem Fall die entsprechenden Maßnahmen.

  1. Identifizieren Sie den Engpass
  2. Beschleunigen Sie dort

Wenn Sie sich den Engpass nicht ansehen und damit umgehen, werden Sie eine Menge Kot haben, die die Geschwindigkeit nicht verbessert und die Komplexität erhöht. Ich denke, diese Idee gilt auch für die Geschäftsverbesserung und die Verbesserung der Genauigkeit von Modellen für maschinelles Lernen (durch Hinzufügen des Prozesses "Erstellen des Zielindex"). Andrew Ngs Coursera Machine Learning sagt: "In der Pipeline für maschinelles Lernen sollten wir Module verbessern, die für eine verringerte Genauigkeit von entscheidender Bedeutung sind. Ich denke, es gab so eine Geschichte.

Wie damit umzugehen ist, hängt vom Engpass ab.

Die Berechnungsverarbeitung ist langsam (CPU-gebunden / Speicher gebunden)

Wenn Ihr Programm seltsam langsam ist, vermuten Sie zunächst, dass ein Problem mit der "Berechnung (genauer Zeit)" des Algorithmus vorliegt. Insbesondere gibt es viele Fälle, in denen mehrere Schleifen nicht erforderlich sind.

#Jedes Mal, wenn die Anzahl n der Tag-IDs zunimmt, ist der Berechnungsschritt O.(n^2)Wird steigen!
result = []
for tag_ID in der Liste der Tags, die dem Benutzer gefallen:
    for product_id,Liste der Tag-IDs, die an Produkte in angehängt sind(Produkt ID,Liste der Tag-IDs)Liste von:
        for product_tag_ID in Liste der an das Produkt angehängten Tag-IDs:
            if tag_id == product_tag_id:
                result.append(product_id)
                break
return result

Um damit umzugehen, müssen Sie "Algorithmen und Datenstrukturen" lernen. Meine Empfehlung lautet "[Algorithmen, Teil I](https: // www." Dies ist ein kostenloser Coursera-Kurs namens "coursera.org/learn/algorithms-part1)". Wenn Sie ein Problem mit dem Rechenaufwand haben, beachten Sie bitte, dass eine Neuimplementierung in einer schnelleren Sprache (z. B. Go-Sprache) das Problem nicht lösen kann.

Der obige Code wird implementiert, indem er aus dem Wörterbuch (Hash-Tabelle) abgerufen wird.

#Tag-ID-> {Produkt ID}Wörterbuch
Produktwörterbuch= {
    "Tag 1": {"Produkt 1", "Produkt 2"},
    "Tag 2": {"Produkt 2", "Produkt 3"},
    ...
}

result = set(Liste der möglichen Produkt-IDs) 
for tag_ID in der Liste der Lieblings-Tags des Benutzers:
    result &=Produktwörterbuch[tag_id] #Summensatz
return result

Wenn Sie den Rechenaufwand nicht verbessern können, ziehen Sie die Parallelverarbeitung in Betracht. Wenn Sie mit der in Python verwendeten Parallelverarbeitung arbeiten, concurrent.futures.ProcessPoolExecutor und [ joblib](https :: //joblib.readthedocs.io/en/latest/parallel.html#parallel) wird verwendet.

Manchmal ist es kein CPU-Problem und Sie haben nicht genügend Speicher. Überprüfen Sie die Servermetriken. Sie können den Unix-Befehl unter top überprüfen.

IO ist langsam (IO gebunden)

Wenn eine große Anzahl von Anforderungen für WEB-Anwendungen, Datenbanken oder andere Server vorliegt, ist das Programm aufgrund der E / A-Wartezeit möglicherweise langsam. Gleiches gilt für das Crawlen einer Site.

In diesem Fall behandeln wir es zuerst durch "Parallelverarbeitung". Bitte lesen Sie "Parallele / asynchrone Story um Python" für spezifische Gegenmaßnahmen.

  • Wirklich mehrere Prozesse gleichzeitig ausführen-> Parallelverarbeitung
  • Es ist, als würden mehrere Prozesse gleichzeitig effizient geschaltet und ausgeführt-> Parallele Prozesse

Ich wechsle nur zu einem anderen Prozess, während ich auf IO warte. Mit anderen Worten, "Parallelverarbeitung" "async / await" und "ThreadPoolExecutor" erhöhen den Betriebssystemprozess selbst nicht, so dass "die Berechnungsverarbeitung mit der CPU beschleunigt" keine Auswirkung hat. Beachten Sie auch die Geschichte des C10K-Problems.

Der Unterschied im Python-Bereich zu diesem Dokument ist trio asyncio. 3 / library / asyncio.html) Ich denke, dass eine Bibliothek herausgekommen ist, die einfacher zu handhaben ist. Ich frage mich, ob FastAPI es unterstützen wird ...

Wie kann ich ein gutes Programm schreiben?

Ich würde es gerne wissen, aber ich werde Ihnen so viele Ratschläge geben, wie ich kann. Joel Spolskys "[Java School Dangers](https://web.archive.org/web/20190514152427/http://local.joelonsoftware.com/mediawiki/index.php/Java%E3%82%B9%E3" % 82% AF% E3% 83% BC% E3% 83% AB% E3% 81% AE% E5% 8D% B1% E9% 99% BA) "" Java "ist modernes Python.

Es gibt einen Grund, warum Personalvermittler, die grep verwenden, getäuscht werden. Jeder, der Scheme-, Haskell- und C-Zeiger verwenden kann, die ich kenne, wird in 2 Tagen mit Java besseren Code schreiben als ein Java-Programmierer mit 5 Jahren Erfahrung. Aber das ist für den durchschnittlichen langweiligen HR-Mann unverständlich.

Ich habe auch diesen Artikel gelesen und versucht, zusätzlich zu Python C-Sprache und Haskell zu berühren. Insbesondere das Gefühl von Entwurfsmethode nach Typ der statischen Typfunktionstypprogrammierung (ich kann es nicht gut sagen, aber reine Funktionen Das Erstellen und Zusammenstellen des Programms als Verbundwerkstoff ist auch nützlich für die Implementierung von Python, und ich denke, es ist nützlich, eine C-Sprache geschrieben zu haben, um die Numpy-Verarbeitung zu beschleunigen. Eine der Antworten darauf, wie man ein gutes Programm schreibt, könnte sein: "Schreiben Sie ein Programm mit der Idee eines Paradigmas, das zum Problem passt."

In Bezug auf das Design wurden gute Informationen in "Einführung in iOS App Design Patterns" gesammelt. "'Einführung in iOS App Design Patterns' war ein gutes Buch, das auch Nicht-iOS-Ingenieure rettete, die mit Designproblemen zu tun hatten" Wie Sie sehen können, wird es nach dem Verständnis der Vor- und Nachteile der einzelnen Muster möglich sein, zu diskutieren, welches Muster übernommen werden sollte.

Das Muster befindet sich nicht an erster Stelle, sondern findet beim Ändern des Codes das Muster in seiner endgültigen Form. ... (weggelassen) ... Der Anfang ist von einem einfachen Design. Wenn dort ein bekanntes Muster angewendet werden könnte, können Sie sich vorstellen, was als Ergebnis passieren würde. Da die Vor- und Nachteile des Musters analysiert wurden, ist es möglich, plötzlich zu einem sehr vollständigen Design zu gelangen. Oder Sie schreiben den Test nach und nach und fahren mit dem Refactoring fort.

Ohne ein solches Bewusstsein für die "Entscheidung über geeignete Optionen unter Berücksichtigung von Kompromissen" wird es doktrinorientiert dieser Artikel. Wie in 20/093044) gezeigt, befindet es sich im Status "Ich habe den Code, der einfach implementiert wurde, in einen komplizierten Code umgeschrieben." Ich denke, es ist eine extreme Theorie.

Sie müssen auch etwas über die Objektorientierung lernen. Es ist jedoch verwirrend, da es häufig mit einigen Rollen diskutiert wird, die in erster Linie gemischt werden. Weitere Informationen finden Sie unter "Technologie, die das Codieren unterstützt". Der Blog-Beitrag des Autors "Drei Rollen einer Klasse" erwähnt ebenfalls ein wenig.

Was auch immer die Methode sein mag, ich denke, es ist eine Wiederholung von "Erhöhung der Optionen und Berücksichtigung der Kompromisse von ihnen". Es kann ähnlich sein, wie eine Fremdsprache zu lernen und Ihren Wortschatz zu erweitern. Ich denke, es wird ein langfristiger Kampf, also suchen Sie bitte nach einer Lernmethode, die Sie genießen können.

Zusammenfassung

Wenn ich meine 5 Jahre Lernen in 3 Zeilen zusammenfasse, sieht es so aus. Es war wirklich erfrischend.

Wenn Sie im Artikel etwas Falsches sagen, teilen Sie uns dies bitte in den Kommentaren mit.

Recommended Posts

Wie kann ich ein gutes Programm schreiben?
Wenn Sie die mathematischen Symbole nicht verstehen, können Sie ein Programm schreiben.
Wie viel sollte ich schließlich einen Qiita-Artikel schreiben?
[Python] Ich habe eine Klasse erstellt, die schnell einen Dateibaum schreiben kann
Qiita (1) Wie schreibe ich einen Codenamen?
Ich habe ein Pay-Management-Programm in Python erstellt!
Schreiben Sie ein Caesar-Verschlüsselungsprogramm in Python
Ein Memorandum darüber, wie man Pandas schreibt, das ich persönlich oft vergesse
[Anfänger] Was passiert, wenn ich ein Programm schreibe, das in Python auf PHP läuft?
Wie fange ich an, mein Programm zu schreiben?
So schreiben Sie einen ShellScript Bash für Anweisung
Ich las "Wie man ein Hacking Lab macht"
Schreiben wir ein Python-Programm und führen es aus
Wie schreibe ich ein benanntes Tupeldokument im Jahr 2020?
[Go] So schreiben oder rufen Sie eine Funktion auf
Ich bin ein Anfänger, kann ich mir Weisheit ausleihen?
Ich möchte mit Python in eine Datei schreiben
So schreiben Sie eine ShellScript-Bash-Case-Anweisung
Ich habe ein Caesar-Kryptografieprogramm in Python erstellt.
So schreiben Sie eine GUI mit dem Befehl maya
Schreiben Sie ein super einfaches molekulardynamisches Programm in Python
Ich möchte in Python schreiben! (2) Schreiben wir einen Test
So schreiben Sie einen Listen- / Wörterbuchtyp von Python3
[Python] So schreiben Sie eine Dokumentzeichenfolge, die PEP8 entspricht
〇✕ Ich habe ein Spiel gemacht
4. Erstellen eines strukturierten Programms
Ich habe einen sqlite3.OperationalError
So führen Sie ein Python-Programm in einem Shell-Skript aus
Ich habe schnell ein Programm geschrieben, um DI mit Python zu lernen
Ich habe ein Demo-Programm zur linearen Transformation einer Matrix geschrieben
Schreiben Sie ein Python-Programm, um die Bearbeitungsentfernung [Python] [Levenshtein-Entfernung] zu ermitteln.
[Python] Kapitel 01-03 Über Python (Schreiben und Ausführen eines Programms mit PyCharm)
Schreiben Sie ein Programm, um den 4x4x4 Rubik Cube zu lösen! 1. Übersicht
Ich habe versucht, "ein Programm, das doppelte Anweisungen in Python entfernt"
Ich habe versucht "Wie man eine Methode in Python dekoriert"
So schreiben Sie einen Test für die Verarbeitung mit BigQuery
Ich werde nie vergessen, wie man ein Shell-Skript schreibt, nicht vergessen! !!
So schreiben Sie eine Meta-Klasse, die sowohl Python2 als auch Python3 unterstützt
Ich habe ein Plug-In erstellt, das "Daruma-san Fell" mit Minecraft ausführen kann
Ich wollte den AWS-Schlüssel nicht in das Programm schreiben