[PYTHON] Nous avons organisé une session d'étude en interne sur la programmation mob avec le thème de FizzBuzz.

C'est @aimof d'Iridge Co., Ltd. J'ai animé une session d'étude sur la programmation de la foule au sein d'Iridge (principalement pour les jeunes), je vais donc la résumer lorsque je la rapporterai. Cette fois, j'ai utilisé du code général (FizzBuzz) au lieu du code de production. Cet article est une réécriture d'un document partagé dans Iridge.

Objet de la session d'étude

Objectif interne

But personnel

Ambiance de programmation de foule

Comme nous étions libres d'entrer et de sortir, il y a eu quelques fluctuations, mais le nombre de personnes était d'environ 4 à 5 et nous avons effectué pendant 2 heures. Il y a trois membres qui ont participé du début à la fin.

Il était bon de remarquer immédiatement tout malentendu ou erreur, car ce serait une forme de réflexion avec tout le monde autre que le conducteur, pas seulement le conducteur. (Bien qu'il y ait eu quelques bugs qui n'ont pas été corrigés: voir ci-dessous).

Je pense que les membres ont pu travailler ensemble dans un esprit d'unité.

thème

Voici le thème préparé cette fois.

FizzBuzz avec des exigences supplémentaires chaque fois qu'il est terminé

règle basique

Pour les nombres de 1 à 100

À propos de l'ajout d'exigences

Tirez-en un des exigences préparées à l'avance et ajoutez les exigences.

Cette fois, j'ai décidé de mettre une boîte et un stylo et de leur demander d'écrire librement leurs exigences. Divers éléments allant des exigences de base aux exigences difficiles ont été rassemblés.

Rapport de résultat

De là, je vais vous raconter l'atmosphère en écrivant le code actuel.

Fizz Buzz ordinaire

for i in range(1, 101):
    if i % (3 * 5) == 0:
        print("FizzBuzz")
    elif i % 3 == 0:
        print("Fizz")
    elif i % 5 == 0:
        print("Buzz")
    else:
        print(i)

Aucun commentaire requis? C'est un Fizz Buzz ordinaire.

Condition 1: ne pas utiliser de f inférieur dans le code source

J'ai abandonné.

Je l'ai tiré d'un seul coup parce qu'il était inclus dans une histoire. C'est très pénible car la syntaxe de base telle que if, def, for est restreinte. Suivant rapidement.

Plus tard, on m'a dit une solution en interne. (C'est python2.7)

i = 1
while i <= 100:
    print "Fizz" * (not i % 3) + "Buzz" * (not i % 5) or i
    i = i + 1

Condition 2: si les 10 dernières sorties contiennent 6 nombres ou plus de 0 à 9, la sortie est ok.

def has_six_different_num(values):
    char_set = set()
    for value in values:
        if type(value) is int:
            for char in str(value):
                char_set.add(char)
    if 6 <= len(char_set):
        return True
    else:
        return False

values = list()
for i in range(1, 101):
    value = ""
    if i % (3 * 5) == 0:
        value = "FizzBuzz"
    elif i % 3 == 0:
        value = "Fizz"
    elif i % 5 == 0:
        value = "Buzz"
    else:
        value = i
    values.append(value)
    if len(values) > 10:
        del values[0]
    if has_six_different_num(values):
        value = "ok"
        values[-1] = "ok"
    print(value)

C'est devenu assez long. Le code mérite déjà d'être refactorisé. Si j'écrivais du code ça me ferait dire que c'est vraiment désagréable de tourner deux fois ...

Exigence 3: accélérer. La moitié de la vitesse d'exécution est un guide

J'ai dessiné l'exigence comme si on m'avait dit de corriger le double pour la déclaration. Tout le monde a ri sans le vouloir du bon timing.

Voici les résultats.

def has_six_different_num(values):
    return 7 <= len(set(list("".join(values))))


values = list()
for i in range(1, 30001):
    value = ""
    if i % (3 * 5) == 0:
        print("FizzBuzz")
    elif i % 3 == 0:
        print("Fizz")
    elif i % 5 == 0:
        print("Buzz")
    else:
        value = i
    values.append(str(value))
    if has_six_different_num(values[-10:]):
        value = "ok"
        values[-1] = "ok" # <-C'est un bug
    if value:
        print(value)

C'était assez rafraîchissant. Puisqu'il est difficile d'accélérer 100 fois, le nombre à produire est passé à 30 000. Il est passé de 0,044 seconde à 0,028 seconde.

7 <= len(set(list("".join(values)))) J'ai beaucoup appris de cette partie.

Renvoie true si 7 types de caractères comprenant des chaînes vides sont utilisés.

En fait, ce bogue de code. Je viens de l'écrire dans les commentaires. Si vous ne remplacez pas ici une chaîne de caractères vide, les deux caractères de ok seront traités comme un jugement numérique.

Condition 4: inverser la sortie

def has_six_different_num(values):
    return 7 <= len(set(list("".join(values))))


values = list()
for i in range(30000, 0, -1):
    value = ""
    if i % (3 * 5) == 0:
        print("FizzBuzz")
    elif i % 3 == 0:
        print("Fizz")
    elif i % 5 == 0:
        print("Buzz")
    else:
        value = i
    values.append(str(value))
    if has_six_different_num(values[-10:]):
        value = "ok"
        values[-1] = "ok"
    if value:
        print(value)

Changez simplement la gamme. Je n'ai pas encore remarqué le bogue.

Condition 5: exécuter rm -Rf ~ si une erreur d'exécution se produit

C'est parti pour ma commodité. C'est un ordinateur d'entreprise ... Au fait, l'erreur d'exécution ne s'est jamais produite après cela!

N'exécutez jamais cette commande. Les éléments suivants du répertoire personnel seront supprimés.

Condition 6: génère Foo lorsqu'il est un multiple de 7 et affiche Bar lorsqu'il est un multiple de 11. Lorsque deux ou plus sont les produits principaux, l'ordre d'affichage est Fizz, Buzz, Foo, Bar.

Au fur et à mesure que je m'y suis habitué, la vitesse à laquelle le conducteur pouvait deviner à partir des remarques de Mob est devenue plus rapide. Il semble que la ligne disparaisse immédiatement après avoir dit que je veux l'effacer.

J'ai oublié d'enregistrer le code pour cette exigence, je vais donc le résumer dans la section suivante.

Condition 7: Recevoir des nombres naturels comme entrée standard et renvoyer les résultats jusqu'à ce nombre dans un tableau Json.

import json


num = int(input())


def has_six_different_num(values):
    return 7 <= len(set(list("".join(values))))


values = list()
output_values = list()
for i in range(num, 0, -1):
    value = ""
    if i % 3 == 0:
        value += "Fizz"
    if i % 5 == 0:
        value += "Buzz"
    if i % 7 == 0:
        value += "Foo"
    if i % 11 == 0:
        value += "Bar"
    if not value:
        value = i
    if type(value) is str:
        values.append("")
    else:
        values.append(str(value))
    if has_six_different_num(values[-10:]):
        value = "ok"
        values[-1] = ""
    output_values.append(value)
print(json.dumps(output_values))

C'est le résultat final. Le bogue a également été corrigé.

Résumé et impressions

C'était une session d'étude (session d'essai) pour la programmation de foule, mais pour être honnête, j'ai apprécié plus que ce à quoi je m'attendais. Cette fois, j'ai écrit un code avec une forte nature événementielle, donc je pense que le sentiment que tout le monde était fou était plus fort que d'habitude.

Cependant, nous avons également reçu des commentaires selon lesquels nous aimerions utiliser le code de production s'il y en a un suivant. C'est amusant de préparer le code avec lequel j'ai des problèmes dans l'entreprise et de l'utiliser comme matériel pour la session d'étude. (Le problème est que vous ne pouvez pas publier le code sur Qiita)

Ce que j'ai ressenti comme un mérite de la programmation mob

En plus du but initial, c'était un grand mérite que je ne puisse rien faire de approprié car cela a conduit à l'organisation de mes propres pensées.

Autre résumé

Je pense que c'était bien cette fois que les exigences augmenteraient. La raison en est qu'il est développé petit et le refactoring est très important.

Je pense personnellement que ce serait formidable si nous pouvions organiser des sessions d'étude plus intéressantes au sein d'Iridge. Si nous avons une session d'étude intéressante, nous la publierons à nouveau sur Qiita!

Recommended Posts

Nous avons organisé une session d'étude en interne sur la programmation mob avec le thème de FizzBuzz.
Lisez "Programmation Linux ordinaire" lors d'une session d'étude en interne
J'ai essayé d'étudier côté serveur WEB lors d'une session d'étude Python en interne
Lisez "Programmation Linux ordinaire" lors d'une session d'étude interne ~ 10.11 Exercices ~
Un exemple de réponse à la question de référence de la session d'étude. Avec python.
Un moyen simple de remplir le début de 0 en fonction du nombre de chiffres dans le nombre [Python]
Une réflexion sur la visualisation du champ d'application du modèle de prédiction
Bases de la création d'un serveur interne pour Linux (CentOS 8.1, openSUSE 15.1, Ubuntu 20.04)! Serveur de fichiers avec Samba