In großen Automobil-Softwaresystemen sind nicht-funktionale Aspekte wie Plattformspezifikationen, Timing-Anforderungen, Ressourcennutzung, Implementierungsdetails und Fehlerbehandlung oft über die gesamte Codebasis verstreut und mit der zentralen Funktionslogik verwoben. Diese enge Kopplung stellt den gesamten Entwicklungsprozess vor große Herausforderungen. Dadurch wird es schwieriger, die Software zu verstehen, zu warten und weiterzuentwickeln, insbesondere da die Fahrzeuge immer komplexer und softwaregesteuerter werden.
Wenn nicht-funktionale Anforderungen direkt in funktionalen Code eingebettet werden, können selbst kleine Änderungen wie die Portierung von Software auf eine neue Hardwareplattform oder die Anpassung von Leistungsparametern zu weitreichenden Dominoeffekten führen. Dies verlangsamt die Entwicklung, erhöht das Risiko, Fehler einzuführen, und erschwert das Testen und Verifizieren. Darüber hinaus schränkt es die Wiederverwendbarkeit von Komponenten ein, da jedes Modul nicht nur auf eine bestimmte Funktion, sondern auch auf eine bestimmte Ausführungsumgebung oder eine Reihe von Systemeinschränkungen zugeschnitten ist.
Mit der Umstellung von Fahrzeugen auf eine softwaredefinierte Architektur wird diese Art der Verschränkung zu einem ernsthaften Hindernis für Skalierbarkeit und Innovation. Um mit den steigenden Anforderungen an Effizienz, Sicherheit und Anpassungsfähigkeit Schritt zu halten, muss sich Automobilsoftware hin zu modularen, entkoppelten Architekturen entwickeln, die nicht-funktionaler Eigenschaften als erstklassige, trennbare Elemente behandeln und nicht als versteckte Nebeneffekte, die im prozeduralen Code verborgen sind.
Der TwinSpace-Ansatz zielt darauf ab, den Herausforderungen eng gekoppelter Softwarearchitekturen zu begegnen, indem nicht-funktionale Aspekte in Automobilsystemen identifiziert und modularisiert werden. Unser Vorgehen ist vom „Aspect Mining“ inspiriert – einer Technik, die traditionell ein breites Spektrum von Querschnittsthemen adressiert. Im Unterschied zum klassischen Aspect Mining fokussieren wir jedoch gezielt auf Software- und Systemaspekte, die Leistung, Energieeffizienz und Plattformkompatibilität beeinflussen.
Diese Methode ermöglicht es Entwicklungsteams, vorhandene Codebasen zu analysieren und festzustellen, wo nicht-funktionale Logik mit dem Kernfunktionsverhalten verwoben ist. Nach der Isolierung werden diese Aspekte in klar definierte, modulare Komponenten oder Schichten umgestaltet, die unabhängig von der Anwendungslogik verwaltet, analysiert und optimiert werden können.
Diese Modularisierung hat mehrere wichtige Vorteile:
Verbesserte Rückverfolgbarkeit über den gesamten Stack
Einer der ersten Vorteile der Isolierung nicht-funktionaler ist die bessere Rückverfolgbarkeit. Wenn Verhaltensweisen auf Systemebene wie Timing, Ressourcennutzung oder Plattformeinschränkungen in der Kernlogik verborgen sind, ist es schwierig zu verstehen, wo und wie sie das Systemverhalten beeinflussen. Durch die Extraktion dieser Aspekte in dedizierte Komponenten können Teams besser erkennen, wie solche Verhaltensweisen implementiert werden und wie sie mit den Kernfunktionen interagieren, wodurch die Codebasis leichter zu navigieren und zu bedenken ist.
Trennung von Anliegen, die tatsächlich funktioniert
Mit einem modularen Aufbau kann sich die Funktionslogik endlich auf das konzentrieren, was das System tun soll, wie z. B. die Verarbeitung von Sensordaten oder das Auslösen einer Steuerungsreaktion, ohne sich damit zu beschäftigen, wie das System Echtzeit-Fristen einhält oder den Stromverbrauch verwaltet. Nicht-funktionale Elemente, wie z. B. Planungsrichtlinien oder Kommunikationsprotokolle, werden in separate Schichten oder Module verschoben. Diese Trennung bringt Klarheit in die Architektur und schafft die Voraussetzungen für saubere Schnittstellen zwischen Logik- und Ausführungsumgebungen.
Isoliertes Optimieren des Verhaltens auf Systemebene
Ein weiterer großer Vorteil dieses Ansatzes ist die Möglichkeit, nicht-funktionale Aspekte, wie z. B. die Laufzeitleistung oder die Energieeffizienz, abzustimmen und zu optimieren, ohne die Kernfunktionalität zu beeinträchtigen. Entwickler können Einschränkungen auf Systemebene nach ihren eigenen Anforderungen simulieren und validieren, ohne erneut in den Anwendungscode eintauchen oder unveränderte Logik erneut überprüfen zu müssen, die sich nicht geändert hat. Diese Isolierung reduziert das Risiko, spart Zeit und unterstützt einen iterativeren Ansatz zur Feinabstimmung des Systems.
Wiederverwendbarkeit, die mit der Plattform skaliert
Wenn nicht-funktionale Probleme von der Kernlogik der Software entkoppelt werden, können sie viel einfacher wiederverwendet werden. So kann beispielsweise eine für ein Steuergerät entwickelte Timing-Strategie für mehrere Module oder sogar verschiedene Fahrzeuge mit ähnlichen Einschränkungen wiederverwendet werden. Plattformspezifische Aspekte, Speicherverwaltungsstrategien oder Diagnoseverhalten können bei Bedarf modularisiert und in neue Projekte integriert werden, um die Entwicklung zu beschleunigen und die Konsistenz im gesamten Software-Stack zu verbessern.
Optimierte Tests und Verifizierung
Das Testen von nicht-funktionalen Eigenschaften wie Timing und Fehlertoleranz wird notorisch schwierig, wenn solche Aspekte tief im System verankert sind. Wenn sie jedoch isoliert sind, bieten sich Möglichkeiten für eine gezielte Simulation und Co-Verifizierung. In Kombination mit digitalen Zwillingsumgebungen können diese modularen Komponenten lange vor der Bereitstellung virtuell getestet werden, so dass Probleme frühzeitig erkannt und die Systemleistung unter realistischen Bedingungen validiert werden können. Dadurch wird das Vertrauen in das System erhöht und die Rückkopplungsschleifen in der Entwicklung deutlich verkürzt.