2023/08/21

Zukunftssichere Gestaltung der Grundstrukturen von Evernote

Bevor wir uns mit den jüngsten Entwicklungen bei Evernote befassen, wollen wir kurz auf den Elefanten im Raum eingehen (na ja, den anderen).

Die vergangenen sieben Monate brachten viele Veränderungen mit sich, was einige Nutzer und Nutzerinnen dazu veranlasste, ihre Bedenken bezüglich unserer langfristigen Absichten für Evernote zu äußern. Um es ganz klar zu sagen: Bending Spoons hat die Zügel in die Hand genommen, um Evernote wieder in die Erfolgsspur zurückzubringen, und nicht, um schnelles Geld zu machen. Unsere langfristige Vision erforderte einige kurzfristige Einschnitte, und das ist bedauerlich. Aber es war leider auch notwendig, denn andernfalls hätte Evernote nicht überlebt, geschweige denn gedeihen können. Letztendlich wird Evernote deutlich gestärkt aus dieser Situation herausgehen. Während die Lage von Evernote vor ein paar Monaten noch ziemlich düster aussah, können wir inzwischen mit berechtigtem Optimismus in eine langfristige Zukunft blicken.

Unser Fokus liegt nun ganz darauf, Evernote zu deinem sicheren und zuverlässigen zweiten Gedächtnis zu machen. Eine schnelle, unfehlbare Datenquelle für deine wichtigsten Informationen, die du jederzeit und überall abrufen kannst. Diese Idee ist zwar nicht neu – sie war sogar die Grundlage, auf der Evernote vor fast 20 Jahren entwickelt wurde. Aber als Verantwortliche für das Unternehmen ist es unsere unmittelbare Priorität, die Basis weitaus robuster zu machen, als es bisher der Fall war, und diese seit Jahrzehnten gemeinsame Vision zu verwirklichen.

Die Frage, die sich uns stellt, ist also folgende: Wie können wir dir genau das zuverlässige und schnelle Produkt garantieren, nach dem unsere Nutzerschaft verlangt? Die Antwort ist etwas länger und nicht gerade sehr direkt, aber ich werde mein Bestes geben, um sie in diesem Blogartikel und weiteren zukünftigen Mitteilungen verständlich zu formulieren.

Noch ein letztes Wort, bevor ich beginne: Was im Folgenden beschrieben wird, ist keineswegs erschöpfend. Ich habe mich auf drei zentrale Aspekte beschränkt, aber im Hintergrund geschieht noch viel mehr, worüber du zu gegebener Zeit mehr erfahren wirst.

Ein wihtiger erster Schritt: Geschwindigkeit und Synchronisation

Jede Reise beginnt mit einem ersten Schritt. Unserer erfolgte im Mai 2023, als wir den neuen Synchronisationsprozess für die Echtzeitbearbeitung einführten. Unser Ziel bestand darin, die bislang schnellste Notizsynchronisation bei reibungsloser paralleler Bearbeitung von Notizen auf mehreren Geräten zu ermöglichen. In diesem Zusammenhang wollten wir gleichzeitig den bis dahin gelegentlich auftretenden Konflikten mit gleichen Notizen ein Ende setzen.

Für dieses ehrgeizige Projekt mussten wir eine brandneue Datenstruktur (konfliktfreie replizierte Datentypen, CRDT) einführen, die von einem effektiven Framework zur Implementierung (Yjs) getragen wird und es uns ermöglicht, den Inhalt von Notizen unverzüglich geräteübergreifend zu synchronisieren – etwas, das mit dem bisherigen HTML-artigen Format für Notizen nicht möglich war.

Ich freue mich, nun bekannt geben zu können, dass die Einführung dieser wichtigen neuen Struktur und dieses Systems erfolgreich abgeschlossen ist. Die Übergangsphase brachte zwar einige Herausforderungen mit sich, aber die Einführung von etwas so Grundlegendem wie der Echtzeitbearbeitung bringt unweigerlich die Möglichkeit von Problemen mit sich, selbst nach gründlichster Vorbereitung und präventiver Fehleranalyse. Wir waren darauf gefasst, dass es auf diesem Weg ein paar Schwierigkeiten geben würde, aber wir waren auch zuversichtlich, dass wir sie überwinden würden. Im Zuge dieser Anstrengungen haben wir eine Menge gelernt. Und für die überwiegende Mehrheit der Nutzerinnen und Nutzer läuft Evernote jetzt wesentlich flüssiger und zuverlässiger.

Geschwindigkeit: Ausbügeln der letzten Macken

Die Einführung der Synchronisation mit Echtzeitbearbeitung hat bei einigen Nutzerinnen und Nutzern von Evernote zu einer Verlangsamung der Ladegeschwindigkeit von Notizen geführt. Das war teilweise auch so zu erwarten: Denn beim erstmaligen Öffnen einer Notiz mit dem neuen Echtzeitbearbeitungssystem muss eine Notiz einen Konvertierungsprozess durchlaufen, sodass sie ein paar Sekunden zum Laden braucht. Nach diesem ersten Mal sollten die Notizen jedoch ohne Verzögerung geöffnet und synchronisiert werden.

Einzelne Nutzer und Nutzerinnen meldeten jedoch deutlich langsamere Ladezeiten für ihre Notizen, auch nachdem diese für die Echtzeitbearbeitung konvertiert worden waren. Dieses Problem wurde in einigen sehr speziellen Fällen durch die Verarbeitung der Notizen durch unser System verursacht, in denen es dazu kam, dass abnorm umfangreiche Notizverläufe erzeugt wurden. Neben den langsamen Ladezeiten für Notizen konnten wir in diesem Zusammenhang beobachten, dass dadurch auch die Wahrscheinlichkeit für andere Probleme, wie zum Beispiel fehlende Inhalte oder die mangelhafte Synchronisation von Aufgaben, zunahm.

Nachdem die Ursache identifiziert war, wurden die notwendigen Lösungen zügig umgesetzt. Dazu gehörte die Behebung von drei performancebezogenen Fehlern im Backend (die Korrekturen wurden am 15. Juni, 27. Juni und 20. Juli freigegeben, und inzwischen auch der Open-Source-Community für die Yjs-Bibliothek zur Verfügung gestellt). Nahezu umgehend war zu beobachten, dass die Ladezeiten der Notizen bei den betroffenen Konten wieder in Ordnung waren. Wir empfehlen allen, die immer noch Probleme mit den Ladezeiten haben, sicherzustellen, dass sie die neueste Version von Evernote verwenden, und sich an unseren Kundenservice zu wenden, falls das Problem weiterhin bestehen sollte.

Navigation: Wichtige Änderungen unter der Motorhaube

Einige der vorgenommenen Detailverbesserungen erfolgten in den Tiefen des Produkts, weit entfernt von den alltäglichen Anwenderaktionen im Editor. Die wichtigste davon ist die komplette Überarbeitung des Navigationssystems in den Desktopversionen von Evernote sowie in Evernote Web, die Ende Juli abgeschlossen wurde (Version 10.59). Im gleichen Zeitraum wurde auch das Navigationssystem für Mobilgeräte umfassend modernisiert (Version 10.52). Die Navigation legt maßgeblich fest, wie die verschiedenen Komponenten der Anwendung untereinander in Beziehung stehen. Auf dem Smartphone ist diese Änderung so gut wie unsichtbar, wenngleich die Navigation als leistungssteigernde Maßnahme nun auf native APIs setzt. Der einzige offensichtliche Hinweis findet sich in der neuen URL-Struktur der Desktopversionen:

www.evernote.com?b=<notebookID>&n=<noteID> →

www.evernote.com/notebook/<notebookID>/note/<noteID>

Was wie eine harmlose kosmetische Änderung aussieht, ist in Wirklichkeit der Schlüssel, der es uns ermöglicht, die Navigationsstruktur künftig problemlos zu erweitern, während sich das Produkt weiterentwickelt.

Migration eines Monolithen

Eine weitere nicht offensichtliche, aber wichtige Änderung, mit der mehrere Teams beschäftigt sind, ist die Migration des Monolithen. Hier muss ich kurz ins Detail gehen, daher bitte ich um etwas Geduld.

Der gegenwärtige Zustand

Bei dem Monolithen handelt es sich um eine alte JEE-Anwendung (Java Enterprise Edition), die für den Großteil der Unternehmensabläufe von Evernote im Backend verantwortlich ist. Als solche ermöglicht sie das Speichern und Synchronisieren verschiedener Elemente, darunter auch Notizen.

Bevor wir mit unserer Arbeit begannen, lief die Datenbank auf demselben Rechner wie die Anwendungsschicht (JEE für die Anwendung, MySQL für die Datenbank). Das machte die eingesetzten Rechner extrem belastungsintensiv und erschwerte ihre Verwaltung. Sowohl die Codebasis als auch die zugrunde liegende Infrastruktur hatten erhebliche technische Altlasten angehäuft. Zum Glück helfen uns Microservices wie die Echtzeitbearbeitung, von diesem Ansatz abzurücken.

Was als Nächstes ansteht

Unser Hauptaugenmerk liegt nun darauf, die Codebasis zu bereinigen und technische Altlasten zu beseitigen. In Bezug auf die Infrastruktur machen wir bereits große Fortschritte ‑– tatsächlich haben wir zuletzt die Software für die gesamte Produktionsinfrastruktur unter Einsatz moderner Technologien neu programmiert.

Im Zuge der Neuprogrammierung haben wir auch die Anwendung und die Datenbank voneinander getrennt. Die Datenbank wird nun auf eine neue und deutlich modernere Infrastruktur migriert, die für wesentlich mehr Sicherheit und Zuverlässigkeit sorgen wird. Bisher wurde die Konfiguration mit Puppet verwaltet, inzwischen ist alles in einem Docker-Container verpackt. Diese neue Produktivumgebung ist der Entwicklungsumgebung sehr viel ähnlicher, was für unsere Entwicklerinnen und Entwickler eine große Hilfe ist und zur Folge hat, dass sich wesentlich einfacher sicherstellen lässt, dass die vorgenommenen Änderungen auch den gewünschten Effekt haben. Kurz gesagt: weniger Fehler und schnelleres Beheben von etwaig auftretenden Fehlern.

Die Arbeit geht weiter

Im Laufe der kommenden Monate werden wir uns verstärkt um die Behebung von Fehlern kümmern, um eine reibungslose Nutzung auf allen Plattformen zu gewährleisten. Darüber hinaus planen wir, die Zuverlässigkeit der Synchronisierung von Aufgaben zu erhöhen und die Geschwindigkeit des Evernote-Clients deutlich zu steigern (ich habe bereits erste Tests mit dem Web‑Client durchgeführt, deren Ergebnisse ich hoffentlich bald mit euch teilen kann).

Und auch wenn die Grundfunktionen und das Nutzungserlebnis für uns derzeit oberste Priorität haben, bedeutet das nicht, dass die Bedeutung von Innovationen außer Acht gelassen wird. Eine kleine Gruppe von Nutzerinnen und Nutzern (Mitarbeiter und Evernote-Experten) testet bereits die KI-gestützte Suche, und das Feedback ist äußerst positiv und ermutigend. Aber unsere ehrgeizigen Pläne setzen voraus, dass die Basis grundsolide ist. Danach sind keine Grenzen mehr gesetzt.

Bis zum nächsten Mal

Federico