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.
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.
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"!
Es gibt Zeiten, in denen "ich funktionieren konnte, aber es ist seltsam langsam und unbrauchbar ...". Ergreifen Sie in diesem Fall die entsprechenden Maßnahmen.
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.
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.
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 ...
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.
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