Kollaboratives Texteditieren gilt seit langem als eine der schwierigsten Herausforderungen bei der Entwicklung von Echtzeit-Anwendungen, in denen mehrere Nutzer gleichzeitig an demselben Dokument arbeiten. Traditionell verlässt sich die Softwareentwicklung in diesem Bereich auf zwei bewährte Konzepte: Conflict-free Replicated Data Types (CRDTs) und Operational Transformation (OT). Beide Techniken verfügen über ausgereifte theoretische Grundlagen, doch sie sind äußerst komplex und schwer zu implementieren, was ihre Integration in eigene Projekte zu einer aufwendigen Aufgabe macht. Deshalb stellt der jüngste Trend, kollaboratives Texteditieren ohne CRDTs oder OT umzusetzen, eine wegweisende Entwicklung dar, die insbesondere durch eine einfache und flexible Methode geprägt wird, die auf einer neuen Art der Kennzeichnung und Verarbeitung von Textelementen beruht. Die traditionelle Herausforderung liegt im Umgang mit parallelen Textänderungen, die gleichzeitig von verschiedenen Benutzern durchgeführt werden.
Wird zum Beispiel ein Wort an einer bestimmten Position in einem Dokument eingefügt, ist es nicht trivial, diesen Einfügevorgang auf einem gemeinsamen Server so zu interpretieren, dass die Reihenfolge und Position der Zeichen auch bei gleichzeitigen Änderungen korrekt bleibt. Wenn unterschiedliche Änderungen gleichzeitig gesendet werden, verschieben sich die Indizes der Zeichen gegenseitig, was zu Konflikten führt. Diese Herausforderung wird oft als das „Rebasieren von Indizes“ bezeichnet und fordert eine intelligente Synchronisationslogik. Die bislang etablierten Lösungen CRDTs und OT verfolgen unterschiedliche Konzepte, um dieses Problem zu beheben. CRDTs arbeiten mit global eindeutigen Identifikatoren für jedes Zeichen und einem mathematisch definierten totalen Ordnungssystem, in das die Zeichen einsortiert werden.
Dies kann beispielsweise über komplexe Baumstrukturen realisiert sein, die sicherstellen, dass alle Replikate letztendlich im selben Zustand münden, ganz gleich, in welcher Reihenfolge Operationen eintreffen. OT hingegen transformiert Operationen beim Empfang in Abhängigkeit von bereits angewandten Änderungen, sodass lokale Änderungen an den neuen Kontext angepasst werden. Beide Technologien sind technisch sehr ausgereift und werden in vielen professionellen Anwendungen eingesetzt. Allerdings ist gerade ihre Komplexität eine große Hürde bei der Implementierung und Anpassung an individuelle Anwendungsfälle. Die Algorithmen hinter den Operationen sind schwer durchschaubar, oft sind viele Spezialfälle zu berücksichtigen, und die Implementationsaufwände sind entsprechend hoch.
Zudem sind viele der existierenden Bibliotheken, die diese Techniken umsetzen, als Black-Box-Lösungen implementiert, was eine feingranulare Steuerung oder Erweiterung erschwert. Dies erweist sich zum Beispiel als nachteilig, wenn Anwendungen spezielle Features für das Dokumentmanagement wie Abschnittsbedingungen, differenzierte Benutzerrechte oder Änderungswünsche nach dem Muster von Suggestionen in Google Docs umsetzen wollen. Der innovative Ansatz zur kollaborativen Textbearbeitung ohne CRDTs oder OT setzt stattdessen auf eine einfache, aber äußerst elegante Methode: Die Verwendung von global eindeutig identifizierten Zeichen kombiniert mit einer direkten Referenzierung im Text. Jedes Zeichen im Dokument erhält eine eindeutige ID, die typischerweise als UUID generiert wird. Anstatt Operationen als etwas wie „Füge das Wort ‚the‘ an Index 17 ein“ zu formulieren, werden hier klar definierte Einfügeoperationen wie „Füge das Zeichen ‟the‟ direkt nach Zeichen mit ID X ein“ versendet.
Das bedeutet, dass die Positionierung der Einfügung sich auf ein konkretes Zeichen bezieht und nicht auf eine sich verändernde Indexposition. Diese „nach Zeichen einfügen“-Operationslogik eliminiert viele der Probleme des traditionellen Index-Rebasings, da sie den Zustand ausschließlich anhand von IDs definiert und damit einen stabilen Referenzrahmen bietet. Zusätzlich wird das Dokument intern als eine Liste von Elementen modelliert, die nicht nur das sichtbare Zeichen und seine ID enthalten, sondern auch einen Löschstatus. Gelöschte Zeichen bleiben im Datenmodell vorhanden, werden jedoch als solche gekennzeichnet und bei der Textausgabe nicht mehr angezeigt. Diese sogenannte Tombstone-Technik sorgt dafür, dass Operationen, die beispielsweise Text nach einem gelöschten Zeichen einfügen wollen, immer noch korrekt verarbeitet werden können, selbst wenn das ursprüngliche Zeichen nicht mehr sichtbar ist.
Dieses Modell zeichnet sich durch eine hohe Flexibilität aus. So können Operationen einfach interpretiert und ausgeführt werden, ohne komplexe Konfliktlösungen oder komplexe mathematische Überlegungen anstellen zu müssen. Der Server übernimmt die deutliche Rolle der Streamlining-Instanz, die alle Operationen sequentiell und wörtlich interpretiert, und ist gleichzeitig das zentrale Organ, das die Autorität über den endgültigen Dokumentzustand besitzt. Ein weiterer großer Vorteil liegt in der Unterstützung von Optimistischen lokalen Updates, oft als Server-Reconciliation bezeichnet. Dabei kann ein Benutzer seine Eingaben sofort am eigenen Client sehen, noch bevor die Aktion vom Server bestätigt wurde.
Sollte es zwischenzeitlich zu parallelen Änderungen anderer Benutzer kommen, sorgt die Reconciliation-Logik dafür, dass lokale, noch nicht bestätigte Änderungen temporär zurückgenommen, die neuen Remote-Operationen angewandt und dann die ursprünglichen lokalen Änderungen erneut eingespielt werden. Dieses Umschreiben des Zustands passiert automatisiert und sorgt für eine konsistente Benutzererfahrung, ohne dass die zugrundeliegenden Datenstrukturen sich an die komplizierten Algorithmen von CRDTs oder OT anpassen müssen. Ein sehr interessantes Phänomen der Methode zeigt sich beim gleichzeitigen Einfügen von Text an derselben Position. Die Reihenfolge der eingefügten Elemente widerspiegelt die exakte Reihenfolge, in der der Server die Operationen erhält, sodass das Ergebnis vorhersagbar und verständlich bleibt. Dabei bleiben selbst bei mehreren Parallelbearbeitern Wortgruppen oder Sätze als Einheit erhalten, anstatt zeichenweise miteinander verwechselt zu werden.
Genau diese Eigenschaft ist für Anwender besonders wichtig, da sie Klarheit und Nachvollziehbarkeit bietet und unerwartete Vermischungen vermeidet. Darüber hinaus ermöglicht der Ansatz flexible Operationen jenseits von einfachem Einfügen und Löschen. Mit Blick auf Nutzerfreundlichkeit und Weiterentwicklung sind Operationen wie „Einfügen vor einem bestimmten Zeichen“, bedingte Operationen, die bei gegebener Dokumentstruktur nur ausgeführt werden, oder Integration von Rich-Text-Formatierungen auf Basis der Zeichen-IDs denkbar. Dies eröffnet den Spielraum, individuelle Applikationslogiken zu realisieren, wie zum Beispiel das Implementieren von Änderungsvorschlägen, das differenzierte Setzen von Zugriffsrechten oder das dynamische Umordnen von Dokumentabschnitten. Bei Formatierungen in Rich-Text-Dokumenten wird die besondere Herausforderung, Bereiche zu definieren, ebenfalls durch die Verwendung von Zeichen-IDs elegant gelöst.
Statt lediglich Indizes zu speichern, wird der Formatierungsbereich über die IDs des Anfangs- und Endzeichens markiert, was besonders bei gleichzeitig eintreffenden Änderungen ein präzises und konfliktfreies Nachverfolgen von Formatierungsgrenzen ermöglicht. Zusammen mit einschlägigen Editoren wie ProseMirror wird der erforderliche Synchronisationsaufwand minimiert und Probleme wie das Vergessen oder falsche Anwenden von Formatierungen in konkurrierenden Szenarien entschärft. Dieses einfache und dennoch kraftvolle Prinzip lässt sich nicht nur mit einer zentralen Serverarchitektur kombinieren, sondern auch in dezentralen Systemen anwenden, bei denen kein einzelner Autoritätsserver mehr existiert. Die Operationen werden dann mit Zeitstempeln wie Lamport-Zeitstempeln versehen, um eine konsistente Reihenfolge sicherzustellen. In solchen Szenarien entsteht ein verteiltes Replikat des Textes, das letztlich mit den bekannten CRDT-Strukturen vergleichbar ist, aber auf einer zugänglicheren Grundlage aufbaut.
Bemerkenswert ist, dass diese Methode viele bekannte CRDT-Typen wie RGA und Fugue grundsätzlich reproduziert, jedoch ohne deren theoretische Komplexität und in einer verständlicheren Weise. Zur Unterstützung der praktischen Implementierung wurde mit „Articulated“ eine Hilfsbibliothek entwickelt. Dieses Tool liefert optimierte Datenstrukturen für die Verwaltung von Zeichen-IDs und unterstützt effizientes Einfügen, Löschen und Serialisieren. Indem IDs zu sogenannten Bunches zusammengefasst werden und die interne Struktur als B+Tree aufgebaut ist, können Operationen mit logarithmischer Komplexität durchgeführt werden. Zudem ist die Bibliothek persistent, was eine einfache Implementierung von Server-Reconciliation und Undo-Mechanismen auf Clientseite ermöglicht.
Die Vorteile dieser neuen Methodik liegen auf der Hand: Entwickler erhalten mit ihr die Möglichkeit, kollaborative Texteditoren leichter zu bauen, individuell anzupassen und zu erweitern, ohne tiefgründiges Fachwissen in CRDTs oder OT haben zu müssen. Die Entkopplung von der komplexen mathematischen Modellierung führt zu mehr Flexibilität bei der Realisierung besonderer Anforderungen und kann dazu beitragen, den Entwicklungsaufwand und Wartungskosten erheblich zu senken. Gleichzeitig bleibt die Korrektheit und Zuverlässigkeit von gleichzeitigen Änderungen sichergestellt, ohne dass Anwender darunter leiden. Die Verwendung von IDs statt Indizes verhindert inkonsistente Zustände, und die einfache Logik des Einfügens nach einem Ziel-Element reduziert Fehlerquellen signifikant. Abschließend ist zu betonen, dass dieser Ansatz für vielfältige Einsatzgebiete geeignet ist, die über das klassische Texteditor-Szenario hinausgehen.