From 4a1eeb4837114485efdb23c486c85b5be3b889b2 Mon Sep 17 00:00:00 2001 From: herzogflorian Date: Tue, 8 Sep 2026 10:57:34 +0200 Subject: [PATCH] Auto-commit 2026-09-08 10:57: 6 files changed, 112 insertions(+) --- Modulbeschreibung_AISE502_v2_2026.md | 42 ++++++++++++++++++ Modulbeschreibung_AISE502_v3_2026.docx | Bin 0 -> 24816 bytes Modulbeschreibung_AISE502_v3_2026.md | 41 +++++++++++++++++ ...eschreibung_AISE502_v3_2026_confluence.txt | 3 ++ tools/md2docx.sh | 26 +++++++++++ tools/reference_fhgr.docx | Bin 0 -> 10963 bytes 6 files changed, 112 insertions(+) create mode 100644 Modulbeschreibung_AISE502_v3_2026.docx create mode 100755 tools/md2docx.sh create mode 100644 tools/reference_fhgr.docx diff --git a/Modulbeschreibung_AISE502_v2_2026.md b/Modulbeschreibung_AISE502_v2_2026.md index 4382fa3..60e16c7 100644 --- a/Modulbeschreibung_AISE502_v2_2026.md +++ b/Modulbeschreibung_AISE502_v2_2026.md @@ -55,6 +55,7 @@ Künstliche Intelligenz erscheint dabei in **zwei gleichwertigen Rollen**: Entwicklungswerkzeuge produktiv, aber kritisch-reflektiert ein -- auf Basis der empirischen Evidenz (randomisierte Studien mit positiven wie negativen Befunden), mit Architektur-Dokumentation als Agenten-Kontext und Fitness Functions als Leitplanken. + - **AI als Komponente im System (Achse B):** Studierende entwerfen Architekturen, in denen LLM-, ML- und Optimierungskomponenten als Laufzeit-Bausteine wirken, und machen diese nicht-deterministischen Komponenten *engineering-tauglich* -- gekapselt (Gateway, Ports), @@ -168,118 +169,151 @@ Implementierungsphase (3 L Vorlesung + 1 L Standup/Coaching), **Woche 14** Synth Präsentationen (1 L + 3 L). **1. Das Entscheidungsproblem und das Framework** *(Teil I)* + - Inhalte: Vier Produktionssysteme, zwei Fakten (Stack Overflow, Monzo, Segment, Prime Video); Architektur als schwer umkehrbare Entscheidungen; die fünf Framework-Elemente (R(a), C(p), fit, ADR, Messvertrag); die Annahmen A1--A6; ADR/MADR und C4. + - AI-Linse (A): Ein Agent erstellt ADR-Entwürfe -- der Mensch verantwortet die Entscheidung. - Projekt: Kickoff -- Teams, Repository und Werkzeug-Setup, Domänenverständnis, Ontologie-Skizze, rohe Stakeholder-Wünsche. **2. Das Koordinatensystem: zwölf Profildimensionen** *(Teil I)* + - Inhalte: Die zwölf Dimensionen mit Antwortmass und Messinstrument; ISO/IEC 25010:2023 als Vokabular; ASR und Quality Attribute Workshop; sechsteilige Qualitätsszenarien; Utility Tree → Gewichte; R(a) aus Gewichten, Workload-Shape und Constraints. + - AI-Linse (B): Nicht-Determinismus, Latenz und Kosten als Dimension D12 der AI-Integrierbarkeit. - Projekt: Requirements-Workshop I -- Qualitätsszenarien mit Antwortmass, Utility Tree beginnen. **3. Nachfrage, Angebot, Passung: das formale Modell** *(Teil I)* + - Inhalte: C(p) über Taktiken; das dreistufige, nicht-kompensatorische Matching-Verfahren am Mini-Match des Kursprojekts (C10 gegen L, MM, MS); warum keine gewichtete Summe; ADR/MADR mit Messvertrag als Abschluss. + - AI-Linse (A/B): Der LLM-Provider hinter einem Port; ein Agent entwirft den MADR, ein Mensch zeichnet ihn. + - Projekt: Requirements-Workshop II -- R(Plattform) finalisieren, Ontologie als Vertrag. **Abgabe A1 (Ende Woche 3).** **4. Patterns I: ein Deployable** *(Teil II)* + - Inhalte: Schichtenarchitektur, modularer Monolith, Hexagonal/Ports-and-Adapters -- je Ursprungsproblem, Topologie, Architecture Quantum, Fähigkeitsprofil, Anti-Patterns; Modulgrenzen als CI-Gegenstand (Spring Modulith, import-linter, ArchUnit, Packwerk). + - AI-Linse (B): Der Port als Anti-Corruption-Layer, der die LLM-Komponente austauschbar macht. - Projekt: Architekturstudium I -- healthchecks (Django), Apache Fineract und Cosmic Python im Code; C4-Kontext- und Container-Entwurf. **5. Patterns II: verteilte Topologien** *(Teil II)* + - Inhalte: Microservices und Event-Driven Architecture; Sagas vs. ACID; der verteilte Monolith; Broker- vs. Mediator-Topologie; die sieben Resilienz-Grundmuster; Fallstudien (Netflix, Uber DOMA, Monzo, Segment-Rückbau). + - AI-Linse (B): Ein LLM-Aufruf als unzuverlässiger Remote-Call; Queues absorbieren Latenz, Rate-Limits und Ausfälle. + - Projekt: Architekturstudium II -- Ränder entwerfen (Ingestion-Queue, Resilienz gegen API-Ausfall), Service-Kontrakte skizzieren, Matrix-Vorfilter. **6. Patterns III: Batch und Serverless, Verallgemeinerung -- und die eigene Klasse C10** *(Teil II; Teil III)* + - Inhalte: Pipes-and-Filters/Batch und Serverless/FaaS; Stepping Back -- Architecture Quantum, "Partitioning beats distribution", konsolidierte Fähigkeitstabelle, Ausblick Agenten-Orchestrierung; danach C10, die AI-native Advisory-Plattform (Klasse des Projekts) mit dem Spiegelpaar C1/C2 als Vorschau. + - AI-Linse (B): Serverless und Pipelines als natürliche Heimat von Ingestion und Evaluation. - Projekt: **Der Match** -- drei Stufen für die eigene Plattform, Architekturentscheid, ADR-Entwurf. **7. Die Passung: drei Fälle, das Verfahren, die Matrix** *(Teil IV)* + - Inhalte: Drei durchgerechnete Matches (C6 Shape-Gate, C1 Veto und Mitigationen, C2 ordinale Lesung mit Sensitivitätsanalyse); das Verfahren im Allgemeinen; die 7×10-Matrix lesen; Einführung des Messvertrags (Fitness Functions, DORA). + - AI-Linse (A/B): Der Messvertrag als Betriebslizenz auch für agentisch erzeugten Code. - Projekt: Lösungsdesign finalisieren (Service-Schnitt, Kontrakte, Walking-Skeleton-Plan, Messvertrag mit Zahlen); **Design-Review-Gate**, **Abgabe A2 (Ende Woche 7)**. **8. Anwendungsklassen I: C1--C5** *(Teil III)* + - Inhalte: Anwendungsklassen als ASR-Bündel; C1 Kernbanking, C2 Social/Content, C3 Back-Office, C4 ERP, C5 E-Commerce -- Herausforderungen mit Zahlen und Regulatorik, Anforderungsprofile und die reale Architekturwahl (LMAX vs. Monzo, Instagram, Shopify, Fineract). + - AI-Linse (B): Die Latenzklasse, nicht die Genauigkeit, entscheidet über die Platzierung einer AI-Komponente; Agenten schlagen vor, deterministische Services entscheiden und buchen. + - Projekt: Sprint 1 -- Walking Skeleton beginnen (MarketDataService, minimaler ResearchAgent, stabile API). **9. Anwendungsklassen II: C6--C9 und zehn Profile nebeneinander** *(Teil III)* + - Inhalte: C6 Simulation/Batch, C7 DSS/BI, C8 IoT-Streaming, C9 Collaboration/Messaging; die dritte Konsistenzsemantik (Reproduzierbarkeit, Freshness-Kontrakt); zehn Profile nebeneinander mit fünf klassenübergreifenden Beobachtungen. + - AI-Linse (B): Text-to-SQL nur auf der governierten semantischen Schicht; keine LLM-Aufrufe pro Event im Stream. + - Projekt: Coaching; Walking Skeleton fertigstellen -- **Meilenstein: läuft End-to-End**. **10. Hybride, Evolution und das achtstufige Entscheidungsverfahren** *(Teil IV)* + - Inhalte: Hybride als Normalfall; Fit als Funktion der Zeit; Migrationsstrategien (MonolithFirst, Strangler Fig, Sacrificial Architecture; Segment, Prime Video, Shopify); das achtstufige Verfahren an ADR-007; Matrix-Zeilenbegründungen. + - AI-Linse (B): Die AI-Schicht als bewusst ersetzbare Sacrificial Architecture hinter einem Port. - Projekt: Coaching; deterministische Services (Performance, Risk, Optimization) mit exakten Tests gegen die Referenzvektoren. **11. Der Messvertrag, Conway's Law und die Grenzen der Theorie** *(Teil IV)* + - Inhalte: Fitness Functions in CI/CD (Taxonomie, drei Instrumentenfamilien); die vier DORA-Metriken und der Kopplungs-Befund; Kostenverlauf von Änderungen (Boehm vs. Menzies); Conway's Law und Team Topologies; sechs Grenzen der Theorie. + - AI-Linse (A/B): Eval-Harness-Pass-Rate und Token-Budget als neue Fitness-Function-Typen mit alter Mechanik. + - Projekt: Coaching; Resilienz auf allen externen Aufrufen, verifizierte Graceful Degradation -- **Meilenstein: deterministischer Kern vollständig getestet und resilient**. **12. AI-Dimension I: Achse A -- Evidenz und Konsequenzen; Achse B -- Grundlagen** *(Teil V)* + - Inhalte: Zwei widersprüchliche RCTs (Copilot +55.8 % vs. METR −19 % samt Wahrnehmungslücke) und ihre Auflösung; der Verifikations-Engpass; ADRs und Agenten-Instruktionsdateien als Kontrollschnittstelle; Achse B: der Sentiment-Call falsch und richtig verdrahtet, drei Komponententypen, LLM-Gateway-Referenzarchitektur, Eval-Harness-Grundlagen. + - Projekt: Coaching; AdvisorAgent mit 2--3 Sub-Agenten hinter dem Gateway (Pflichtteil), Ontologie-Guard auf allen Insights aktiv. **13. AI-Dimension II: Bedrohungen, verschobene Matrix, Orchestrierung -- und Synthese** *(Teil V)* + - Inhalte: OWASP LLM Top 10 und Prompt Injection als Architekturproblem; EU AI Act als Knock-out-Constraint; die fünf Zellverschiebungen der Matrix; Agenten-Orchestrierung als achtes, emergentes Kompositionsmuster und die Ökonomie der Autonomie; Synthese und Prüfungsorientierung. + - Projekt: Coaching; Eval-Harness als CI-Gate, Kosten- und Latenz-Dashboard, Threat-Model, Hardening, Topologie-ADR; Kür: autonomes Planning, Self-Repair, Model-Routing -- **Meilenstein: Eval-Harness im CI, Guard aktiv, Kosten-Observability**. **14. Synthese, Präsentation und Architektur-Verteidigung** + - Inhalte (1 L): Die Theorie-Pipeline in einem Satz; eine Disziplin an zwei Bindungsstellen; Prüfungsorientierung und Q&A -- kein neuer Stoff. + - Reflexion: Wo half und wo schadete die AI -- im Bauen (A) und im System (B)? - Projekt (3 L): Präsentationen, Architektur-Verteidigung und Peer-Reviews -- **Abgabe A3**. @@ -296,10 +330,13 @@ Plattform: - bezieht **strukturierte externe Daten** (Börsenkurse, z. B. via Yahoo Finance) -- mit Live-API und verpflichtendem Cache-/Snapshot-Fallback; + - bezieht **unstrukturierte externe Daten** (Firmen-News, Web-Berichte) und wandelt sie über eine AI-Komponente in strukturierte, gegen die Ontologie validierte Insights um; + - berechnet **Risiko-, Performance- und Portfolio-Optimierungs-Kennzahlen** (Formeln und Testvektoren werden vorgegeben; die Lernleistung ist das Engineering darum herum); + - stellt die Funktionalität **API-first** bereit, mit einem dünnen Dashboard (z. B. Streamlit) nur zur Demonstration. @@ -329,6 +366,7 @@ Architektur-Verteidigung (14, Abgabe A3). Resilienz gegen Ausfall externer Datenquellen; Eval-Harness für die AI-Komponente; Observability für Kosten und Latenz über das einzige LLM-Gateway; der Messvertrag aus A2 (Modulgrenzen-Check, Eval-Schwelle, Token-Budget) in CI verdrahtet. + - *Kür (für Spitzennoten):* autonomes Planning (der Advisor entscheidet selbst über Tool- und Sub-Agent-Aufrufe), Self-Repair-Loops, Model-Routing, Deployment mit CI/CD und Tracing. @@ -357,17 +395,21 @@ Zusammenarbeit mit anderen Studierenden, projektbegleitendes Selbststudium. ## Literatur **Leitmedium:** + - *AISE502 Lecture Notes -- A Theory of Architecture--Application Fit*, F. Herzog, Fachhochschule Graubünden, 2026 (englisch; wird abgegeben). **Methodische Hauptquellen der Theorie:** + - L. Bass, P. Clements, R. Kazman: *Software Architecture in Practice*, 4. Aufl., 2021. - M. Richards, N. Ford: *Fundamentals of Software Architecture*, 2. Aufl., O'Reilly, 2025. - N. Ford, R. Parsons, P. Kua, P. Sadalage: *Building Evolutionary Architectures*, 2. Aufl., O'Reilly, 2022. + - N. Forsgren, J. Humble, G. Kim: *Accelerate*, IT Revolution, 2018. **Begleitend:** + - I. Sommerville: *Modernes Software-Engineering*, Pearson, 2020 (deutschsprachiger Anker). - S. Newman: *Building Microservices*, 2. Aufl., O'Reilly, 2021 (nach Bedarf als Reader). - Aktuelle wissenschaftliche Artikel und Branchenforschung zu AI-Agenten, agentischen diff --git a/Modulbeschreibung_AISE502_v3_2026.docx b/Modulbeschreibung_AISE502_v3_2026.docx new file mode 100644 index 0000000000000000000000000000000000000000..da6a723fb65e80db7a05bc1f7a76be2665052cf4 GIT binary patch literal 24816 zcmY(qQ;;UWvbNipwr!i!wr$%sr@yvs+qP}nwrx$@|E#^wjyUV0sv`2L;;qc8%8Yyz zq(Oh70s#R*0uhQ+>Oxv{%me}h0YyUq0ipb}Y75)j0Zi=x`YP@YrcS!_Znief$&+$} z42Yt>WE1FQcAA7i?;1e5LSz#VZO=u~VZ154=ZClHq%1;^2`Md^5;Id-p5DeZh37M< z^Wa`%^D&2pTwx@2(9U-1hp*m@(l>|aCQWPHkVvf?3^A)BH-ce#D+VSK^Zv(DAv+QW z#rjYb%b_~{ZFsOZK|<07RQVA|@?!FF;|+Od?xVFhn)tDWqb0Qo*rN;W#Oeucv=w}MR5FOu%uH}mLTS2&Dp@j@`s21$+Tt
Wei4PIo3hEat!H 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 JMEBRH{{bAH{UQJW literal 0 HcmV?d00001 diff --git a/Modulbeschreibung_AISE502_v3_2026.md b/Modulbeschreibung_AISE502_v3_2026.md index 3fcb6f1..54b62f0 100644 --- a/Modulbeschreibung_AISE502_v3_2026.md +++ b/Modulbeschreibung_AISE502_v3_2026.md @@ -44,6 +44,7 @@ Künstliche Intelligenz erscheint in **zwei gleichwertigen, strikt getrennten Ac Entwicklungswerkzeuge produktiv, aber kritisch-reflektiert ein -- auf Basis der empirischen Evidenz (randomisierte Studien mit positiven wie negativen Befunden) und mit Architektur-Dokumentation und Fitness Functions als Leitplanken. + - **Achse B -- AI als Komponente im System:** Studierende entwerfen Architekturen, in denen LLM-, ML- und Optimierungskomponenten als Laufzeit-Bausteine wirken, und machen diese nicht-deterministischen Komponenten *engineering-tauglich*: gekapselt (Gateway, Ports), @@ -192,48 +193,58 @@ die Gateway- und Eval-Harness-Vorlesung genau dann, wenn Gateway und Agenten geb ## Inhalte **1. Das Entscheidungsproblem und das Framework** *(Skript Teil I, §1--2)* + - Inhalte: Vier Produktionssysteme, zwei Fakten (Stack Overflow, Monzo, Segment, Prime Video); Architektur als schwer umkehrbare, qualitätsgetriebene Entscheidungen; die fünf Framework-Elemente (R(a), C(p), fit, ADR, Messvertrag); die tragenden Annahmen A1--A6; von Alltagsfragen zu den zwölf Dimensionen (Überblick der fünf Gruppen). + - Praktische Anwendung: Projekt-Kickoff (Teams, Repository und Werkzeug-Setup inkl. agentischer Entwicklungswerkzeuge, Domänenverständnis, erste Ontologie-Skizze, rohe Stakeholder-Wünsche); ein Agent erstellt ADR-Entwürfe -- der Mensch entscheidet und verantwortet (Achse A). **2. Das Koordinatensystem: zwölf Profildimensionen und messbare Anforderungen** *(Teil I, §2--3)* + - Inhalte: Die zwölf Dimensionen einzeln motiviert, je mit Antwortmass und Messinstrument (Last, Korrektheit/Vertrauen, Wandel/Delivery, Ökonomie/Organisation, AI-Integrierbarkeit); ISO/IEC 25010:2023 als Vokabular; architektur-relevante Anforderungen (ASR), Quality Attribute Workshop, sechsteilige Qualitätsszenarien, Utility Tree → Gewichte; R(a) aus Gewichten, Workload-Shape und Knock-out-Constraints. + - Praktische Anwendung: Requirements-Workshop I -- Qualitätsszenarien mit Antwortmass für die Projektplattform (mindestens acht, davon drei für die AI-Komponenten), Utility Tree beginnen. **3. Nachfrage, Angebot, Passung: das formale Modell** *(Teil I, §4--6)* + - Inhalte: Herleitung von C(p) über Taktiken (Pattern vs. Taktik, Evidenzbasis); das dreistufige, nicht-kompensatorische Matching-Verfahren am Mini-Match des Kursprojekts (C10 gegen L, MM und MS); warum keine gewichtete Summe (MCDM-Kritik); ADR/MADR und der Messvertrag als Abschluss jeder Entscheidung. + - Praktische Anwendung: Requirements-Workshop II -- R(Plattform) finalisieren (Gewichte, Workload-Shape, Knock-out-Constraints), Ontologie als Vertrag fixieren. **Abgabe A1: Requirements-Dossier (Ende Woche 3).** **4. Patterns I: ein Deployable** *(Teil II, §8--10)* + - Inhalte: Schichtenarchitektur, modularer Monolith, Hexagonal/Ports-and-Adapters -- je: reales Ursprungsproblem, Topologie, Architecture Quantum, dimensionsweises Fähigkeitsprofil, Engineering-Konsequenzen, Anti-Patterns; Modulgrenzen als CI-Gegenstand (Spring Modulith, import-linter, ArchUnit, Packwerk). + - Praktische Anwendung: "Build it and study it" -- healthchecks (Django), Apache Fineract und das Cosmic-Python-Repo klonen und die Architektur im Code nachweisen; Architekturstudium I für die Plattform, C4-Kontext- und Container-Entwurf; AI-Linse: der LLM-Provider hinter einem Port. **5. Patterns II: verteilte Topologien** *(Teil II, §11--12)* + - Inhalte: Microservices und Event-Driven Architecture -- Ursprungsprobleme (Release-Zug, Ingest), Fähigkeitsprofile, Sagas vs. ACID, der verteilte Monolith als häufigster Fehlausgang, Broker- vs. Mediator-Topologie, Schema-Governance, die sieben Resilienz-Grundmuster (Timeout, Retry, Circuit-Breaker, Bulkhead, Fallback, Dead-Letter Queue, idempotenter Consumer); Fallstudien (Netflix, Uber DOMA, Monzo, Segment-Rückbau). + - Praktische Anwendung: Online Boutique und der Home-Assistant-EventBus im Quellcode; Architekturstudium II -- Ränder entwerfen (Ingestion-Queue, Resilienz gegen API-Ausfall), Service-Kontrakte skizzieren, Matrix-Vorfilter der Kandidaten; AI-Linse: ein LLM-Aufruf als @@ -241,65 +252,78 @@ die Gateway- und Eval-Harness-Vorlesung genau dann, wenn Gateway und Agenten geb **6. Patterns III: Batch und Serverless, die Verallgemeinerung -- und die eigene Klasse C10** *(Teil II, §13--17; Teil III, §28)* + - Inhalte: Pipes-and-Filters/Batch und Serverless/FaaS; die Verallgemeinerung: Architecture Quantum, "Partitioning beats distribution", Evidenzbasis und die konsolidierte Fähigkeitstabelle als Vergleichssicht; Agenten-Orchestrierung als emergentes Kompositionsmuster (Ausblick); danach **C10 -- AI-native Advisory-Plattformen**, die Klasse des Kursprojekts, mit dem Spiegelpaar C1/C2 als Kurzvorschau. + - Praktische Anwendung: dbt-Pipeline (jaffle_shop_duckdb) lokal bauen und den Knative-Bookstore inspizieren; **der Match**: das dreistufige Verfahren für die eigene Plattform durchführen (Knock-out → Veto → ordinale Lesung), Entscheid fällen, ADR beginnen. **7. Die Passung, formal: drei Fälle, das Verfahren, die Matrix** *(Teil IV, §30--32, 34; §37 Einführung)* + - Inhalte: Drei durchgerechnete Matches (C6: das Shape-Gate leert sechs von sieben Zellen; C1: Veto und dokumentierte Mitigationen; C2: ordinale Lesung mit Sensitivitätsanalyse und Tradeoff-Point); das Verfahren im Allgemeinen und was eine gewichtete Summe zerstört hätte; Zellsemantik und Lesart der 7×10-Matrix (Spalten, Zeilen, fünf Stützpunkte); Einführung des Messvertrags (Fitness Functions, vier DORA-Metriken). + - Praktische Anwendung: Lösungsdesign finalisieren -- Service-Schnitt und Kontrakte, Walking-Skeleton-Plan, Messvertrag mit Zahlen (Token-Budget, Eval-Schwelle ≥ 95 %, p95-Latenz ≤ 20 s, null Modulgrenzen-Verletzungen); **Design-Review-Gate** mit Verteidigung des ADR. **Abgabe A2: Architektur-Dossier (Ende Woche 7).** **8. Anforderungsprofile I: Anwendungsklassen C1--C5** *(Teil III, §18--23)* + - Inhalte: Anwendungsklassen als ASR-Bündel, nicht als Branchenlabel; C1 Kernbanking, C2 Social/Content, C3 Back-Office, C4 ERP, C5 E-Commerce -- je: reale Herausforderungen mit Zahlen und Regulatorik, Anforderungsprofil über die zwölf Dimensionen, und *welche Architektur reale Systeme wählten und warum* (LMAX vs. Monzo, Instagram, Shopify, Fineract). + - Praktische Anwendung: Sprint 1 -- Beginn des Walking Skeleton (MarketDataService, minimaler ResearchAgent, stabile API); AI-Linse: die Latenzklasse, nicht die Genauigkeit, entscheidet über die Platzierung einer AI-Komponente. **9. Anforderungsprofile II: C6--C9 und zehn Profile nebeneinander** *(Teil III, §24--27, 29)* + - Inhalte: C6 Simulation/Batch, C7 DSS/BI, C8 IoT-Streaming, C9 Collaboration/Messaging; die dritte Konsistenzsemantik (Reproduzierbarkeit, Freshness-Kontrakt); Verallgemeinerung: zehn Profile nebeneinander mit ihren Fussnoten und fünf klassenübergreifenden Beobachtungen (u. a.: D11 High, nicht Skalierung, erzwingt Microservices). + - Praktische Anwendung: Coaching; Walking Skeleton fertigstellen -- **Check Woche 9: läuft End-to-End**; das Projekt erbt C6 (Ingestion- und Eval-Pipelines) und C7 (Analytik). **10. Hybride, Evolution und das achtstufige Entscheidungsverfahren** *(Teil IV, §35--36, 33)* + - Inhalte: Hybride als Normalfall und die Bewertungseinheit Subsystem; Fit als Funktion der Zeit (Lehman, Annahme A5), Migrationsstrategien (MonolithFirst, Strangler Fig in beide Richtungen, Sacrificial Architecture; Fallstudien Segment, Prime Video, Shopify); das achtstufige Entscheidungsverfahren von den ASRs bis zum Messvertrag, durchgespielt an ADR-007; die Zeilen-Begründungen der Matrix im Detail. + - Praktische Anwendung: Coaching; deterministische Services (Performance, Risk, Optimization) mit exakten Tests gegen die Referenzvektoren; AI-Linse: die AI-Schicht als bewusst ersetzbare Sacrificial Architecture hinter einem Port. **11. Der Messvertrag, Conway's Law und die Grenzen der Theorie** *(Teil IV, §37--39)* + - Inhalte: Fitness Functions (atomar/holistisch, triggered/continual/temporal) in CI/CD und ihre drei Instrumentenfamilien; die vier DORA-Metriken und der Kopplungs-Befund; die vierstufige Kaskade und der C10-Referenzvertrag; Kostenverlauf von Änderungen (Boehm vs. Menzies); Conway's Law und Team Topologies als dritte Passungsdimension; sechs Grenzen der Theorie, auf sich selbst angewandt. + - Praktische Anwendung: Coaching; Resilienz auf allen externen Aufrufen (Timeout, Retry, Circuit-Breaker, Fallback) und verifizierte Graceful Degradation -- **Check Ende Woche 11**; der Messvertrag der eigenen Abgabe wird in CI verdrahtet. **12. Die AI-Dimension I: Achse A -- Evidenz und Konsequenzen; Achse B -- Grundlagen** *(Teil V, §40--41, §42.1--42.5)* + - Inhalte: Zwei widersprüchliche randomisierte Experimente (Copilot-RCT +55.8 % vs. METR −19 % inklusive Wahrnehmungslücke) und ihre Auflösung über fünf Moderatorvariablen; der Verifikations-Engpass; ADRs und Agenten-Instruktionsdateien als Kontrollschnittstelle, @@ -307,25 +331,30 @@ die Gateway- und Eval-Harness-Vorlesung genau dann, wenn Gateway und Agenten geb und richtig verdrahtet, drei Komponententypen (LLM, ML, Solver), die LLM-Gateway-Referenzarchitektur (Port, Routing, Caching, Budgets, Fallbacks, Ontologie-Guard) und die Grundlagen des Eval-Harness. + - Praktische Anwendung: Coaching; AdvisorAgent mit 2--3 Sub-Agenten hinter dem Gateway (Pflichtteil), Ontologie-Guard auf allen Insights aktiv; Achse-A-Arbeitsregeln im Team (Agenten-Instruktionsdatei, signierte ADRs, CI-Gate, AI-Policy). **13. Die AI-Dimension II: Bedrohungen, verschobene Matrix, Orchestrierung -- und Synthese** *(Teil V, §42.6--42.7, 43--45)* + - Inhalte: OWASP LLM Top 10 und Prompt Injection als Architektur-, nicht Modellproblem; EU AI Act als Knock-out-Constraint in R(a); wie AI die Matrix verschiebt (D12-Mechanik, fünf Zellverschiebungen, MLOps-Reifegrade); Agenten-Orchestrierung als achtes, emergentes Kompositionsmuster (sechs Topologien, Task-Signatur-Tabelle, Ökonomie der Autonomie); Synthese der Theorie und Prüfungsorientierung. + - Praktische Anwendung: Coaching; Eval-Harness als CI-Gate, Kosten- und Latenz-Dashboard, Threat-Model inklusive Prompt Injection über News, Hardening, Topologie-ADR; Kür: autonomes Planning, Self-Repair-Loops, Model-Routing. **Check Ende Woche 13.** **14. Synthese, Präsentation und Architektur-Verteidigung** + - Inhalte (1 Lektion, kein neuer Stoff): das Skript rückwärts als ein Argument gelesen; die Theorie-Pipeline in einem Satz; eine Disziplin an zwei Bindungsstellen (Achse A und B); Prüfungsorientierung und Q&A. + - Praktische Anwendung (3 Lektionen): Abschlusspräsentationen, **Architektur-Verteidigung** der eigenen Trade-offs, Reflexion (wo half und wo schadete AI -- im Bauen und im System) sowie Peer-Reviews. **Abgabe A3 / Meilenstein M6.** @@ -346,10 +375,13 @@ Die Plattform: - bezieht **strukturierte externe Daten** (Börsenkurse, z. B. via Yahoo Finance) -- mit Live-API und verpflichtendem Cache-/Snapshot-Fallback; + - bezieht **unstrukturierte externe Daten** (Firmen-News) und wandelt sie über eine AI-Komponente in strukturierte, gegen die Ontologie validierte Insights um; + - berechnet **Risiko-, Performance- und Portfolio-Optimierungs-Kennzahlen** (Formeln und Testvektoren werden vorgegeben; die Lernleistung ist das Engineering darum herum); + - stellt die Funktionalität **API-first** bereit, mit dünnem Dashboard zur Demonstration. **Zentrale Architekturregel:** *Agents propose; deterministic services decide and book.* @@ -366,6 +398,7 @@ Manifestation von "AI engineering-tauglich machen" und wird bewertet. Eval-Harness für die AI-Komponente; Kosten- und Latenz-Observability über das einzige LLM-Gateway; der Messvertrag aus A2 (Modulgrenzen-Check, Eval-Schwelle, Token-Budget) in CI verdrahtet. + - *Kür (für Spitzennoten):* autonomes Planning (der Advisor entscheidet selbst über Sub-Agent- und Tool-Aufrufe), Self-Repair-Loops, Model-Routing, Deployment mit CI/CD und Tracing. @@ -381,9 +414,11 @@ Degradation), Qualität (Tests der deterministischen Services, Eval-Harness), AI - **Vorlesungsskript** *A Theory of Architecture--Application Fit* (Teile I--V, 45 Abschnitte) -- Leitmedium, Prüfungsgrundlage und Lektüre vor jeder Sitzung; wird während des Semesters entlang der Vorlesung korrigiert und ergänzt (die jeweils aktuelle Fassung liegt auf Moodle). + - **Foliensätze der 14 Vorlesungen** sowie ein eigener Foliensatz zur Projekteinführung. - **Aufgabenblatt zum Praxisprojekt** (normative Quelle für Anforderungen, Meilensteine und Bewertung) inklusive UI-Skizzen der sechs Bildschirme. + - **Moodle-Kursraum** mit einem Abschnitt pro Woche (Lernziele, Theorie, Selbststudium und Aufgaben), einem Abschnitt zum Skript und einem Abschnitt zum Praxisprojekt. @@ -410,20 +445,26 @@ Zusammenarbeit mit anderen Studierenden, projektbegleitendes Selbststudium. ## Literatur **Leitmedium (roter Faden):** + - *AISE502 Lecture Notes -- A Theory of Architecture--Application Fit*, F. Herzog, Fachhochschule Graubünden, 2026 (englisch; wird abgegeben). **Die vier methodischen Hauptquellen der Theorie (im Skript gewürdigt):** + - L. Bass, P. Clements, R. Kazman: *Software Architecture in Practice*, 4. Aufl., Addison-Wesley/SEI, 2021 (Qualitätsszenarien, Taktiken, Utility Tree/ATAM). + - M. Richards, N. Ford: *Fundamentals of Software Architecture -- A Modern Engineering Approach*, 2. Aufl., O'Reilly, 2025 (Architecture Characteristics, Trade-off-Gesetze). + - N. Ford, R. Parsons, P. Kua, P. Sadalage: *Building Evolutionary Architectures*, 2. Aufl., O'Reilly, 2022 (Fitness Functions, Messvertrag). + - N. Forsgren, J. Humble, G. Kim: *Accelerate -- The Science of Lean Software and DevOps*, IT Revolution, 2018 (DORA-Metriken, Kopplungs-Befund). **Begleitend:** + - I. Sommerville: *Modernes Software-Engineering*, Pearson, 2020 (deutschsprachiger Anker). - S. Newman: *Building Microservices*, 2. Aufl., O'Reilly, 2021 (nach Bedarf als Reader). - ISO/IEC 25010:2023 (Qualitätsvokabular) und ISO/IEC/IEEE 42010:2022 (Architekturbeschreibung). diff --git a/Modulbeschreibung_AISE502_v3_2026_confluence.txt b/Modulbeschreibung_AISE502_v3_2026_confluence.txt index f1d3783..641de84 100644 --- a/Modulbeschreibung_AISE502_v3_2026_confluence.txt +++ b/Modulbeschreibung_AISE502_v3_2026_confluence.txt @@ -209,15 +209,18 @@ h2. Struktur h2. Literatur *Leitmedium (roter Faden):* + * _AISE502 Lecture Notes – A Theory of Architecture–Application Fit_, F. Herzog, Fachhochschule Graubünden, 2026 (englisch; wird abgegeben). *Die vier methodischen Hauptquellen der Theorie (im Skript gewürdigt):* + * L. Bass, P. Clements, R. Kazman: _Software Architecture in Practice_, 4. Aufl., Addison-Wesley/SEI, 2021 (Qualitätsszenarien, Taktiken, Utility Tree/ATAM). * M. Richards, N. Ford: _Fundamentals of Software Architecture – A Modern Engineering Approach_, 2. Aufl., O'Reilly, 2025 (Architecture Characteristics, Trade-off-Gesetze). * N. Ford, R. Parsons, P. Kua, P. Sadalage: _Building Evolutionary Architectures_, 2. Aufl., O'Reilly, 2022 (Fitness Functions, Messvertrag). * N. Forsgren, J. Humble, G. Kim: _Accelerate – The Science of Lean Software and DevOps_, IT Revolution, 2018 (DORA-Metriken, Kopplungs-Befund). *Begleitend:* + * I. Sommerville: _Modernes Software-Engineering_, Pearson, 2020 (deutschsprachiger Anker). * S. Newman: _Building Microservices_, 2. Aufl., O'Reilly, 2021 (nach Bedarf als Reader). * ISO/IEC 25010:2023 (Qualitätsvokabular) und ISO/IEC/IEEE 42010:2022 (Architekturbeschreibung). diff --git a/tools/md2docx.sh b/tools/md2docx.sh new file mode 100755 index 0000000..8bdfcef --- /dev/null +++ b/tools/md2docx.sh @@ -0,0 +1,26 @@ +#!/bin/zsh +# AISE502: Markdown-Modulbeschreibung -> Word (.docx), A4, Arial, mit Inhaltsverzeichnis. +# ./tools/md2docx.sh Modulbeschreibung_AISE502_v3_2026.md [ausgabe.docx] +# Benötigt pandoc; die Referenzvorlage tools/reference_fhgr.docx liefert Schriften, Ränder und A4. +set -e +SRC="${1:?Markdown-Datei angeben}"; OUT="${2:-${SRC:r}.docx}" +REF="$(dirname "$0")/reference_fhgr.docx" +# eigenstaendige "---"-Trennlinien entfernen: Word stellt sie als Absatz mit Punkt dar +sed '/^-\{3,\}$/d' "$SRC" | pandoc -f markdown+pipe_tables+smart -t docx \ + --reference-doc="$REF" --toc --toc-depth=2 --metadata toc-title="Inhaltsverzeichnis" -o "$OUT" +python3 - "$OUT" <<'PY' +import re, shutil, sys, zipfile +p = sys.argv[1]; tmp = p + ".tmp" +with zipfile.ZipFile(p) as zin, zipfile.ZipFile(tmp, "w", zipfile.ZIP_DEFLATED) as zout: + for it in zin.infolist(): + data = zin.read(it.filename) + if it.filename == "word/settings.xml": + s = data.decode("utf-8") + if "updateFields" not in s: # Word aktualisiert das Inhaltsverzeichnis beim Öffnen + s = re.sub(r"(]*>)", r'\1', s, count=1) + data = s.encode("utf-8") + zout.writestr(it, data) +shutil.move(tmp, p) +print(f"{p}: Feldaktualisierung aktiviert") +PY +echo "fertig: $OUT" diff --git a/tools/reference_fhgr.docx b/tools/reference_fhgr.docx new file mode 100644 index 0000000000000000000000000000000000000000..3ad55c9c5a1a02047e20168923663280ddcabe6b GIT binary patch literal 10963 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