[PYTHON] Wir haben eine interne Lernsitzung zum Thema Mob-Programmierung mit dem Thema FizzBuzz abgehalten.

Dies ist @aimof von Iridge Co., Ltd. Ich habe eine Mob-Programmier-Lernsitzung in Iridge veranstaltet (hauptsächlich für junge Leute), daher werde ich sie zusammenfassen, wenn ich darüber berichte. Dieses Mal habe ich allgemeinen Code (FizzBuzz) anstelle von Produktionscode verwendet. Dieser Artikel ist eine Neufassung eines in Iridge freigegebenen Dokuments.

Zweck der Studiensitzung

Interner Zweck

Persönlicher Zweck

Mob-Programmieratmosphäre

Da wir frei ein- und ausgehen konnten, gab es einige Schwankungen, aber die Anzahl der Personen lag bei 4 bis 5 und wir führten 2 Stunden lang durch. Es gibt drei Mitglieder, die von Anfang bis Ende teilgenommen haben.

Es war gut, Missverständnisse oder Fehler sofort zu bemerken, denn es wäre eine Form des Denkens mit allen anderen als dem Fahrer, nicht nur mit dem Fahrer. (Obwohl es einige Fehler gab, die nicht behoben wurden: siehe unten).

Ich denke, die Mitglieder konnten mit einem Gefühl der Einheit zusammenarbeiten.

Thema

Hier ist das Thema dieses Mal vorbereitet.

FizzBuzz mit zusätzlichen Anforderungen bei jedem Abschluss

Grundregel

Für Zahlen von 1 bis 100

Informationen zum Hinzufügen von Anforderungen

Zeichnen Sie eine aus den im Voraus vorbereiteten Anforderungen und fügen Sie die Anforderungen hinzu.

Dieses Mal habe ich beschlossen, eine Schachtel und einen Stift zu platzieren und sie zu bitten, ihre Anforderungen frei zu schreiben. Verschiedene Dinge, von Grundanforderungen bis zu schwierigen, wurden gesammelt.

Ergebnisbericht

Von hier aus werde ich Ihnen die Atmosphäre beim Schreiben des eigentlichen Codes erzählen.

Gewöhnlicher Fizz Buzz

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)

Kein Kommentar erforderlich? Es ist ein gewöhnlicher Fizz Buzz.

Anforderung 1: Verwenden Sie im Quellcode kein niedrigeres f

Ich gab auf.

Ich habe es auf einmal gezogen, weil es als Geschichte enthalten war. Es ist sehr schmerzhaft, weil die grundlegende Syntax wie if, def, for eingeschränkt ist. Weiter schnell.

Später wurde mir eine interne Lösung mitgeteilt. (Es ist Python2.7)

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

Anforderung 2: Wenn die letzten 10 Ausgänge 6 oder mehr Zahlen von 0 bis 9 enthalten, wird die Ausgabe als OK ausgeführt.

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)

Es ist ziemlich lang geworden. Der Code ist bereits eine Überarbeitung wert. Wenn ich Code schreiben würde, würde ich sagen, dass es wirklich unangenehm ist, zweimal zu drehen ...

Voraussetzung 3: Beschleunigen. Die Hälfte der Ausführungsgeschwindigkeit ist ein Richtwert

Ich habe die Anforderung so gezeichnet, als ob mir gesagt worden wäre, ich solle das Double für die Anweisung korrigieren. Alle lachten ungewollt über das gute Timing.

Hier sind die Ergebnisse.

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" # <-Dies ist ein Fehler
    if value:
        print(value)

Es war ziemlich erfrischend. Da es schwierig ist, das 100-fache zu beschleunigen, hat sich die auszugebende Anzahl auf 30.000 erhöht. Es wurde von 0,044 Sekunden auf 0,028 Sekunden erhöht.

7 <= len(set(list("".join(values)))) Ich habe viel aus diesem Teil gelernt.

Gibt true zurück, wenn 7 Arten von Zeichen einschließlich leerer Zeichenfolgen verwendet werden.

Eigentlich dieser Codefehler. Ich habe es gerade in den Kommentaren geschrieben. Wenn Sie hier keine leere Zeichenfolge ersetzen, werden die beiden Zeichen von ok als Zahlenbeurteilung behandelt.

Anforderung 4: Ausgabe umkehren

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)

Ändern Sie einfach die Reichweite. Ich habe den Fehler noch nicht bemerkt.

Anforderung 5: Führen Sie rm -Rf ~ aus, wenn ein Laufzeitfehler auftritt

Es ist für meine Bequemlichkeit weg. Es ist ein Firmencomputer ... Der Laufzeitfehler ist übrigens danach nie mehr aufgetreten!

Führen Sie diesen Befehl niemals aus. Das Folgende des Home-Verzeichnisses wird gelöscht.

Anforderung 6: Gibt Foo aus, wenn es ein Vielfaches von 7 ist, und gibt Bar aus, wenn es ein Vielfaches von 11 ist. Wenn zwei oder mehr die Hauptprodukte sind, lautet die Anzeigereihenfolge Fizz, Buzz, Foo, Bar.

Als ich mich daran gewöhnt habe, hat die Geschwindigkeit, mit der der Fahrer aus Mobs Bemerkungen raten kann, zugenommen. Es scheint, dass die Zeile sofort verschwindet, nachdem ich gesagt habe, dass ich sie löschen möchte.

Ich habe vergessen, den Code für diese Anforderung zu speichern, daher werde ich ihn im nächsten Abschnitt zusammenfassen.

Anforderung 7: Empfangen Sie natürliche Zahlen als Standardeingabe und geben Sie die Ergebnisse bis zu dieser Zahl in einem Json-Array zurück.

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

Dies ist das Endergebnis. Der Fehler wurde ebenfalls behoben.

Zusammenfassung und Eindrücke

Es war eine Lernsitzung (Probesitzung) für Mob-Programmierung, aber um ehrlich zu sein, es hat mir mehr Spaß gemacht, als ich erwartet hatte. Dieses Mal habe ich einen Code mit einem starken Ereignischarakter geschrieben, daher denke ich, dass das Gefühl, dass jeder verrückt war, stärker war als gewöhnlich.

Wir haben jedoch auch das Feedback erhalten, dass wir den Produktionscode verwenden möchten, wenn es einen nächsten gibt. Es macht Spaß, den Code, mit dem ich im Unternehmen Probleme habe, vorzubereiten und als Material für die Lernsitzung zu verwenden. (Das Problem ist, dass Sie den Code nicht auf Qiita veröffentlichen können.)

Was ich als Verdienst der Mob-Programmierung empfand

Neben dem ursprünglichen Zweck war es ein großer Verdienst, dass ich nichts Angemessenes tun konnte, da dies zur Organisation meiner eigenen Gedanken führte.

Andere Zusammenfassung

Ich denke, diesmal war es gut, dass die Anforderungen steigen werden. Der Grund ist, dass es klein entwickelt ist und Refactoring sehr wichtig ist.

Ich persönlich denke, dass es großartig wäre, wenn wir interessantere Lernsitzungen in Iridge abhalten könnten. Wenn wir eine interessante Lernsitzung haben, werden wir sie erneut auf Qiita veröffentlichen!

Recommended Posts

Wir haben eine interne Lernsitzung zum Thema Mob-Programmierung mit dem Thema FizzBuzz abgehalten.
Lesen Sie "Gewöhnliche Linux-Programmierung" in einer internen Lernsitzung
Ich habe versucht, auf der WEB-Serverseite bei einer internen Python-Lernsitzung zu lernen
Lesen Sie "Gewöhnliche Linux-Programmierung" in einer internen Lernsitzung ~ 10.11 Übungen ~
Ein Beispiel für die Antwort auf die Referenzfrage der Studiensitzung. Mit Python.
Einfache Möglichkeit, 0 abhängig von der Anzahl der Ziffern vorangestellt [Python]
Eine Überlegung zur Visualisierung des Anwendungsbereichs des Vorhersagemodells
Grundlagen zum Erstellen eines internen Servers für Linux (CentOS 8.1, openSUSE 15.1, Ubuntu 20.04)! Dateiserver mit Samba