Je ne suis pas issu des sciences de l'information, j'ai donc dû apprendre beaucoup après avoir trouvé un emploi de programmeur. Maintenant, je travaille en tant qu'ingénieur backend dans une équipe de machine learning, en mesure de réviser et d'enseigner le code junior (surprise!).
Cependant, la méthode d'apprentissage n'était pas efficace et je pense que j'ai perdu beaucoup de temps. Je ne supporte pas de laisser mes juniors faire de même, alors j'écris cet article avec l'intention de permettre de verbaliser ce que je pense lors de la programmation. Cela peut être naturel pour ceux qui le peuvent.
Avant cet article, je voudrais parler des valeurs et des attitudes d'un programmeur, telles que «Comment devenir un hacker» et «Excellent. Conseils pour devenir un bon programmeur ".
En plus de la programmation, il y a beaucoup de choses à apprendre, mais comme il n'y a pas de fin, je saisis une autre occasion.
J'obtiens toujours une erreur. Parfois, il est difficile de faire le travail sans savoir comment y faire face. Dans de tels moments, les programmeurs (qu'ils soient conscients ou inconscients) agissent selon le processus de «test d'hypothèse» suivant.
Si vous ne comprenez toujours pas, demandez à quelqu'un qui semble en savoir plus. De plus, lors de la vérification, le document officiel est plus précis que Qiita ou Stackoverflow, alors vérifiez-le d'abord. En particulier, AWS et Python, que nous utilisons souvent, sont bien documentés.
Par exemple, dans un processus par lots tel que "mettre le résultat du calcul numérique dans MySQL", pour une raison quelconque, une erreur de délai d'expiration peut se produire uniquement dans l'environnement de production. À ce stade, émettez d'abord une hypothèse selon laquelle «la valeur du paramètre de délai d'expiration peut être différente entre l'environnement de test et l'environnement de production» et confirmez que c'est effectivement le cas, et comme une valeur suffisamment longue est définie, «valeur numérique» Je pense que la connexion a été collée avant le processus de calcul et qu'elle a été collée pendant longtemps. "
Une fois que vous avez pris cette habitude, vous pouvez apprendre la connaissance de la couche inférieure suivante tout en traitant les erreurs. Si vous ne comprenez pas cette idée, peu importe depuis combien d'années vous êtes programmeur, vous resterez avec des connaissances superficielles.
Cependant, pour ne pas devenir rasage de yak et enquêter sans cesse, "une autre option Veuillez laisser l'idée de "finir une fois"!
Il y a des moments où "j'ai pu fonctionner, mais c'est étrangement lent et inutilisable ...". Dans ce cas, agissez en conséquence.
Si vous ne regardez pas le goulot d'étranglement et ne le gérez pas, vous vous retrouverez avec une masse de matières fécales qui n'améliore pas la vitesse et ajoute de la complexité. Je pense que cette idée est la même pour l'amélioration des affaires et l'amélioration de la précision des modèles d'apprentissage automatique (en ajoutant le processus de «création de l'indice cible»). Coursera Machine Learning d'Andrew Ng déclare: «Dans le pipeline d'apprentissage automatique, nous devrions améliorer les modules qui sont critiques pour les inexactitudes. Je pense qu'il y avait une histoire comme celle-là.
Comment y faire face dépend du goulot d'étranglement.
Si votre programme est étrangement lent, suspectez d'abord qu'il y a un problème avec le "calcul (plus précisément, le temps)" de l'algorithme. Plus précisément, il existe de nombreux cas où plusieurs boucles sont inutiles.
#Chaque fois que le nombre n d'identifiants de balise augmente, l'étape de calcul est O(n^2)Augmentera!
result = []
for tag_identifiant dans la liste des balises que l'utilisateur aime:
for product_id,Liste des identifiants de balise attachés aux produits dans(Identifiant du produit,Liste des identifiants de balise)Liste de:
for product_tag_id dans la liste des identifiants de balise attachés au produit:
if tag_id == product_tag_id:
result.append(product_id)
break
return result
Pour faire face à cela, vous devez apprendre "Algorithmes et structures de données". Ma recommandation est "[Algorithmes, partie I](https: // www." J'ai appris de l'article du développeur Hatena. Il s'agit d'un cours Coursera gratuit appelé "coursera.org/learn/algorithms-part1)". Si vous rencontrez un problème avec la quantité de calcul, sachez que le réimplémenter dans un langage plus rapide (par exemple, le langage Go) ne le résoudra pas.
Le code ci-dessus est implémenté en le récupérant à partir du dictionnaire (table de hachage).
#ID de tag-> {Identifiant du produit}dictionnaire
Dictionnaire des produits= {
"Balise 1": {"Produit 1", "Produit 2"},
"Étiquette 2": {"Produit 2", "Produit 3"},
...
}
result = set(Liste des identifiants de produits candidats)
for tag_identifiant dans la liste des balises préférées de l'utilisateur:
result &=Dictionnaire des produits[tag_id] #Ensemble de somme
return result
De plus, si vous ne pouvez pas améliorer la quantité de calcul, envisagez le traitement parallèle. Si vous avez affaire à un traitement parallèle utilisé en Python, concurrent.futures.ProcessPoolExecutor
et [ joblib
](https :: //joblib.readthedocs.io/en/latest/parallel.html#parallel) sera utilisé.
Parfois, ce n'est pas un problème de processeur et vous manquez de mémoire. Vérifiez les métriques du serveur. Vous pouvez vérifier la commande Unix sur top
.
S'il y a un grand nombre de demandes d'applications WEB, de bases de données ou d'autres serveurs, le programme peut être lent en raison de l'attente d'E / S. La même chose est vraie lors de l'exploration d'un site.
Dans ce cas, traitons-le d'abord par "traitement parallèle". Veuillez lire "Histoire parallèle / asynchrone autour de Python" pour des contre-mesures spécifiques.
- Exécution de plusieurs processus en même temps -> Traitement parallèle
- C'est comme si plusieurs processus étaient efficacement commutés et exécutés en même temps-> Processus parallèles
Je passe juste à un autre processus en attendant IO. En d'autres termes, le "traitement parallèle" "async / await" et "ThreadPoolExecutor" n'augmentent pas le processus du système d'exploitation lui-même, il n'y a donc aucun effet d '"accélérer le traitement du calcul en utilisant le CPU". Soyez également conscient de l'histoire du problème C10K.
La différence dans la zone Python de ce document est ʻasyncio](https://docs.python.org/ja/) appelé [
trio`. 3 / library / asyncio.html) Je pense qu'une bibliothèque plus facile à gérer est sortie. Je me demande si FastAPI le supportera ...
J'aimerais savoir, mais je vais vous donner autant de conseils que possible. "[Java School Dangers] de Joel Spolsky](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 "est le Python moderne.
Il y a une raison pour laquelle les recruteurs utilisant grep sont dupes. Quiconque peut utiliser les pointeurs Scheme, Haskell et C que je connais écrira un meilleur code qu'un programmeur Java avec 5 ans d'expérience en 2 jours après avoir commencé à utiliser Java. Mais c'est incompréhensible pour le gars moyen des RH ennuyeux.
J'ai également lu cet article et essayé de toucher le langage C et Haskell en plus de Python. En particulier, le sentiment de méthode de conception par type de programmation de type fonction de type statique (je ne peux pas le dire bien, mais des fonctions pures (Créer et assembler le programme sous forme de synthèse) est également utile pour implémenter Python, et je pense qu'il est utile d'avoir écrit un langage C pour accélérer le traitement numpy. Une des réponses à la façon d'écrire un bon programme peut être «d'écrire un programme avec l'idée d'un paradigme qui convient au problème».
En ce qui concerne la conception, de bonnes informations ont été recueillies dans "Introduction aux modèles de conception d'applications iOS". «'Introduction to iOS App Design Patterns' était un bon livre qui a également sauvé les ingénieurs 'non'iOS qui étaient préoccupés par la conception" Comme vous pouvez le voir, après avoir compris les avantages et les inconvénients de chaque modèle, je pense qu'il sera possible de discuter de celui qui devrait être adopté.
Le motif n'est pas en premier lieu, mais en cours de modification du code, il trouve le motif dans sa forme finale. ... (Omis) ... Le début est d'une conception simple. Si un modèle connu pouvait y être appliqué, vous pouvez imaginer ce qui en résulterait. Puisque les avantages et les inconvénients du motif ont été analysés, il est possible d'arriver soudainement à une conception très complète. Ou vous pouvez écrire le test petit à petit et procéder au refactoring.
Sans une telle conscience de "décider des options appropriées en tenant compte des compromis", cela devient axé sur la doctrine [cet article](http://rirakkumya.hatenablog.com/entry/2013/04/ Comme indiqué dans 20/093044), il sera dans l'état "J'ai réécrit le code implémenté simplement en un code compliqué." Je pense que c'est un peu une théorie extrême.
Vous devez également vous renseigner sur l'orientation des objets. Cependant, il est déroutant car il est souvent discuté avec certains rôles mélangés en premier lieu. Pour plus de détails, veuillez lire «Technologie prenant en charge le codage». Le billet de blog de l'auteur "Trois rôles d'une classe" en mentionne également un peu.
Quelle que soit la méthode, je pense que c'est une répétition «d'augmenter les options et de considérer les compromis qui en découlent». Cela peut être similaire à l'étude d'une langue étrangère et à l'augmentation de votre vocabulaire. Je pense que ce sera une bataille à long terme, alors cherchez une méthode d'apprentissage qui vous plaira.
Si je résume mes 5 années d'apprentissage en 3 lignes, cela ressemble à ceci. C'était vraiment rafraîchissant.
Si vous dites quelque chose de mal dans l'article, faites-le nous savoir dans les commentaires.
Recommended Posts