Wie wir Software bauen, die man übernehmen kann
Am Anfang steht der reale Ablauf, nicht ein Funktionskatalog. Wir lesen die vorhandene Tabelle oder das Access-Backend, prüfen das bestehende Datenbankschema und sehen den Personen bei der Arbeit zu, die das Werkzeug später benutzen. Daraus entsteht ein schriftlich fixiertes Domänenmodell mit Begriffen, die im Unternehmen tatsächlich verwendet werden, und eine bewusst kleine erste Ausbaustufe, die produktiv gehen kann.
Fachlogik bleibt von Framework, HTTP und Benutzeroberfläche getrennt, damit sie ohne laufenden Server prüfbar ist. Datenintegrität gehört ins Schema: Fremdschlüssel, NOT NULL, CHECK-Constraints und eindeutige Indizes in PostgreSQL 17 statt Regeln, die nur im Anwendungscode existieren. Schemaänderungen laufen ausschließlich über versionierte Migrationsdateien im Repository, sodass jede Umgebung denselben Weg nimmt – auch die Entwicklungsdatenbank einer neuen Kollegin.
Getestet wird dort, wo Fehler teuer sind: Domänenlogik über Unit-Tests, Persistenz und Schnittstellen über Integrationstests gegen eine echte PostgreSQL-Instanz im Container statt gegen Attrappen. Die Pipeline führt bei jedem Push Linter, statische Analyse – tsc, mypy oder go vet – und die vollständige Testsuite aus. Ein Build, der durchläuft, ist damit eine belastbare Aussage und kein Ritual.
Betreibbarkeit ist Teil der Entwicklung. Konfiguration kommt aus Umgebungsvariablen, Logs sind strukturiert, ein Health-Endpunkt macht den Zustand abfragbar, und der Start erfolgt lokal wie in Produktion über dieselben Container-Images. Im Repository liegen README, Migrationen, Testdaten und kurze Entscheidungsnotizen unter docs/adr, die festhalten, warum eine Variante gewählt wurde. Übergabe heißt dann Lesen und Nachfragen statt Rekonstruktion.