Softwarearchitektur#

Midjourney: Soft Architecture

Good architecture is not just about structure - it’s about intention. In code as in buildings, clarity and purpose leave the longest legacy

— Louis Kahn

Folien/PDF#

Monolithische, maschinennahe Software vor 1950#

Über die Jahre haben sich die Softwarearchitekturen den modernen Anforderungen angepasst. Dadurch haben sich auch neue Programmiersprachen und Softwarearchitekturen entwickelt. Die ersten Programme wurden direkt in binären Maschinencode geschrieben. Dieser wurde mit speziellen Maschinen programmiert, die direkt mit der Hardware kommunizierten. Die Software war monolithisch, d.h. es gab keine Trennung von Funktionalitäten. Alle Funktionen waren in einem einzigen Programm vereint. Diese Software war eng an die Hardware gebunden, was bedeutete, dass sie nur auf einer bestimmten Hardwareplattform lief.

Problem: Dabei entstand das Problem, dass Programme für neue Hardware meist komplett neu geschrieben oder stark angepasst werden mussten.

Monolithische Software

Aufteilung in Betriebssysteme und Monolithische Software ab ca. 1960#

Betriebssysteme wurden eingeführt um Standardaufgaben zu erfüllen (Dateiverwaltung, Speichermanagement, Anzeige, etc.) und die Hardware zu abstrahieren. Dies geschieht durch hardwarespezifische Treiber. Dadurch muss bei neuer Hardware, nur der Treiber ausgewechselt werden, welcher die gleichen Funktionen wie der alter Treiber bietet. Das Programm muss nicht angepasst werden.

Problem: Die Programme sind sehr schwer zu schreiben, weil sie sehr gutes Verständnis der Hardware, der Treiber und der Betriebssystemfunktionen erfordern. Sie sind sehr low-level und bieten wenig Abstraktion.

Betriebssysteme

Entwicklung von höheren Programmiersprachen ab ca. 1970#

Um die Programmierung zu vereinfachen, wurden höhere Programmiersprachen eingeführt, die ‘natürlichsprachlichere’ Befehle benutzen. Sie müssen mit Compilern oder Interpretern in Maschinensprache übersetzt werden. Die ist allerdings spezifisch für das Betriebssystem und die genutzten Treibern, um deren spezifische Funktionen anzusprechen. Das bedeutet, dass Programme, die für ein bestimmtes Betriebssystem und Treiber geschrieben wurden, nicht ohne Weiteres auf einem anderen Betriebssystem laufen können.

Problem: Wenn sich die Betriebssysteme ändern, so funktionieren Programme nicht und müssen entweder neu Kompiliert werden oder umgeschrieben werden.

Höheren Programmiersprachen

Virtualisierung Monolithischer Software ab ca. 1995#

Um die Abhängigkeit von Betriebssystemen zu verringern, wurden virtuelle Laufzeitumgebungen eingeführt. Diese abstrahieren die Betriebssysteme und ermöglichen es, Code in Echtzeit zu kompilieren (z.B. Java) oder ihn zu interpretieren (z.B. Python). Dadurch können Programme auf verschiedenen Betriebssystemen laufen, ohne dass sie neu geschrieben werden müssen.

Dadurch wurde es auch einfacher neue Betriebsysteme zu entwickeln, weshalb auch Android und iOS für mobile Geräte entstanden sind, die sehr stark Virtualisierung nutzen.

Problem: Mit dem Internet entwickelte sich der Bedarf nicht nur Text und Bilder zu teilen, sondern auch Inhalte auf Webseiten dynamisch anzupassen und kleinere (bis größere) Programme auszuführen. Um von verschiedenen Geräten auf die Daten zuzugreifen, braucht man einen zentralen Punkt um die Daten zu speichern und komplexere Berechnungen auszuführen.

Virtualisierung

Verteilte, Virtualisierte Software im Internet ab ca. 2000#

Im Internet funktionierten traditionelle monolithische Softwareanwendungen die auf einem einzelnen Computer liefen nicht mehr gut. Es stieg der Bedarf an Anwendungen, die auf mehreren z.T. mobilen Geräten laufen und gleiche Daten verwenden können. Hierfür wurde verteilte Softwarearchitektur entwickelt.

Diese Architektur trennt die Frontend-Anwendungen von den Backend-Servern. Die Frontend-Anwendungen sind für die Darstellung der Inhalte und die Interaktion mit den Nutzern zuständig, während die Backend-Server die Webseiten bereitstellen und die Langzeitdaten in Datenbanken verwalten. Diese Trennung ermöglicht es, dass Frontend-Anwendungen (Webseiten oder Apps) die Inhalte visualisieren und mit den Nutzern interagieren können, ohne dass sie direkt auf die Datenbanken zugreifen müssen.

Problem: Im Internet greifen oft sehr viele Nutzer gleichzeitig auf die gleichen Server (Seiten) zu. Um diese nicht zu überlasten, brauchte man Wege diese bei Bedarf schnell zu duplizieren. Mit der Entwicklung von mobilen Geräten (Smart Phones, Tablets, etc.) gab es immer mehr relativ kleine spezialisierte Anwendungen (Apps) Hier kann der Bedarf an Rechenkapazitäten dynamisch schnell wachsen und man benötigte auch dynamisch skallierbare Server.

Verteilte Software

Verteilte, Virtualisierte Apps und Cloud Software ab ca. 2010#

Apps und Websites lösen vollständig traditionelle monolithische Programme ab. Sie laufen nicht mehr vollständig auf einem einzigen Computer, sondern haben Benutzeroberflächen auf mobilen Geräten und die Daten in der Cloud. Das erfordert auch die Skalierbarkeit und Flexibilität von Anwendungen im Internet zu verbessern, um auf hohes Nutzeraufkommen schnell reagieren zu können. Um Webserver und Berechnungen in der Cloud besser zu skalieren, bündelt man Programme mit dem Betriebssystem in Images und virtualisiert Hardware. Dadurch kann man sehr schnell Programme mit dem kompletten Betriebssystem auf vielen Rechnern verteilen.

Problem: Die resultierenden modernen verteilten Anwendungen weisen eine sehr hohe Komplexität auf. Es gibt viele spezialisierte Programmiersprachen und Teilarchitekturen, um einzelne Probleme darin zu lösen.

Images und Cloud Software

Klassifikation der Programmiersprachen nach historischer Anwendung#

Die Programmiersprachen haben sich entsprechend den Architekturen auch mit der Zeit entwickelt. Deshalb änderten sich auch über die Zeit die beliebten Programmiersprachen.

Klassifikation der Programmiersprachen

Quiz#

--- shuffleQuestions: true shuffleAnswers: true --- ### Was war typisch für Software vor 1950? - [x] Direkt in binärem Maschinencode geschrieben - [x] Monolithischer Aufbau ohne Funktions-Trennung - [x] Enge Kopplung an spezifische Hardware - [ ] Nutzung von Cloud-basierten Microservices ### Welches Hauptproblem ergab sich durch die enge Kopplung von Software und Hardware? - [x] Änderungen an der Hardware erforderten oft eine komplette Neuprogrammierung - [ ] Software war nicht ausführbar - [ ] Es konnte kein Speicher genutzt werden - [ ] Software war zu langsam für den Einsatz ### Wozu wurden Betriebssysteme ab den 1960er Jahren eingeführt? - [x] Um Hardwarefunktionen zu abstrahieren - [x] Um Standardaufgaben wie Dateiverwaltung zu übernehmen - [ ] Um Hardware komplett zu ersetzen - [ ] Um Spiele effizienter zu gestalten ### Welche Rolle spielen Treiber in modernen Betriebssystemen? - [x] Sie erlauben den Austausch von Hardware ohne Änderung am Programm - [ ] Sie speichern Programme im RAM - [ ] Sie stellen das GUI bereit - [ ] Sie sind optional für Hardwareansteuerung ### Warum wurden höhere Programmiersprachen eingeführt? - [x] Um die Programmierung zu vereinfachen - [ ] Um direkt Maschinencode zu schreiben - [x] Um Programme menschenlesbarer zu gestalten - [ ] Um Compiler zu vermeiden ### Was ist ein Nachteil höherer Programmiersprachen? - [x] Programme müssen für jedes Betriebssystem neu kompiliert oder umgeschrieben werden - [ ] Sie können keine Zahlen verarbeiten - [ ] Sie sind zu nah an der Hardware - [ ] Sie funktionieren nicht auf modernen Rechnern ### Welche Aufgabe übernehmen virtuelle Laufzeitumgebungen? - [x] Sie abstrahieren das Betriebssystem - [x] Sie interpretieren oder kompilieren Code zur Laufzeit - [ ] Sie ersetzen den Compiler vollständig - [ ] Sie verwalten den Dateizugriff im Netzwerk ### Warum stieg der Bedarf an Virtualisierung ab ca. 1995? - [ ] Weil Server nicht mehr funktionierten - [x] Weil Inhalte mobil über das Internet verfügbar sein mussten - [ ] Weil es keine Compiler mehr gab - [ ] Weil Betriebssysteme abgeschafft wurden ### Welche Aufgaben übernimmt das Frontend in verteilter Websoftware? - [x] Visualisierung der Inhalte - [x] Interaktion mit Nutzern - [ ] Verwaltung von Langzeitdaten - [ ] Steuerung der Serverhardware ### Welche Herausforderung trat bei Webservern mit vielen gleichzeitigen Nutzern auf? - [x] Gefahr der Serverüberlastung - [ ] Sicherheitslücken in CSS - [x] Notwendigkeit zur schnellen Vervielfältigung (Skalierung) - [ ] Keine Möglichkeit der Speicherung von Daten ### Wie helfen Images bei der Skalierung von Cloud-Anwendungen? - [x] Programme und Betriebssysteme werden gebündelt - [x] Sie lassen sich schnell auf Server verteilen - [ ] Images ersetzen die Benutzeroberfläche - [ ] Sie ermöglichen Code-Analyse durch KI ### Was ist ein Merkmal moderner Apps und Cloud-Software? - [ ] Sie werden lokal installiert und betrieben - [ ] Sie laufen nur auf einem Computer - [x] Sie sind verteilt und speichern Daten in der Cloud - [x] Sie ersetzen monolithische Software ### Wie stehen Programmiersprachen mit Softwarearchitektur im Zusammenhang? - [x] Sie haben sich zusammen mit Architekturmustern weiterentwickelt - [x] Beliebte Sprachen hängen von der Art der Architektur ab - [ ] Sie haben keinen Bezug zur Architektur - [ ] Nur objektorientierte Sprachen können verwendet werden