Connect with us

Entwicklung & Code

Team und Softwarearchitektur im Einklang – ein soziotechnisches System


close notice

This article is also available in
English.

It was translated with technical assistance and editorially reviewed before publication.

Scheinbar geht es bei Softwarearchitektur nur um die Strukturierung von Software und die Umsetzung von nicht funktionalen Anforderungen. Aber in Wirklichkeit ist die Software für Menschen da und Menschen schreiben die Software. Daher ist es notwendig, sie als ein soziotechnisches System zu begreifen. Das hat Auswirkungen auf das Verständnis von Softwarearchitektur.

Weiterlesen nach der Anzeige


Eberhard Wolff

Eberhard Wolff

(Bild: 

Eberhard Wolff

)

Eberhard Wolff ist Head of Architecture bei SWAGLab und arbeitet seit mehr als zwanzig Jahren als Architekt und Berater, oft an der Schnittstelle zwischen Business und Technologie. Er ist Autor zahlreicher Artikel und Bücher, u.a. zu Microservices und trägt regelmäßig als Sprecher auf internationalen Konferenzen vor. Sein technologischer Schwerpunkt sind moderne Architektur- und Entwicklungsansätze wie Cloud, Domain-driven Design und Microservices.

Der Begriff Soziotechnisches System steht für eine organisierte Menge von Menschen und mit diesen verknüpfte Technologien, die in einer bestimmten Weise strukturiert sind, um ein spezifisches Ergebnis zu produzieren. Er geht auf Forschung unter anderem im Steinkohlebergbau in Großbritannien in den 1950er-Jahren zurück. Die Idee von soziotechnischen Systemen ist somit nicht neu und schon gar keine Mode. Eine Kernerkenntnis ist, dass der Erfolg eines Unternehmens davon abhängt, wie es als soziotechnisches System funktioniert, nicht einfach als ein technisches System mit ersetzbaren Individuen, die hinzugefügt werden und sich anpassen müssen.

Die Bezeichnung sagt bereits, worum es geht: Das System besteht aus einer technischen Komponente (etwa Maschinen) und einer sozialen Komponente (Mitarbeiterinnen und Mitarbeiter, die technische Komponenten bedienen und nutzen). Beide lassen sich nur gemeinsam betrachten, da sie eng miteinander verknüpft sind. Deswegen muss man auch menschliche Kommunikation neben der Mensch-Maschine-Kommunikation betrachten.

Dieser Ansatz ist für Softwareentwicklung und -architektur gleich aus mehreren Gründen interessant: Erstens wird Softwareentwicklung oft als eine rein technische Aufgabe begriffen und betrieben. Das ist sie aber nur scheinbar. Software als soziotechnisches System zu behandeln, birgt die Chance, wesentliche Verbesserungen zu erreichen. Zweitens löst die meiste Software keine rein technischen Probleme, sondern muss für Anwenderinnen und Anwender sowie andere Stakeholder einen wirtschaftlichen Nutzen haben.

Damit steht die Software in einem wichtigen Verhältnis zu dieser Personengruppe, da der Wert der Software sich an dem wirtschaftlichen Nutzen für diese Gruppe orientiert. Dieser soziale Aspekt ist zentral für den Erfolg eines Softwareentwicklungsprojekts. Und schließlich wird Software in Teams implementiert. Auch bei der Entwicklung gibt es also ein soziales Geflecht, das es zu verwalten gilt. Wenn man diese Aufgabe besonders gut erfüllt, wird man effektiv und effizient entwickeln.

Tatsächlich steht Softwarearchitektur in einem engen Zusammenhang mit beiden sozialen Systemen – Entwickler und User (siehe Abbildung 1). Softwarearchitektur muss eine technische Lösung finden, die Nutzerinnen und Nutzer ausreichend unterstützt. Dabei sind Qualitäten der Software wie Benutzerfreundlichkeit, Performance, Skalierbarkeit oder Sicherheit zu betrachten. Dieser Teil der Architektur ist daher nur im Zusammenspiel mit diesem sozialen System bewertbar. Eine Architektur lässt sich nur daran messen, ob sie ausreichende Qualitäten für die Benutzergruppe mit sich bringt. Was für einige Personen subjektiv unmöglich zu benutzen ist, kann für andere akzeptabel oder gar ideal sein – man denke nur an die Auseinandersetzungen zu Editoren wie Vim oder Emacs.


Softwarearchitektur bietet für Developer eine Strukturierung des Codes und muss für User die Einhaltung der Qualitäten garantieren (Abb. 1).,

Softwarearchitektur bietet für Developer eine Strukturierung des Codes und muss für User die Einhaltung der Qualitäten garantieren (Abb. 1).,

Softwarearchitektur bietet für Developer eine Strukturierung des Codes und muss für User die Einhaltung der Qualitäten garantieren (Abb. 1).

Die Aufteilung eines Systems in Module dient dazu, die Komplexität des Systems beherrschbar zu machen. Damit ist die Modularisierung nur im Zusammenspiel mit dem jeweiligen Entwicklungsteam bewertbar. Auch eine scheinbar gute Modularisierung kann für das Team schwer verständlich sein und zu geringer Produktivität führen. Beispielsweise kann ein Team ein System ohne eine gute Übergabe von einem anderen Team übernommen haben, sodass das neue Team es trotz guter Modularisierung schwer verstehen und ändern kann.

Weiterlesen nach der Anzeige

Es ist auch denkbar, dass das System zwar schlecht strukturiert ist, aber das Team sich über einen längeren Zeitraum an diese Struktur gewöhnt hat und daher das System ausreichend gut ändern kann. Dann kann das Team die Software schwerlich abgeben, weil ein neues Team Schwierigkeiten hätte, sie zu verstehen. Das ist weniger ein technisches Problem, sondern lässt sich als ein soziales Problem auffassen.

Das Gesetz von Conway besagt, dass eine Organisation ein System entwickeln wird, dessen Design die Kommunikationsstrukturen der Organisation kopiert. Für die Softwareentwicklung bedeutet das beispielsweise: Wenn zwei Teams zwei Aufgaben haben und darüber bei Bedarf miteinander kommunizieren, werden sie in der Software zwei Module aufbauen, die eine Schnittstelle haben. Klassisch hat man das Gesetz von Conway eher als ein Hindernis begriffen: Wenn Teams in einer bestimmten Art organisiert sind, können sie nur bestimmte Architekturen erstellen. Sind ein UI- und ein Backend-Team vorhanden, werden auch ein UI und ein Backend in der Architektur entstehen.

Dabei wird jedoch das Organigramm mit Kommunikation verwechselt. Aber Menschen und Teams kommunizieren auch dann, wenn sie im Organigramm keine offensichtlichen Beziehungen besitzen. Zwar kann das Organigramm einen wesentlichen Einfluss auf die Kommunikation ausüben, aber es ist nicht deckungsgleich. Das ist auch eine gute Nachricht: Während das Organigramm statisch ist, kann jede involvierte Person die Kommunikationsflüsse im Projekt beeinflussen.

Aus dem Zusammenhang zwischen Kommunikation und Architektur ergibt sich ein weiteres Problem: Wenn die Kommunikation nicht mehr effektiv ist oder zusammenbricht, leidet die Architektur des Systems darunter. Gerade bei großen Projekten ist es schwierig, eine gute Kommunikation zu bewahren. Daher kann es insbesondere hier dazu kommen, dass zunächst die Kommunikation schwierig und dann die Architektur in Mitleidenschaft gezogen wird.

Solche Probleme hat Melvin Conway schon 1967 im ursprünglichen Paper zu seinem Gesetz beschrieben. Wenn Softwarearchitektinnen und -architekten die Qualität der Architektur erhalten oder gar verbessern wollen, müssen sie auf die Kommunikation im Projekt Einfluss nehmen und gewährleisten, dass sie funktioniert.

Durch das Inverse Conway Maneuver (siehe Abbildung 2) hat sich im Rahmen der Microservices-Bewegung das Verständnis für das Gesetz von Conway gewandelt: Statt es als Hindernis zu verstehen, will man es nun für die Gestaltung der Architektur nutzen. Wenn Teams definiert werden und jedes eine bestimmte Verantwortung erhält, werden diese Teams voraussichtlich jeweils ein Modul oder einen Microservice implementieren, der ihrer Verantwortung entspricht. Das Aufstellen der Organisation auf eine bestimmte Weise definiert somit indirekt die Architektur. Das Inverse Conway Maneuver versteht Software demnach als soziotechnisches System und wirkt durch Maßnahmen auf der sozialen Seite auf die technische ein.


Inverse Conway Maneuver: Die Organisation bestimmt die Architektur (Abb. 2).,

Inverse Conway Maneuver: Die Organisation bestimmt die Architektur (Abb. 2).,

Inverse Conway Maneuver: Die Organisation bestimmt die Architektur (Abb. 2).



Source link

Entwicklung & Code

Programmiersprache Python: Performante Algorithmen entwickeln und optimieren


Plant man eine Reise durch mehrere Städte und will die kürzeste Route finden, greift man auf Algorithmen zurück, eine wohldefinierte Abfolge deterministischer Operationen. Dieser Artikel begleitet den Entwicklungsprozess eines Algorithmus, der kürzeste Wege zwischen Städten findet. Er zeigt Schritt für Schritt den Weg von der ersten Skizze über Tests und Visualisierung mit Matplotlib und NetworkX bis zur Optimierung durch geeignete Datenstrukturen. So entsteht ein Programm, das nicht nur funktional korrekt arbeitet, sondern auch performant ist.

Weiterlesen nach der Anzeige


Michael Inden

Michael Inden

Michael Inden ist Java- und Python-Enthusiast mit über zwanzig Jahren Berufserfahrung. Derzeit ist er als Head of Development tätig, spricht auf Konferenzen und schreibt Fachbücher über Java und Python.

Ziel ist, in einem Straßennetz diejenigen Wege zu finden, die Städte am kürzesten verbinden. Zur Modellierung kann man Graphen verwenden. In Abbildung 1 repräsentieren Kreise mit Beschriftung die Städte und die Verbindungslinien mit Zahlen entsprechen Wegen mit Distanzen.


Ein Graph visualisiert die Abstände von Städten; die Zahlen stehen für die Entfernungen (Abb. 1).

Ein Graph visualisiert die Abstände von Städten; die Zahlen stehen für die Entfernungen (Abb. 1).

Ein Graph visualisiert die Abstände von Städten; die Zahlen stehen für die Entfernungen (Abb. 1).

Für diese vereinfachte Karte soll der kürzeste Weg von A nach D gefunden werden. Während man bei wenigen Städten und Verbindungen alle Möglichkeiten ausprobieren kann, wird der Ansatz aufwendiger, je mehr Städte und Verbindungen existieren. Folgende Verbindungen sind möglich, wobei 13 die schlechteste ist und 6 die beste:


A -> B -> C -> D => 5 + 1 + 7 = 13
A -> C -> B -> D => 2 + 1 + 3 = 6
A -> C -> D => 2 + 7 = 9
A -> B -> D => 5 + 3 = 8


Für eine gute Bedienbarkeit von Programmen ist relevant, wie schnell sich Berechnungen und Operationen ausführen lassen. Das gilt vor allem bei großen Datenmengen. Die O-Notation erlaubt es, Algorithmen zu klassifizieren und das Wachstum der Laufzeit (oder des Speicherbedarfs) eines Algorithmus zu beschreiben, wenn die Eingabemenge größer wird. Somit sind Effekte vorhersagbar, etwa wenn eine Liste nicht mehr 10 oder 20, sondern 100.000 und mehr Daten enthält.

Weiterlesen nach der Anzeige

Die O-Notation hilft, die Laufzeit von Operationen einzuschätzen. Sie ordnet Algorithmen und Funktionen in Komplexitätsklassen ein. Bei O(n³) wächst die Anzahl der Schritte mit der dritten Potenz der Eingabemenge. Bei 100 Eingabedaten ergibt sich ein Aufwand von 1003 für die Berechnung, also 1.000.000 Schritte. Je niedriger die Komplexitätsklasse ist, desto besser. Weitere Klassen zeigt die Tabelle „O-Notation mit in Komplexitätsklassen eingeteilten Algorithmen“, Abbildung 2 visualisiert die Effekte.

O-Notation mit in Komplexitätsklassen eingeteilten Algorithmen
Notation Bedeutung, Wachstum Beispiel
O(1) konstant Zugriff auf ein Listenelement
O(log n) logarithmisch Binärsuche
O(n) linear einfache Schleife über alle Elemente
O(n log n) linear-logarithmisch effiziente Sortieralgorithmen (etwa Mergesort)
O(n²) quadratisch zweifach verschachtelte Schleife
O(n3) kubisch dreifach verschachtelte Schleife


Die Graphen zeigen die Anzahl der Operationen in Abhängigkeit von der Eingabegröße (Abb. 2).

Die Graphen zeigen die Anzahl der Operationen in Abhängigkeit von der Eingabegröße (Abb. 2).

Die Graphen zeigen die Anzahl der Operationen in Abhängigkeit von der Eingabegröße (Abb. 2).

Eine Klassifikation mit der O-Notation ist insbesondere wichtig, um Laufzeiten unabhängig von Hardwareausstattung, Implementierungsdetails und gewählten Programmiersprachen bezüglich ihrer Skalierungseigenschaften zu vergleichen.

Für eine vereinfachte Einschätzung betrachtet man bei der Bewertung nur den dominierenden Term, da bei großen Eingabegrößen kleine Konstanten oder niedrigere Terme und Faktoren vernachlässigbar sind. In der Formel n3 + 4n² + 3n + 7 folgt durch die Vereinfachungen die Laufzeitklasse O(n3).

Ein systematisches Vorgehen ist selbst für kleinere Programme und vor allem bei komplexen Softwareprojekten der Schlüssel zu funktionalem, wartbarem und performantem Code.

1. Problem verstehen und analysieren

  • klären, welches Problem zu lösen ist, und es in Teilaufgaben zerlegen;
  • prüfen, ob es bereits bewährte Lösungen für Teilaufgaben gibt, beispielsweise Binärsuche für performante Suchen in sortierten Datenbeständen, Dijkstra-Algorithmus für kürzeste Wege;
  • Eingabe- und Ausgabedaten definieren;
  • Randbedingungen und Sonderfälle berücksichtigen.

2. Planen und eine Grobstruktur entwickeln

  • Problem in Teilaufgaben zerlegen;
  • Abläufe in natürlicher Sprache formulieren oder skizzieren;
  • geeignete Datenstrukturen wählen (Listen, Dictionaries, Heaps).

3. Implementierung

  • Sourcecode in klar getrennte Funktionen oder Klassen gliedern;
  • auf Lesbarkeit und Verständlichkeit achten, aussagekräftige Namen und (falls sinnvoll) ergänzende Kommentare verwenden;
  • vorhandene Bibliotheken nutzen, um Entwicklungszeit zu sparen (etwa Matplotlib zur Visualisierung).

4. Testen (Dry-Run- und Unit-Tests)

  • Funktionsweise ausprobieren;
  • Unit-Tests schreiben, um die Funktionsweise zu prüfen und Rand- und Sonderfälle abzudecken.

5. Performance messen

  • Messungen mit kleinen, mittleren und großen Datenbeständen ausführen, etwa mit 100, 10.000 und 1.000.000 Datensätzen;
  • Engpässe identifizieren – sie zeigen sich allerdings meist erst bei sehr großen Datenbeständen.

6. Optimieren

Wurden in Schritt 5 Schwachstellen aufgedeckt, sollte man die Umsetzung und die gewählten Algorithmen für Teilprobleme nochmals genauer anschauen.

  • O-Notation verwenden, um die Komplexität formal zu bewerten: Was läuft in Schleifen? Wie und wo erfolgt eine Suche – linear oder mit Binärsuche? Für verschiedene Aktionen kann das Laufzeiten von O(1), O(log n) oder O(n) bedeuten.
  • besser geeignete Algorithmen oder effizientere Datenstrukturen einsetzen.

Implementierung und Test miteinander verweben

In der Praxis laufen die Schritte 3 und 4 nicht immer unabhängig voneinander. Wenn sich die Ergebnisse gut vorhersagen lassen, bietet es sich an, mit dem Erstellen von Testfällen zu starten. Manchmal braucht es aber erst einmal eine Idee und einen Prototyp der Implementierung. Gerade bei größeren Programmierprojekten ergeben sich weitere Anforderungen während der Implementierungs- und Testphase.

Der folgende Ablauf hat sich in der Praxis bewährt und lässt sich auch beim Entwickeln eines Algorithmus anwenden.



Source link

Weiterlesen

Entwicklung & Code

GitLab 18.8: Duo Agent Platform jetzt allgemein verfügbar


Mit GitLab 18.8 stellt GitLab die Duo Agent Platform allgemein zur Verfügung. Sie soll Unternehmen dabei unterstützen, KI-Agenten für Planung, Entwicklung, Absicherung und Auslieferung von Software koordiniert einzusetzen.

Weiterlesen nach der Anzeige

GitLab reagiert damit auf ein bekanntes Problem beim Einsatz von KI in der Softwareentwicklung: KI-Tools steigern zwar die Produktivität einzelner Entwicklerinnen und Entwickler, verlieren diesen Effekt aber oft auf Teamebene. Die Duo Agent Platform orchestriert KI-Agenten deshalb innerhalb eines einheitlichen Systems und nutzt einen gemeinsamen Projektkontext aus Issues, Merge Requests, Pipelines und Security-Findings.

Lesen Sie auch

Die Plattform kombiniert konversationelle KI, spezialisierte Agenten und automatisierte Workflows. Ein zentraler Baustein ist der Agentic Chat, der in der GitLab-Oberfläche und in verschiedenen Entwicklungsumgebungen zur Verfügung steht. Er unterstützt beim Erstellen von Code, bei der Analyse und Fehlerbehebung, bei Tests und Dokumentation auf Basis des aktuellen Projektkontexts.

Der Planner Agent ist nun ebenso allgemein verfügbar und soll Produktmanager in GitLab bei der Arbeit mit Work Items unterstützen. Er kann unter anderem beim Analysieren von Backlogs, beim Priorisieren (z. B. mit RICE oder MoSCoW) und beim Aufbereiten von Planungsinformationen helfen.

Weiterlesen nach der Anzeige

Mit dem AI Catalog können Teams Agenten und Workflows organisationsweit bereitstellen und teilen. Vorgefertigte Agenten übernehmen typische Aufgaben wie Planung oder Sicherheitsanalyse. Flows automatisieren wiederkehrende Abläufe, etwa das Erstellen von Merge Requests, die Anpassung von CI/CD-Pipelines oder die Analyse fehlgeschlagener Builds.

Auch der GitLab Duo Security Analyst Agent ist mit GitLab 18.8 aus der Beta-Phase in die allgemeine Verfügbarkeit übergegangen. Er ermöglicht es, Schwachstellen per natürlicher Sprache im GitLab Duo Agentic Chat zu verwalten, und ist dort standardmäßig ohne zusätzliche Einrichtung verfügbar.

Die Duo Agent Platform ist auf GitLab.com und in GitLab Self-Managed verfügbar, GitLab Dedicated soll folgen. Transparenz- und Governance-Funktionen unterstützen den Unternehmenseinsatz. Die Abrechnung erfolgt nutzungsabhängig über GitLab Credits aus einem gemeinsamen Pool. Weitere Informationen finden sich im entsprechenden Blogbeitrag.


(mdo)



Source link

Weiterlesen

Entwicklung & Code

software-architektur.tv: Spec-Driven Development mit Simon Martinelli


In dieser Episode spricht Ralf D. Müller mit Simon Martinelli über den AI Unified Process (AIUP), einen agilen und iterativen Entwicklungsansatz, der Requirements ins Zentrum stellt – nicht den Code. Martinelli zeigt, wie man mit AIUP moderne Software entwickelt, bei der Anforderungen, Spezifikationen, Code und Tests gemeinsam durch kurze Iterationen wachsen, während KI als Konsistenz-Engine dient.

Weiterlesen nach der Anzeige

Das Duo diskutiert die zentrale Frage: Braucht es perfekte, deterministische Spezifikationen für KI-Code-Generierung? Simon Martinelli argumentiert, dass das der falsche Ansatz ist. Stattdessen ermöglicht AIUP iterative Verbesserung: Requirements treiben die Entwicklung, Spezifikationen werden detaillierter und Tests schützen das Systemverhalten, während der generierte Code sich gemeinsam mit allem anderen weiterentwickelt.

Lisa Maria Schäfer malt dieses Mal keine Sketchnotes.

Die Ausstrahlung findet am Freitag, 16. Januar 2026 live ab 13:00 Uhr statt. Die Folge steht im Anschluss als Aufzeichnung bereit. Während des Livestreams können Interessierte Fragen via Twitch-Chat, YouTube-Chat oder anonym über das Formular auf der Videocast-Seite einbringen.

software-architektur.tv ist ein Videocast von Eberhard Wolff, Blogger sowie Podcaster auf iX und bekannter Softwarearchitekt, der als Head of Architecture bei SWAGLab arbeitet. Zum Team gehören außerdem Lisa Maria Schäfer (Socreatory) und Ralf D. Müller (DB Systel). Seit Juni 2020 sind über 250 Folgen entstanden, die unterschiedliche Bereiche der Softwarearchitektur beleuchten – mal mit Gästen, mal Wolff, Schäfer oder Müller solo. Seit mittlerweile mehr als zwei Jahren bindet iX (heise Developer) die über YouTube gestreamten Episoden im Online-Channel ein, sodass Zuschauer dem Videocast aus den Heise Medien heraus folgen können.

Weitere Informationen zu den Folgen finden sich auf der Videocast-Seite.

Weiterlesen nach der Anzeige


(mdo)



Source link

Weiterlesen

Beliebt