
Fantastic - stock.adobe.com
Software-Refactoring: Best Practices für Cloud-Migrationen
Refactoring optimiert Anwendungen für die Cloud, steigert Leistung, senkt Kosten, verbessert Sicherheit und ermöglicht die Nutzung moderner Cloud-Technologien und -Dienste.
Die meisten Anwendungen, die in der Cloud ausgeführt werden können, lassen sich auch lokal betreiben. Cloud-Umgebungen funktionieren jedoch in vielerlei Hinsicht anders, weshalb es oft sinnvoll ist, Anwendungen im Rahmen der Migration in die Cloud zu überarbeiten.
In diesem Artikel wird erläutert, warum das Refactoring von Anwendungen ein wichtiger Schritt im Cloud-Migrationsprozess sein kann, und es werden praktische Tipps und Best Practices für die Überarbeitung Ihrer Anwendungen vorgestellt, um sie Cloud-freundlicher zu gestalten.
Was ist Refactoring von Anwendungen bei der Cloud-Migration?
Im Zusammenhang mit der Cloud-Migration bedeutet Anwendungs-Refactoring das Umschreiben oder Neugestalten der internen Komponenten einer Anwendung mit dem Ziel, die Vorteile der Cloud besser zu nutzen.
Das Refactoring von Anwendungen ändert in der Regel weder die Funktionen einer Anwendung noch die Art und Weise, wie Benutzer mit ihr interagieren. Stattdessen werden beim Refactoring die inneren Strukturen der Anwendung modifiziert.
Beispiele für Änderungen, die während des Refactoring-Prozesses vorgenommen werden können, sind unter anderem die folgenden:
- Aufteilung einer monolithischen Anwendung in eine Reihe von Microservices: Da Microservices unabhängig voneinander skaliert werden können, helfen sie Apps dabei, die Vorteile flexibler, Cloud-Umgebungen besser zu nutzen.
- Neuschreiben von Teilen der Anwendung: So kann die Anwendung mit bestimmten Arten von Cloud-Services interagieren, die bei der Ausführung On-Premises nicht verwendet wurden, beispielsweise serverlose Funktionen.
- Entfernung von doppeltem Code aus einer Anwendung: Dies kann dazu beitragen, die Cloud-Hosting-Kosten zu senken, indem die für die Ausführung der Anwendung erforderlichen Ressourcen reduziert werden.
- Reorganisieren von Code, um ihn für Entwickler lesbarer zu machen: Dies hat zwar möglicherweise keinen direkten Einfluss auf die effiziente Ausführung der Anwendung in der Cloud, verbessert jedoch die Wartbarkeit, was für Unternehmen wichtig sein kann, die die Anwendung über Jahre oder Jahrzehnte hinweg nutzen möchten.
- Implementierung neuer Authentifizierungs- oder Autorisierungskontrollen innerhalb der Anwendung, um sie vor Sicherheitsrisiken zu schützen: Diese Änderungen können zwar bei jede Art von Anwendung von Vorteil sein, sind jedoch bei der Migration in die Cloud in der Regel besonders wichtig, da Cloud-Anwendungen häufig in komplexeren Umgebungen ausgeführt werden und einer größeren Angriffsfläche ausgesetzt sind – beides Faktoren, die Sicherheitsvorkehrungen besonders wichtig machen.
Dies sind nur einige der Refactoring-Initiativen, die Teil einer Cloud-Migration sein können. Letztendlich zählt jede Art von Änderung, die Entwickler an einer App vornehmen, um sie in der Cloud schneller, kostengünstiger, sicherer oder zuverlässiger auszuführen, als Refactoring.

Vorteile des Refactorings von Anwendungen für den Migrationsprozess
Wie bereits erwähnt, ist es fast immer möglich, eine lokale Anwendung ohne Refactoring in die Cloud zu migrieren. Beispielsweise kann eine auf einem lokalen Server ausgeführte Anwendung in der Regel ohne Änderungen an der Anwendung selbst auf eine Cloud-basierte virtuelle Maschine verschoben werden. Dies ist ein Beispiel für eine Lift-and-Shift-Migration, bei der Workloads ohne wesentliche Änderungen in die Cloud verschoben werden.
Aber nur weil Refactoring für eine erfolgreiche Migration nicht unbedingt erforderlich ist, heißt das nicht, dass sie sich nicht lohnt. Im Gegenteil, Refactoring kann eine Vielzahl von Vorteilen mit sich bringen, darunter die folgenden:
- Nutzung einzigartiger Cloud-Funktionen: Der wohl wichtigste Grund für das Refactoring einer Anwendung während der Migration ist die Nutzung neuer Arten von Cloud-Services, die in der Regel lokal nicht verfügbar sind, beispielsweise verwaltete Datenbanken, serverlose Funktionen und Identity-and-Access-Management-Frameworks (IAM). Aus dieser Perspektive ist das Refactoring eine Möglichkeit, eine Anwendung flexibler auszuführen und nahtloser in Cloud-Services zu integrieren.
- Entfernung von Legacy-Komponenten und Abhängigkeiten: Ebenso kann es vorkommen, dass die Cloud bestimmte Ressourcen oder Dienste nicht bietet, die eine Anwendung On-Premises nutzt. Beispielsweise kann eine App von einer Legacy-Datenbank abhängig sein, die Sie nicht in der Cloud implementieren können oder deren Betrieb dort zu kostspielig oder unsicher ist. Durch das Refactoring können Entwickler veraltete Komponenten oder Abhängigkeiten durch moderne, Cloud-freundliche Alternativen ersetzen.
- Reduzierung der Cloud-Hosting-Kosten: Anders als in einer lokalen Umgebung spiegeln sich die Kosten für den Betrieb einer Cloud-Anwendung in der Regel direkt in der Anzahl der verbrauchten Ressourcen wider. Aus diesem Grund kann das Refactoring von Anwendungen, die zu einem effizienteren Betrieb durch reduzierten Ressourcenverbrauch führt, zur Optimierung der Cloud-Hosting-Kosten beitragen.
- Verbesserung der Cloud-Sicherheit: In der Cloud sind Anwendungen Risiken ausgesetzt, wie beispielsweise falsch konfigurierte IAM-Regeln, die in lokalen Systemen in der Regel keine Rolle spielen. Refactoring kann dazu beitragen, die Sicherheit von Cloud-Anwendungen zu erhöhen und diese Risiken zu minimieren.
- Verbesserung der Wartbarkeit: Wenn eine Anwendung so wichtig ist, dass sie in die Cloud verlagert wird, ist es wahrscheinlich, dass Ihr Unternehmen sie noch lange Zeit nutzen wird. Maßnahmen zur Vereinfachung der Wartung der Anwendung – beispielsweise durch die Umstrukturierung von Spaghetticode, damit er für Entwickler leichter verständlich ist – zahlen sich langfristig aus, da sie den Zeit- und Arbeitsaufwand für die Wartung und Aktualisierung der Anwendung reduzieren.
Herausforderungen des Refactoring für eine Cloud-Migration
Das Refactoring von Anwendungen während der Cloud-Migration ist in vielerlei Hinsicht vorteilhaft, kann aber auch Herausforderungen mit sich bringen. Probleme wie die folgenden sind keine Seltenheit:
- begrenzte Kenntnisse über die Cloud-Umgebung: Manchmal beginnt ein Team mit einem Refactoring-Projekt, obwohl es weiß, dass eine Anwendung in die Cloud migriert wird, aber nicht genau weiß, welche Cloud-Services oder Konfigurationen die Anwendung nach der Migration verwenden wird. Dies führt zu unklaren Zielen und macht es schwierig zu wissen, wie die Anwendung auf der Grundlage ihrer Umgebung nach der Migration am besten verbessert werden kann.
- Notwendigkeit von Cloud-Unabhängigkeit: Die Herausforderung, zu bestimmen, wie eine Anwendung nach der Migration laufen wird, wird dadurch erschwert, dass Entwickler oft unter Druck stehen, überarbeitete Anwendungen Cloud-agnostisch zu gestalten, das heißt, sie müssen in jeder Cloud und mit jeder Konfiguration laufen können. Diese Flexibilität mag für ein Unternehmen, das nicht an eine bestimmte Cloud gebunden sein möchte, wichtig sein, aber sie kann es schwierig machen, die Anwendung für eine bestimmte Cloud-Umgebung zu optimieren, da die Ausrichtung auf eine bestimmte Umgebung bedeuten kann, dass die Anwendung nicht mehr Cloud-agnostisch ist.
- Entstehen neuer Probleme: Die Aktualisierung einer Anwendung, um sie Cloud-freundlicher zu machen, kann die App verbessern, aber auch neue Probleme mit sich bringen – beispielsweise zusätzlichen Code, der zu einem insgesamt höheren Ressourcenverbrauch führt – die den Wert des Refactoring untergraben.
- fehlende Abstimmung von Migrationsressourcen und Zeitplänen: Oft entscheiden Unternehmen frühzeitig, wie viele personelle Ressourcen sie für die Cloud-Migration bereitstellen und wie lange der Migrationsprozess voraussichtlich dauern wird. Fehlen genügend Ressourcen und Zeit für das Refactoring, drohen Verzögerungen im Migrationsprozess. Im schlimmsten Fall wird eine halbfertige App in die Cloud verschoben, bevor sie vollständig optimiert ist.
Best Practices für das Refactoring von Anwendungen
Die folgenden Best Practices können dazu beitragen, das Risiko von Fehlschlägen bei Refactoring-Projekten zu verringern und den Wert zu maximieren, den das Refactoring für die Cloud-Migration bringt.
1. Legen Sie konkrete Refactoring-Ziele fest
Die vielleicht wichtigste Vorgehensweise für ein erfolgreiches Refactoring ist die Festlegung klarer und konkreter Ziele. Beauftragen Sie die Entwickler nicht einfach mit der Verbesserung der Anwendung. Geben Sie ihnen konkrete Vorgaben, wie beispielsweise die Verbesserung des Authentifizierungsmodells der Anwendung oder die Kompatibilität mit einem bestimmten Cloud-Service.
Wenn Entwickler genau wissen, was sie tun sollen, sind ihre Erfolgschancen höher.
2. Überarbeiten Sie in kleinen Schritten
Der Versuch, den internen Code einer Anwendung auf einmal zu überarbeiten, ist zum Scheitern verurteilt. Dies ist nicht nur mit einem hohen Arbeitsaufwand für die Entwickler verbunden, sondern erhöht auch das Risiko, dass Änderungen in einem Teil der Anwendung zu Kompatibilitätsproblemen in anderen Teilen führen, da die Entwickler gleichzeitig an verschiedenen Teilen des Codes arbeiten.
Ein besserer Ansatz ist es, die Anwendung in kleinen Schritten oder Teilen zu überarbeiten. Sie können beispielsweise zunächst Änderungen zur Verbesserung der Sicherheit vornehmen, dann die App zur Leistungssteigerung umgestalten und anschließend den Code aus Gründen der Wartbarkeit bereinigen.
3. Testen Sie während der Arbeit
Durch kontinuierliches Testen der Anwendungen während des Refactoring-Prozesses lassen sich Probleme frühzeitig erkennen. In dieser Phase sind sie in der Regel leichter zu beheben, da Sie umso weniger Code umschreiben müssen, um das Problem zu beheben, je weniger Code Sie seit dem Auftreten eines Fehlers geändert haben.
Warten Sie also nicht, bis Sie große Teile des Codebestands überarbeitet haben, um ihn zu testen. Idealerweise führen Sie nach jeder Codeänderung automatisierte Tests durch. Sie sollten die Anwendung auch nach Abschluss des Refactoring als Ganzes testen, aber nicht erst dann zum ersten Mal.
4. Legen Sie im Voraus ein Cloud-Hosting-Modell und eine Konfiguration fest
Entwickler können effektiver arbeiten, wenn sie von Anfang an wissen, welche Art von Cloud-Umgebung und Konfiguration sie beim Refactoring einer Anwendung anstreben sollten. Um diese Orientierungshilfe zu geben, sollten Cloud-Architekten, Entwickler und IT-Ingenieure frühzeitig im Migrationsprozess zusammenarbeiten, um genau zu entscheiden, wie das Unternehmen die Anwendung nach der Migration in die Cloud betreiben will.
5. Legen Sie flexible Zeitpläne fest
Selbst wenn Entwicklungsteams Refactoring-Initiativen sorgfältig planen, ist es unmöglich vorherzusagen, wie lange die Arbeit dauern wird oder welche Hindernisse den Entwicklern begegnen können. Aus diesem Grund ist es wichtig, Zeitpläne flexibel zu gestalten. Dies können Sie erreichen, indem Sie den Zeitaufwand für die Arbeit etwas großzügig schätzen.
Sie können auch beschließen, die Ziele zu reduzieren, wenn sie nicht rechtzeitig erreicht werden. Wenn der Refactoring-Plan beispielsweise die Änderung der internen Logik für eine bestimmte Anwendungsfunktion vorsah, diese Arbeit jedoch nicht rechtzeitig abgeschlossen werden kann, können Sie beschließen, die App trotzdem bereitzustellen, um eine Verzögerung des Migrationsprozesses zu vermeiden.
6. Ziehen Sie Refactoring-Tools in Betracht
Refactoring ist immer ein praktischer, weitgehend manueller Prozess, aber Tools können dabei helfen, Teile davon zu automatisieren. Das Analyse-Tool Lint kann beispielsweise die Lesbarkeit des Codes verbessern oder Fälle von doppeltem Code aufspüren. Ebenso gibt es mittlerweile verschiedene KI-basierte Codierungs-Tools, die versprechen, qualitativ minderwertigen Code automatisch neu zu schreiben. Dazu gehören beispielsweise GitHub Copilot oder AWS CodeWhisperer.
7. Vermeiden Sie unnötige Änderungen
Eine letzte Best Practice für erfolgreiches Refactoring ist, nur dort zu überarbeiten, wo es wirklich nötig ist. Vermeiden Sie Änderungen, die keinen greifbaren Nutzen bringen, wie beispielsweise die Umgestaltung einer App in Microservices, wenn Sie planen, alle Dienste auf einem einzigen Server bereitzustellen. Dies macht einen Großteil des Vorteils der Bereitstellung der App als Microservices zunichte, da diese weniger unabhängig voneinander sind, wenn sie auf demselben Host ausgeführt werden. Nur weil Sie etwas während des Refactoring tun können, bedeutet das nicht, dass es eine sinnvolle Nutzung Ihrer Zeit und Ihrer Entwicklungsressourcen ist.
Refactoring im Vergleich zum Finden neuer Software
In einigen Fällen ist es am besten, die Anwendung gar nicht in der Cloud auszuführen. Stattdessen können Sie sie durch alternative Software ersetzen.
Stellen Sie sich beispielsweise vor, Sie verwenden derzeit ein benutzerdefiniertes Monitoring Tool, das Ihre Entwickler selbst implementiert haben. Wenn Sie Workloads in die Cloud verlagern, stellen Sie möglicherweise fest, dass Sie besser bedient sind, wenn Sie das Überwachungs-Tool durch eine handelsübliche Monitoring- oder Observability-Suite ersetzen. Selbst wenn das alternative Tool höhere Betriebskosten verursacht, können diese durch den Wegfall des Aufwands für die Umgestaltung des benutzerdefinierten Tools zur Anpassung an die Überwachungsanforderungen nach der Migration wieder ausgeglichen werden.
Sie können Ihre Entwickler auch beauftragen, eine Anwendung von Grund auf neu zu schreiben, anstatt sie umzugestalten. Dies ist in der Regel dann sinnvoll, wenn eine Anwendung so viele veraltete Komponenten enthält oder die Codequalität so schlecht ist, dass eine Aktualisierung mehr Arbeit erfordern würde als ein kompletter Austausch.