Zum Hauptinhalt springen
  1. Digital Odyssey/

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

·1629 Wörter·8 min·
Digital Odyssey CS50 Python Philosophie Memento-Mori Stoizismus CLI Testing Persönliches-Projekt
Simon Bernbeck
Autor
Simon Bernbeck
Deutscher Digital Nomad in Rio de Janeiro - KI-Student, Reisender und Philosoph
Inhaltsverzeichnis
LifeClock - Dieser Artikel ist Teil einer Serie.
Teil : Dieser Artikel

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

Hast du jemals dein gesamtes Leben auf einem einzigen Blatt Papier gesehen? 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. Es geht nicht nur ums Programmieren; es geht darum, Code als Linse zu nutzen, um das eigene Leben zu untersuchen.

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. Wie der Philosoph Marcus Aurelius schrieb:

“Du könntest das Leben jetzt verlassen. Lass das bestimmen, was du tust, sagst und denkst.”

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 Modell ist überraschend nuanciert:

  • 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

Dieses Modell demonstriert, wie kleine tägliche Entscheidungen—eine Stunde Bewegung, sieben Stunden Schlaf, eine vermiedene Zigarette—sich zu Jahren Lebenserwartung summieren.

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 stellen sicher, dass jedes Stück der Anwendung wie beabsichtigt funktioniert. 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. Mit 100% Test-Coverage der Kernlogik konnte ich die komplexen Berechnungs- und Rendering-Engines modifizieren oder refaktorieren, wissend, dass die Test-Suite sofort jede Regression erkennen würde.

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 übertraf diese Anforderungen, indem es technische Tiefe mit philosophischer Bedeutung kombinierte. Es ist nicht nur ein funktionales Tool—es ist ein Gesprächsstarter über Sterblichkeit, Zeit und wie wir unsere endlichen Wochen zu verbringen wählen.

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 finale Poster ist mehr als nur ein Bild; es ist ein personalisiertes Werkzeug für Reflexion.

Tim Urban berechnete, dass alle 4.680 Wochen eines 90-jährigen Lebens etwa einem Esslöffel Diamanten entsprechen. Das Raster aus Kästchen—einige gefüllt, einige leer—liegt bei uns, es weise zu nutzen. Dieses Projekt war meine Art, einige davon zu füllen, nicht nur mit Code, sondern mit Bedeutung.

Die Stoiker hatten recht: Sich zu erinnern, dass wir sterben werden, macht uns nicht morbide. Es macht uns intentional. Was wirst du mit deinen verbleibenden Diamanten bauen?


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, abgeschlossen 2026.

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

Verwandte Artikel

LifeClock (Teil 2/2): Refactoring zu Clean Architecture
·5432 Wörter·26 min
Digital Odyssey Clean-Architecture Python Refactoring Software-Design LifeClock Testing Architecture
Eigenen lokalen WebDAV-Server für Zotero aufsetzen (Windows 11)
·1244 Wörter·6 min
Digital Odyssey Zotero WebDAV Docker Windows-11 Forschungstools Self-Hosting Guide Wissensmanagement