tl;dr

  • In lokalen Entwicklungsumgebungen werden temporäre Dateien oft zufällig an verschiedenen Orten abgelegt

  • Die richtigen Daten zu finden und das System dahinter zu verstehen erhöht die kognitive Last

  • Die einfache Regel, alle temporären Daten und Dateien immer unterhalb eines dedizierten Verzeichnisses abzulegen, führt zu einer wesentlichen Vereinfachung der Entwicklungsarbeit

Die lokale Entwicklungsumgebung ist der Ort, wo neue Werte, Ideen und Funktionen entstehen, wenn die Developer Experience stimmt, also die Entwicklung leicht von der Hand geht. Eine häufige Aufgabe, die bei der Einrichtung der lokalen Entwicklungsumgebung auftritt, ist die Entscheidung, wo wir temporäre Daten und Dateien ablegen, die bei der Entwicklung und beim Testen entstehen, wenn ein Testsystem aufgesetzt, in ihm getestet oder Integrationstests ausgeführt werden. Gibt es auf diese Frage keine direkte und von allen geteilte Antwort, entstehen Fragen danach, wo etwas abgelegt oder gefunden wird. Wo liegen die Logfiles, mit denen das Verhalten des Systems nachvollzogen werden kann? Wo werden die Dateien für den Datenaustausch hingeschrieben oder von wo können sie geladen werden? Wo soll die PostgreSQL-Datenbank ihre Datafiles ablegen, wenn sie als Docker-Container ausgeführt wird?

In jedem Projekt wird das anders gehandhabt. Ein neues Projekt. Alles anders. Jedes Mal die gleiche Frage. Jedes Mal eine andere Antwort. Oft gibt es auch keine Antwort und dementsprechend steigt die Varianz in dem Projekt und unser Aufwand, um unsere Aufgabe zu vollbringen, wächst.

Wie wäre es mit einem Standard für die Frage: Wo kommen all die Daten und Dateien hin, die wir temporär brauchen, aber nicht unter Versionskontrolle sollen?

Hierfür einen Standard zu haben, zahlt auf zwei wesentliche Punkte in der Software-Entwicklung ein: die Developer Experience und das Prinzip Don’t make me think!.

Developer Experience

Developer Experience beschreibt die Gesamtheit aller Erfahrungen, die Entwickler bei ihrer Arbeit machen und umfasst sowohl das soziale Umfeld der Arbeit als auch die technische Ausgestaltung der Arbeitsumgebung. Die Developer Experience ist umso besser, je leichter und angenehmer sich eine Aufgabe umsetzen lässt, unabhängig von der Aufgabe an sich.

Eine positive Developer-Experience trägt positiv zur Wertsicherung und -entwicklung einer Organisation bei.

Don’t make me think!

Don’t make me think! beschreibt den Ansatz, die kognitive Last bei der Erledigung einer Aufgabe zu reduzieren, welche sich nicht direkt aus der Aufgabe selber ergibt.

Ein dediziertes Verzeichnis für Laufzeitdaten und -dateien

Die oben gestellte Frage kann einfach offen gelassen und damit im Status Quo belassen werden, durch viele einzelne Regelungen geregelt oder pragmatisch mit einer einfachen Regelung gelöst werden. Die letztere Variante sollte dabei so einfach sein, dass sie in einem einfachen Satz ausgedrückt werden kann:

Alle temporären Daten und Dateien liegen im Verzeichnis runtimedata.

Das heißt, dass alle Dateien, die wir nur während der lokalen Entwicklung brauchen und niemals unter Versionskontrolle gestellt werden sollen, sich immer unterhalb eines dedizierten Verzeichnisses befinden.

Dieses Verzeichnis hat die folgenden Eigenschaften:

  1. Es heißt runtimedata.

  2. Es befindet sich immer im Wurzelverzeichnis des Projektverzeichnisses der lokalen Entwicklungsumgebung.

  3. Es ist von der Versionsverwaltung ausgeschlossen.

Mit der Einführung dieses Verzeichnisses gibt es einen kanonischen Ort, an dem sich alle eingangs genannten Daten und Dateien ablegen und finden lassen.

Diesen kanonischen Ort zu haben bringt Vorteile, die sich sofort auszahlen:

  1. Es ist klar, wo neue temporäre Dateien abgelegt werden sollen.

  2. Es ist klar, wo temporäre Dateien gefunden werden können.

  3. Aufräumen ist leicht mittels rm -r -f runtimedata/* oder git clean -f -d -x runtimedata

Ein Beispielsetup

Wie das in einem realen Projekt aussehen kann, zeigt das folgende Beispiel aus einem meiner aktuellen Projekte.

Das geforderte Verzeichnis runtimedata befindet sich, wie in Listing 1 zu sehen, im Wurzelverzeichnis des Projektverzeichnisses.

Listing 1. Das Verzeichnis runtimedata in einem Projekt
$ tree --charset=ascii
.
|-- antora-playbook.yml
|-- antora.yml
|-- bin
|-- codebase
|-- compose.yaml
|-- database-init-files.d
|-- Dockerfile
|-- keycloak-init-files.d
|-- modules
|-- mvnw
|-- pgadmin-config-init-files.d
|-- pom.xml
|-- public-site.d
|-- run-antora.sh
`-- runtimedata        (1)

12 directories, 13 files
  1. Das Verzeichnis runtimedata in einem meiner Projekte

Das Listing 2 zeigt, dass sich im Verzeichnis alle temporären Dateien befinden, wie die Logfiles der Services, die Datafiles der Datenbank und ein Readme. Das Readme beschreibt kurz die Natur dieses Verzeichnisses, damit seine Verwendung direkt im Projekt dokumentiert ist.

Listing 2. Beispielinhalt des Verzeichnisses runtimedata
$ tree --charset=ascii -L 1  runtimedata
runtimedata/
|-- dataimport   (1)
|-- logs         (2)
|-- postgresql   (3)
`-- readme.adoc  (4)

4 directories, 1 file
  1. Verzeichnis für den Austausch von Daten mit externen Services

  2. Verzeichnis für Logdateien der Services

  3. Datafiles von PostgreSQL

  4. Ein Readme zur Verwendung des Verzeichnisses runtimedata

Der geforderte Ausschluss aus der Versionsverwaltung wird durch zwei weitere Einträge in .gitignore sichergestellt.

Listing 3. Auszug aus .gitignore für die richtige Behandlung des Verzeichnisses runtimedata
runtimedata/**           (1)
!runtimedata/**/*.adoc   (2)
  1. Ausschluss aller Dateien in diesem Verzeichnis aus Git

  2. Ausnahme für das Readme mit den Hinweisen für die Verwendung des Verzeichnisses

Fazit

Das lokale Entwicklungssetup ist einer der am meisten unterschätzten Orte für Effizienzgewinne in der Entwicklung. Durch eine einfache Regel wie die Festlegung eines kanonischen Ortes für alle temporären Dateien lässt sich die lokale Entwicklung vereinfachen. Ein Punkt weniger, über den wir nachdenken müssen und zu dem wir Entscheidungen treffen müssen, obwohl sie nichts mit der eigentlichen Wertschöpfung zu tun haben, weil wir uns auf sinnvolle und effektive Standards verlassen können. Don’t make me think!