Sechs Monate, in denen ich Bookverse allein aufgebaut habe

Es gibt eine romantische Version davon, allein Software zu bauen, in der man einen aufgeräumten Schreibtisch hat, einen Espresso, und bis zum Mittagessen etwas ausliefert, das die Leute lieben. Die Version, die ich in den letzten sechs Monaten tatsächlich gelebt habe, gleicht eher “dieselbe Nginx-Konfiguration viermal schreiben, weil dich gerade der siebte Edge Case gebissen hat.”

Dies ist eine Reflexion — keine Checkliste dessen, was ausgeliefert wurde, kein Tutorial. Nur Notizen nach sechs Monaten.

Warum ich angefangen habe

Ich hatte jahrelang ab und zu Sprachlern-Apps benutzt und etwas Bestimmtes bemerkt: Ich konnte eine 30-Tage-Serie in der beliebten gamifizierten App durchhalten und trotzdem keinen Absatz muttersprachlichen Texts lesen. Die Feedbackschleife war eng, die Gamification war geschliffen, aber die Einheit des Fortschritts war ein Satz, manchmal ein Wort. Und Sprachen zu lesen — sie wirklich zu lesen — geschieht auf der Ebene von Seiten.

Ich wollte eine App, die ein Lehrbuch wie ein Lehrbuch behandelt. Öffne Kapitel eins. Lies es. Hör es. Sprich es nach. Lerne, was hängen blieb. Morgen, Kapitel zwei.

Die Form des Produkts war vom ersten Tag an klar. Der Haken ist, dass “Form vom ersten Tag an klar” vielleicht für 5% des Softwarebauens verantwortlich ist. Die anderen 95% sind die glanzlose Mitte.

Die glanzlose Mitte

Eine nicht erschöpfende Liste von Dingen, die ich dieses Quartal getan habe und die in keinen Release Notes stehen:

  • Einen ganzen Monorepo-Pfadbaum von app_v54_01 in bookverse umbenannt (und erneut umbenannt, als ich Unterstriche im Namen der systemd-Unit haben wollte).
  • Vier Versionen einer Terraform-Konfiguration für Nginx-vhosts geschrieben, bevor ich entdeckte, dass ein null_resource-Trigger den Hash des gerenderten Templates enthalten muss, nicht nur die Eingabevariablen.
  • Eine Woche damit verbracht, herauszufinden, warum ein EXPO_PUBLIC_*-Umgebungswert im Web-Bundle zu einem leeren String aufgelöst wurde, auf iOS aber einwandfrei funktionierte. (Babels preset-expo überspringt das Inlining für node_modules. Factory-Funktionen, keine Umgebungsvariablen, in veröffentlichten Paketen.)
  • 17 Aufrufer eines API-URL-Helpers refaktoriert, weil ich ihn beim ersten Mal falsch zentralisiert hatte.

Nichts davon stünde in einem Marketing-Beitrag über die App. All das war die eigentliche Arbeit.

Wovor dich niemand bei der Solo-Entwicklung warnt: Es gibt niemanden, der die langweilige Hälfte abnimmt. Du kannst nicht sagen “das Plattform-Team kümmert sich um Deployments”, weil du das Plattform-Team bist. Du setzt jeden Hut schlecht auf, bis du ihn lange genug getragen hast, um ihn gut zu tragen.

Das Kaninchenloch der Spracherkennung

Die lehrreichste Episode der letzten sechs Monate war, die Sprechübung auf Telefonen in China zum Laufen zu bringen.

Der Plan: Tippe auf eine Zeile, höre einen Muttersprachler sie sagen, tippe erneut, nimm dich selbst auf, sieh, wie nah du dran warst. Standard-Spracherkennung für Mobilgeräte — expo-speech-recognition auf iOS, der Systemdienst auf Android, fertig.

Die Realität: Ein Teil der Zielgruppe nutzt Lenovo-Motorola-Telefone mit der Betriebssystemvariante für die Region China (das gmsconfig.china-Overlay), die die Google Mobile Services vollständig entfernt. Kein System-Speech-to-Text. Die App lief im Emulator perfekt. Auf einem Moto XT2507 in Peking stürzte sie lautlos ab.

Die Behebung dauerte etwa drei Wochen:

  1. Ein Adapter-Pattern bauen, damit die App die Sprach-Backends je nach Plattform austauschen kann — Systemerkennung, wo verfügbar, Cloud-Transkription als Fallback.
  2. Ein Cloud-Backend im Whisper-Stil hinzufügen (Alibabas qwen3-asr-flash über DashScope, da Geräte der Region China es ohne VPN erreichen können).
  3. Die Sprachaktivitätserkennung so abstimmen, dass die Aufnahme automatisch stoppt, wenn du fertig gesprochen hast. (-25-dBFS-Schwelle, 600ms-Stille-Fenster, geglättet über fünf Samples — jede andere Kombination schnitt dich mitten im Wort ab oder hörte nie auf.)
  4. Von React Natives FormData-Uploads auf uploadAsync von expo-file-system umstellen, weil RNs FormData mit Audio-Blobs auf genau diesen Geräten unzuverlässig war.

Die Hälfte dieser vier Punkte ist mehr Code, als ich in einer typischen Woche schreibe. Nichts davon ist “ein Feature.” Alles war nötig, damit das Feature für die Menschen existiert, die es brauchten.

Die Lektion — etwa alle zwei Wochen wiederholt — ist, dass der schwierige Teil selten der Teil ist, von dem man denkt, er werde schwierig. Ich hatte einen Tag für die Spracherkennung eingeplant. Es dauerte zwanzig.

Die Disziplin, fertig zu werden

Die Versuchung beim Solo-Bauen ist, dem Neuen, Glänzenden hinterherzujagen. Ein neues Feature ist aufregend. Die 47. Feinjustierung an einem bestehenden Ablauf ist es nicht. Also häufst du Features an, von denen keines so richtig fertig ist, und das Produkt fühlt sich an wie ein Friedhof halbfertiger Bauten.

Die Disziplin, die ich immer wieder neu lerne: Bring eine Sache ordentlich zu Ende, bevor du die nächste anfängst. Mandarin zuerst. Mach Mandarin wirklich gut. Dann Koreanisch. Dann Englisch. Die Plattform ist gebaut, um strukturierte Kurse zu liefern — aber der erste Kurs muss das Aushängeschild sein, der, den ein Lernender tatsächlich abschließen könnte.

Ein geplanter Koreanisch-Kurs, der zu 5% gebaut ist, hilft niemandem. Ein fertiger Mandarin-Kurs, den jemand von Anfang bis Ende lesen kann, ist ein echtes Produkt.

Dasselbe gilt für Features. Die Sprechübung stand drei Monate auf der Roadmap, bevor sie ausgeliefert wurde. Sie kam spät, aber sie kam richtig — den Fall der Region China zu behandeln war tragend dafür, dass sie nutzbar wurde, kein Feinschliff-Detail zum Aufschieben.

Was ich mir im November sagen würde

Drei Dinge, wenn ich der Version von mir, die das angefangen hat, eine Postkarte schicken könnte.

Hör auf, Dinge umzubenennen. Einen Namen am ersten Tag falsch zu wählen, ist völlig in Ordnung. Erneutes Umbenennen kostet meistens mehr, als es wert ist. (Ich habe das jetzt genau viermal getan.)

Kauf die strukturierten Bücher. Ich habe Wochen damit verbracht, zwischen Vokabellisten aus Foren hin und her zu springen. Die Standards von HSK 3.0 sind ein echtes veröffentlichtes Dokument. Die strukturierten Bücher zu kaufen und ihnen zu folgen ist schneller, als per Reverse Engineering herauszufinden, was sie abdecken.

Das Publikum ist geduldig. Ich dachte ständig, ich müsse schnell ausliefern, sonst verlieren die Leute das Interesse. Das Gegenteil ist wahr: Sprachlernende sind per Definition geduldig — sie verpflichten sich bereits zu einem Jahr Übung. Sie brauchen keine Demo am dritten Tag. Sie brauchen etwas, das am dreihundertsten Tag funktioniert.

Was als Nächstes kommt

Mandarin wächst weiter — Band 1 und Band 2 sind live, Band 3 wird gerade geprüft. Die Erstellung der Inhalte für den Koreanisch-Kurs startet, nachdem Mandarin Band 3 ausgeliefert ist. Die Plattformseite ist ruhiger als vor sechs Monaten, was bedeutet, dass mehr Zeit in die eigentlichen Lerninhalte fließt — wo sie auch hingehört.

Wenn du Bookverse nutzt: danke. Wenn nicht: öffne irgendwann ein Kapitel. Das erste ist kostenlos.

← Alle Beiträge