[PYTHON] Comment puis-je écrire un bon programme?

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.

Comment gérer l'erreur?

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.

  1. Lisez le message d'erreur
  2. Faire une hypothèse sur la cause
  3. Découvrez et essayez
  4. Si cela ne fonctionne pas, faites une autre hypothèse et étudiez

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"!

Le programme est lent! Comment puis-je aller plus vite?

Il y a des moments où "j'ai pu fonctionner, mais c'est étrangement lent et inutilisable ...". Dans ce cas, agissez en conséquence.

  1. Identifiez le goulot d'étranglement
  2. Accélérez là-haut

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.

Le traitement du calcul est lent (lié au processeur / à la mémoire)

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.

IO est lent (IO lié)

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 ...

Comment puis-je écrire un bon programme?

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.

Résumé

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

Comment puis-je écrire un bon programme?
Si vous ne comprenez pas les symboles mathématiques, vous pouvez écrire un programme.
Après tout, combien dois-je écrire un article sur Qiita?
[python] J'ai créé une classe qui peut écrire rapidement une arborescence de fichiers
Qiita (1) Comment écrire un nom de code
J'ai fait un programme de gestion de la paie en Python!
Ecrire un programme de chiffrement Caesar en Python
Un mémorandum sur la façon d'écrire des pandas que j'ai tendance à oublier personnellement
[Débutant] Que se passe-t-il si j'écris un programme qui s'exécute sur php en Python?
Comment commencer à rédiger mon programme?
Comment écrire une instruction ShellScript Bash for
J'ai lu "Comment créer un laboratoire de piratage"
Écrivons un programme Python et exécutons-le
Comment écrire un document tuple nommé en 2020
[Go] Comment écrire ou appeler une fonction
Je suis débutant, puis-je emprunter de la sagesse?
Je veux écrire dans un fichier avec Python
Comment écrire une instruction de cas bash ShellScript
J'ai créé un programme cryptographique César en Python.
Comment écrire une interface graphique à l'aide de la commande maya
Ecrire un programme de dynamique moléculaire super simple en python
Je veux écrire en Python! (2) Écrivons un test
Comment écrire un type liste / dictionnaire de Python3
[Python] Comment écrire une docstring conforme à PEP8
〇✕ J'ai fait un jeu
4. Création d'un programme structuré
J'ai un sqlite3.OperationalError
Comment exécuter un programme Python à partir d'un script shell
J'ai écrit rapidement un programme pour étudier la DI avec Python ①
J'ai écrit un programme de démonstration pour la transformation linéaire d'une matrice
Ecrire un programme python pour trouver la distance d'édition [python] [distance Levenshtein]
[Python] Chapitre 01-03 À propos de Python (Ecrire et exécuter un programme à l'aide de PyCharm)
Écrivez un programme pour résoudre le Rubik Cube 4x4x4! 1. Vue d'ensemble
J'ai essayé "un programme qui supprime les déclarations en double en Python"
J'ai essayé "Comment obtenir une méthode décorée en Python"
Comment rédiger un test de traitement utilisant BigQuery
Je n'oublierai jamais comment écrire un script shell, n'oubliez pas! !!
Comment écrire une classe méta qui prend en charge à la fois python2 et python3
J'ai créé un plug-in qui peut faire "Daruma-san tombé" avec Minecraft
Je ne voulais pas écrire la clé AWS dans le programme