Zeilenwerk Foundation: Warum Individualsoftware bei uns nicht bei Null anfängt

Wie wir durch den Einsatz der standardisierten Referenzarchitektur Zeilenwerk Foundation und wiederverwendbaren Modulen individuelle, nutzerzentrierte Fachapplikationen bauen und trotzdem mit Standardsystemen konkurrenzfähig sind.

Zeilenwerk Foundation: Warum Individualsoftware bei uns nicht bei Null anfängt
Wie wir durch den Einsatz der Referenzarchitektur «Zeilenwerk Foundation» und wiederverwendbaren Modulen individuelle, nutzerzentrierte Fachapplikationen bauen und trotzdem mit Standardsystemen konkurrenzfähig sind.

Unser Geschäft ist die Entwicklung von Individualsoftware: Fachapplikationen, die wir nutzerzentriert nach den Bedürfnissen unserer Kund:innen massgeschneidert konzipieren, gestalten, umsetzen und betreiben. Im Gegensatz dazu steht die Standardsoftware, die mit einer bestehender Palette an Funktionen aufwartet und eine günstigere Investition verspricht.

In den letzten Jahren haben wir ein hybrides Modell entwickelt, mit dem wir die beiden Ansätze verbinden: Die Referenzarchitektur Zeilenwerk Foundation, die uns einen klaren Startpunkt und eine technische Vision bietet; und ein Ökosystem an Modulen, das die Wiederverwendung von Teillösungen möglich macht.

Das gibt uns die technische Flexibilität, qualitativ hochwertige und nutzungszentrierte Fachapplikationen in komplexen Geschäftsumfeldern entwickeln zu können, und diese während ihrer Laufzeit an Veränderungen anpassen zu können. Das Risiko einer Neuentwicklung sinkt, die Nutzungszufriedenheit ist hoch und die Total Cost of Ownership (TCO) der Software bleibt tief.

Referenzarchitektur

Wir verstehen unter Referenzarchitektur nicht ein starres Bild, das jedes Details vorgibt. Vielmehr fassen wir darunter zusammen, was wir im grossen Ganzen von Projekt zu Projekt gleich machen: Eine klare Strukturierung der Applikation in einzelne Bereiche und Komponenten; Best Practices, die unser Arbeiten strukturieren und verbessern; und einige technische Setzungen, die sich als sinnvoll erwiesen haben.

Unsere webbasierten Applikationen folgen einer Client-Server-Architektur, in der die Bedienoberflächen als Single Page Applications (SPAs) umgesetzt sind. Als Schichtendiagramm visualisiert sieht das wie folgt aus:

Logische Ansicht von Zeilenwerk Foundation

Im Zentrum steht dabei eine interne API, die jegliche Anfragen der einzelnen Bedienberflächen entgegennimmt. Die API funktioniert als wohldefiniertes Zusammenspiel folgender Komponenten:

  • Anwendungsfälle, die aufgrund einer User-Interaktion Daten zusammenführen oder die Aktualisierung von Daten in den Services koordinieren. 
  • Hintergrundaufgaben, die zeitbasiert (Cron Jobs) oder asynchron Verarbeitungsschritte durchführen, beispielsweise die Synchronisierung mit externen Systemen.
  • Ein Domain-Service, der zentrale Geschäftsregeln beinhaltet und die Services entsprechend initialisiert.
  • Services, die jeweils für fachlich klar umrissene Datensätze zuständig sind und eine Schnittstelle zur Analyse und Mutation dieser Daten zur Verfügung stellen.
  • Adapter, die für die Koordination des Datenflusses zu und von einem externen System zuständig sind, und diese Daten sinnvoll transformieren.

Diese Blaupause des Gesamtsystems dient der Orientierung in der Applikation und sorgt dafür, dass der Umsetzungsprozess stets auf ein klar strukturiertes und verständliches System hinarbeitet. 

Daneben sorgen gelebte Best Practices, beispielsweise im Bezug auf Testing und Naming Conventions, für eine Einheitlichkeit auf tieferer Ebene: Eine bewusste Angleichung und Qualitätssicherung von verschiedenen Herangehensweisen.

Die Referenzarchitektur und die Best Practices schaffen zusammen im Makro- und Mikrobereich wichtige Strukturen, um die Flexibilität des Systems offen zu halten und auf sich ändernde Anforderungen gut reagieren zu können. Die so entwickelten Applikationen sind durch ihren verständlichen Aufbau einfacher zu entwickeln, zu ändern und zu warten.

Modul-Ökosystem

Die Komponenten in der Service-Schicht (Services und Adapter) können wiederverwendet werden, da sie grundsätzlich frei von individueller Geschäftslogik der jeweiligen Anwendung sind. Zusammen mit den Packages machen sie das Modul-Ökosystem aus, das uns eine Wiederverwendung zwischen Projekten erlaubt:

Übersicht der Komponenten. Mit jedem Projekt wächst die Anzahl an Komponenten und damit die Flexibilität und Effizienzgewinne in der Entwicklung.

Die Services bieten den grössten fachlichen Mehrwert. Die Prozesslogiken eines Services lassen sich flexibel auf andere Kontexte übertragen und integrieren — bewährt, getestet und ohne grossen Entwicklungsaufwand. Als Beispiel: Der Bestand-Service dient der Abbildung von Bestand in Lagerverwaltungs- oder Logistik-Anwendungen, egal ob Artikel, Chargen oder Einzelstücke verwaltet werden. Der Service kümmert sich um das korrekte Aufzeichnen der Bestandesveränderungen und kann Aussagen treffen zum Bestand der gelagerten «Dinge», egal ob es sich um ein Pallett oder ein Einzelstück handelt.

Die Adapter sind als Abstraktionen von Umsystemen zu verstehen. Für jedes Umsystem, jede externe Schnittstelle wird ein solcher Adapter genutzt. So werden Details des Umsystems abstrahiert und eine spätere Wiederverwendung spart Zeit und Kosten.

Zum Schluss bieten die Packages auf technischer Ebene die Möglichkeit, Konfigurationen (beispielsweise TypeScript, ESLint, UI-Theming) und Dienstfunktionen zu teilen. Auch hier werden Synergien zwischen den Applikationen genutzt, ohne auf die Freiheit einer Individualentwicklung verzichten zu müssen.

Beispiel: Lagerverwaltungslösung Shelf für Elvetino

Die aktuelle Generation unserer Lagerverwaltungslösung Shelf haben wir in Zeilenwerk Foundation entwickelt und für die SBB-Tochter Elvetino ein komplettes Lagerverwaltungssystem konfiguriert und um ihre spezialisierten Anforderungen erweitert. Dank der Referenzarchitektur konnten wir mehrere Herausforderungen erfolgreich lösen. 

Bei der Lagerverwaltung überschneiden sich mehrere Fachbereiche und stellen damit damit diverse Anforderungen an Software: Lagerprozesse, Buchhaltungsprozesse, Bestellprozesse und weitere. Dank der klaren Trennung von Datenarchitektur (Services) und Anwendung (Domain) konnten die unterschiedlichen Anforderungen effizient adressiert werden, ohne auf eine hohe Individualisierung und Datenqualität verzichten zu müssen.

Eine zweite Herausforderung war die heterogene Struktur und Qualität der Daten aus den Umsystemen und deren Abgrenzung vom Lagerverwaltungssystem. Auch hier hat die Logik von Adaptern dabei geholfen, eine klare Abgrenzung zu finden. Die dem Framework zugrunde liegende Best Practice, jegliche Eingaben zu validieren, hat zudem das Aufdecken und Ausweisen von Datenproblemen vereinfacht.

Drittens ermöglichte die Flexibilität der Services ein schnelles Iterieren während dem Projekt. Damit konnten wir während des Projekts einfach auf die Rückmeldung der Nutzenden reagieren und zusätzliche Prozesse digitalisieren, die erst durch die Entwicklung aufgedeckt wurden.

Fazit

Der Einsatz einer Referenzarchitektur mit einer klaren Struktur und Best Practices hilft uns, Applikationen schneller, verlässlicher und günstiger zu entwickeln. Das wachsende Modul-Ökosystem ermöglicht es uns, gut ausgerüstet in einem bekannten Umfeld gleich nach Projektstart in die Individualisierung zu starten und nahe an den Nutzenden ergonomische Software zu entwickeln. 

Hinzu kommt: Diese Art von Softwareentwicklung ist zukunftsfähig. Durch KI-gestütztes Software Engineering wird Individualentwicklung umso attraktiver — wenn man die richtigen Leitplanken setzt und Qualität und Sicherheit im Griff hat. Zeilenwerk Foundation bietet genau diese Grundlagen —für nutzerzentrierte, solide und bezahlbare Fachapplikationen.