↓Zum Hauptinhalt springen
  1. Digitale Odyssee/

LifeClock (Teil 1/2): Von Memento Mori zu Python

··1554 Wörter·8 min·
Digitale Odyssee CS50 Python Philosophie Memento-Mori Stoizismus CLI Testing Persönliches-Projekt
Simon Bernbeck
Autor
Simon Bernbeck
Software-Ingenieur und Masterstudent in Informatik an der PUC Rio de Janeiro, ursprünglich aus Deutschland. Ich schreibe über das, was ich lerne, wo ich hinreise und was es wert ist, weitergegeben zu werden.
Inhaltsverzeichnis
LifeClock - Dieser Artikel ist Teil einer Serie.
Teil : Dieser Artikel

LifeClock (Teil 1/2): Von Memento Mori zu Python
#

Tim Urbans Darstellung eines Lebens in Wochen zeigt einen langen Zeitraum in einem kleinen Raster. In seinem Artikel “Your Life in Weeks” präsentiert Tim Urban ein erschreckend kraftvolles Bild: ein Raster aus winzigen Kästchen, eines für jede Woche eines 90-jährigen Lebens. Beim Betrachten dieses Rasters wird klar: Das Leben ist keine abstrakte, endlose Weite. Es ist endlich, vollständig zählbar und überraschend kurz, wenn man es so visualisiert.

Dieses einzelne Bild inspirierte mich, ein tiefgründiges philosophisches Konzept in ein greifbares, persönliches Artefakt für mein CS50 Python-Abschlussprojekt zu verwandeln. Das Ergebnis ist “LifeClock”, ein Kommandozeilen-Tool, das ein personalisiertes “Your Life in Weeks”-Poster generiert. Dieser Beitrag führt durch die wichtigsten Erkenntnisse beim Bau, von antiker Philosophie bis zu modernem Python. Auch die technischen Entscheidungen haben geprägt, wie das Poster zum Nachdenken anregen soll.

LifeClock‑Serie: Das ist Teil 1/2. Weiter geht’s mit: LifeClock (Teil 2/2): Refactoring zu Clean Architecture.

LifeClock-Poster: Leben visualisiert als Wochen-Raster

Jedes Quadrat = eine Woche. Dunkelbraun = Vergangenheit, Rot = aktuell, Beige = Zukunft, Lila = Geburtstage.

Der Funke: Eine Idee, die es wert ist, codiert zu werden
#

Die Inspiration für LifeClock kam aus zwei Quellen. Erstens das Konzept aus Tim Urbans Artikel, der unsere Wochen als eine “winzige Handvoll” “wertvoller” Edelsteine beschreibt, die “vollständig zählbar” sind. Wenn man ein 90-jähriges Leben in ein einziges Bild komprimiert, werden die Wochen greifbar—etwa das Volumen eines Esslöffels voll Diamanten. Plötzlich trifft die Frage “Nutzt du deine Wochen optimal?” anders.

Zweitens verbindet sich dieses moderne visuelle Tool direkt mit der antiken stoischen Praxis des Memento Mori, einer lateinischen Phrase, die “Gedenke, dass du sterben wirst” bedeutet. Die Praxis soll nicht deprimierend sein. Stattdessen ist sie ein Werkzeug, um Priorität, Bedeutung und Dringlichkeit zu schaffen und uns zu ermutigen, unsere Zeit als Geschenk zu behandeln und sie nicht mit Trivialem zu verschwenden. Der stoische Gedanke des Memento Mori gab der Visualisierung für mich eine zweite Bedeutung: Sie regt dazu an, über den Umgang mit der eigenen Zeit nachzudenken.

Das Projekt wurde zu einer Übung darin, Code zu nutzen, um eine moderne Vanitas zu erschaffen—ein symbolisches Kunstwerk, das als persönliche Erinnerung an die Vergänglichkeit des Lebens dient.

Der Bauplan: Philosophie in Funktionen strukturieren
#

Die philosophische Idee in eine logische Code-Struktur zu übersetzen, war die erste technische Herausforderung. So wie der Stoizismus uns auffordert, das Kontrollierbare vom Unkontrollierbaren zu trennen, verlangt gutes Softwaredesign die Trennung der Verantwortlichkeiten eines Programms. Um das Projekt sauber und handhabbar zu halten, habe ich eine funktionale Zwei-Dateien-Architektur basierend auf dem Prinzip der Separation of Concerns übernommen. Die Logik für Benutzerinteraktion lebt in helpers.py, getrennt von der unveränderlichen Mathematik einer Lebensspanne in project.py.

Die zwei Dateien sind:

lifeclock/
├── project.py        # Kernlogik: compute_expectancy, life_stats, render_weeks_poster
├── helpers.py        # Benutzerinteraktion und Validierungs-Utilities
├── test_project.py   # 25 umfassende Tests (100% Coverage)
└── requirements.txt  # pillow, pytest

Die Kernfunktionen handhaben unterschiedliche Verantwortlichkeiten:

  • compute_expectancy(): Berechnet die Lebenserwartung basierend auf Lebensstilfaktoren
  • life_stats(): Bestimmt, wo du dich auf der Zeitlinie befindest
  • render_weeks_poster(): Verwandelt Daten in visuelle Kunst

Diese Trennung betraf nicht nur Dateien; sie erstreckte sich auf die Funktionen selbst. Die Verwendung von Features wie Keyword-Only-Argumenten machte den Code selbstdokumentierend und weniger fehleranfällig und verstärkte das Ziel, ein klares und robustes Werkzeug für Reflexion zu schaffen.

Der Motor: Die Mathematik einer Lebensspanne
#

Das Herzstück der LifeClock-Anwendung ist die Funktion compute_expectancy(). Hier werden abstrakte Lebensstilentscheidungen quantifiziert und in eine konkrete Zahl übersetzt: deine geschätzte Lebenserwartung in Jahren. Der Algorithmus beginnt mit einer Basis-Lebenserwartung und wendet dann eine Reihe von Deltas oder Anpassungen basierend auf vier wichtigen Lebensstilfaktoren an.

Das Programm verwendet folgende beispielhafte Anpassungen:

  • Aktivität: Hohe Aktivität fügt 2,0 Jahre hinzu, während niedriges Aktivitätsniveau 2,0 Jahre abzieht
  • Rauchen: Eine starke Rauchgewohnheit zieht signifikante 8,0 Jahre ab
  • Schlaf: Weniger als 6 Stunden Schlaf ziehen 1,0 Jahr ab, während optimaler Schlaf (6-9 Stunden) bescheidene ein halbes Jahr hinzufügt
  • BMI: Ein gesunder BMI (18,5-25) fügt 0,5 Jahre hinzu, während ein adipöser (≥30) 3,0 Jahre abzieht

Nachdem alle Deltas angewendet wurden, wird die finale berechnete Lebenserwartung auf einen Bereich zwischen 40 und 120 Jahren begrenzt. Dies stellt sicher, dass die finale Ausgabe innerhalb einer realistischen menschlichen Lebensspanne bleibt.

# Vereinfachtes Beispiel für Lebensstil-Anpassungen
delta = 0.0
if activity == "high": delta += 2.0
if smoking == "heavy": delta -= 8.0
if sleep_hours < 6: delta -= 1.0
# ... (BMI-Berechnungen)
adjusted = baseline + delta
return max(40, min(120, adjusted))  # Auf realistischen Bereich begrenzen

Diese Zahlen sind Gestaltungsentscheidungen für ein Poster zur Reflexion, keine medizinisch validierte Vorhersage der Lebensdauer. Das Ergebnis ist keine Gesundheitsberatung.

Die Überraschung: Der kontraintuitive Drift eines Geburtstags
#

Eine der überraschendsten Entdeckungen während der Entwicklung war eine visuelle Besonderheit im finalen Poster: Die lila Quadrate, die Geburtstage markieren, fallen nicht jedes Jahr in dieselbe Wochen-Spalte. Stattdessen driften sie diagonal über das Raster im Laufe der Zeit und erzeugen ein subtiles “Treppen”-Muster.

Der Grund für diesen “Drift” ist simple Mathematik:

  • Ein reguläres Jahr hat 365 Tage, was genau 52 Wochen plus 1 zusätzlichem Tag entspricht
  • Ein Schaltjahr hat 366 Tage, was 52 Wochen plus 2 zusätzlichen Tagen entspricht

Diese zusätzlichen Tage akkumulieren sich Jahr für Jahr. Ungefähr alle 5-6 Jahre summieren sich die akkumulierten Offsets zu einer vollen Woche, wodurch das Geburtstagsquadrat in die nächste Spalte verschoben wird. Dies erzeugt ein sichtbares “Treppen”-Muster auf dem Poster. Dies erforderte eine spezifische Hilfsfunktion, safe_birthday(), um die Logik zu handhaben, einen 29. Februar-Geburtstag auf den 28. Februar in Nicht-Schaltjahren abzubilden—ein perfektes Beispiel dafür, wie eine philosophische Beobachtung eine konkrete Programmierherausforderung schafft.

Zum Leben erwecken: Visuelle Implementierung
#

Die Poster-Generierung verwendet Pythons Pillow (PIL)-Bibliothek, um berechnete Daten in visuelle Kunst zu verwandeln. Das Grid-Layout ist sorgfältig gestaltet:

  • 52 Spalten repräsentieren Wochen pro Jahr
  • 16×16 Pixel Zellen für Klarheit ohne überwältigende Details
  • Farbcodierte Quadrate: Dunkelbraun für vergangene Wochen, leuchtendes Rot für deine aktuelle Woche, helles Beige für zukünftige Wochen und Lila zur Hervorhebung von Geburtstagen durch deine gesamte Zeitlinie
  • Rechtsbündiges Statistik-Panel zeigt deine Lebensmetriken auf einen Blick

Die Rendering-Logik iteriert durch jede Woche deiner berechneten Lebensspanne und weist Farben basierend darauf zu, ob diese Woche in deiner Vergangenheit, Gegenwart oder Zukunft liegt. Geburtstagwochen erhalten spezielle lila Hervorhebung.

# Jede Woche basierend auf Zeitposition einfärben
for week_index in range(total_weeks):
    if week_index in birthday_weeks:
        color = purple
    elif week_index < current_week:
        color = dark_brown
    elif week_index == current_week:
        color = red
    else:
        color = tan
    draw.rectangle([x0, y0, x1, y1], fill=color)

Die Rendering-Logik beinhaltet intelligente Fallbacks—sie versucht, die Arial-Schriftart deines Systems zu verwenden, fällt aber elegant auf Pillow-Standardwerte zurück für plattformübergreifende Kompatibilität. Das Ergebnis ist ein personalisiertes PNG-Poster, das sowohl als Datenvisualisierung als auch als philosophisches Artefakt dient.

Der Beweis: Mit Vertrauen durch Testing bauen
#

Eine Schlüsselanforderung des CS50-Projekts war es, Tests für unseren Code zu schreiben, und dies erwies sich als einer der wertvollsten Teile des Entwicklungsprozesses. Das Projekt umfasst eine umfassende Test-Suite in test_project.py mit insgesamt 25 Tests. Diese Tests decken die Kernfunktionen in project.py ab und prüfen die von den Tests erfassten Abläufe. Sie verifizieren:

  • Berechnungsgenauigkeit: Bestätigung, dass die Lebenserwartungs-Deltas und Lebensstatistiken korrekt berechnet werden
  • Grenzbedingungen: Überprüfung, dass der Clamping-Mechanismus für Lebenserwartung an seinen Minimum- (40) und Maximum- (120) Grenzen funktioniert
  • Edge Cases: Testen kniffliger Edge Cases, wie sicherzustellen, dass eine am 29. Februar geborene Person ihren Geburtstag in gewöhnlichen Jahren korrekt plotten lässt, um zu verhindern, dass die Logik bei ungewöhnlichen Eingaben fehlschlägt

Die Verwendung des pytest-Frameworks zur Implementierung eines Test-Driven Development (TDD)-Ansatzes lieferte immenses Vertrauen. Die Testabdeckung half beim Refactoring. Sie beweist weder die medizinische Aussagekraft des beispielhaften Modells noch verhindert sie jeden Fehler.

Die CS50-Reise
#

Dieses Projekt wurde für Harvards CS50 Introduction to Programming with Python gebaut, einen intensiven Kurs, der Programmiergrundlagen durch praktische Projekte lehrt. Die Anforderungen an das Abschlussprojekt verlangten Originalität, umfassendes Testing und eine Video-Demonstration, die die Implementierung erklärt.

LifeClock verband für mich eine Programmieraufgabe mit der Frage, wie ich meine Zeit nutze.

In Aktion sehen
#

Sieh dir die vollständige Demonstration von LifeClock in Aktion an, von Kommandozeilen-Prompts bis zur finalen Poster-Generierung:

Das Video führt durch die interaktiven Prompts, Lebensstilfaktor-Berechnungen und den überraschenden Moment, wenn dein Leben als Raster farbiger Quadrate erscheint—jedes repräsentiert eine Woche, die du gelebt hast oder noch erleben wirst.

Das Projekt selbst erkunden
#

Für diejenigen, die tiefer in den Code eintauchen oder die Anwendung selbst ausführen möchten, hier die Projekt-Ressourcen:

  • GitHub Repository: Sims2k/LifeClock
  • Video Demo: YouTube
  • Erforderliche Bibliotheken: Um das Projekt auszuführen, benötigst du pillow für Bildgenerierung und pytest für das Ausführen der Test-Suite

Um das Projekt auszuführen:

cd lifeclock
pip install -r requirements.txt
python project.py

Das Tool führt dich durch eine Reihe von Prompts über dein Geburtsdatum und Lebensstilfaktoren und generiert dann dein personalisiertes Poster.

Zusätzliche Ressourcen:

Deine Zeit, die Wochen zu füllen
#

Dieses Projekt war eine Reise von den tiefgründigen Ideen Tim Urbans und antiker stoischer Philosophen zu einer funktionalen Python-Anwendung. Es demonstriert, wie Programmieren ein mächtiges Medium sein kann, um abstrakte Konzepte über unser eigenes Leben zu erkunden und mit ihnen zu interagieren. Das fertige Poster nutze ich als Anstoß zum Nachdenken.

Das Raster sagt mir nicht, wie lange ich leben werde. Es macht nur sichtbar, wie Wochen vergehen. Das genügte, um aus der Programmieraufgabe etwas Persönliches zu machen.


Dieser Artikel ist Teil meiner Digital Odyssey-Reihe, in der ich technische Projekte dokumentiere, die Philosophie, Produktivität und persönliches Wachstum verbinden. LifeClock war mein CS50 Python-Abschlussprojekt, als CS50-Python-Abschlussprojekt entwickelt.

LifeClock - Dieser Artikel ist Teil einer Serie.
Teil : Dieser Artikel

Verwandte Artikel

LifeClock (Teil 2/2): Refactoring zu Clean Architecture
··5326 Wörter·26 min
Digitale Odyssee Clean-Architecture Python Refactoring Software-Design LifeClock Testing Architecture
Lokales WebDAV für Zotero unter Windows: Sync, Grenzen und Backup
··723 Wörter·4 min
Digitale Odyssee Zotero WebDAV Docker Windows-11 Forschungstools Self-Hosting Guide Wissensmanagement