Ich kenne das Problem. Die Software wird immer umfangreicher und die Seiteneffekte durch Neuentwicklungen werden immer unbeherrschbarer. Es gibt dazu ein Grundprinzip: Testautomatisierung! Mein früherer Arbeitgeber, die andrena objects AG hatte sehr gute Kenntnisse im SW-Engineering. Sie haben den Ausdruck geprägt: "Legacy Software ist jede Software, die nicht automatisiert getestet wird." Oder: "Nur Test- und Deploymentautomatisierung ermöglicht wirksame Agilität." Deshalb hatten sie in SW-Projekten zunächst eine Priorität darauf, dass der bestehende Code erstmal mit automatisierten Tests abgesichert wird.
Microservices sind ein gutes Pattern, um Unabhängigkeit zwischen einzelnen Softwarekomponenten zu erreichen. Das alleine reicht aber nicht. Auch die Microservices müssen automatisiert getestet werden. Ich kenne den Kontext nicht, aus dem die Frage entstanden ist. Auf alle Fälle kann ich empfehlen, genau hinzusehen, wie es mit er bestehenden Testautomatisierung aussieht? Ist die Testpyramide erfolgreich umgesetzt?
Also
Tests müssen kontinuierlich durchgeführt werden. Wobei anzumerken ist, dass die Tests im Vorfeld vor der Entwicklung definiert werden sollten (Stichwort TDD), damit während der Entwicklung zu jeder Zeit gegen diese Testkriterien getestet werden kann und nicht erst beim Deployment auf die Testumgebung festgestellt wird, dass die Tests nicht erfolgreich laufen. Denn dann fängt man wieder von vorne an und das kostet unnötig Zeit und Geld. Ein oft beobachtetes Phänomen ist das des Mini-Wasserfalls innerhalb eines Sprints. Es ist und war nie Ziel, am Ende eines Sprints festzustellen, dass die Qualität nicht stimmt. Qualität kann nicht eingetestet werden, sondern muss von vorne herein eingebaut werden! Deshalb gelingt es einem guten Scrum-Team, die Tests bereits sehr früh im Sprint zur Verfügung zu stellen.
Hinsichtlich des Testaufwandes bleibt somit festzuhalten, dass der Aufwand idealerweise nur 1x nötig ist, nämlich zum Erstellen der automatisierten Tests. Anschließend sorgt das automatisierte Testsystem dafür, dass die Kosten für das Testen minimal bleiben.
Ich habe Systeme gesehen, wo bei jedem Deployment auf die Integrationsumgebung an die 7000 Tests ausgeführt werden. Das sollte für eine state-of-the-art Testautomation kein Problem darstellen.
Eine weitere Möglichkeit, Testautomatisierung einfacher zu gestalten, ist die Anwendung geeigneter Containerisierung (Stichwort docker) und adhoc Erstellung von Testumgebungen (Stichwort kubernetes). Damit können ganz gezielt Testkonfigurationen hergestellt werden, um in ihnen besondere Testszenarien zu testen. Z.B. können gezielt Netzwerkverbindungen gekappt werden oder falsche Daten erzeugt werden, damit die Tests prüfen können, wie die Software mit solchen Fehlern zurecht kommt.
Wendet man diese Prinzipien konsequent von Anfang an an, lassen sich Software-Systeme damit auch über Jahre hinweg nachhaltig und mit wenig Wartungsaufwand weiterentwickeln. Wurde diesem wichtigen Punkt der Testautomatisierung zu Beginn zugunsten von schnellerer Featureentwicklung zu wenig Aufmerksamkeit gewidmet, bleibt leider nur zu sagen, dass dies nun aufwändig nachgeholt werden muss.
Eine Anmerkung möchte ich noch mitgeben hinsichtlich der Aussage '... Testaufwand gering zu halten, damit sich ein Scrumteam auf die neuen Bausteine neuer Sprints konzentrieren kann...' : Ein Scrum-Team ist vollverantwortlich dafür zu sorgen, dass der Testaufwand eben NICHT aus dem Ruder läuft. Deshalb gehört beim Nachdenken darüber, wie neue Features entwickelt werden zwangsläufig dazu, darüber nachzudenken, wie die neuen Features entsprechend abgesichert werden können, damit man sich über mögliche Seiteneffekte späterer Entwicklungen keine Gedanken machen muss. Es ist also kein entweder-oder, sondern diese Dinge gehören schlicht zusammen.
Abseits der Testautomatisierung und Microservices gibt es natürlich weitere Möglichkeiten, wie nachhaltige Software entwickelt werden kann. Jedem Entwickler müssen die Clean-Code-Prinzipien nicht nur vertraut sein, sondern er sollte sie auch sicher anwenden können. Wenn Microservices auf der modularen Ebene für Unabhängigkeit sorgen, dann gibt es ähnlich wirksame Prinzipien und Software Design Patterns auch auf der Code-Ebene. Z.B. das Single-Responsibility-Prinzip für Klassen. Nähere Infos hierzu finden sich hier: https://clean-code-developer.de/
Ist hier noch Entwicklungspotential der Mitarbeiter gegeben, ist es Aufgabe des Managements, für diese Entwicklung der persönlichen Fähigkeiten entsprechenden Freiraum zur Verfügung zu stellen. Der Invest zahlt sich schon nach kurzer Zeit aus.
Übrigens: Studien haben gemessen, dass das Verhältnis zwischem einem echten Profi-Programmierer und einem durchschnittlichem Programmierer einen Produktivitätsfaktor von bis zu 300, also 30000% ausmachen kann. Es lohnt sich also, bei der Rekrutierung genau hinzusehen. Lieber etwas mehr für einen Profi-Programmierer ausgeben, der vielleicht 30% teurer sein mag wie ein Durchschnittsprogrammierer. Es lohnt sich in den meisten Fällen.