Die kontinuierliche Weiterentwicklung von Software ist in Unternehmen jeder Größe eine Herausforderung, insbesondere wenn es darum geht, Abhängigkeiten und Bibliotheken stets aktuell zu halten. Gerade in großen Organisationen mit zahlreichen Frontend-Microservices wird die manuelle Anpassung an neue Versionen schnell zu einem zeitraubenden und fehleranfälligen Prozess. Lyft, eines der führenden Technologieunternehmen im Mobilitätssektor, hat dieses Problem erkannt und mit der Entwicklung einer eigenen Codemod-Plattform eine innovative Lösung geschaffen, die den gesamten Upgrade-Prozess automatisiert und vereinfacht. Die Codemod-Plattform bei Lyft entstand aus dem Bedürfnis, technische Altlasten effizient zu beseitigen und gleichzeitig die Entwicklerproduktivität zu steigern. Während die Einführung neuer Features in der Softwareentwicklung meist höchste Priorität hat, führt das Vernachlässigen von Abhängigkeits-Updates zu langfristig höheren Kosten und erschwert die Wartung.
Indem Lyft eine Plattform entwickelte, die automatisch Code-Transformationen – sogenannte Codemods – durchführt, können APIs und Bibliotheken ohne manuellen Aufwand auf den neuesten Stand gebracht werden. Codemods sind dabei Skripte, welche Quellcode analysieren und gezielt verändern. Sie arbeiten auf Basis des Abstract Syntax Tree (AST), einer abstrakten Baumstruktur, die den Quellcode in einzelne Komponenten zerlegt und so präzise Manipulationen ermöglicht. Während es bereits mehrere Werkzeuge im Open-Source-Bereich gab, entschied sich Lyft für jscodeshift als Grundlage, da es parsing, Transformation und Writing integriert vereint und zudem TypeScript, JSX und JavaScript unterstützt. Die Plattform bietet Lyft spezifisch eine Reihe von Vorteilen, die den Unterschied in der Anwendung und Skalierbarkeit ausmachen.
Eine der größten Herausforderungen war es, die Flexibilität zu gewährleisten, sodass nicht nur einzelne Codemods ausgeführt werden können, sondern auch Abhängigkeiten zwischen Transformationen berücksichtigt werden. Durch die Möglichkeit, mehrere Transformationen zu verketten und eigene Upgradeklassen zu definieren, wurde eine modulare Struktur geschaffen, die große Komplexität bewältigt und gleichzeitig robust bleibt. Ein weiteres wichtiges Element ist die sogenannte Eligibility-Prüfung. Diese Funktion sorgt dafür, dass Codemods nur auf diejenigen Microservices angewandt werden, die die entsprechende Abhängigkeit auch tatsächlich nutzen. Das spart wertvolle Ressourcen in der Integration und verhindert unnötige Codeänderungen in nicht betroffenen Repositories.
Lyft ging zudem einen Schritt weiter, indem mit Evergreen-Codemods ein Mechanismus entwickelte wurde, der vor und nach einer Transformation notwendige Voraussetzungen automatisch verwaltet. So wird beispielsweise bei einem Upgrade der internen Bibliothek @lyft/service sichergestellt, dass vor der Anwendung des Codemods alle nötigen Pakete wie Sass installiert sind, um Fehler durch fehlende Abhängigkeiten zu vermeiden. Durch diese proaktiven Prüfungen kann der Upgrade-Prozess komplett automatisiert und extrem zuverlässig gestaltet werden. Die Plattform wurde zudem um die Fähigkeit erweitert, nicht nur JavaScript- und TypeScript-Code, sondern auch andere Dateien wie YAML, JSON oder .env-Dateien zu transformieren.
Damit umfasst die Automatisierung auch Konfigurationsänderungen und Umgebungsvariablen, was die Anwendbarkeit der Codemods erheblich steigert und den Wartungsaufwand in verschiedensten Bereichen der Entwicklung verringert. Eine klare und durchgängige Namenskonvention wurde bei der Entwicklung der Codemod-Plattform ebenfalls eingeführt. Indem Transformationen transparent benannt werden, beispielsweise mit dem Format verb-nomen und der Ergänzung der Version, wird die Bedienung intuitiver und die Wartung erleichtert. Auch wurde festgelegt, nur bestimmte Zeichen zu nutzen, um Versionskonflikte und Verwechslungen zu vermeiden. Dies unterstützt eine einheitliche und skalierbare Verwaltung der zahlreichen Codemods, die zum Einsatz kommen.
Durch die Integration bekannter Open-Source-Codemods, etwa von Next.js oder React, konnte Lyft zudem viel Entwicklungserfahrung wiederverwenden und die eigene Plattform gleichzeitig mit umfangreichen, erprobten Transformationen erweitern. Dies verdeutlicht den pragmatischen Ansatz bei der Entwicklung, der bewährte Tools nicht ersetzt, sondern sinnvoll ergänzt. Für Entwickler bietet die Codemod-Plattform eine CLI (Command Line Interface) an, die sich unkompliziert über npx ausführen lässt, ohne dass globale Installationen notwendig sind. Dies macht die Codemods für jeden Entwickler innerhalb von Lyft schnell zugänglich und fördert die Verbreitung und Nutzung innerhalb verschiedenster Teams.
Die Plattform sorgt damit für eine Standardisierung und einheitliche Prozesse, die im gesamten Unternehmen Anwendung finden. Ein Beispiel, wie Codemods konkret genutzt werden können, ist das Entfernen eines nicht mehr unterstützten Props aus einer gemeinsam genutzten Button-Komponente im Core-UI-Bibliothek. Dieses Update, das tausendfach händisch durchgeführt worden wäre, lässt sich mit einem entsprechenden Codemod in Sekundenschnelle über alle relevanten Frontend-Microservices hinweg automatisch transformieren. Dadurch wird nicht nur die Qualität der Software verbessert, sondern vor allem auch Zeit eingespart, die Entwickler ansonsten mit repetitiver Arbeit verbringen müssten. Die Plattform erlaubt dabei verschiedene Komplexitätsgrade: einfache Transformationen können genauso umgesetzt werden wie komplexe Abläufe, in denen mehrere Codemods hintereinander laufen, verschiedene Abhängigkeiten geprüft und anschließend Fremd-Codemods von Drittanbietern integriert werden.
Diese Flexibilität macht den Einsatz in einem umfangreichen Mikrodienst-Ökosystem erst möglich. Die Veröffentlichung der Codemod-Plattform als eigenständiges npm-Paket mit Versionsverwaltung nach semantischem Versioning bietet den großen Vorteil, dass verschiedene Teams unabhängig voneinander Innovationen und Fehlerbehebungen testen können, ohne sich gegenseitig zu behindern. In der Continuous-Integration-Umgebung von Lyft wird stets die aktuellste Version ausgeführt, so dass alle Dienste von den neuesten Verbesserungen profitieren und keine veralteten Codemods mehr laufen. Das Testen der Codemods wird mithilfe des defineTest-Tools von jscodeshift erleichtert. Durch den Vergleich von sogenannten Fixture-Dateien vor und nach der Transformation wird sichergestellt, dass Codemods wie gewünscht funktionieren und keine Fehler einführen.
Zusätzlich nutzt das Team regelmäßig den AST Explorer, ein grafisches Tool, das die Struktur der Codebäume visualisiert und Entwicklern das Experimentieren mit AST-Manipulationen ermöglicht. Dies erhöht die Genauigkeit und Effizienz bei der Entwicklung neuer Codemods erheblich. Die Ergebnisse der Einführung der Codemod-Plattform bei Lyft sprechen für sich. Die Automatisierung technischer Schulden ermöglicht eine kontinuierliche Pflege und Modernisierung der zugrundeliegenden Bibliotheken statt großer, seltener und risikobehafteter Major-Updates. Dadurch konnten hunderte von Entwicklerstunden eingespart werden, da manuelle Prüfungen, Dokumentationsstudium und Fehlerbehebung weitgehend entfallen.
Eine besonders positive Auswirkung war die Integration mit dem bereits existierenden Refactorator-Tool, das automatisierte Pull Requests für umfangreiche Codeänderungen erzeugt und verwaltet. Dank der Codemods sind diese PRs häufig direkt aut-omergbar, was die gesamte Entwicklungs- und Release-Pipeline erheblich beschleunigt und entlastet. Die Migration auf neue Komponenten-Bibliotheks-Generationen wurde somit von Monaten auf Wochen reduziert. Langfristig plant Lyft, die Codemod-Plattform weiter auszubauen. Neben regelmäßigen Aufräumarbeiten, bei denen redundante Konfigurationen und Duplikate in Microservices automatisch entfernt werden, sollen Entwickler bald durch integrierte Feedbackschleifen in lokalen Entwicklungsumgebungen und CI-Pipelines frühzeitig über notwendige Transformationen informiert werden.
Dies unterstützt noch frühzeitigeres Handeln und verbessert die Codequalität deutlich. Ein weiterer spannender Zukunftsausblick ist die Erprobung von KI-gestützten Codemods, die transformierende Vorschläge basierend auf Änderungsmustern oder Dokumentationen generieren und so manuellen Aufwand weiter reduzieren können. Dieser Ansatz könnte einen weiteren Quantensprung in der Automatisierung von Softwarewartung bringen und Entwickler nachhaltig entlasten. Zusammengefasst zeigt die Codemod-Plattform von Lyft, wie technologische Innovationen gezielt eingesetzt werden können, um klassische Herausforderungen in der Softwareentwicklung zu meistern. Durch Automatisierung, Standardisierung und intelligente Toolintegration gelingt es, technische Schulden nicht nur zu managen, sondern proaktiv abzubauen, ohne dass die Entwickler der Entwicklung neuer Features daran gehindert werden.
Die Entwicklung dieser Plattform wurde durch die engagierte Arbeit eines spezialisierten Teams ermöglicht, das kontinuierlich neue Funktionen, Hilfsmittel und Transformationen beisteuert. Lyft zeigt damit einmal mehr, wie wichtig es ist, in Entwickler-Tools zu investieren, um ganze Organisationen effizienter und innovativer zu machen. Die Codemod-Plattform steht exemplarisch für eine zukunftsorientierte Entwicklungskultur, die nicht nur Probleme löst, sondern aktiv die Arbeitsweise von Entwicklern verbessert und nachhaltigen technischen Fortschritt ermöglicht.