Modellgetriebene Softwareentwicklung

Blogeintrag:

Modellgetriebene Softwareentwicklung

6 Februar 2017

Modelle als Mittel zur Handhabung von komplexen Sachverhalten sind ein wichtiges und etabliertes Mittel in der Informatik. Modelle sind sowohl aus Wissenschaft wie Alltag bekannt: Sie sollen helfen, unüberschaubare, nicht direkt einsehbare oder komplexe Sachverhalte angemessen zu vereinfachen, das heißt, sie auf ihre relevanten Merkmale zu reduzieren. Modellbeschreibungen stellen also niemals einen kompletten Sachverhalt oder eine Funktionalität dar, sondern nur einen gewünschten und für den jeweiligen Einsatzbereich benötigten Ausschnitt. In der Softwareentwicklung helfen Modelle, die ständig wachsende Komplexität von Software bewältigen zu können. Im Ansatz der sogenannten modellgetriebenen Softwareentwicklung wird nun versucht, die Vorteile die modellhafte Betrachtungen mit sich bringen, direkt in die Softwareentwicklung selbst zu integrieren. Ziel ist es, aus dem Modell eines Computerprogramms direkt ein lauffähiges Programm zu erzeugen. Vereinfacht wird dabei aus einem Diagramm automatisch ein Quellcode erzeugt.

Was ist modellgetriebene Softwareentwicklung?

In der modellgetriebenen Softwareentwicklung wird aus formalen Modellen lauffähige Software (vollständig oder teilweise) automatisch generiert. Unter einem formalen Modell wird eine funktionale Beschreibung verstanden, die erstens aus standardisierten Elementen zusammengesetzt ist und zweitens diese Elemente Komponenten der maschinellen Informationsverarbeitung repräsentieren. Aufgabe von Modellen in der Informatik und Softwareentwicklung ist es, einen Sachverhalt so darzustellen, dass er mit Hilfe elektronischer Informationsverarbeitung verarbeitet werden kann.

Bei der modellgetriebenen Softwareentwicklung handelt es sich um ein Programmierparadigma. Ein Programmierparadigma ist als die fundamentale Organisationsform einer Programmiersprache zu verstehen und gibt an, welche Prinzipien und Konzepte zum Einsatz kommen. Dies bezieht sich sowohl auf die zum Einsatz kommenden Datenstrukturen (wie werden bestimmte Daten aufgenommen, gespeichert und verarbeitet), als auch auf die Art wie in der jeweiligen Programmiersprache Abläufe, die der Computer ausführen soll, eingegeben werden. Ein Programmierparadigma umfasst also die strukturierten Grundgedanken, die hinter einer Programmiersprache stecken und legt somit fest, wie eine an den Computer gestellte Aufgabe umgesetzt werden kann.

In der modellgetriebenen Progarmmierung kommen nun nicht herkömmliche, textbasierte Programmiersprachen zum Einsatz, sondern die sogenannten Modellsprachen. Programmiersprachen bestehen mehr oder weniger aus einem Textfenster, in das die in der jeweiligen Sprache gültigen Befehle eingegeben und durch einen Compiler ausführbar gemacht werden. Der Ansatz der Modellierungssprachen ist ein anderer. Diese Art von Sprachen ermöglicht es, Programmabläufe, Datenflüsse und Verarbeitungsprozesse mit Hilfe von formalen Diagrammen zu entwerfen. Diese Diagramme werden nach einer festgelegten Syntax, einer formalen Grammatik, welche die Struktur festlegt, wie einzelne Diagrammbausteine zusammengefügt werden dürfen, gestaltet und können anschließend durch den Codegenerator in ausführbaren Code umgewandelt werden.

Um aus einem Modell ein lauffähiges Programm zu erstellen, sind mindestens drei Schritte nötig. Neben der Modellerstellung müssen Modelltransformation und Codegenerierung stattfinden.

Die zur modellgetriebenen Softwareentwicklung genutzten Werkzeuge müssen mindestens aus einem Modellierungswerkzeug bestehen. Dies arbeitet meist mit einer grafischen Benutzeroberfläche und ermöglicht das reine Erstellen von Diagrammen, die Verarbeitungswege der Daten und Interaktionen zwischen Benutzern und Programmablauf darstellen. Diese können dann als Datei in einem Austauschformat gespeichert werden.

Damit aus diesem Modell ein ausführbarer Code werden kann, muss jedoch vorher eine weitere Zwischenstufe, die Modelltransformation, durchlaufen werden. Dieser Schritt ist durch das flexible Austauschformat begründet. Dieses Austauschformat erlaubt es, Modelle in verschiedenen Modellierungswerkzeugen untereinander auszutauschen. Verwendung findet dabei zunehmend der XML Metadata Interchange Standard, XMI abgekürzt. Dieser Dateistandard erlaubt es, beliebige Datenverarbeitungsmodelle abzuspeichern. Als reines Austauschformat eignet es sich aber nicht, um daraus direkt einen Sourcecode zu generieren.

Deshalb muss das Austauschformat in Vorbereitung zur Codegeneration, abhängig von Codegenerator in dem das Modell ausführbar gemacht werden soll und abgebildeten Sachverhalt, vorher in ein geeignetes Format transformiert werden. Diese Phase wird als Modelltransformation bezeichnet und lässt sich vereinfacht dadurch verstehen, dass sich verschiedene Sachverhalte durch sogenannte Graphen darstellen lassen. Sowohl das U-Bahn-Netz einer Großstadt, als auch ein soziales Netzwerk zwischen Personen lassen sich anhand von durch Linien verbundenen Kreisen darstellen. Die standardisierte Variante dieser Darstellungsform, zusammen mit Verknüpfungsregeln für die Kreise, nennt sich Graph. Jeder Kreis, in der Graphentheorie, dem Teilbereich der Mathematik der sich mit diesen Graphen beschäftigt, als Knoten bezeichnet, stellt dabei entweder eine Haltestelle (im Falle des U-Bahn-Netzes) oder eine Person (im Falle des sozialen Netzwerkes) dar. Jede Linie, in der Graphentheorie Kante genannt, symbolisiert entweder eine Schienenverbindung zwischen den Haltestellen oder ein Bekanntschaftsverhältnis zwischen den Personen. Beide Sachverhalte, U-Bahnverbindungen oder Bekanntschaftsverhältnisse zwischen Personen, lassen sich in der Sprache desselben Modells, eines Graphen, abbilden, müssen aber vollkommen unterschiedlich interpretiert werden. Man kann beide Modelle zwar im selben Format speichern, damit diese dann aber von einem datenverarbeitenden System bearbeitet werden können, z. B. für die optimale Erstellung eines Fahrplans, müssen die jeweiligen Graphen erst noch in ein auf den jeweiligen Kontext des Modells passendes Format für eine entsprechende Bearbeitungssoftware übertragen werden. Die Modelltransformation stellt somit in gewisser Weise eine maschinelle Interpretation des Modells dar.

Die letzte Stufe der modellgetriebenen Softwareentwicklung stellt schließlich die Phase der Codegenerierung dar, bei der automatisch durch einen Codegenerator ein Quelltext in einer bestimmten Programmiersprache erzeugt wird.

Es existieren auch integrierte Werkzeuge, die alle drei Phasen der modellgetriebenen Softwareentwicklung selbst durchführen können. Kommen solche integrierten Lösungen zur Softwareentwicklung zum Einsatz, müssen keine Dateiübertragungen oder Transformationen durchgeführt werden und das Entwicklerwerkzeug muss während des ganzen Entwicklungsprozesses „nicht verlassen“ werden.

Wo kommt modellgetriebene Softwareentwicklung zum Einsatz?

In der Softwaretechnik spielen Modelle in der Konzeption und Entwicklung von Programmen seit jeher eine zentrale Rolle. Bevor der eigentliche Programmiervorang durch Befehlseingabe in einen Interpreter oder Compiler beginnt, werden die Teile umfangreicher Programme meist als Diagramme vorbereitet. Diese Diagramme zeigen Eingabe- und Verarbeitungswege sowie die davon abhängigen Ausgaben an. Erst dann wird anhand dieser Ablaufpläne programmiert. Ohne eine solche Vorbereitung ist ein umfangreiches Programm meist gar nicht zu verwirklichen. Modelle der Programmabläufe waren also seit jeher ein wichtiges Werkzeug in Programmierung. Entwickelt wurden diese meist in Rückgriff auf die wissenschaftliche Analyse und Entwicklung von Datenstrukturen und Algorithmen in der Informatik. Hier stellen Modelle die Grundkonzepte der Datenverarbeitung dar.

In einer zunehmend vernetzten Welt nehmen einerseits Bedarf und Komplexität softwaregesteuerter Geräte zu und andererseits kommen immer mehr sogenannte eingebettete Systeme zum Einsatz, die ebenfalls Software benötigen.

Eingebettete Systeme sind in einen speziellen technischen Kontext eingebettete Rechenanlagen, die Regelungs- oder Überwachungsaufgaben übernehmen oder allgemein Datenflüsse in Form von Ein- und Ausgaben verarbeiten. Solche eingebetteten Systeme kommen, meist nicht vom Nutzer bewusst wahrgenommen, im Alltag in Multimediageräten, Telekommunikationsgeräten oder Unterhaltungselektronik vor. Aber auch in komplexen Produktionsanlagen, in der Hausautomatisierung oder zusammengesetzten Maschinen wie Flugzeugen oder Fahrzeugen kommen diese Geräte zum Einsatz. Eingebettete Systeme bestehen dabei meist aus einer Kombination von spezieller Hard- und Software und sind für ihren jeweiligen Einsatz angepasst. In Bezug auf Schlagworte wie dem „Internet der Dinge“ oder „Industrie 4.0“ gewinnen diese integrierten Systeme zunehmend an Relevanz, da die technische Umgebung des Menschen immer stärker Digitalisiert wird.

Einerseits steigt mit dem Ausbau der datenintensiven Infrastruktur schlicht der Bedarf an Software für die speziellen Geräte, die zudem auch immer schneller entwickelt werden muss, andererseits muss diese Software auch einen bestimmten Qualitätsstandart erfüllen. Hinzu kommt, dass die Anforderungen an die hergestellte Software zunehmen und diese immer komplexer wird. War ein Fernseher früher eine Elektronenröhre mit ein paar Schaltern und Drehknöpfen, so verfügen heute bereits die einfacheren Modelle über Betriebssysteme und Internetzugang.

Doch nicht nur im Bereich der eingebetteten Systeme finden modellbasierte Programmierparadigmen ihre Anwendung. Durch die zunehmende Präsenz informationeller Systeme in allen Lebensbereichen sind neue Aufgabenfelder in der Informationstechnologie hinzugekommen. Reichte früher der „klassische“ Informatiker für die Programmierung der IT-Infrastruktur aus, so können inzwischen viele Entwicklungs- und Betreuungsaufgaben nur noch von Spezialistenteams ausgeführt werden. Softwareingenieure, -architekten und -designer arbeiten zusammen mit anderen IT-Berufen in großen Entwicklerteams zusammen, um umfangreiche Projekte zu realisieren. Da oftmals nicht mehr auf einen gemeinsamen Wissensschatz zurückgegriffen werden kann, benötigen all diese Fachleute die einheitliche Sprache des Modells, um gemeinsam eine Software zu realisieren. Frühere Softwarelösungen bestanden damals zudem aus Ad-Hoc-Lösungen minderer Qualität.

Bei den Modellierungssprachen wird, je nach Einsatzbereich zwischen domänenspezifischen Sprachen und universell einsetzbaren Modellierungssprachen unterschieden. Wo eine domänenspezifische Sprache auf einen bestimmten Einsatzbereich begrenzt ist (dieser begrenzte Einsatzbereich wird Domäne genannt), sind universelle Modellierungssprachen dazu geeignet, für beliebige Einsatzbereiche Anwendung zu finden. Die domänenspezifischen Sprachen kommen daher oft für eingebettete Systeme zum Einsatz, während sich mit den universellen Modellierungssprachen die großen Softwareprojekte durchführen lassen.

Die Unified Modeling Language (UML) ist momentan die meist eingesetzte Sprache in der Softwaresystem-Modellierung. Sie eignet sich sowohl zur Konstruktion als auch zur Dokumentation von Software. Dabei verfügt UML über eine graphische Notation (also einem festgelegten Katalog von Diagrammteilen) und einem Regelwerk, nach denen diese Diagrammelemente zusammengeführt werden dürfen. Diese Elemente und ihre Kombinationen entsprechen Begriffen und ihren möglichen Beziehungen einer Programmiersprache zueinander, durch die erst eine Sprache entstehen kann. Die Diagramme sind dabei gewissermaßen die Repräsentation für die Begriffe, aus denen das Modell besteht.

Welche Vor- und Nachteile hat modellgetriebene Softwareentwicklung?

Die Vorteile von Modellierungssprachen sind vor allem ihre einfachere Zugänglichkeit und ihre Reduktion von Komplexität. Ein Programmablauf ist durch ein standardisiertes Diagramm einfacher nachzuvollziehen als ein unübersichtlicher Programmcode. Weiterhin ist die Darstellung klarer und universeller als bei einem an eine bestimmte Sprache gebundenen Programm. So werden durch diesen Abstraktionsgrad die Grundkonzepte und Strukturen eines Programms ersichtlich und unabhängig von einer Sprache. Somit ist das Programmmodell, sofern es in einer universellen Modellsprache geschrieben ist, in beliebigen Sprachen und auf verschiedenen Plattformen realisierbar.

Diese Trennung von Programmcode und der formalen Abbildung eines Programms macht es auch einfacher, Modifikation an bestehenden Softwarelösungen vornehmen zu können. So können Zusatzfunktion oder Änderungen leichter implementiert werden, ohne über die Codezeile gehen zu müssen.

Nachteile modellgetriebener Programmierung können sein, dass der tatsächliche Entwicklungsaufwand deutlich unterschätzt wird. Das liegt zum einen daran, dass im Gegensatz zu einer Planung eines umfangreichen Softwareprojekts kein informelles und oftmals grobes Rahmendiagramm des Ablaufs ausreicht, sondern ein formale und sorgfältige Erstellung notwendig ist.

Zum anderen bieten Modelle oftmals nur Teilaspekte der durch sie modellierten Sachverhalte ab. Das kann es mitunter notwendig machen, Details des durch den Codegenerator erzeugten Codes per Hand zu ergänzen. Dies stellt einerseits dann eine erneute Fehlerquelle bereit und andererseits ist oft schwer einzuschätzen, wie umfangreich die abschließende Feinarbeit an einem Softwareprojekt tatsächlich ist. Die Möglichkeiten und damit auch die Ersparnis an Entwicklungszeit mit modellbasierten Programmiersprachen werden so teilweise überschätzt.

Weiterhin kann die Fehlersuche durch manuell eingefügten Code umfangreich werden, was die Vorteile der Flexibilität und Universalität eines Modells für die Software teilweise wieder zunichtemacht.

Während die Vorteile bei universellen Modellierungssprachen und den domänenspezifischen weitgehend gleich sind, treten bei den spezifischen Sprachen noch zusätzliche Nachteile auf. So bleibt für Entwickler immer die Frage offen, ob es sich lohnt, für einen begrenzten Einsatzbereich eine neue Sprache zu lernen. Auch sind zukünftige Entwicklungen bestimmter eingebetteter Systeme durch die spezifischen Sprachen schwer zu antizipieren. Weiterhin besteht das Risiko, dass der Umfang der domänenspezifischen Sprache bei fortschreitendem Entwicklungszyklus immer weiter ansteigt, bis sich daraus schleichend, eine Mächtigkeit einer universellen Sprache entwickelt hat. Damit wäre die Existenzberechtigung einer im Einsatzbereich eingeschränkten Sprache fragwürdig geworden.

Zusammenfassend

Das Paradigma der modellgetriebenen Softwareentwicklung verfolgt also das Ziel der Programmgenerierung direkt aus dem Modell. Dabei soll der Quelltext automatisch, teilweise oder vollständig, durch einen Codegenerator anhand eines von Menschen entworfenen Ablauf- oder Interaktionsmodells erzeugt werden. Dieses Modell besteht aus einem graphischen formalen Diagramm, dass alle Interaktionen und Abläufe des Programms darstellt. Dies soll einerseits die Entwicklungszeit verkürzen aber auch für eine gleichbleibende Qualität des Quellcodes und für hohe Flexibilität der Software für Modifikationen und Plattformen ermöglichen. Zum Einsatz kommt der modellgetriebene Ansatz gegenwärtig vor allem im Bereich der eingebetteten Systeme und wird deshalb bei zunehmender Vernetzung stärker an Bedeutung gewinnen. Aber auch die immer umfangreicher werdenden und von Spezialistenteams betreuten Softwareprojekte machen Modellierungssprachen zu einem zunehmend wichtigen Entwicklungswerkzeug.

Bei Fragen können Sie gerne mit uns oder unseren Fachberatern Kontak aufnehmen.

Schreiben Sie uns an.