Kosteneinsparungen bei der Softwareentwicklung
Kein erfolgreiches Unternehmen kommt heutzutage ohne Softwareentwicklung aus – sei es für eigene Anwendungen oder die Anpassung bestehender bzw. gekaufter Systeme. Wir geben Ihnen Tipps, wie Sie dabei Kostenexplosionen vermeiden können.
Es gibt zahlreiche Möglichkeiten, die Kosten in der Softwareentwicklung zu kontrollieren. In diesem Artikel konzentrieren wir uns auf drei ausgewählte Bereiche: die Ausbalancierung der automatisierten Testabdeckung innerhalb der kontinuierlichen Integration (CI), die Nutzung von Feature-Flags für die schrittweise Einführung von Funktionen und die Implementierung intelligenter Automatisierungspraktiken in der kontinuierlichen Bereitstellung (CD).
Weitere Ideen zur Optimierung des Software-Bereitstellungsprozesses finden Sie in unserem Artikel „Erfolgreiche Software Delivery: Wie man Hürden bei der Entwicklung überwindet“.
Abgleich der Abdeckung mit automatisierten Tests
Automatisierte Tests sind unerlässlich, um sicherzustellen, dass Codeänderungen frühzeitig und häufig getestet werden. IT-Teams versuchen oft, eine 100-prozentige Unit-Test-Abdeckung und eine 80- bis 90-prozentige Integrationstest-Abdeckung zu erreichen. Eine hohe Abdeckung ist jedoch keine Garantie für Qualität.
Unit-Tests
Mariusz Święs, Chief Software Architect bei Striped Giraffe, warnt davor, bei Unit-Tests eine zu hohe Codeabdeckung anzustreben.
“Diese Tests validieren zwar die Codestruktur, übersehen aber möglicherweise kritische Geschäftsfunktionen. Darüber hinaus kann eine hohe Abdeckung kostspielig sein, oft ohne ausreichende Rendite.“
Empfehlungen:
- Qualität vor Quantität bei Tests: Anstatt sich auf die Testabdeckung zu konzentrieren, sollten Sie in hochwertige Tests investieren, die überprüfen, wie der Code in die größere Codebasis passt.
- Tests nach Code-Auswirkungen priorisieren: Nicht jeder Code ist gleich wichtig. Priorisieren Sie umfassende Tests in Bereichen mit hoher Auswirkung wie Abrechnung und Daten.
- Fokus auf häufig aktualisierte Komponenten: Automatisieren Sie Tests für häufig geänderte Funktionen, um eine bessere Stabilität bei der Weiterentwicklung Ihres Codes zu gewährleisten.
- Vertrauen Sie auf die Expertise Ihres Teams: Wenn Ihr Team bereits über umfangreiche Erfahrung in der Erstellung von hochwertigem Code verfügt, sind möglicherweise keine gründlichen Tests für alle kleineren Funktionen erforderlich.
- Festlegen praktischer Abdeckungsziele: Streben Sie eine Abdeckung von etwa 80 % an; die letzten 10–20 % können einen unverhältnismäßig hohen Aufwand erfordern.
Integrationstests
Integrationstests, die ganze Arbeitsabläufe validieren, bringen oft einen größeren Mehrwert für Unternehmen als isolierte Komponententests. Diese Tests werden jedoch oft schlecht verwaltet und konzentrieren sich zu sehr auf die Codestruktur statt auf die Funktionalität.
Ein Beispiel: Ein Team, das wir beraten haben, hatte 1.100 Integrationstests in Java entwickelt und diese kontinuierlich ausgeführt, die Ergebnisse jedoch nur alle drei Wochen überprüft. Jedes Mal schlugen etwa 400 Tests fehl, hauptsächlich, weil die Tests die Codestruktur statt die Geschäftslogik überprüften.
„Wir haben empfohlen, statt der Testentwicklung in Java-Code auf verhaltensgesteuerte Tests mit Cucumber und seiner Beschreibungssprache Gherkin umzusteigen. So konnten Testszenarien einfach auf Englisch geschrieben und sichergestellt werden, dass sie die Überprüfung der Geschäftslogik mit einbeziehen. Darüber hinaus wurden QS-Spezialisten zur Validierung aller Testszenarien empfohlen.“
Durch diese Umstellung wurden die Relevanz der Tests verbessert und der Wartungsaufwand reduziert.
Feature-Flags für kontrollierte Rollouts
Feature-Flags helfen dabei, schnelle Feature-Rollouts mit Systemstabilität in Einklang zu bringen. Sie ermöglichen es Entwicklern, neue Features schrittweise freizugeben und eine kontinuierliche Bereitstellung ohne größere Unterbrechungen aufrechtzuerhalten.
Hauptanwendungen:
- Schrittweise Feature-Rollouts: Neue Funktionen werden zunächst für eine kleine Benutzergruppe freigegeben, sodass Teams Probleme identifizieren und beheben können. Bei Erfolg wird der Zugriff schrittweise auf größere Gruppen ausgeweitet, bis das Feature für alle Benutzer vollständig eingeführt ist.
- A/B-Tests: Teams können die Leistung verschiedener Versionen einer Funktion oder von UI-Komponenten überwachen, um letztlich die Iteration auszuwählen, die am stabilsten ist oder von den Benutzern am besten angenommen wird.
- Gezielter Benutzerzugriff: Flags ermöglichen eine präzise Kontrolle darüber, welche Benutzergruppen auf bestimmte Funktionen zugreifen können. Dieser Ansatz ermöglicht exklusiven Zugriff, personalisierte Erfahrungen und gezieltes Feedback ohne zusätzliche Codeänderungen.
- Sofortiges Rollback: Wenn eine neue Funktion Probleme verursacht oder die Erwartungen der Benutzer nicht erfüllt, können Sie sie mithilfe von Feature-Flags sofort auf die vorherige Version zurücksetzen.
Feature-Flags beschleunigen die Bereitstellung neuer Funktionen, indem sie es Entwicklern ermöglichen, Codeänderungen zu integrieren, ohne sie sofort den Endbenutzern zugänglich zu machen. Dies ermöglicht „stille“ Tests in einer Live-Umgebung. Dieser Ansatz mindert die Risiken der herkömmlichen Bereitstellung, die zu kostspieligen Ausfallzeiten führen kann – laut Forbes bis zu 5.600 US-Dollar pro Minute – aufgrund von Fehlern, die in der Produktion auftreten. Teams können Probleme auch schrittweise identifizieren und beheben, wodurch die Notwendigkeit teurer Rollbacks reduziert wird.
Strategische Automatisierung bei Continuous Deployment
Im Allgemeinen werden bei Continuous Deployment (CD) Codeänderungen automatisiert und regelmäßig veröffentlicht, wodurch die Agilität erhöht und menschliche Fehler reduziert werden. Es ist jedoch wichtig, strategisch zu entscheiden, was genau automatisiert werden soll.
Optimale Anwendungsfälle für die Automatisierung:
- Umgebungsbereitstellung: Automatisieren Sie die Erstellung und Konfiguration von Entwicklungs-, Test- und Produktionsumgebungen.
- Überwachung: Implementieren Sie eine automatisierte Überwachung für Performance-Einblicke in Echtzeit.
- Rollback-Verfahren: Automatisieren Sie Rollback-Prozesse, um schnell zu stabilen Versionen zurückzukehren.
- CI/CD-Integration: Automatisieren Sie die Integration von CI-Prozessen in CD-Workflows.
- Leistungstests: Automatisieren Sie Leistungstests, um Probleme schnell zu identifizieren.
Prozesse, die bei der Automatisierung mit Vorsicht angegangen werden sollten:
- Kritische Feature-Releases: Funktionen, die geschäftskritisch sind oder eine präzise Koordination zwischen mehreren Teams erfordern, sollten manuell bereitgestellt werden.
- Komplexe Datenbankmigrationen: Bei umfangreichen Migrationen – insbesondere bei kritischen Datentransformationen – kann eine manuelle Bearbeitung erforderlich sein, um die mit der Datenintegrität verbundenen Risiken zu minimieren.
- User Acceptance Testing (UAT): Manuelle Tests sind nach wie vor unerlässlich, um qualitative Daten zu sammeln und die User Experience zu verstehen.
- Edge-Case-Handling: Die manuelle Überwachung seltener Edge-Cases kann effizienter sein und es Teams ermöglichen, komplizierte Automatisierungsskripte zu vermeiden, die nur einen begrenzten Nutzen bieten.
Durch die strategische Auswahl der zu automatisierenden und manuell zu verwaltenden Komponenten können Unternehmen ihre kontinuierlichen Bereitstellungsbemühungen optimieren, die Produktivität steigern und gleichzeitig qualitativ hochwertige Releases sicherstellen.
Fazit
Die Rationalisierung von Softwareentwicklungsprozessen ist für die Kostensenkung und Effizienzsteigerung von entscheidender Bedeutung. Durch die Konzentration auf automatisierte Tests, Feature-Flags und strategische Automatisierung in der Continuous Delivery können Unternehmen unnötige Kosten senken und die Produktqualität verbessern. Durch die Priorisierung hochwertiger Tests und kontrollierter Rollouts können Organisationen ihre Entwicklung optimieren und die Markteinführungszeit verkürzen, wovon sowohl das Unternehmen als auch deren Anwender profitieren.
Optimieren Sie Ihre Softwarebereitstellung mit unserem eigens entwickelten 5-Schritte-Programm!