Development

Software-Architekturen: Es muss kein Microservice sein | MVP

Hendrik Haustein
Hendrik Haustein
Software-Architekturen: Es muss kein Microservice sein | MVP
⏱️

In 30 Sekunden

  • Die Analogie: Architektur ist der Unterschied zwischen Spaghetti (unentwirrbar), Lasagne (saubere Schichten) und Pizza (modularer Modulith).
  • Der MVP-Killer: Microservices sind für kleine Teams oft "technischer Selbstmord", da sie enorme Infrastruktur-Komplexität und Kosten verursachen.
  • Die Empfehlung: Starte mit einem Modulith. Er bietet die Einfachheit eines Monolithen bei der Entwicklung, lässt sich aber später modular in Microservices zerlegen.
  • Die Warnung: Vermeide Resume Driven Development (RDD) – wähle die Technik, die das Kundenproblem löst, nicht die, die am coolsten im Lebenslauf aussieht.

Was sind Software-Architekturen?

Software-Architekturen sind die Blaupausen, die ein Projekt wartbar und preiswert halten. Ohne Plan landest du unweigerlich beim berüchtigten 'Spaghetti-Code'.

Stell dir vor, du hast einen Teller Nudeln mit Tomatensauce, merkst aber plötzlich, dass du eigentlich Pesto wolltest. Bei Spaghetti hast du keine Chance – die Sauce klebt überall. Eine gute Architektur ist wie eine Lasagne: Alles ist in sauberen Schichten getrennt. Du kannst die oberste Schicht abnehmen oder austauschen, ohne dass die gesamte Struktur im Chaos versinkt.

Das Ziel: Die Komponenten sollen so wenig wie möglich voneinander wissen. Das bezeichnen wir als Entkopplung.

Wieso Software-Architektur?

Wartbarkeit

Kennst du das? Du sitzt an deiner IDE, klickst auf File > Recent Files und da steht es: Eines deiner ersten Projekte. Du öffnest es und es haut dich aus den Socken. Dieses abgrundtief böse Chaos. Du drückst schneller Strg + F4 als dein KB-schwerer Push das Repository erreichen kann. Du schämst dich vor dir selbst, jemals solch eine chaotische Codebase gebaut zu haben.

Genau hier liegt das erste Argument für Software-Architektur: Wartbarkeit. Und die Freude daran. Niemand hangelt sich gerne wie Tarzan durch die Lianen eines Spaghetti-Code-Dschungels.

Seien wir ehrlich: Nach dem Motto „aus den Augen, aus dem Sinn“ haben wir oft schon nach wenigen Wochen vergessen, wie und warum der Code überhaupt zusammenhält. Wir waren einfach nur froh, dass er funktionierte und magischerweise das tat, wofür er vorgesehen war. Eine gute Architektur jedoch sorgt dafür, dass wir (oder unsere Nachwelt) das System auch in zwei Jahren noch verstehen – es sei denn, man lebt nach dem Motto „nach mir die Sintflut“.

Agilität

Gute Architektur ist das Fundament für echte Agilität. Es entsteht ein spannendes Spiel: Wie schnell kann ich eine Anforderung ändern oder ein Feature hinzufügen, bevor das Kartenhaus ineinanderkracht? Ohne Architektur gewinnen meist die Bugs; mit Architektur bleibt das System auch bei Änderungen stabil.

Kosten

Wer ein MVP (Minimum Viable Product) baut, arbeitet mit begrenzten Ressourcen – allen voran Geld. Ein Microservice-Ansatz ist hier oft ein teurer Luxus. Er läuft verteilt auf verschiedenen Systemen und benötigt eine komplexe Infrastruktur, nur damit man theoretisch „beliebig skalieren“ kann. Doch für ein MVP bedeutet das meistens: Man verbrennt Kapital für Server und Orchestrierung, bevor man überhaupt den ersten zahlenden Kunden hat. Architektur hilft dabei, die Kosten im Griff zu behalten, indem man so einfach wie möglich, aber so strukturiert wie nötig startet.

Software-Architekturen bilden oft die Teamstruktur ab. Conway’s Law besagt im Kern: Das System, das du baust, wird am Ende so aussehen wie die Kommunikationswege in deiner Firma. Microservices sind super, wenn man 5 Teams in 5 verschiedenen Zeitzonen koordinieren muss. Für einen Solo-Dev oder ein 3er-Team ist ein solches Konstrukt jedoch technischer Selbstmord.

Stattdessen gibt es Alternativen, die fast genauso gut skalieren und – falls nötig – später sauber in einzelne, verteilte Services aufgebrochen werden können.

ℹ️

Resume Driven Development (RDD)

Resume Driven Development (RDD) bezeichnet das Phänomen, dass viele Projekte in der Microservice-Hölle sterben, weil die Entwickler „etwas Cooles für den CV“ bauen wollten, statt das eigentliche Kundenproblem effizient zu lösen.

Bevor wir also blind dem Hype folgen, schauen wir uns die verschiedenen Konzepte einmal genauer an:

ℹ️

Grafiken werden ausgetauscht:

draw.io eignet sich nicht besonders für präzise Grafiken. Sobald ich ein besseres Tool habe (Visio ist es nicht), werden die Modelle nochmal getauscht / ergänzt.

Grundlegende Architektur Typen

Der Big Ball of Mud

Er ist das gefürchtete Spaghetti-Monster: schwer wartbar, starr und fehleranfällig. Er ist das Symptom einer ungeplanten, "wild gewachsenen" Implementierung. Meist fängt es als simples Skript an, das dann wie eine Lawine Fahrt aufgenommen hat und immer weiter angeschwollen ist. Dieser Architekturtyp leidet unter massiven Deployment-Problemen, mangelnder Testbarkeit und mieser Performance. Ein wahres Anti-Pattern.

Am besten stellt man sich das so vor: Du sitzt im Kindergarten und bittest dein Kind, ein Porträt von dir zu malen. Was du zurückbekommst, ist ein Kreis mit lauter wirren Strichen, die kreuz und quer überallhin führen. Genau so fühlt sich dieser Code an.

Big Ball of Mud: Wir alle kennen ihn.

Client/Server (The Classic)

Das Grundprinzip der Trennung von Aufgaben (Separation of Concerns). Hier teilt man das System in zwei Rollen auf: Der Client fragt an, der Server liefert.

  • Two-Tier (Client & Server): Die einfachste Form. Die Logik sitzt entweder komplett auf dem Client (Fat Client) oder auf dem Server.
  • Desktop + Datenbank-Server: Der Klassiker für interne Firmensoftware. Die Anwendung läuft auf dem PC und spricht direkt mit einer zentralen SQL-Datenbank.
  • Browser + Web-Server: Das Fundament des Internets. Dein Browser ist der (meist "Thin") Client, der Server liefert HTML, CSS und Daten.

Three-Tier (Die Schichtentrennung)

Hier gehen wir einen Schritt weiter und führen eine dedizierte Ebene für die Business-Logik ein. Man trennt strikt in:

  1. Presentation Tier (Die Benutzeroberfläche)
  2. Logic Tier (Hier passiert die Magie, die Berechnungen und Validierungen)
  3. Data Tier (Die persistente Speicherung, meist eine Datenbank)

Diese Struktur ist der Urvater der sauberen Architektur und sorgt dafür, dass du die Datenbank austauschen kannst, ohne deine gesamte UI neu schreiben zu müssen.

Distributed Systems (Verteilte Systeme)

Verteilte Systeme sind die Antwort auf die Frage: „Wie skaliere ich ins Unendliche?“ Anstatt eines einzelnen, riesigen Servers lässt man viele kleine Einheiten miteinander kommunizieren.

Arten

Es gibt eine Fülle an Architekturen in diesem Bereich: Service-based, Event-driven, Space-based oder die klassische Service-oriented Architecture (SOA). Wir wollen uns hier aber auf den aktuellen „Industrie-Standard“ konzentrieren:

Microservice Architektur

Bei Microservices wird die Anwendung in kleine, unabhängige Einheiten zerlegt, die jeweils eine spezifische Geschäftsfunktion (Bounded Context) abbilden. Sie kommunizieren meist über das Netzwerk (REST, gRPC, Message Broker).

Microservices sind kompliziert und teuer.

Vorteile

  • Skalierbarkeit: Du kannst den „Payment-Service“ 100-mal klonen, während der „E-Mail-Service“ nur einmal läuft.
  • Technologie-Freiheit: Service A kann in Rust geschrieben sein, Service B in Go und Service C in Python.
  • Unabhängiges Deployment: Ein Bugfix im Login-Service erfordert keinen Neustart des gesamten Systems.

Nachteile

  • Extreme Komplexität: Du tauschst Code-Komplexität gegen Infrastruktur-Komplexität.
  • Observability: Wenn ein Request fehlschlägt, musst du ihn durch 10 verschiedene Services tracen, um den Fehler zu finden.
  • Daten-Konsistenz: „Eventual Consistency“ ist die neue Realität – Daten sind nicht überall sofort aktuell.

Die harten Fakten: Die Irrtümer verteilter Systeme

Entwickler unterliegen beim Entwurf verteilter Systeme gerne folgenden Irrtümern, die das Projekt schneller ruinieren können als jeder Syntax-Fehler:

Die 8 Irrtümer verteilter Systeme (basierend auf Deutsch):

  • Das Netzwerk ist zuverlässig.
  • Die Latenz ist gleich Null.
  • Die Bandbreite ist unendlich.
  • Das Netzwerk ist sicher.
  • Die Topologie ändert sich nie.
  • Es gibt nur einen Administrator.
  • Traffic kostet nichts.
  • Das Netzwerk ist homogen.

Monolithen: Felsenfeste Basis statt Relikt der Vergangenheit

Monolithen sind wie riesige, felsenfeste Steine. Man hat das Gefühl, man könnte Bomben darauf werfen und sie hielten trotzdem zusammen. Für viele wirken sie wie ein Überbleibsel einer vergangenen Epoche, als Computer noch raumgroß und sündhaft teuer waren – oder eben wie „Anfängerkram“. Dabei wird völlig zu Unrecht auf sie herabgesehen. Gerade in der Entwicklung von MVPs sind sie oft die vernünftigste Wahl.

Die verschiedenen Arten

  • Klassischer Monolith: Das (leider oft anzutreffende) Spaghetti-Monster.
  • Layered Architecture (N-Tier): Die klassische Schichentrennung (UI, Business-Logik, Datenbank).
  • Pipeline-Architektur: Daten fließen durch eine Kette von Transformatoren.
  • Microkernel-Architektur: Ein schlanker Kern mit Plug-ins (wie deine IDE oder ein Betriebssystem).
Layered-Monolithen sind nichts bösartiges: Sie sind ziemlich pflegeleich.

Die Wunderarchitektur: Der Modulith (Modularer Monolith)

Stell dir einen Modulithen wie eine Pizza oder einen Kuchen vor. Der Clou: Die Stücke sind bereits vorgeschnitten, liegen aber noch gemeinsam auf einem Karton.

Modulithen sind Architekturen, die Komplexität kapseln.

Du kannst den Kuchen als Ganzes servieren (ein einziges Deployment). Wenn du aber später merkst, dass ein Teil (z. B. der Auth-Service) extrem viel Last zieht, nimmst du dieses eine Stück einfach weg und stellst es auf einen eigenen Teller (einen eigenen Server). Das kannst du tun, ohne den Rest des Kuchens zu zerstören.

Die technischen Benefits:

  • Compile-Time-Safety: Im Modulithen meckert dein Compiler sofort, wenn eine Schnittstelle nicht passt. Bei Microservices merkst du die Misere oft erst durch einen Laufzeit-Error in der Produktion.
  • Geringe kognitive Last: Du musst nicht zwischen zehn Repositories, hunderte Docker-Containern und komplexen Deployment-Pipelines hin- und herspringen. Dein Fokus bleibt beim Code.
  • Refactoring-Freundlichkeit: Mal eben eine Methode umbenennen? In einem Modulithen ein Klick in der IDE. In einer Microservice-Welt ein koordinierter Release-Plan über drei Teams hinweg.
VorteileNachteile
Einfaches Debugging: Ein Stacktrace zeigt dir den gesamten Weg.Single Point of Failure: Wenn der Prozess abschmiert, brennt das ganze Haus.
In-Memory-Speed: Kommunikation zwischen Modulen ist extrem schnell.Starre Skalierung: Du musst immer den gesamten Klotz klonen, auch wenn nur ein Modul Last hat.
Niedrige Kosten: Nur eine Infrastruktur, eine Datenbank, ein Monitoring.Lange Build-Zeiten: Je größer der Stein, desto länger dauert das Kompilieren.

Wie lerne ich Software-Architektur?

Theorie ist gut, aber Architektur lernt man vor allem durch Schmerz – und durch das Studium derer, die diesen Schmerz schon hinter sich haben.

Hands-On

Baue Projekte. Nicht nur eins, sondern mehrere. Versuche, ein altes Projekt von dir umzustrukturieren. Erst wenn du merkst, wie weh es tut, eine Komponente auszutauschen, verstehst du, warum Entkopplung so wichtig ist.

Bücher

Die Klassiker sind zeitlos. Achte auf Sales (wie bei Humble Bundle), dort gibt es oft ganze Pakete für wenig Geld. Meine Empfehlungen:

  • "Clean Architecture" von Robert C. Martin (Der Klassiker für Schichtentrennung).
  • "Fundamentals of Software Architecture" von Mark Richards (Perfekt für den Überblick über die Muster).
  • "Building Microservices" von Sam Newman (Damit du weißt, worauf du dich einlässt).
ℹ️

Pro Tipp: Humble Bundle Deals

Nicht selten, aber oft, gibt es die begehrten O'Reilly-Fachbücher (und viele andere Verlage) im riesigen Bundle mit ca. 24 Architektur-Themen bei Humble Bundle. Zwar auf Englisch, aber für den Preis einiger teuren Kaffees unschlagbar. Warten lohnt sich hier definitiv.

Podcasts

Hören statt Lesen. In meiner handverlesenen Liste der besten Tech-Podcasts findest du Experten-Talks, die tief in Architektur-Themen eintauchen.

YouTube-Videos

Kanäle wie Modern Software Engineering oder CodeOpinion sind Goldgruben für pragmatische Architektur-Tipps.

KI für Software-Architektur (Vorsicht)

Agentic AI ist der Helfer, den jeder wollte – manchmal aber auch so anstrengend wie wir Junior-Entwickler auf Koffein-Entzug. In meinen Frontend-Projekten setze ich gerne Agenten ein, nachdem ich ein festes Konzept vorgegeben habe. Das kann klappen – oder völlig schiefgehen.

Gerade im Flutter-Umfeld, wo ich mit BLoCs (State Management) arbeite, um die Business-Logik strikt von der UI zu trennen, erlebe ich oft Folgendes: Die KI wirft meine Vorgaben, den Logic-Layer sauber zu nutzen, vehement über Bord und klatscht Logik direkt in die Widgets. Ende vom Lied: Ich drücke Undo und schreibe es selbst.

Interessanterweise sagen mir viele, ihre KI würde das nie tun und sich brav an den Kontext (instruction.md und Co.) halten. Vielleicht mag sie meine Apps einfach nicht?

Chancen

Die größte Chance ist das Lernen durch KI. Sie kann dir Konzepte blitzschnell erklären oder Beispiele generieren. Aber Vorsicht: Die Qualität schwankt massiv. Mal bekommst du den "Best Practice"-Weg, mal nur das Basis-Paket, das in einen "Premium Business Look" verpackt wurde. Hier helfen unter Umständen ChatGPT Personas, mit denen du die Instruktion gibst, dass es sich um einen hochklassigen Software-Architekten handelt, der Bücher wie Clean Code, Clean Architecture und Co. nicht nur gelesen hat, sondern seine Manifeste darstellen.

Risiken

KI liefert oft Code-Snippets, die isoliert betrachtet funktionieren, aber architektonisch „lose“ im Raum stehen. Wer nur noch "Vibe-Coding" betreibt, baut unbewusst einen Monolithen, der so verstrickt ist, dass ihn keine Architektur der Welt mehr rettet.

Nochmal meine Flutter-Arbeit als Beispiel: Mir passierte das bei einem Flutter-Projekt: Ich wollte UI und Logik (Events, States, BLoCs) sauber trennen. Die KI lieferte mir erst nur eine "BLoCs-Light"-Komponente. Erst durch die offizielle Dokumentation merkte ich, dass es mit Tools wie Freezed (ein Code-Generator für Datenklassen) viel effektiver und wart

Tags:#software-architektur#microservice#modulith#monolith#verteilte systeme#distributed system
Artikel teilen:
RSS Feed

Bleib auf dem Laufenden mit neuen Artikeln. Abonniere den RSS Feed.

Gefällt dir dieser Artikel?

Entdecke mehr zum Thema Development.

Alle Artikel ansehen
Hendrik Haustein

Hendrik Haustein

Fullstack Developer

Hendrik ist Fachinformatiker für Anwendungsentwicklung, studiert Medieninformatik an der TH Lübeck und liebt sauberen Code und packende Stories. Er entwickelt diverse Web- und Mobile-Apps. Seit 2014 beschäftigt er sich mit Blogs und Content-Marketing.