Gebaut.
Ausgeliefert.
Und der Markt kam nie.
Bei HappyTausch konnten Menschen Dinge — vor allem Bücher, dazu Gutscheine und Veranstaltungen — als Nadeln auf einer Karte anbieten, zum Tauschen oder Verschenken. Schlichtes PHP von 2020: kein Framework, kein Redaktionssystem, drei Umgebungen und ein geplanter Job, der aufräumt.
Es funktioniert. Es nutzt fast niemand. Wir führen diese Akte, weil ein Portfolio aus Erfolgen einem Leser nichts über Urteilsvermögen verrät — und weil das Interessante an einer Enttäuschung ist, welche Entscheidungen tatsächlich schuld waren. Meist weniger, als man erwartet.
- Status
- Ruhend
- Art
- Verbraucher-Marktplatz
- Gebaut
- 2020
- Stack
- PHP, ohne Framework
- Umgebungen
- 3, eine Datenbank
- Lehre
- Aktivierung, nicht Anmeldungen
- hielt eine Datenbank, drei Umgebungen richtigEin Tabellen-Präfix je Umgebung, gewählt über den Hostnamen. Ein Schema zu migrieren, und eine Testumgebung, die wirklich identisch ist.
- hielt kein Framework richtig2020 diskutabel, seither bestätigt: der Code läuft auf einem aktuellen PHP, ohne dass eine Framework-Migration im Weg steht.
- hielt langweilige geplante Jobs richtigDrei Takte, schlichte Protokolle. Nichts Cleveres, nichts das je Aufmerksamkeit gebraucht hätte.
- scheiterte das Angebot kommt von selbst falschEinstellen ist kostenlos, also stellen Menschen ein. Tatsächlich kostet Einstellen Mühe, und der Nutzen ist unsichtbar, bis jemand anders zuerst eingestellt hat.
- fehlgelesen Anmeldungen bedeuten Interesse falschMenschen meldeten sich an. Anmelden ist nicht Nutzen — und wir ließen uns von dieser Zahl zu lange beruhigen.
Drei davon sehen sechs Jahre später immer noch richtig aus. Die gescheiterte war nicht technisch — und keine Menge Entwicklung hätte sie gerettet.
Ausgangslage Warum es diese Akte gibt § 01
Der Bau war nicht das Problem. Das ist der unangenehme Teil.
Es wäre schmeichelhafter zu schreiben, uns sei die Zeit ausgegangen, oder der Stack sei schlecht gealtert, oder irgendeine technische Schuld habe uns eingeholt. Nichts davon stimmt. Die Software tut, wozu sie entworfen wurde, auf einem aktuellen PHP, sechs Jahre später, ohne dass eine Migration darüber hinge.
Gescheitert ist eine Produktannahme, und sie scheiterte leise. Eine Tauschplattform ist ein zweiseitiger Markt: niemand kommt, um eine leere Karte zu durchstöbern, und niemand stellt auf eine leere Karte ein. Wir nahmen an, dass Angebot entsteht, weil Einstellen kostenlos und einfach ist. Kostenlos und einfach waren nicht die Hürde. Sinnlos wirkend war die Hürde.
Wir veröffentlichen die Entscheidungen statt der Kennzahlen, denn die Zahlen würden Ihnen nur sagen, dass es nicht funktioniert hat. Die Entscheidungen sagen Ihnen, wie wir denken — und das ist es, was Sie tatsächlich einkaufen würden.
Bestand Was gebaut wurde § 02
Entscheidungen Was wir wählten, und wie es alterte § 03
Drei Entscheide, sechs Jahre Rückblick.
Eine Datenbank, drei Umgebungen, gewählt über den Hostnamen.
Entwicklung, Test und Produktion teilen sich ein Schema und werden über ein Tabellen-Präfix getrennt, ausgewählt anhand des Hostnamens, unter dem die Anfrage eintraf. Das ist nicht die Lehrbuchlösung, und es bündelt das ganze Risiko in einem kleinen Stück Code.
Genau deshalb bekam dieses Stück Code die Sorgfalt. In sechs Jahren hat es nie Umgebungen vermischt, und es gab immer nur ein Schema zu migrieren.
Kostet: eine einzelne Stelle, an der ein Fehler ernst wäre statt nur ärgerlich.
Gealtert: gut. Die Testumgebung ist wirklich identisch mit der Produktion — was die wenigsten Drei-Umgebungen-Aufbauten von sich behaupten können.
Bewusst kein Framework.
2020 wirkte das konservativ bis stur. Die Rechnung kam sofort: Routing, Validierung und Templating mussten geschrieben statt geerbt werden.
Der Ertrag kam später und leise. Es gab keinen Framework-Upgrade-Pfad zu gehen, keine Hauptversion die Unterstützung fallen ließ, keine Ökosystem-Unruhe abzufedern. Ein ruhendes Projekt auf einem Framework ist eine Last; ein ruhendes Projekt auf der Standardbibliothek schläft nur.
Kostet: mehr handgeschriebenen Code am Anfang, und keine Community-Antworten zum Nachschlagen.
Gealtert: gut — auch wenn wir es für ein Produkt mit einem echten Team dahinter nicht wiederholen würden.
Wir haben die Karte perfektioniert. Das war das Falsche.
Die Karte mit ihren Nadeln war der angenehme Teil zu bauen und der Teil, der auf einem Bildschirmfoto gut aussah. Sie war nicht der Teil, den eine mögliche Nutzerin abwog, als sie entschied, ob sich der Aufwand lohnt.
Was wir heute täten: den kleinstmöglichen Einstell-Ablauf bauen, ihn dreißig Menschen vorlegen und messen, wie viele ihn abschließen — bevor irgendetwas entsteht, das sich gut fotografieren lässt.
Kostet: Aufwand an einer Stelle, an der er das Ergebnis nicht bewegen konnte.
Gealtert: schlecht, und nützlich. Das ist die Lehre, die wir tatsächlich in Kundenprojekte mitnehmen.
Nachbetrachtung Was tatsächlich schiefging § 04
Nichts ging kaputt. Genau das war das Problem.
Produkt
Anmeldungen kamen. Aktivierung nicht.
Menschen meldeten sich an und hörten dann auf. Sehr wenige gingen den Schritt zu Ende, bei dem sie ein kleines Stück Arbeit für eine fremde Person hätten leisten müssen. Die Einträge, die entstanden, sammelten sich in einer engen Kategorie — was viel früher als Signal hätte gelesen werden müssen.
Was wir angenommen hatten: dass Anmeldungen Interesse messen. Sie messen Neugier. Der Schritt, den zu instrumentieren sich lohnt, ist der erste, bei dem jemand etwas geben muss, bevor er etwas bekommt — und in einem zweiseitigen Markt ist dieser Schritt das ganze Produkt.
Schluss → wir hörten auf, Funktionen hinzuzufügen. Nicht jedes Projekt verdient eine Rettung, und das früh zu erkennen ist mehr wert als die Rettung gewesen wäre. Die Plattform läuft weiter; wir hörten nur auf, so zu tun, als wäre mehr Code die Antwort.
Übertrag Was das für Sie bedeutet § 05
Die lehrreichen Fehlermodi sind selten die technischen.
Zweiseitige Märkte scheitern an der Angebotsseite
Nachfrage lässt sich simulieren, leihen oder kaufen. Angebot muss man sich Beitrag für Beitrag verdienen — und dort sterben diese Produkte. Testen Sie diese Seite zuerst, mit etwas peinlich Kleinem.
Den ersten Moment echter Mühe messen
Anmeldungen messen Neugier. Die Zahl mit Aussagekraft ist, wie viele Menschen den ersten Schritt abschließen, der sie etwas kostet. Wenn Sie nur einen Trichter-Schritt verfolgen, dann diesen.
Ein langweiliger Stack altert besser als ein modischer
Sechs Jahre später läuft dieser Code auf einer aktuellen Laufzeitumgebung ohne Migrationsschulden. Für alles, was Sie eine Weile in Ruhe lassen müssen, ist diese Eigenschaft mehr wert als Entwicklerkomfort am ersten Tag.