Entwicklungstagebuch · Teil 30

Das Feld stand die ganze Zeit da

Entwicklungstagebuch, Teil 30 · 1. September 2026, ganzer Tag

Entwicklungstagebuch, Teil 30 · 1. September 2026, ganzer Tag

Gestern waren es drei Fehler, die fehlerfrei übersetzt haben. Heute ist es eine Stufe subtiler: Code, der funktioniert und nichts sagt.

Ein Feld, das da ist und keine Beschriftung trägt. Ein Knopf, hinter dem neunzehn Reviere liegen und der aussieht wie „neu laden“. Eine Zahl in einer Tafel, die etwas anderes verspricht, als sie zeigt. Xcode sagt bei keinem davon etwas — es ist ja alles richtig geschrieben.

Warum ich mir die anderen angesehen habe

Ich habe mir heute Mittag einen Wettbewerbsvergleich geben lassen. Der Grund war nicht Neugier auf fremde Funktionslisten.

Der Grund war, dass in meiner eigenen App einzelne Bereiche nicht miteinander verknüpft waren.

Die App soll dem Eigner Arbeit abnehmen und nicht noch mehr Arbeit machen. Wer Wasser bunkert, muss die Kosten eintragen — und der Zustand des Tankinhalts muss sich ändern. Beides, aus einem Vorgang. Eine intelligente, smarte App soll entstehen, keine Sammlung von Formularen, die nebeneinander liegen und sich gegenseitig ignorieren.

Aus dem Vergleich ist mir ein Satz hängengeblieben, und ich habe ihn weitergegeben:

Die Differenzierung sollte konsequent von „mehr Funktionen“ zu „bessere, geprüfte und miteinander verstandene Daten“ verschoben werden.

Dazu habe ich geschrieben: diese Logik fehlt bei dir manchmal.

Der Wasserfall, der die Bordkasse nie erreichte

Mein Beispiel war absichtlich das einfachste, das mir eingefallen ist. Wasser bunkern, dafür bezahlen. Zwei Dinge müssen passieren, und beide gehören zu einem Vorgang.

Beim Nachsehen kam heraus: Genau das konnte die App schon — aber nur für Kraftstoff. Im Code stand wörtlich tankliste(.kraftstoff).

Frischwasser und Abwasser waren seit Monaten angelegt. Sie hatten Füllstände, Warnschwellen, Geber am Bordnetz. Und keinen einzigen Weg, fortgeschrieben zu werden — außer die Zahl unter „Mein Boot“ von Hand zu überschreiben. Die ganze Maschinerie lag daneben und wurde nicht benutzt.

Aus „Tanken“ ist „Bunkern“ geworden, mit zwei Schiebern: was, und in welche Richtung. Abwasser stellt sich von allein auf Abpumpen — die Absauganlage im Hafen kostet ja genauso Geld wie der Zapfhahn. Achtzig Liter Wasser für zwölf Euro ergeben jetzt drei Dinge auf einmal: Füllstand hoch, Ausgabe in der Bordkasse, Eintrag im Logbuch.

Und wenn mehr eingetragen wird, als hineinpasst, sagt das Blatt, wie viele Liter es nicht einträgt. Stillschweigend zu deckeln wäre dasselbe wie stillschweigend zu übernehmen: Die Zahl stimmt dann zwar, aber der Tippfehler dahinter bleibt.

Zwei Zahlen, die nichts voneinander wussten

Derselbe Gedanke, zweimal weitergedreht.

Der Luftdruck war eine Zahl. 1008 Hektopascal. Was einen Segler angeht, ist aber die zweite Zahl: 1008 nach einer ruhigen Nacht sind etwas anderes als 1008 nach 1016 am Morgen. Die Reihe dafür steht längst im Logbuch — jeder Eintrag mit Luftdruck ist eine Messung. Gelesen hat sie bis heute niemand. Jetzt steht unter dem Feld, was der Druck in den letzten sechs Stunden getan hat, mit der Zahl der Messungen und der Herkunft dabei.

Was dort nicht steht, ist eine Bewertung. Kein „Sturm kommt“. Fünf Hektopascal in drei Stunden sind eine Messung; daraus eine Warnung zu machen wäre eine Vorhersage, und dafür bräuchte es Schwellen, die niemand nachgelesen hat. Dieselbe Zurückhaltung wie bei der Douglas-Skala.

Der Stundenzähler war zweimal da. Das Bordnetz meldet die Betriebsstunden der Maschine, und unter „Mein Boot“ steht eine Zahl von Hand. Aus der rechnet die Wartungsfrist. Standen die beiden auseinander, merkte es niemand — die App hatte beide Zahlen und hat sie nie nebeneinandergelegt.

Jetzt tut sie es, mit einer Regel, die ich mir aufschreiben lassen habe:

Ein Zähler, der von 3000 auf 12 springt, ist keine Berichtigung, sondern eine Frage.

Übernommen wird deshalb nur auf Knopfdruck. Neuer Motor, getauschtes Instrument, falscher Geber — wer das stillschweigend beantwortet, verschiebt eine Wartungsfrist um Jahre, und das fällt erst auf, wenn der Motor steht.

Das Jahr, das im April anfängt

Am Nachmittag kam das, was ich vorher als „so eine Art Haushaltsbuch“ beschrieben hatte. Werft, Winterlager, Liegeplatz Wasser, Versicherung, Segelmacher, Rigger, allgemeine Instandhaltung, Neuanschaffung — dieses Frühjahr zum Beispiel ein neuer Autopilot. Es gehen halt auch mal Dinge kaputt.

Dazu habe ich gesagt: Liegeplatz Wasser immer von April bis Oktober, Winterlager November bis März.

Genau daran hängt die Entscheidung, die ich am besten finde: Das Bootsjahr läuft vom 1. April bis zum 31. März. Ein Kalenderjahr zerschneidet meine Saison in der Mitte. Das Winterlager 2026/27 stünde halb im einen und halb im anderen Jahr, und keine der beiden Zahlen wäre eine Saison.

Und dann kam die Frage, was ich mit der Zahl am 31. März eigentlich anfangen will. Die Antwort ist kürzer, als die Frage vermuten lässt:

Speichern. Das ist eine digitale Bootsakte — für einen Verkauf zum Beispiel.

Ein Boot, dessen Kosten und Arbeiten über Jahre dokumentiert sind, ist etwas anderes als eines, bei dem der Verkäufer erzählt, er habe sich gut gekümmert.

Vier Fragezeichen

Und dann wollte ich ein Winterlager eintragen.

jetzt verrate mir wo ich jahresausgaben wie winterlager eintragen soll????

Vier Fragezeichen. Die Antwort war: Bordkasse, Ausgabe erfassen, runterscrollen bis „Für wen“, das orange Wort antippen.

Das Feld stand die ganze Zeit vor mir. Es hatte nur keinen Namen.

Der Grund ist eine Zeile, die im Quelltext richtig aussieht:

Picker("Posten im Bootsjahr", selection: $wahl)
    .pickerStyle(.menu)

Da steht die Beschriftung doch. Ja — aber außerhalb eines Form zeigt ein Klappmenü nur den Wert. Der Titel bleibt unsichtbar. Auf meinem Bogen standen dadurch drei orange Wörter untereinander — „Hafen“, „Sven“, „nicht zugeordnet“ — und nichts sagte, was sie bedeuten.

Nachgesehen wurde daraufhin die ganze App. Sechzehn Stellen. Kategorie, Bezahlt von, Warengruppe, Stauort, Rolle, Bauart, Wiederkehr, Abstand — überall dasselbe.

Das ist kein Schönheitsfehler. Es ist genau das Gegenteil von dem, was ich heute Mittag beschrieben habe: Eine App, die dem Eigner Arbeit abnehmen soll, und ein Feld, das er nicht findet, obwohl es da ist, macht ihm Arbeit.

Der Posten steht jetzt oben bei Betrag und Kategorie, wo man sagt, was es war — und nicht mehr zwischen den Häkchen der Crew. Eine Werftrechnung hat mit „für wen“ nichts zu tun.

„Ohne Zuordnung“ war zweimal falsch

In der Jahresübersicht stand eine Zeile „Ohne Zuordnung · 170,00 €“. Ich habe sie als Törnzuordnung gelesen, und dazu geschrieben: Eine Törnzuordnung ergibt bei der Jahresübersicht keinen Sinn und interessiert keinen.

Beim Nachsehen war sie zweimal falsch. Erstens das Wort: „Zuordnung“ heißt in dieser App an drei anderen Stellen genau das, was ich gelesen habe. Sie heißt jetzt „Ohne Posten“.

Zweitens die Zahl. Von den 170 Euro waren 160 Euro Diesel und Essen der Crew — Geld, das geteilt und über den Ausgleich zurückgezahlt wird und mich nichts kostet. In einer Tafel mit der Überschrift „Was das Boot im Jahr kostet“ hatte es nichts verloren. Aufgeteilt wird jetzt nur, was als Bootsausgabe eingetragen ist.

Was ich am Saisonende nicht will

Mir ist noch etwas aufgefallen, das erst später weh tut: Die Ausgabenliste wird immer länger. Richtung Saisonende erleichtert das die Bedienung nicht gerade.

Ich habe gefragt, ob man das in der Kachel scrollbar machen könnte. Die Antwort war ein Nein mit Begründung, und die Begründung leuchtet mir ein: Eine Scrollfläche innerhalb einer scrollenden Seite sind zwei Scrollbereiche übereinander. Wo der Finger aufsetzt, entscheidet, welcher sich bewegt — und mit Handschuhen erwischt man regelmäßig den falschen.

Stattdessen: fünfzehn Zeilen in der Kachel, und „Alle zeigen“ öffnet ein eigenes Blatt mit Suche, Saison und Postenfilter. Der Filter „ohne Posten“ ist dabei die eigentliche Arbeit am Saisonende — er zeigt genau die Ausgaben, denen noch ein Posten fehlt.

Dasselbe Problem sehe ich beim Logbuch, und dazu hatte ich einen eigenen Vorschlag: Einträge, die einem Törn zugeordnet sind und deren Törn abgeschlossen ist, müssen auf der Seite nicht mehr sichtbar sein. Weg sind sie ja nicht — im jeweiligen Törn stehen sie auch nach Jahren noch.

Das ist so gebaut worden, und mir wurde gesagt, es sei die bessere Lösung als der Deckel nach Anzahl, den es vorher gab: Der schneidet nach Menge ab und weiß nicht, was er abschneidet. Meiner schneidet nach Bedeutung. Ein abgeschlossener Törn ist erzählt.

Darunter steht, wie viele Einträge ruhen, und ein Knopf holt sie zurück. Eine Liste, die stillschweigend etwas weglässt, ist der Anfang von „wo ist mein Eintrag hin“.

Der Knopf, der aussah wie ein Kreispfeil

Noch so ein Fall von fertig gebaut und nichts gesagt.

Ich habe gefragt, wo ich weitere Reviere laden kann, wenn ich das Revier verlasse, das ich einmal am Anfang eingegeben habe.

Es gab den Knopf. Er hieß „Revier laden“ und trug einen Kreispfeil — das Zeichen für „neu laden“. Wer 56 Häfen aus der Mecklenburger Bucht im Bestand hat und nach Bornholm will, liest das als „meine Häfen auffrischen“ und sucht woanders weiter.

Dahinter lagen die ganze Zeit neunzehn Reviere, von der Nordsee bis Estland. Der Knopf heißt jetzt „Weiteres Revier laden — 18 zur Auswahl“ und trägt ein Plus.

Die Zeile, an der das ganze Logbuch hing

Am Abend kam noch etwas, das mir vorher nicht klar war, und ich schreibe es auf, weil es mich beim Lesen kurz kalt erwischt hat.

Eine Zeile im Kern sah so aus:

anlass = try k.decode(Loganlass.self, forKey: .anlass)

Sechs Fälle kennt dieses Feld: Törnbeginn, Zeit, Strecke, Kursänderung, Törnende, Von Hand. Steht dort ein siebtes Wort — weil eine neuere Fassung der App eines erfunden hat und die Datei auf ein Gerät mit der älteren wandert, beim Abgleich also ständig —, dann scheitert der Leser des Eintrags. Und weil das Logbuch als eine Liste gelesen wird, ist dann nicht ein Eintrag weg, sondern alle. Beim nächsten Start. Ohne Meldung.

Das Tückische daran: Die naheliegende Absicherung sieht aus, als wäre sie schon da. decodeIfPresent(... ) ?? ersatz liest sich nachsichtig. Ist es aber nicht — decodeIfPresent gibt nur dann nichts zurück, wenn der Schlüssel fehlt. Steht ein unbekanntes Wort da, wirft es, und das ?? ersatz dahinter kommt nie zum Zug.

Dreiunddreißig solche Stellen gab es im Kern. Alle umgestellt. Und der Prüfer hat eine neue Regel bekommen, die die Namen der Aufzählungstypen selbst aus den Quellen holt, damit niemand eine Liste pflegen muss.

Die Regel hat in derselben Minute, in der sie entstand, zwei Stellen gefunden, die beim Durchgehen von Hand übersehen worden waren. Genau dafür sind Prüfer da — nicht um zu bestätigen, was man ohnehin weiß.

Die Bootsakte, und warum sie mir wichtig ist

Zum Schluss ein Punkt, der seit Tagen offen war.

Wir werben mit einer digitalen Bootsakte und machen es nicht. Das geht gar nicht.

Ich will nicht noch einen Ordner zu Hause haben. Das Beispiel ist immer dasselbe: die Versicherungskopie für die Werft, wegen des Winterlagers. An Bord liegt die Police, zu Hause sitze ich am Rechner, und die Werft will sie jetzt.

An jeder Dokumentzeile steht jetzt ein Teilen-Zeichen. Betreff ist der Titel, die Nachricht der Kennsatz. Mail, AirDrop, Dateien, Drucken — was das Gerät eben anbietet. Bei einem Dokument ohne Datei ist das Zeichen nicht da; ein Knopf, der ins Leere greift, ist schlimmer als keiner.

Und am Abend, als ich darüber nachgedacht habe, ist mir aufgefallen, dass ich noch weiter gehen würde. In die App gehören auch die Bedienungsanleitungen der verbauten Geräte — das Raymarine Axiom, der Wasserboiler, was sonst noch an Bord ist. Die zieht man ohnehin alle als PDF aus dem Netz.

Denn wenn ich ehrlich nachzähle, habe ich fürs Boot allein drei Ordner im Regal:

1. einen mit Anleitungen 2. einen mit Rechnungen fürs Refit 3. einen dünnen über die laufenden Kosten

Und wenn ich mir ansehe, was heute gebaut wurde, dann sind das genau diese drei Ordner. Die laufenden Kosten sind seit heute Nachmittag die Saisonübersicht. Die Refit-Rechnungen sind Bootsausgaben mit einem Posten, und sie werden später die Servicehistorie sein.

Und die Anleitungen haben ihr Fach längst: Unter Dokumente gibt es die Kategorie Handbuch, und darunter steht als Hinweis „Motor, Elektrik, Navigation“. Die Kategorie Rechnung heißt dort „Belege und Werftrechnungen“. Zwei meiner drei Ordner haben also schon ihr Fach in der App.

Was fehlt, ist nicht der Ort. Es ist die Verbindung. Eine Bedienungsanleitung ist kein Dokument mit einer Frist — sie gehört zu einem Gerät. Das Axiom hat eine Anleitung, eine Seriennummer, ein Kaufdatum, eine Garantie und irgendwann eine Rechnung über die Reparatur. Solange die App keine Liste der verbauten Anlagen führt, liegen diese fünf Dinge in fünf Listen nebeneinander statt beieinander.

Und damit bin ich wieder bei dem Satz von heute Mittag, nur eine Etage höher: Es geht nicht um mehr Funktionen. Es geht darum, dass die Daten voneinander wissen.

Und auf dem SOS-Bildschirm steht endlich der gesprochene Wortlaut und nicht nur der Merkzettel mit den Angaben. Dreimal die Anrufung, dreimal der eigene Name, Position in Grad und Dezimalminuten. Was passiert ist, steht in Klammern und wird angesagt, nicht abgelesen — die App weiß es nicht, und ein vorbelegtes Feld wird im Ernstfall unverändert vorgelesen.

Wo wir jetzt stehen

gestern Abendheute
Kern78 Dateien, 624 Prüffälle86 Dateien, 769 Prüffälle
App-Schicht62 Dateien, 42 Regeln66 Dateien, 45 Regeln
Kern-Prüfer6 Regeln8 Regeln

Dreizehn Lieferungen, alle Prüflisten abgearbeitet, kein Rückstand.

Der Satz, den ich mir aus diesem Tag mitnehme, ist der Gegensatz zu dem von gestern. Gestern: Ein Fehler, der eine Fehlermeldung erzeugt, ist der harmlose; der andere übersetzt sich sauber und tut nichts.

Heute geht es eine Stufe weiter:

Es gibt einen Fehler, der noch schwerer zu finden ist als der, der nichts tut — nämlich der, der alles richtig tut und es nur nicht sagt. Den siehst du nicht im Code. Den siehst du erst, wenn du selbst davorsitzt und nicht weiterkommst.

← Zurück zum Entwicklungstagebuch

PELARON entsteht an Bord der Bluebaerry und am Schreibtisch in Erfurt. Fragen, Widerspruch und Fehlermeldungen sind willkommen.