Psychic Debugging
Der aktuelle Aufdruck auf den Studentenausweisen sieht ein wenig ungewöhnlich aus:
Falls man es nicht lesen kann: es ist dort das "WS10/011" angegeben. 011? Das ist ziemlich seltsam. Offensichtlich wird dort eine Null zuviel angefügt? Wie kann das passieren?
(Nur damit es klar ist: Ich weiß nicht was wirklich los ist. Aber der folgende Weg erscheint mir wahrscheinlich. Der Code ist Ruby, sollte aber leicht zu verstehen sein.)
Pre-2k
Die letzten zwei Stellen des Jahres zu bekommen war bis zum Jahr 2000 ziemlich leicht: Es reichte einfach die Jahreszahl modulo 100 zu rechnen. Der Modulo-Operator gibt einem grob gesagt den Rest einer Division zurück und verhält sich in etwa wie die Zeitdarstellung auf einer Uhr: Sowohl bei 13 Uhr als auch bei ein Uhr wird eine eins angezeigt, da 13 / 12 = 1, Rest 1 ist (und 1 / 12 = 0, Rest 1). Wenn man also etwa 1999 modulo 100 rechnet kommt die 99 heraus – genau was wir haben wollen! Die erste Variante der "Jahr-zu-zwei-Stellen-Funktion" sah wahrscheinlich so aus:def year_for_printing(year)
return year % 100
end2000+
Ab dem Jahr 2000 funktionierte das aber nicht mehr, da 2000 % 100 einfach Null ergibt, also nur noch einstellig ist! Ich schätze der Fehler wurde wie folgt repariert:def year_for_printing(year)
if year
Man hat also wohl einfach einen Zweig hinzugefügt, der bei den Jahren ab 2000 eine Null zum Ergebnis hinzufügt. Der Code gibt richtig aus: "WS 99/00". Das wird zehn Jahre gut gehen! Nämlich bis zum Jahre 2010...
Hochspekulativer Zwischenschritt
Der folgende Schritt erscheint einfacher möglich wenn folgendes innerhalb dieser zehn Jahre passierte: Jemand hat sich die Funktion angeschaut und gesehen, dass sie den unnötigen Fall "vor dem Jahr 2000" abdeckt und diesen entfernt. Die neue Funktion sah also so aus:
def year_for_printing(year)
return "0" + (year % 100).to_s
end
Die Argumentation ist zwar noch schlüssig wenn dieser Schritt fehlt, wirkt aber mit ihm wahrscheinlicher.
2010, 2011
Als das Jahr 2010 anbrach wurde die Ausgabe wieder falsch: Der Code gibt jetzt "010" zurück. Das steht aber offensichtlich nicht auf den Ausweisen. Ich schätze dass dem Programmierer der Auftrag gegeben wurde, den Fehler für das Jahr 2010 zu beheben. Er hat die Funktion wohl so abgeändert:
def year_for_printing(year)
if year == 2010
return year % 100
else
return "0" + (year % 100).to_s
end
end
Dieser Code gibt richtig aus: "WS09/10". Es scheint also alles seine Richtigkeit zu haben! Aber beim Jahr 2011 gibt dieser Code auch genau das aus, was jetzt auf unseren Karten zu lesen ist: "WS10/011". Und das hat anscheinend noch niemand gemerkt. Oder nicht für wichtig genug gehalten.
Hier mein Bugfix für den Code. Ich gehe mal davon aus dass das System ein Embedded-System ohne Datumsfunktionen ist (denn diese sollte man benutzen, wenn sie vorhanden sind!).
def year_for_printing(year)
res = year % 100
if res
Dieser Code gibt für jedes Jahr den richtigen Wert aus. Wenn ihr das Spiel gerne weitertreiben wollt, dann ersetzt einfach "year == 2010" durch "year >= 2010" und ihr habt wieder Code der nur die nächsten 10 Jahre richtig ist.
Habt ihr eine andere Erklärungsmöglichkeit?