MVP-Entwicklung mit Gemini - ein Erfahrungsbericht

Ausgangssituation

Mir kam beim Lesen des Buchs Seductive Interaction Design von Stephen Anderson eine Idee für eine App, die mir dabei helfen soll, mit dem Rauchen aufzuhören. In meinem Kopf malte ich mir ein Konzept zusammen und überlegte, ob das erdachte Prinzip funktionieren könnte.

Schnell wurde mir klar, dass rein theoretische Überlegungen nicht ausreichen. Es ist ein witziger Gedanke, dass sich mein Gehirn etwas ausdenkt und sich damit dann selbst überlistet. Doch dafür muss die Idee in ein Produkt gepackt werden, das sich auch wirklich bedienen lässt. 

Jetzt habe ich als Produktdesigner zwar viele Berührungspunkte mit der Software-Entwicklung, aber vom richtigen Programmieren bin ich dann doch zu sehr entfernt, um meine Idee umsetzen zu können.

Die Idee

Was hatte ich mir eigentlich überlegt?

Bestehende Anti-Rauchen-Apps setzten meistens darauf, dem Nutzer vorzurechnen, wie viel Geld er spart, wenn er nicht mehr raucht. Oder Sie betonen, wie gut es für die Gesundheit ist, wenn man nicht mehr zur Zigarette greift. Da das Rauchen, wie, so oft, wenn es um eine Sucht geht, jedoch keine rationale Entscheidung ist, konnten mich diese Ansätze bisher weniger überzeugen.

Streaks

Überzeugender finde ich da das Konzept der Streaks. Dies ist im Grunde eine einfache, aber wirkungsvolle Methode, um neue Gewohnheiten aufzubauen oder unerwünschte abzulegen. Das Prinzip dahinter ist simpel: Man versucht, eine bestimmte Tätigkeit jeden Tag auszuführen, ohne einen Tag auszulassen. Jeder Tag, an dem man erfolgreich ist, verlängert die eigene Streak-Serie. Dabei motiviert einen der Fortschritt, da man sieht, wie die Anzahl der Streaks kontinuierlich wächst. Zudem vermeidet man Rückschläge, da man eine hohe Anzahl an Streaks nicht unterbrechen möchte. Mit der Zeit wird die Tätigkeit dann zur Gewohnheit, die man fast automatisch ausführt.

Jetzt gibt es einige, sehr erfolgreiche Apps, die das Streaks-Konzept abbilden, allerdings mit einem Haken – sie basieren auf zeitlichen Perioden von Tagen. Man kann also eine Serie nur mit einem ganzen rauchfreien Tag starten. Jetzt rauchen Menschen aber unterschiedlich viele Zigaretten pro Tag. Der eine muss sich pro Tag nur dreimal gegen eine Zigarette entscheiden, der andere 25 Mal, um den Beginn einer Serie zu starten. Grade für die starken Raucher entsteht so eine hohe Einstiegshürde.

Kleinteilig zum Erfolg

Mein Ansatz ist, dass jede Entscheidung gegen eine Zigarette ein Bruch der Routine ist und belohnt werden sollte. Der Nutzer drückt jedes Mal, wenn er sich gegen das Rauchen entscheidet, einen Button und bekommt diesen Erfolg visualisiert. 

Ein Levelsystem, das motiviert

Am Anfang ist das Ziel, genau ein einziges Mal nicht zu rauchen. Dadurch ist die Einstiegshürde besonders gering. Ist dies geschafft, sind noch drei weitere nicht-gerauchte-Zigaretten nötig, um ein Level aufzusteigen. Jeder Erfolg bleibt dabei für den Nutzer sichtbar und er sieht, wie oft er sich schon hintereinander gegen eine Zigarette entschieden hat. Die Ziele steigen mit den Leveln stetig, bleiben aber angesichts des bereits erreichten nie unerreichbar.

„Hallo Gemini, ich habe da eine Idee.“

Angesichts des aktuellen KI-Hypes ist es naheliegend, sich beim Programmieren Unterstützung von einer Künstlichen Intelligenz zu holen. 

Ich habe mich entschieden, für dieses Projekt Gemini Advanced zu nutzen. 

Ich beginne das Gespräch mit einer langen Nachricht, die sehr detailliert erklärt, was ich vorhabe:

  • Eine mobile App für iOS in Swift

  • Ich nutze Xcode

  • Für den Anfang braucht meine App nur eine Seite

  • Eine Beschreibung des Aufbaus der Seite. Ich habe mich für drei Bereiche entschieden: oben eine Anzeige, in der Mitte die Grafik mit den Punkten und unten zwei Buttons.

  • Dann folgt eine genaue Beschreibung der einzelnen Bereiche und die Logik, die dahintersteckt.

Es zeigt sich, dass die erste Nachricht großen Einfluss auf den weiteren Gesprächsverlauf hat. Je besser ich meine „Geschichte“ formuliere und umso umfangreicher ich sie beschreibe, desto besser werden die Antworten von Gemini. Auch im weiteren Gesprächsverlauf dient diese Geschichte als eine Art Ankerpunkt, auf den sich immer wieder bezogen wird.

Wichtig: Die Versionsnummer der verwendeten Entwicklungsumgebung sollte immer mit angegeben werden. In meinem Fall hat sich Gemini immer auf Xcode 16 Beta bezogen und viele genannten Funktionen standen mir in der Version 15.2 nicht zur Verfügung.

Einrichtung des Projekts

Auf meine erste Nachricht folgt eine Anleitung, wie ich ein solches Projekt strukturieren könnte, welche Entscheidungen getroffen werden sollten und was die nächsten Schritte sind.

Da ich noch nie in Xcode ein Projekt angelegt habe, stelle ich viele Nachfragen. Gemini antwortet mit detaillierten Antworten und ist gnädig mit mir und meinem fehlenden Wissen.

Core Data oder Swift Data?

Beim Erstellen meines Projekts kommt die Frage auf, wie ich die Daten in meiner App speichern möchte. Gemini empfiehlt mir Swift Data, ich stelle aber fest, dass diese Methode noch zu neu ist und Gemini dadurch nicht genug Informationen findet. Ich entscheide mich daher lieber für Core Data. 

„Zeige mit den gesamten benötigten Code für …“

Nach der Einrichtung meines Projekts lasse ich mir den gesamten benötigten Code von Gemini geben und füge ihn in mein Projekt ein. Die Abfrage nach dem vollständigen Code der z.B. ContentView.swift funktioniert anfangs sehr zuverlässig, erst ab ca. 300 Zeilen gibt Gemini nur noch Teilbereiche an.

Erste Erfolge

Der Anfang geht wahnsinnig schnell und ich werde übermütig. Nur eine Stunde nach meiner ersten Nachricht kann ich meinen Prototypen das erste Mal ausprobieren. Klar, optisch ist die erste Version sehr rudimentär. Aber die Logik funktioniert und ich kann die App benutzen. Ich bin völlig im Tunnel und möchte mehr.

„Lass uns die App schöner machen.“

Ab einem gewissen Punkt schlägt Gemini vor, sich auch um die UI zu kümmern. In meinem Kopf schwirren die Farben einer alten Sony VHS Hülle herum und Beige, Orange und Rot passen auch gut zum Thema Zigaretten. Es soll alles rund sein und etwas retro aussehen. Ich habe eine klare Vorstellung von der UI und schildere Gemini, was ich möchte. 

Das Anpassen der UI ist für mich deutlich leichter als Anpassungen an der Datenbank oder Logik. Der von Gemini ausgegebene Code enthält kaum Fehler und vieles kommt mir durch meine Arbeit schon bekannt vor. Gemini schlägt mir eigene Klassen für die Farben vor und eine Anleitung für das Importieren von individuellen Fonts gibt es auch dazu. 

Anfangs hatte ich mir Vorschläge für beides geben lassen, aber sie trafen dann doch nicht meinen Geschmack und ich passe sie an.

Zusätzlich füge ich einen neuen View ein, der erscheint, wenn man den „Ich habe geraucht“ Button klickt. Es soll ein Timer angezeigt werden, der 3 Minuten herunterzählt sowie ein motivierender Text.

8 Stunden später

Ich schließe mein iPhone an meinen Mac und drücke auf „Start“. Das App-Icon lädt auf meinem Startbildschirm und anschließend öffnet sich die App zum ersten Mal. Ich klicke mich durch und kann physisch ausprobieren, was ich mir noch kurz vorher ausgedacht hatte. Ich bin glücklich und auch etwas stolz. 

Sind die Grenzen erreicht?

Als der erste MVP funktionierte, wollte ich unbedingt weitermachen. Der schnelle Erfolg beflügelte die Fantasie. Was ist noch alles möglich, wenn ich weitermache?

Eine zusätzliche Seite wäre als Nächstes schön. Diese soll anzeigen, wie lange der Nutzer es geschafft hat erfolgreich auf „Keine Kippe für mich“ zu drücken, dazu soll der Nutzer noch angeben können, warum er dann doch zur Zigarette gegriffen hat. 

Was benötigen wir?

Damit wir die App dementsprechend erweitern, benötigen wir eine Tab-Bar und eine Seite, die den Verlauf anzeigt. Gemini liefert schnell den benötigten Code und erklärt die nötigen Änderungen. Ich gebe grobe Anforderungen, wie die Verlaufsseite aussehen soll. Ich drücke auf „Start“ und teste meine App.

Die UUID-Schleife

Es stellt sich schnell heraus, dass nicht korrekt gespeichert wird, wie oft der Nutzer hintereinander auf eine Zigarette verzichtet. Meine HistoryEntries aktualisieren sich mal alle auf einmal, oder gar nicht. Immer wieder scheitert es an der korrekten Zuordnung der UUID. Ich lasse meinen gesamten Code auf Fehler überprüfen und lande in einer Endlosschleife. Ich löse ein Problem und schaffe ein neues. Immer und immer wieder, über Stunden.

Wir benötigen mehr Klassen! 

Kurzfristig kann ich diese Endlosschleife durchbrechen, indem ich die Verwaltung der UUID in eine neue Klasse verschiebe. Die Freude ist unendlich groß, bis ich sie mit dem nächsten Feature wieder zunichtemache. Also nächste Idee: wir nutzen keine UUID, sondern weisen eine eigene ID zu. Also erstelle ich eine neue Klasse und löse das Problem erneut.

Gemini wird vergesslich.

Immer mehr wird die größte Schwäche von Gemini sichtbar – sie wird vergesslich. Der Gesprächsverlauf zu meinem App-Projekt ist mittlerweile schier unendlich, enthält mehrere Änderungen und Anpassungen. Am Anfang hat Gemini sich nur selten auf einen veralteten Projektstand bezogen, mittlerweile vergisst sie schon Sachverhalte, die nur ein paar Nachrichten zurückliegen. 

Es wird zäh – Willkommen im Alltag

Je weiter mein Projekt voranschreitet, desto länger dauert der Fortschritt. Ich muss aufmerksam die Antworten von Gemini prüfen und den Überblick über meinen Code behalten. Es vergehen Stunden, in denen sich meine App nicht weiter entwickelt und ich nur versuche hartnäckige Fehler zu beheben. Dabei zeigt sich ein schöner Nebeneffekt, ich lerne tatsächlich mehr über das Programmieren.

Die Kunst der richtigen Frage

Die Zusammenarbeit mit Gemini lässt sich am besten so erklären, dass man sich vorstellt, es würde ein sehr freundlicher Entwickler neben einem sitzen, mit dem man etwas bespricht. Wenn man etwas nicht versteht, fragt man einfach nach und bekommt sofort eine umfangreiche Erklärung. Und wie bei der Zusammenarbeit mit einem Menschen, ist auch hier die Fragestellung oft entscheidend.

Es kann passieren, dass man zeitweise in scheinbar endlosen Fehlerschleifen gefangen ist, da die angebliche Lösung für ein Problem, nur ein bereits gelöstes wieder hervorbringt. An diesem Punkt muss ich auf die Frage "Ich bekomme bei folgendem Code: ... diesen Fehler angezeigt: ... Wo ist der Fehler?" verzichten und nach neuen Ansätzen fragen. Dabei hilft es, Gemini aufzufordern kreativ zu werden. Entscheidend für die erfolgreiche Zusammenarbeit mit einer KI ist es, häufig nachzufragen, Sachverhalte auch mal in Frage zu stellen und sprachlich zu variieren.

Wer immer das gleiche Fragemuster benutzt, bekommt auch immer eine ähnliche Antwort. Am Ende übernimmt die KI nicht das Denken für einen.

More by Erik Lolies

View profile