Softwarearchitektur

Drei Entscheidungsfaktoren für die Wahl der richtigen Softwarearchitektur

Die richtige Wahl der Softwarearchitektur spart Zeit und Geld. Bei der Festlegung der Architektur müssen jedoch verschiedene Entscheidungsfaktoren berücksichtigt werden. Wir stellen Ihnen drei näher vor.

Wie in der klassischen Architektur, legt auch die Softwarearchitektur die nötigen Bausteine bei der Entwicklung eines neuen Systems. Damit die passende Architektur zur Software gefunden werden kann, wird im Vorfeld eine intensive Abklärung mit dem Kunden durchgeführt. Das Ziel dieser Abklärung ist das Festlegen der fundamentalen Rahmenbedingungen für den Einsatz der Software.

Je nach Software spielen unterschiedliche Ausprägungen und Entscheidungsfaktoren eine bedeutsame Rolle. Diese Entscheidungen beeinflussen die Entwicklung der Software, da sie je nach dem zeitaufwändige Konsequenzen mit sich ziehen können. Aus der Gesamtmenge aller Anforderungen wird schliesslich die Teilmenge bestimmt, welche für die Architektur von grosser Bedeutung ist. Diese sind meist in den nicht-funktionalen Anforderungen zu suchen, und können beispielsweise den Qualitäts- und Performance-Anforderungen entsprechen. Davon kann letztlich die passende Architektur abgeleitet werden. 

«Wer als Werkzeug nur einen Hammer hat, sieht in jedem Problem einen Nagel.»

Häufig muss das Rad nicht neu erfunden werden. Meist werden die Anforderungen mit Vorgängerprojekten verglichen und schliesslich eine bewährte Referenzarchitektur gewählt. Die Gewichtung der Anforderungen ist aber nicht zu unterschätzen. Werden falsche Entscheidungen getroffen, ist es im Nachhinein oft schwierig und zeitaufwändig die Software umzubauen.

Welche Entscheidungsfaktoren spielen bei der Wahl der Softwarearchitektur eine entscheidende Rolle? Es gibt viele verschiedene Ausprägungen, die berücksichtigt werden müssen. Wir nehmen drei davon genauer unter die Lupe:

Leistung

Bei der Leistung gibt es viele Fragen, die man für ein System beantworten muss. Zwei der Wichtigsten sind aber sicher, wie sich die Systemprozesse in Bezug zu der realen Zeit verhalten, und wie die Last auf das System mit der Entwicklung der Nutzerzahl zusammenhängt.

Zeitabhängigkeit

Bezüglich Zeitabhängigkeit werden Systeme in drei grobe Kategorien unterteilt: Systeme welche zeitkritische Prozesse steuern, solche die zeitnah reagieren müssen und solche welche keine spezielle Zeitabhängigkeit aufweisen.

  • Für zeitkritische Systeme muss meist eine real-time-fähige Umgebung gewählt werden, in welchen die Laufzeit von Prozessen im Voraus bestimmt werden kann (z.B. VxWorks oder Linux mit Realtime-Kernel). Diese finden zum Beispiel Anwendung bei Raketensteuerungen oder Prozessen in Fahrzeugen.
  • Für zeitnahe Systeme reicht es oft einen schnellen Feedback-Loop einzurichten. Bei Netzwerkanbindungen müssen allerdings oft spezielle Protokolle eingesetzt werden (wie RTP, VoIP, etc.). Interaktive Prozesse wie Videochat oder interaktive Simulationen werden üblicherweise als zeitnahe Systeme umgesetzt.

Benutzerabhängigkeit

Viele Systeme sind nur für einen eingeschränkten Kreis von Fachnutzern gedacht, welcher sich während der Lebensdauer eines Systems nicht gross verändert. Falls sich jedoch die Nutzerzahl stark verändern, oder das System für eine breite Allgemeinheit zur Verfügung gestellt werden sollte, muss es so ausgelegt werden, dass die schwankende Last entsprechend abgefedert werden kann. Dies wird heute meist über eine horizontale Skalierung der kritischen Systemkomponenten realisiert (normalerweise in einer Cloud-Umgebung).

Qualität

Fehlertoleranz

Systeme von welchen Menschenleben abhängen, erfordern andere Massnahmen als normale Business-Software. Auch das Verarbeiten von Finanzströmen erfordert eine besonders niedrige Fehlerquote. Dies hat meist Auswirkungen auf den Quality-Assurance Prozess (insbesondere das Testing), kann aber auch entscheidend für die Technologiewahl sein (z.B. Programmiersprache mit integrierter Beweisführung wie Coq oder ACL2). 

Fehlertoleranz kann auch den Umstand bezeichnen, wie das System mit Bedienungsfehlern umgehen können muss, ohne in einen unbrauchbaren Zustand zu verfallen (Stichwort Undo/Redo).

Ausfallsicherheit

Besonders robuste Systeme sind meist redundant ausgelegt, so dass der Ausfall einzelner Komponenten nicht den gesamten Betrieb beeinträchtigt. Ein weiterer wichtiger Faktor in diesem Bereich ist das Logging und Debugging. Wenn Ausfälle trotzdem vorkommen, muss der Grund gefunden werden, damit eventuelle Programmfehler korrigiert werden können. Es sollte auch überlegt werden, inwiefern die Software ein lohnendes Ziel für Cyberkriminelle werden könnte, und allenfalls müssen dann andere Entscheidungen bezüglich der Ausfallsicherheit getroffen werden.

Sicherheit

Zugriffsschutz

Wie wichtig ist es, dass die Prozesse des Systems vor dem Zugriff unberechtigter Personen geschützt werden? Hier geht es nicht nur um Zugriffsverletzungen von aussen, sondern auch um interne Berechtigungsprobleme und -überschreitungen.

Datenschutz

Viele Systeme verarbeiten Daten, die in etlichen Rechtsräumen als besonders schutzwürdig gelten, und mit speziellen Verarbeitungsgesetzen verknüpft sind. Auch Risikoanalysen im Bezug auf Datenverlust oder Spionage fallen in diesen Bereich.

Je nachdem wie die Software in diesen (oder anderen als wichtig identifizierte) Kriterien abschneidet, kann man andere Architekturmuster anwenden. Im nächsten Blogbeitrag werden wir auf einige dieser Architekturmuster näher eingehen.