Ein Vortrag über Softwarearchitektur mit und für AI.
Thomas Rolf Mannhart
Am FHNW Data Science & Data Engineering Alumni Event habe ich genau zu diesem Thema einen Vortrag gehalten.
Ich klicke gleich kurz durch die damaligen Folien.
Ihr persönlicher Junior Dev: super-schnell, immer verfügbar, konsequent unkritisch.
Arbeiten mit dem Development Funnel.
| Schicht | Kontext | Tool |
|---|---|---|
| Breite Recherche | Das Internet | Deep Research |
| Analyse unbekannter Codebases | Ganze Codebases | Coding Agents (Claude Code, Junie, …) |
| Integration in eigene Codebase | Teil der Codebase | RepoMix, Gemini |
| Implementierung | Ausgewählte Files | AI Assistants (Claude, Gemini) |
super-schnell, immer verfügbar, konsequent unkritisch.
Die KI-Welt entwickelt sich rasend schnell, aber wenn man genau hinschaut, halten die Grundsätze überraschend gut.
Die Botschaft: Ihr müsst nicht jedem neuen Tool hinterherrennen. Ihr müsst die Grundsätze beherrschen.
KI macht Coden leichter und explizite Architektur dadurch wichtiger als je zuvor.
Info 1 + Info 2 als Vortrag
→ Übung 1: Mealie Part 1
Architektur entdecken, dokumentieren, Layering-Smell finden, Refactoring unter Regression-Netz.
Info 3 als Vortrag
→ Übung 2: Mealie Part 2
LiteLLM als Gateway + Pydantic/Instructor als ACL vor die direkten Provider-SDK-Calls schalten.
Architektur muss durchsetzbar UND maschinenlesbar werden, sonst existiert sie für den Coding-Agent nicht.
vor dem Coden
CLAUDE.md / AGENTS.mdnach dem Coden
import-linter (Python)ArchUnit (JVM)Spring Modulithein anderes Modell
AI verschiebt die Schmerzgrenze drastisch nach hinten: was Wochen dauerte, wird Tagesarbeit.
Budget-Verschiebung: AI macht Coding und Testing schneller, aber nicht im selben Maß. Anteil Testing wächst, absoluter Output steigt deutlich.
Legacy-Modul → mit AI in Stunden statt Wochen verstanden, mit Mutation+Snapshot abgesichert, in Tagen statt Monaten refactored.
Übung 1 (Vormittag): Mit der LikeC4-Sicht aus Info 1 im Rücken: Snapshot-Sicherheitsnetz aufbauen, Layering-Smell unter dieser Sicherung refactoren, Linter bleibt grün.
Echte Open-Source-Codebase als Spielwiese. In fünf Schritten von „nie gesehen" zu „sicher refactored".
Werkzeugkasten: Claude Code · arc42 · LikeC4 · grimp · import-linter · syrupy
Sobald AI im Produktivsystem läuft, gelten Regeln, die kein klassisches Architektur-Framework kennt.
| Attribut | Was bricht | Architektur-Antwort |
|---|---|---|
| Testbarkeit | Outputs nicht-deterministisch | Eval-Harness, Golden-Dataset, Eval-on-Merge |
| Latenz | p50 1–5 s, lange Tails | Streaming, zweischichtiger Cache, kleinere Modelle |
| Kosten | neue Dimension (Tokens) | Gateway-Budgets, Modell-Kaskade, Batch |
| Wartbarkeit | Prompt-Drift bei stillen Upgrades | Versionen pinnen, Prompt-Registry |
| Verlässlichkeit | Provider-Ausfälle, Throttling, Deprecations | Multi-Backend-Pool, Circuit-Breaker, Fallback |
| Compliance | Erklärbarkeit ist hart | Logging-Tripel, Post-Validatoren, HITL |
| Sicherheit | Lethal Trifecta, Excessive Agency | Beurer-Kellner-Patterns, Defence-in-Depth |
Zentrale Schleuse zum LLM:
Tool 2026: LiteLLM
Schutzhaut zwischen LLM und Geschäftslogik:
Tool 2026: Pydantic + Instructor
Wer beide hat, hat 80 % der Antworten in einer einzigen Skizze.
Promptfoo · Pre-Deploypromptfoo eval blockt PRs bei Regression, analog zum Test-Gate.
Langfuse · Post-DeployTracing + Prompt-Registry + Cost-Tracking. Failure-Cases wandern als neue Test-Cases zurück in Promptfoo.
Wichtig: Ein LLM darf nie sich selbst beurteilen (Bias).
Quelle: Mahmoudi et al., „Specification and Detection of LLM Code Smells" (arXiv:2512.18020, ICSE-NIER 2026).
In Übung 2 schiebt ihr LiteLLM als Gateway und Pydantic + Instructor als ACL zwischen Mealie und die Provider-SDK-Calls.
Anschliessend übt ihr Fallback und Rate-Limit am laufenden System.
Wir geben Mealie einen LLM-Gateway, und verbessern den ACL, wenn die Zeit reicht.
Werkzeugkasten: LiteLLM · Pydantic · Instructor · import-linter
Damit schliesst sich der Kreis zur Einleitung: „Software-Architektur und Verantwortung bleiben beim Menschen" stand schon 2025 auf den FHNW-Folien. Heute war das die Vertiefung dieses Satzes.
KI macht Coden leichter und explizite Architektur dadurch wichtiger als je zuvor.
Bleibt in Kontakt.
Thomas Rolf Mannhart
thomas@mannhart.ai · thomasrolf.mannhart@fhnw.ch
Begriffe und Tools aus dem Vortrag: kompakte Referenz zum Nachschlagen.
Volltext: lecture/glossary.md
LiteLLM: Open-Source-Proxy/SDK, der 100+ LLM-Provider hinter einem OpenAI-kompatiblen Interface bündelt. Spend-Tracking, Virtual Keys, Load-Balancing, Guardrails. Im Vortrag die Gateway-Schicht.
Pydantic: meistverwendete Python-Validierungs-Library; Schemas via Type-Hints, Rust-Kern. Basis für Structured Outputs.
Instructor: auf Pydantic aufsetzende Library, validiert LLM-Antworten gegen Schema mit Auto-Retry. ACL-Pendant zu LiteLLM.
Promptfoo: CLI für LLM-Eval und Red-Teaming („Pytest für Prompts"); Pre-Deploy-Gate. Im März 2026 von OpenAI für $86 M übernommen, MIT-Lizenz bleibt.
Langfuse: Open-Source-LLM-Engineering-Plattform: Tracing, Prompt-Registry, Eval, Cost-Tracking. Post-Deploy-Schicht.
Repomix: packt ein Repo zu einer einzigen AI-freundlichen Datei (XML/Markdown), respektiert .gitignore, Token-Counts. Funnel-Schicht „Integration in Codebase".
MCP (Model Context Protocol): offener Standard (Anthropic, Nov 2024) für LLM ↔ externe Systeme. „USB-C für AI", drei Primitive: tools, resources, prompts. Seit Dez 2025 unter Linux Foundation (AAIF).
Claude Code: Anthropics offizieller CLI-Coding-Agent (Terminal, Web, IDEs). Referenz für „Analyse unbekannter Codebases".
Junie: JetBrains-eigener AI-Coding-Agent, lebt in IntelliJ-Ultimate / PyCharm Pro, Bring-your-own-LLM, plant mehrstufig.
CLAUDE.md / AGENTS.md: Markdown-Dateien im Repo-Root, die Coding-Agenten zu Session-Beginn lesen. AGENTS.md: 2025 von OpenAI, Google, Sourcegraph, Cursor, Factory als offener Standard gestartet, 20 000+ Repos, jetzt unter AAIF/Linux Foundation.
import-linter: Python-CLI, prüft Imports gegen Layers/Forbidden/Independence-Contracts. Verstoss = roter Build.
ArchUnit: Java-Library, testet Architekturregeln (Layered, Onion, Slices, Cycles) als Unit-Tests. Pendant auf JVM.
Spring Modulith: Spring-Erweiterung für modulare Monolithen mit expliziten Modul-Boundaries und automatischer Verifikation (./mvnw modulith:verify).
mutmut: Python-Mutation-Tester. Mutiert Source (z. B. > → >=), überlebende Mutanten = Test-Lücken.
Stryker: JS/TS (auch C#, Scala). Seit 4.0 mit Mutation Switching (alle Mutanten gleichzeitig im Code, ein aktiv); 20–70 % schneller.
PIT (pitest): JVM-Mutation-Tool, mutiert Bytecode in-memory statt auf Platte. Maven/Gradle, JUnit/TestNG.
syrupy: Pytest-Plugin, zero-dependency, speichert Output in __snapshots__/.
Jest Snapshots: De-facto-Standard in JS/TS; erste Ausführung erzeugt .snap, spätere Läufe diffen dagegen.
ApprovalTests: Library-Familie (Java/.NET/Python/C++/Go). Approvals.verify() erzeugt .received, manuell zu .approved umbenannt; spätere Läufe diffen.
Architecture as Code: Architektur in versionierten Text-Artefakten (DSL, Markdown, ADRs, Lint-Regeln) statt Folien/Confluence. Voraussetzung, dass Coding-Agenten die Architektur überhaupt sehen.
ADR (Architecture Decision Record): Kurzes Doc je Entscheidung (Status, Context, Decision, Consequences). Format: Michael Nygard, 2011.
arc42: Open-Source-Template (Starke/Hruschka, 2005) für Architekturdoku in 12 Abschnitten. Tool-/format-agnostisch.
Development Funnel: mentales Modell aus dem Vortrag: Tools nach Kontext-Sicht (Internet → Codebase → Files).
C4-Modell: Notation von Simon Brown (2006–2011): Context · Container · Component · Code. Leichtgewichtig, UML-Alternative.
LikeC4: DSL und Toolchain inspiriert von C4 / Structurizr DSL, mit frei definierbaren Element-Typen. Ein Modell → mehrere interaktive Diagramme.
Structurizr DSL: Text-DSL des C4-Erfinders Simon Brown. Workspace = Modell + Views.
Brownfield / Greenfield: Greenfield = neues Projekt; Brownfield = bestehendes System mit Legacy. Vortrag: AI macht Brownfield wieder bewegbar.
Anti-Corruption Layer (ACL): DDD-Pattern (Eric Evans). Übersetzungsschicht zwischen eigenem Modell und Fremdsystem (Legacy, Third-Party, oder LLM).
AI-Gateway: zentrale Schleuse: Multi-Backend-Pool, Routing, Circuit-Breaker, Budgets, Logging, Versions-Pinning. Realisiert via LiteLLM.
Circuit Breaker: Resilience-Pattern (Nygard, Release It!): nach Fehler-Schwelle kurzschliessen, Half-Open-Probe testet Recovery. Im LLM-Kontext pro Modell/Provider.
Model Cascade: Anfrage zuerst an billiges Modell; nur bei niedriger Confidence ans teure eskalieren. 45–85 % Kosten-Reduktion möglich.
Structured Outputs: LLM gegen JSON-Schema / Pydantic / Grammar zwingen statt Free-Form-Text. Constrained Decoding.
HITL (Human-in-the-Loop): Mensch gibt folgenreiche Aktionen explizit frei. Pflicht-Antwort auf Excessive Agency.
Eval Harness: Test-Infrastruktur, die LLM-Aufrufe gegen ein Golden Dataset mit Assertions ausführt; CI-Gate. LLM-Pendant zur Test-Suite.
Golden Dataset: manuell kuratierte Input/Erwartungs-Paare; Source of Truth für Quality-Messung. Wächst durch Failure-Cases.
Prompt Registry: versionierte Prompt-Ablage ausserhalb Code (Metadaten, A/B, Diffs). Vermeidet Prompt-as-String.
Misst die Qualität der Test-Suite. Kleine Mutationen werden in den Source-Code eingespielt; Tests, die die Mutation nicht erkennen („überlebt"), markieren Lücken. Mutation Score = % gekillter Mutanten.
Statt Erwartungswerte explizit zu codieren, wird der Output beim ersten Lauf als Snapshot gespeichert. Spätere Läufe diffen dagegen. Geeignet, um beobachtbares Verhalten von Legacy einzufrieren vor dem Refactoring.
Unbounded Max Metrics: Token-Budgets, Timeouts, Retries ohne Cap.
No Model Version Pinning: Provider-Alias statt immutable Version → stilles Verhaltens-Drift.
No System Message: System-Prompt fehlt; keine Rolle, keine Constraints.
No Structured Output: Free-Form-Text wo Schema nötig.
Temperature Not Explicitly Set: implizite Defaults, nicht reproduzierbar.
Prompt-as-String: Prompt im Source, keine Registry, keine A/B-Tests.
Leaky Vendor Abstraction: Provider-SDK direkt im Aufrufpfad → Vendor-Lock-in, kein einheitliches Logging.
Cost-Leaking Loop: Agent-Loop ohne Iterations-Cap, ruft sich endlos selbst auf.
Prompt Injection: Angriffsklasse: Anweisungen in Daten versteckt (Mail, PDF, PR-Text), die das LLM als legitime Instruktion ausführt. Begriff: Simon Willison, Sep 2022.
Lethal Trifecta: Simon Willison (Juni 2025): gefährdet, sobald alle drei zutreffen: private Daten · untrusted Content · externe Kommunikation.
Excessive Agency: OWASP LLM06:2025. Agent hat zu viele Tools/Permissions und führt auf manipulierte Outputs hin folgenreiche Aktionen aus. Mitigation: Least-Privilege + HITL.
Beurer-Kellner-Patterns: sechs Patterns für sichere LLM-Agenten (arXiv:2506.08837): Action-Selector · Plan-Then-Execute · LLM Map-Reduce · Dual LLM · Code-Then-Execute · Context-Minimization.
Defence-in-Depth: mehrere unabhängige Schutzschichten statt einer Mauer. Im LLM-Kontext: Input-Sanitization + Tool-Whitelist + Post-Validatoren + HITL + Monitoring.
Toxic Flow Analysis: Tool-/Datenfluss als Graph modelliert; gefährliche Pfade (untrusted → sensitive → externe Senke) statisch identifiziert. Inspiriert von Taint-Analyse. ThoughtWorks Tech Radar Vol. 34.
OWASP Top 10 LLM (2025): u. a. LLM01 Prompt Injection, LLM06 Excessive Agency, LLM07 System Prompt Leakage, LLM08 Vector & Embedding Weaknesses, LLM10 Unbounded Consumption.
GitHub Copilot RCE via Prompt-Injection (Aug 2025). Injection schreibt chat.tools.autoApprove: true in .vscode/settings.json („YOLO-Mode") und führt beliebige Shell-Commands ohne User-Approval aus. Wormable.
GitHub Copilot Chat (CVSS 9.6, Disclosure Okt 2025). Prompt-Injection in PR-Beschreibungen schleust private Source-Code-/Secret-Inhalte zeichenweise über GitHubs Camo-Bild-Proxy aus, vorbei an der CSP. Patch: Bild-Rendering deaktiviert, 14. Aug 2025.
Erster bekannter malicious MCP server in the wild (npm, Sep 2025). 15 Versionen unauffällig, dann v1.0.16 mit Einzeile-Backdoor: jede Mail still per BCC an phan@giftshop.club. Lehrstück für MCP-Supply-Chain-Risiko.