Block 11 · Entwicklungsumgebung & Werkzeuge

Sonstige 2/9 Prüfungen (W21, W22) · Ø 21 von 200 Punkten · nur Teil 1 (jeweils Aufgabe 1 bzw. 2) · Lösungen: 11_Werkzeuge_Loesungen.html
So arbeitest du mit diesem Block Erst den Erklärungssatz lesen, dann die Aufgaben mit dem Belegsatz daneben lösen (Belegsatz am besten separat ausdrucken und neben die Aufgaben legen). Zeitrichtwert: 1 Punkt ≈ 0,9 Minuten. Lösungen erst danach in der separaten Lösungsdatei nachsehen. Fast alle Aufgaben sind Textaufgaben („beschreiben“, „erläutern“, „bewerten“): Übe, in ganzen Sätzen und mit Bezug auf die Situation zu antworten – reine Stichwortlisten geben in der IHK-Prüfung oft nur die halbe Punktzahl.

A · Erklärungssatz

Die Themen dieses Blocks kamen bisher nur in den ersten beiden Prüfungen nach neuer Ausbildungsordnung vor (W21 und W22), dort aber jeweils mit rund 20 Punkten in Teil 1. Jedes Unterthema wurde genau einmal gefragt – meist mit kurzen Wissensfragen („Nennen Sie …“, „Beschreiben Sie den Unterschied …“) oder einer Bewertung („Entscheiden Sie, ob Sie dem Vorschlag zustimmen“). Es ist Grundlagenwissen aus dem Ausbildungsalltag und kann jederzeit wiederkommen, z. B. als Einstieg in Aufgabe 1 oder 2 von Teil 1.

UnterthemaKategorieOriginalWichtigste Fähigkeit
WZ-01 Versionsverwaltung (Git)SonstigeW21 T1 A1c (4 P)Nutzen begründen, Begriffe, Commit-Graph, Team-Workflow bewerten
WZ-02 CI/CD & DeploymentSonstigeW22 T1 A1c (6 P)Pipeline beschreiben, Vorteile der Automatisierung
WZ-03 SoftwarearchitekturSonstigeW22 T1 A2a (6 P)3 Schichten und ihr Zusammenspiel, MVC, Skizze
WZ-04 Compiler vs. InterpreterSonstigeW21 T1 A1a (6 P)Unterschied, Beispiele, Vor-/Nachteile
WZ-05 Bibliotheken, Frameworks, DokuSonstigeW21 T1 A1b (10 P)Vor-/Nachteile, Dokumentation einer Erweiterung
WZ-06 Open Source & LizenzenSonstigeW22 T1 A2c (9 P)Begriff, Lizenzpflichten (Copyleft), Vor-/Nachteile

WZ-01 · Versionsverwaltung (Git) Sonstige

Vorkommen: 1/9 · Prüfung: W21 T1 A1c (4 P: Ein Entwicklungsteam aus zehn Personen schlägt vor, mit einer Versionsverwaltung zu arbeiten – zustimmen oder ablehnen und fachlich begründen)

Eine Versionsverwaltung (Version Control System, VCS) speichert jede Änderung an Dateien – meist Quellcode – als neue Version in einem Repository. Zu jeder Version werden Autor, Zeitpunkt und eine Beschreibung festgehalten. Dadurch kann ein Team gleichzeitig an denselben Dateien arbeiten, Änderungen zusammenführen und jederzeit auf einen früheren Stand zurückgehen.

Wozu eine Versionsverwaltung? (Argumente für die Prüfung)

Gegen eine Versionsverwaltung spricht praktisch nur der Einarbeitungs- und Einrichtungsaufwand. In der Prüfung lautet die erwartete Antwort daher fast immer: zustimmen – und mit zwei konkreten Vorteilen für dieses Team begründen.

Zentrale und verteilte Versionsverwaltung

Zentral (z. B. Subversion) Server Repository mit Historie Arbeitskopie Arbeitskopie Arbeitskopie commit / update Historie nur auf dem Server – ohne Server kein Commit Verteilt (z. B. Git) Remote-Repository (z. B. GitLab, GitHub) Repository + Arbeitskopie Repository + Arbeitskopie Repository + Arbeitskopie push / pull jede Kopie enthält die vollständige Historie
Abb. A-1: Zentrale und verteilte Versionsverwaltung
Zentral (CVS, Subversion/SVN, Perforce)Verteilt (Git, Mercurial)
Repositorynur auf dem Server; Entwickler haben nur eine Arbeitskopiejeder Klon ist ein vollständiges Repository mit gesamter Historie
Commitdirekt auf den Server – nur mit Netzverbindunglokal, offline möglich; Austausch später per push/pull
GeschwindigkeitLog, Vergleich, Commit brauchen den Serverfast alles lokal und daher schnell
AusfallsicherheitServer ist Single Point of Failurejede Kopie kann den Server wiederherstellen
Branchesmöglich, aber eher schwerfälligbillig und schnell – Grundlage moderner Workflows
Stärkeneinfaches Modell, feine Rechtevergabe je Verzeichnis, Sperren (Locking) großer Binärdateienflexibel, offline, Pull-Request-Workflows; heute Standard

Die wichtigsten Begriffe

BegriffBedeutung
RepositoryDatenbank aller Versionen eines Projekts (bei Git der Ordner .git). Remote = entferntes Repository auf einem Server, Standardname origin.
Arbeitsverzeichnis, Staging-BereichArbeitsverzeichnis = die Dateien, an denen man arbeitet. Mit git add werden Änderungen in den Staging-Bereich (Index) vorgemerkt; nur diese landen im nächsten Commit.
Commitgespeicherter Stand (Schnappschuss) mit eindeutiger ID (Hash, z. B. 4f2a9c1), Autor, Zeitpunkt, Nachricht und Verweis auf den/die Vorgänger-Commit(s).
BranchEntwicklungszweig; technisch ein beweglicher Zeiger auf den letzten Commit des Zweigs. Ein neuer Commit verschiebt den Zeiger mit. Standard-Branch heute meist main (früher master).
HEADZeiger auf den aktuell ausgecheckten Branch bzw. Commit („wo stehe ich gerade?“).
MergeZusammenführen eines Branches in einen anderen. Fast-Forward: Der Ziel-Branch hat sich nicht weiterentwickelt – sein Zeiger wird einfach vorgeschoben, es entsteht kein neuer Commit. Merge-Commit: Beide haben neue Commits – Git erzeugt einen Commit mit zwei Vorgängern.
Merge-KonfliktBeide Branches haben dieselbe Stelle einer Datei unterschiedlich geändert; Git kann nicht automatisch entscheiden, ein Mensch muss den Konflikt auflösen.
clone, fetch, pull, pushclone: Remote-Repository erstmals vollständig kopieren. fetch: neue Commits vom Remote holen, ohne die eigenen Branches zu verändern (nur origin/main wird aktualisiert). pull = fetch + merge (bzw. rebase) in den aktuellen Branch. push: eigene Commits zum Remote hochladen.
Tagfester Name für einen bestimmten Commit, z. B. v2.1.0 für ein Release. Im Gegensatz zum Branch bewegt sich ein Tag nicht.
RebaseCommits eines Branches auf einen neuen Ausgangspunkt „umsetzen“ → lineare Historie. Keine bereits veröffentlichten (gepushten) Commits rebasen.
Pull Request / Merge RequestAnfrage auf der Plattform (GitHub: Pull Request, GitLab: Merge Request), einen Branch in main zu übernehmen. Dort finden Code-Review, Diskussion und automatische Prüfungen (CI) statt, bevor gemergt wird.
Git-Befehle (Grundwortschatz)
BefehlWirkung
git clone <url>Remote-Repository erstmals vollständig kopieren
git statusanzeigen, was geändert bzw. vorgemerkt ist
git add <datei>Änderung für den nächsten Commit vormerken
git commit -m "Nachricht"Commit aus den vorgemerkten Änderungen erstellen
git commit -am "Nachricht"alle geänderten, bereits versionierten Dateien vormerken und committen
git log --oneline --graphHistorie als Graph anzeigen
git switch -c <branch> (älter: git checkout -b)Branch anlegen und dorthin wechseln
git switch <branch>Branch wechseln
git merge <branch>angegebenen Branch in den aktuellen Branch mergen
git fetchneue Commits vom Remote holen (eigener Branch bleibt unverändert)
git pullfetch + merge in den aktuellen Branch
git push origin <branch>eigene Commits zum Remote hochladen
git tag -a v1.0.0 -m "…"annotierten Tag auf den aktuellen Commit setzen
git revert <commit>Commit durch einen Gegen-Commit rückgängig machen

Beispiel: Projekt „Kassenbuch“. main steht auf Commit C2. Dann werden diese Befehle ausgeführt:

git switch -c feature/csv-export
git commit -m "…"                      # E1
git commit -m "…"                      # E2
git switch main
git commit -m "…"                      # C3 (dringender Fix direkt auf main)
git merge feature/csv-export           # M
git tag -a v2.0.0 -m "Version 2.0.0"

Weil main mit C3 einen eigenen neuen Commit hat, ist kein Fast-Forward möglich: Es entsteht der Merge-Commit M mit den Vorgängern C3 und E2. (Hätte es C3 nicht gegeben, wäre main beim Merge einfach auf E2 vorgerückt.)

C1 C2 E1 E2 C3 M feature/csv-export HEAD → main v2.0.0 Zeit →
Abb. A-2: Commit-Graph nach den Befehlen oben – zwei Branches, Merge-Commit M mit zwei Vorgängern, Tag v2.0.0

Zeichenregeln für Commit-Graphen: Commits als Kreise in zeitlicher Reihenfolge, Linien zum Vorgänger, Branch-Namen und Tags als beschriftete Zeiger auf „ihren“ Commit, HEAD beim aktuell ausgecheckten Branch. (In Git zeigt jeder Commit auf seinen Vorgänger; Pfeile sind daher korrekt in Richtung Vergangenheit. Ohne Pfeile mit Zeitachse ist es ebenso eindeutig.)

Merge-Konflikte erkennen und lösen

Git führt Änderungen automatisch zusammen, solange sie unterschiedliche Stellen betreffen. Ändern beide Seiten dieselben Zeilen (oder löscht eine Seite eine Datei, die die andere ändert), stoppt der Merge und markiert die Stelle in der Datei:

timeout.sekunden=
<<<<<<< HEAD
30
=======
120
>>>>>>> feature/langsame-drucker

Oberhalb von ======= steht der Stand des aktuellen Branches (HEAD), darunter der des einzumergenden Branches. So gehst du vor: (1) Konfliktdateien mit git status ermitteln, (2) fachlich entscheiden, welcher Inhalt richtig ist – eine Seite, die andere oder eine Kombination, bei Unklarheit mit dem Autor der anderen Änderung sprechen, (3) Konfliktmarker entfernen, (4) kompilieren und testen, (5) mit git add als gelöst markieren und mit git commit den Merge abschließen. Alternativ bricht git merge --abort den Merge ab.

MerkeMerge-Konflikte sind kein Fehler von Git, sondern eine Rückfrage: Zwei Personen haben dieselbe Stelle unterschiedlich geändert. Sie werden seltener und kleiner, je kürzer Branches leben und je öfter man den aktuellen Stand von main holt.

Branching-Strategien

StrategieAblaufGeeignet für / Bewertung
Feature-Branch-Workflowmain ist immer lauffähig. Für jede Aufgabe (Ticket) ein kurzer Branch, z. B. feature/123-login; Abschluss über Pull Request mit Review und CI-Prüfung, dann Merge in main.sehr verbreitet, einfach, gut für kleine und mittlere Teams; Reviews und Tests vor jedem Merge
Git-Flowdauerhafte Branches main (nur Releases) und develop (Integration); dazu feature/*, release/* (Release vorbereiten), hotfix/* (Fehler im Release).für geplante, versionierte Releases und mehrere gepflegte Versionen; relativ aufwendig, viele Merges, eher langsam
Trunk-based DevelopmentAlle integrieren sehr häufig (mind. täglich) in den Hauptzweig („Trunk“), Branches leben nur Stunden; Unfertiges wird per Feature-Toggle verborgen.passt zu Continuous Integration/Deployment; setzt gute automatische Tests und Disziplin voraus

Ergänzend: Branch-Schutz auf main (kein direkter Push, Merge nur per Pull Request mit mindestens einem Review und grüner Pipeline).

Pull Request und Code-Review

Vorteile: Vier-Augen-Prinzip (Fehler, Sicherheitslücken und unklarer Code werden vor dem Merge gefunden), Wissensverteilung im Team (mehr als eine Person kennt jeden Codeteil), einheitlicher Stil und Einhaltung von Konventionen, dokumentierte Diskussion zu jeder Änderung, automatische Prüfungen (Build, Tests, statische Analyse) laufen vor dem Merge. Nachteile: Zeitaufwand, Wartezeiten, wenn Reviews liegen bleiben – deshalb kleine Pull Requests.

.gitignore – was gehört nicht ins Repository?

Versioniert wird alles, was man braucht, um das Projekt aus dem Quellcode zu bauen: Quellcode, Tests, Build-Konfiguration (pom.xml, package.json, build.gradle), Datenbank-Migrationsskripte, Dokumentation, die .gitignore selbst.

Nicht versioniert werden: erzeugte Dateien (Build-Ausgaben, kompilierte Klassen, heruntergeladene Abhängigkeiten), persönliche Einstellungen (IDE-Ordner), Logdateien, Betriebssystem-Dateien und vor allem Geheimnisse (Passwörter, API-Schlüssel, Zertifikate).

Beispiel .gitignore (Python-Projekt)

# erzeugte Dateien
__pycache__/
*.pyc
dist/
# virtuelle Umgebung
.venv/
# Editor / Betriebssystem
.vscode/
Thumbs.db
# Geheimnisse
.env
*.log
Typische FalleEin Passwort, das einmal committet und gepusht wurde, steht in der Historie – auch wenn es im nächsten Commit gelöscht wird. Es muss als kompromittiert gelten und geändert werden. Ein späterer Eintrag in .gitignore wirkt nur für noch nicht versionierte Dateien.

Gute Commit-Nachrichten

SchlechtBesser
update, ., zwischenstand, FreitagKB-57: Export der Buchungen als CSV ergänzt
bugfixfix: Rundungsfehler bei Beträgen mit 3 Nachkommastellen behoben
Typische FallenGit ≠ GitHub: Git ist das Versionsverwaltungsprogramm, GitHub/GitLab/Bitbucket sind Plattformen, die Remote-Repositories hosten und Pull Requests, Tickets und CI anbieten. · pull ≠ fetch (pull verändert den eigenen Branch, fetch nicht). · Ein Branch ist keine Kopie aller Dateien, sondern nur ein Zeiger. · Veröffentlichte Commits nicht mit reset oder rebase umschreiben, sondern mit revert korrigieren.
So wird es in der Prüfung gefragtW21 T1 A1c (4 P): Das Entwicklungsteam (zehn Personen) schlägt vor, mit einer Versionsverwaltung zu arbeiten. Gefragt war, ob man zustimmt, mit fachlicher Begründung. Erwartet: Zustimmung und zwei gut erläuterte Argumente (paralleles Arbeiten ohne gegenseitiges Überschreiben, Nachvollziehbarkeit/Historie, Wiederherstellen alter Stände, Branches für Releases/Features). Denkbar sind auch Begriffe („Erläutern Sie Branch und Merge“), ein Commit-Graph oder die Bewertung eines Team-Workflows.

WZ-02 · CI/CD & Deployment Sonstige

Vorkommen: 1/9 · Prüfung: W22 T1 A1c (6 P: Durch manuelles Kompilieren und Bereitstellen gab es Probleme mit der Verfügbarkeit – ca) beschreiben, wie automatisierte Kompilierung und Bereitstellung umgesetzt werden können (2 P), cb) zwei Vorteile gegenüber der manuellen Bereitstellung nennen (4 P))

Deployment (Bereitstellung) bezeichnet alle Schritte, mit denen eine neue Softwareversion auf eine Zielumgebung gebracht und dort in Betrieb genommen wird. Manuell heißt das oft: Ein Administrator baut die Software auf seinem Rechner, kopiert Dateien auf den Server, passt Konfigurationen von Hand an und startet Dienste neu. Jeder dieser Schritte kann vergessen oder falsch ausgeführt werden – typische Folgen sind Ausfälle, „bei mir lief es aber“ und Abhängigkeit von einer einzelnen Person.

CI, Continuous Delivery, Continuous Deployment

BegriffBedeutung
Continuous Integration (CI)Entwickler integrieren ihre Änderungen häufig (mindestens täglich) in den gemeinsamen Hauptzweig. Jede Integration (jeder Push/Pull Request) wird von einem CI-Server automatisch gebaut und getestet. Fehler fallen Minuten nach der Änderung auf, nicht erst Wochen später beim Release. Ein „roter“ Build wird sofort repariert.
Continuous Delivery (CD)Erweitert CI: Jede Änderung, die alle Prüfungen besteht, wird automatisch zu einem auslieferbaren Artefakt verpackt und automatisch in Test-/Staging-Umgebungen installiert. Die Software ist jederzeit releasefähig; die Übernahme in die Produktion erfolgt per manueller Freigabe („auf Knopfdruck“), dann aber ebenfalls automatisiert.
Continuous DeploymentWie Continuous Delivery, aber ohne manuelle Freigabe: Jede Änderung, die die Pipeline besteht, geht automatisch in Produktion. Setzt sehr gute automatisierte Tests und Überwachung voraus.
Fehler → Pipeline stoppt, Rückmeldung an Entwickler Commit /Push Buildkompilieren TestsUnit, Integr. StatischeAnalyse PackagingArtefakt DeployStaging Freigabe(manuell) DeployProduktion Continuous Integration Continuous Delivery: jederzeit auslieferbar, Produktion auf Knopfdruck Continuous Deployment: auch Produktion automatisch – ohne manuelle Freigabe
Abb. A-3: Typische Build-Pipeline und die Reichweite von CI, Continuous Delivery und Continuous Deployment

Stufen einer Pipeline

StufeWas passiert?Werkzeuge (Beispiele)
AuslöserPush, Pull Request, Tag oder Zeitplan startet die Pipeline auf dem CI-Server; Code kommt immer aus der Versionsverwaltung.GitLab CI/CD, GitHub Actions, Jenkins, Azure DevOps
BuildAbhängigkeiten laden, Quellcode kompilieren – in einer sauberen, immer gleichen Umgebung.Maven, Gradle, npm, dotnet
TestUnit-Tests, Integrationstests (z. B. gegen eine Test-Datenbank), ggf. Testabdeckung messen.JUnit, pytest, Jest
Statische AnalyseCode prüfen, ohne ihn auszuführen: Stil, typische Fehlermuster, Sicherheitslücken, bekannte Schwachstellen in Abhängigkeiten.SonarQube, Checkstyle, SpotBugs, ESLint, Dependency-Check
PackagingAuslieferbares Artefakt erzeugen (JAR, App-Bundle, Container-Image), versionieren und in einem Repository/Registry ablegen.Docker, Nexus, Container-Registry
DeployArtefakt per Skript in Test-, Staging- und Produktionsumgebung installieren, Datenbank migrieren, Smoke-Test.Skripte, Kubernetes, Ansible, Flyway/Liquibase

Schlägt eine Stufe fehl, stoppt die Pipeline: Nachfolgende Stufen laufen nicht, das Team wird benachrichtigt. Die Pipeline wird als Datei im Repository beschrieben („Pipeline as Code“) und damit selbst versioniert. Beispiel für ein Node.js-Projekt mit GitHub Actions:

# .github/workflows/ci.yml
name: CI
on: [push, pull_request]          # Auslöser
jobs:
  pruefen:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4   # Code aus dem Repository holen
      - uses: actions/setup-node@v4
        with:
          node-version: 22
      - run: npm ci                 # Abhängigkeiten exakt nach Lock-Datei
      - run: npm run lint           # statische Analyse
      - run: npm test               # Unit-Tests

Build-Werkzeuge

Ein Build-Tool automatisiert alles, was nötig ist, um aus Quellcode ein lauffähiges Produkt zu machen: Abhängigkeiten auflösen und herunterladen (inkl. transitiver Abhängigkeiten), kompilieren, Tests ausführen, Artefakte packen (JAR/WAR, APK), Dokumentation erzeugen, Versionen veröffentlichen. Weil der Ablauf in einer Datei beschrieben ist, baut jeder Rechner und der CI-Server das Projekt gleich (reproduzierbarer Build).

WerkzeugKonfigurationMerkmale
Maven (Java)pom.xml (XML)„Konvention vor Konfiguration“ (feste Ordnerstruktur src/main/java, src/test/java); fester Lebenszyklus validate → compile → test → package → verify → install → deploy: mvn package führt alle vorherigen Phasen mit aus. Bibliotheken aus Maven Central.
Gradle (Java, Kotlin, Android)build.gradle(.kts) (Groovy/Kotlin-DSL)flexibel programmierbar, inkrementelle Builds und Build-Cache (schnell), Standard bei Android; Aufruf über den Wrapper ./gradlew build.
npm (JavaScript/TypeScript)package.json + package-lock.jsonPaketverwaltung und Skripte (npm run build, npm test).

Umgebungen (Stages)

Entwicklung (lokal) → Test/Integration (automatische Tests) → Staging → Produktion. Die Staging-Umgebung ist eine möglichst exakte Kopie der Produktion (gleiche Betriebssystem- und Laufzeitversionen, gleiche Konfiguration, realistische, aber anonymisierte Daten). Dort werden Installation, Datenbankmigration und Abnahme (z. B. durch Fachbereich oder Kunden) geprüft, ohne echte Nutzer zu gefährden. Grundsatz „Build once, deploy many“: Dasselbe, einmal gebaute Artefakt wandert durch alle Umgebungen; nur die Konfiguration (Umgebungsvariablen, Secrets) unterscheidet sich.

Vorteile automatisierter Bereitstellung

Nachteile/Aufwand: Einrichtung und Pflege der Pipeline und der Infrastruktur, Know-how, aussagekräftige automatische Tests sind Voraussetzung (eine Pipeline ohne gute Tests liefert Fehler nur schneller aus).

Weitere Begriffe: Rollback = Zurück auf die letzte funktionierende Version. Blue-Green-Deployment = neue Version parallel aufbauen und dann umschalten. Canary Release = neue Version zuerst nur für einen kleinen Teil der Nutzer. Secrets (Passwörter, Schlüssel) gehören nie in die Pipeline-Datei oder das Repository, sondern in geschützte Variablen des CI-Systems bzw. einen Secret-Speicher.

Container (Docker) im Deployment

Ein Container-Image enthält die Anwendung samt Laufzeitumgebung (z. B. Java 21), Bibliotheken und Konfigurationsvorgaben. Aus dem Image werden Container gestartet – auf dem Entwicklerrechner, im Test und in der Produktion identisch. Damit verschwinden Fehler durch abweichende Umgebungen. Images werden in einer Registry abgelegt; viele Container werden mit Kubernetes orchestriert (verteilen, skalieren, neu starten). Beschrieben wird ein Image in einem Dockerfile:

# Dockerfile für das Projekt „Kassenbuch“
# Basis-Image mit Java-21-Laufzeit
FROM eclipse-temurin:21-jre
WORKDIR /app
# gebaute Anwendung in das Image kopieren
COPY target/kassenbuch.jar app.jar
EXPOSE 8080
# Startbefehl des Containers
ENTRYPOINT ["java", "-jar", "app.jar"]

Kommentare stehen im Dockerfile immer in einer eigenen Zeile.

ContainerVirtuelle Maschine (VM)
InhaltAnwendung + Bibliotheken; nutzt den Kernel des Host-Betriebssystems mitkomplettes Gast-Betriebssystem auf virtueller Hardware (Hypervisor)
Größe, StartMegabytes, Start in SekundenGigabytes, Start in Minuten
IsolationProzess-Isolation, geringer als bei VMsstärker (eigener Kernel)

DevOps

DevOps (Development + Operations) ist eine Kultur bzw. Arbeitsweise, in der Entwicklung und Betrieb nicht getrennt „über den Zaun werfen“, sondern gemeinsam Verantwortung für die laufende Software übernehmen. Kernelemente: Automatisierung (CI/CD, Infrastructure as Code), kurze Feedbackschleifen, Messen und Überwachen im Betrieb (Monitoring, Logging), kleine und häufige Releases, „You build it, you run it“. CI/CD ist das wichtigste Werkzeug von DevOps.

Typische FallenContinuous Delivery (Produktion mit manueller Freigabe) und Continuous Deployment (vollautomatisch) verwechseln. · CI ist kein Programm, sondern eine Praxis; Jenkins/GitLab sind nur Werkzeuge dafür. · Tests, deren Fehlschlag ignoriert wird (z. B. allow_failure: true), sind wertlos. · Passwörter im Klartext in der Pipeline-Datei.
So wird es in der Prüfung gefragtW22 T1 A1c (6 P): Wegen manueller Kompilierung und Bereitstellung kam es zu Ausfällen. Erwartet war (ca) eine Beschreibung der Umsetzung: Code liegt in der Versionsverwaltung, ein CI/CD-Server baut bei jeder Änderung automatisch, führt Tests aus und verteilt das Ergebnis per Skript auf die Server; (cb) zwei Vorteile mit kurzer Erläuterung, z. B. weniger menschliche Fehler/reproduzierbar, Tests vor jeder Auslieferung, schnellere und häufigere Releases, Unabhängigkeit vom Administrator. Antworte immer mit Bezug auf das geschilderte Problem (hier: Verfügbarkeit).

WZ-03 · Softwarearchitektur Sonstige

Vorkommen: 1/9 · Prüfung: W22 T1 A2a (6 P: beschreiben, wie die 3-Schichten-Architektur bei einer Webanwendung typischerweise aussieht und wie die Komponenten zusammenarbeiten)

Die Softwarearchitektur beschreibt die grundlegende Struktur eines Systems: aus welchen Komponenten es besteht, welche Aufgabe jede hat und wie sie miteinander kommunizieren. Gute Architektur trennt Verantwortlichkeiten („Separation of Concerns“), damit Teile unabhängig geändert, getestet und ausgetauscht werden können.

Client-Server, Thin Client und Fat Client

Beim Client-Server-Modell bietet ein Server Dienste an (Daten, Berechnungen), Clients fordern sie an (Anfrage → Antwort, z. B. per HTTP). Wie viel Logik auf dem Client liegt, unterscheidet Thin und Fat Client:

Thin ClientFat (Rich) Client
PrinzipClient zeigt nur an und nimmt Eingaben entgegen; Logik und Daten liegen auf dem ServerClient enthält einen großen Teil der Logik, oft auch lokale Daten
Beispieleklassische Webanwendung im Browser, Terminal-ServerDesktop-Anwendung, App mit Offline-Modus und lokaler Datenbank
Vorteilegeringe Anforderungen an das Endgerät, Updates nur zentral auf dem Server, Daten zentral und sicheroffline nutzbar, schnelle Reaktion, entlastet Server und Netz, volle Nutzung der Gerätefunktionen
Nachteileohne Netz/Server nicht nutzbar, Serverlast, LatenzInstallation und Updates auf jedem Gerät, Daten müssen synchronisiert werden (Konflikte), höhere Geräteanforderungen

Schichtenarchitektur und 3-Schichten-Architektur

In einer Schichtenarchitektur wird die Software in übereinanderliegende Schichten mit klaren Aufgaben zerlegt. Jede Schicht nutzt nur die Dienste der Schicht direkt darunter über definierte Schnittstellen und kennt die Schichten darüber nicht. Die klassische Aufteilung ist die 3-Schichten-Architektur:

SchichtAufgabeTypische Technik
Präsentationsschicht (Presentation Layer)Benutzeroberfläche: Daten darstellen, Eingaben entgegennehmen, einfache Eingabeprüfung (Format, Pflichtfelder), Anfragen an die Logikschicht sendenBrowser mit HTML/CSS/JavaScript, App-Oberfläche, Desktop-GUI
Logikschicht (Business/Application Layer)Geschäftsregeln und Abläufe: Berechnungen, fachliche Prüfungen, Rechte, Transaktionen steuern, Schnittstellen zu FremdsystemenAnwendungsserver, REST-API (Java/Spring, C#/ASP.NET, PHP, Node.js)
Datenhaltungsschicht (Data Layer)Daten dauerhaft und konsistent speichern, lesen, ändern, löschen; Integrität, DatensicherungDatenbankserver (MySQL, PostgreSQL), Dateisystem; Zugriff per SQL
Präsentation Darstellung, Eingabe Logik Geschäftsregeln Datenhaltung Speicherung Browser: Ticket-Webshop (HTML, CSS, JavaScript) Kassen-App (Theaterkasse, Tablet) Anwendungsserver (REST-API) Spielplan Reservierung Preisberechnung Zahlung Datenbankserver Vorstellungen, Plätze, Buchungen HTTPS: Anfrage → Antwort (JSON/HTML) SQL (Abfrage → Ergebnismenge)
Abb. A-4: 3-Schichten-Architektur am Beispiel eines Theater-Ticketshops

Zusammenspiel (Beispiel „Platz buchen“): Der Nutzer wählt im Browser einen Platz; die Präsentationsschicht schickt eine HTTPS-Anfrage an den Anwendungsserver. Die Logikschicht prüft, ob der Platz frei ist, berechnet den Preis (Ermäßigung) und veranlasst die Speicherung: Sie sendet SQL-Befehle an die Datenhaltungsschicht, die die Buchung in der Datenbank speichert und das Ergebnis zurückmeldet. Die Logikschicht gibt eine Antwort (z. B. JSON mit Buchungsnummer) an die Präsentationsschicht, die sie dem Nutzer anzeigt. Die Präsentationsschicht greift nie direkt auf die Datenbank zu.

Schicht (Layer) vs. Stufe (Tier): Layer ist die logische Aufteilung des Codes, Tier die physische Verteilung auf Rechner. Drei Schichten können auf einem Rechner laufen; bei einer Webanwendung sind sie meist auf drei Stufen verteilt (Client-Rechner, Anwendungsserver, Datenbankserver) – deshalb auch „3-Tier“ bzw. allgemein n-Tier.

Vorteile der SchichtenarchitekturNachteile
  • Austauschbarkeit: z. B. neue App-Oberfläche oder anderes DBMS, ohne die anderen Schichten zu ändern
  • Wartbarkeit und Übersicht durch klare Zuständigkeiten
  • Wiederverwendung: Web und App nutzen dieselbe Logik
  • Testbarkeit: Schichten einzeln testen (z. B. Logik mit Test-Datenbank)
  • parallele Entwicklung durch spezialisierte Teams
  • Skalierbarkeit: Stufen einzeln auf mehrere Server verteilen
  • Sicherheit: Datenbank nur vom Anwendungsserver erreichbar
  • mehr Entwurfs- und Programmieraufwand (Schnittstellen, Datenobjekte)
  • Performance: Anfragen laufen durch alle Schichten, bei Verteilung zusätzlich Netzwerklatenz
  • kleine Änderungen (neues Feld) betreffen oft alle Schichten
  • für sehr kleine Anwendungen überdimensioniert

MVC – Model View Controller

MVC ist ein Architektur- bzw. Entwurfsmuster für Anwendungen mit Benutzeroberfläche. Es trennt drei Verantwortlichkeiten:

Nutzer (Browser) Controller MedienController Model MedienKatalog, Medium View trefferliste.html 1 Eingabe: Suche „Krimi“ 2 suche("Krimi") 3 Trefferliste 4 Daten übergeben, View auswählen 5 HTML-Seite
Abb. A-5: MVC in einer Web-Anwendung (Bibliothekskatalog): Controller steuert, Model liefert Daten, View stellt dar

Vorteile von MVC: Darstellung lässt sich ändern oder ergänzen (z. B. zusätzliche Smartphone-Ansicht), ohne Geschäftslogik anzufassen; mehrere Views für dasselbe Model; Logik ist ohne Oberfläche testbar; Designer und Entwickler können parallel arbeiten. Im klassischen Desktop-MVC benachrichtigt das Model die View über Änderungen (Beobachter-Muster); in Web-Frameworks (Spring MVC, ASP.NET Core MVC, Laravel) übergibt der Controller die Daten an die View. Verwandte Muster: MVP, MVVM (z. B. bei Android, WPF, Angular).

Merke: MVC und 3 Schichten sind kein WiderspruchDie 3-Schichten-Architektur gliedert das ganze System (Oberfläche – Logik – Daten, oft auf verschiedene Rechner verteilt). MVC ist ein Muster für die Struktur einer Anwendung mit Oberfläche. Beides wird kombiniert: View und Controller gehören zur Präsentationsschicht; das „Model“ entspricht der Logikschicht samt Datenzugriff auf die Datenhaltungsschicht.

Monolith und Microservices

MonolithMicroservices
Aufbaueine Anwendung, ein Deployment (intern ggf. in Module/Schichten gegliedert)viele kleine, eigenständige Dienste je Fachbereich (z. B. Bestellung, Zahlung, Versand), jeder mit eigener Datenhaltung; Kommunikation über das Netz (REST, Messaging)
Vorteileeinfach zu entwickeln, testen, deployen und debuggen; keine Netzwerkkommunikation zwischen Teilen; Transaktionen einfach; ideal für kleine Teams und den StartDienste unabhängig deploy- und skalierbar; Ausfall eines Dienstes legt nicht alles lahm; Teams arbeiten unabhängig; Technologie je Dienst wählbar
Nachteilewird groß und unübersichtlich; jede Änderung erfordert neues Deployment des Ganzen; nur als Ganzes skalierbar; Technologiewechsel schwerhohe Komplexität: verteiltes System (Netzwerkfehler, Latenz), Datenkonsistenz über Dienste hinweg, aufwendiges Monitoring, Tests und Betrieb (Container, Orchestrierung); lohnt sich erst bei großen Systemen/Teams

Ein guter Mittelweg ist der modulare Monolith: ein Deployment, intern aber streng in fachliche Module getrennt – bei Bedarf lassen sich einzelne Module später als Microservice herauslösen.

So gehst du vor: Architektur aus einem Szenario ableiten und skizzieren

  1. Benutzergruppen und Endgeräte sammeln → Clients in der Präsentationsschicht (Browser, App, Kassen-Terminal).
  2. Fachliche Funktionen sammeln → Dienste/Komponenten der Logikschicht (meist ein Anwendungsserver mit REST-API).
  3. Daten sammeln → Datenbank(en) in der Datenhaltungsschicht; lokale Datenhaltung auf Clients (Offline) gesondert zeigen.
  4. Externe Systeme ergänzen (Zahlungsdienst, Kartendienst, ERP) – meist von der Logikschicht angesprochen.
  5. Verbindungen beschriften: Protokoll und Format (HTTPS/REST mit JSON, SQL, Datei-Export XML/CSV).
  6. Schichten als Bänder oder Rahmen kennzeichnen und eine kurze Legende ergänzen.
Typische FallenPfeil vom Browser direkt zur Datenbank. · Geschäftsregeln in der Oberfläche (z. B. Preisberechnung nur in JavaScript – leicht zu manipulieren; Prüfungen immer auch auf dem Server). · Das Model bei MVC nur als „Datenbank“ beschreiben – es enthält auch die Geschäftslogik. · Microservices als Allheilmittel empfehlen, obwohl das Team klein ist.
So wird es in der Prüfung gefragtW22 T1 A2a (6 P): Beschreiben, wie die 3-Schichten-Architektur bei einer Webanwendung aussieht und wie die Komponenten zusammenarbeiten. Erwartet: die drei Schichten mit je einer Aufgabe und typischer Technik (je ca. 1 P) sowie der Ablauf einer Anfrage durch die Schichten und zurück (ca. 3 P). Eine Skizze ist hilfreich, ersetzt aber nicht die Beschreibung. Ebenso denkbar: Architektur für das Szenario skizzieren, Thin vs. Fat Client entscheiden, MVC-Rollen zuordnen.

WZ-04 · Compiler vs. Interpreter Sonstige

Vorkommen: 1/9 · Prüfung: W21 T1 A1a (6 P: aa) je eine Programmiersprache für Compiler- und Interpretersprachen nennen, ab) Unterschied beschreiben, ac) je einen Vor- und Nachteil eines Interpreters gegenüber einem Compiler nennen – je 2 P)

Ein Prozessor versteht nur Maschinencode (Befehle seines Befehlssatzes, z. B. x86-64 oder ARM). Programme in Hochsprachen müssen deshalb übersetzt werden. Dafür gibt es zwei Grundprinzipien – und Mischformen.

Kompiliert C, C++, Go, Rust Quellcode.c Compiler Objektcode.o / .obj Linker ausführbareDatei (.exe) CPU Bibliotheken einmal, vor der Ausführung Interpretiert Python, PHP, JavaScript Quellcode.py Interpreter Anweisung lesen → übersetzen → ausführen → nächste Anweisung CPU bei jeder Ausführung, zur Laufzeit Bytecode + VM Java, Kotlin, C# Quellcode.java Compiler Bytecodeplattformneutral Virtuelle Maschine(Interpreter + JIT-Compiler) CPU vorab zur Laufzeit, auf jeder Plattform mit VM
Abb. A-6: Drei Wege vom Quellcode zur Ausführung (blau, fett umrandet = Programm/Werkzeug, weiß = Datei)
MerkmalCompilerInterpreter
Zeitpunkteinmal vor der Ausführung (Übersetzungszeit)bei jeder Ausführung (Laufzeit)
Ergebnisausführbare Datei in Maschinencodekeine Datei, direkte Ausführung
Geschwindigkeitschnelle Ausführung, Optimierung beim Übersetzenlangsamer, da während der Ausführung übersetzt wird
FehlererkennungSyntax- und Typfehler vor dem Start für das ganze ProgrammFehler erst, wenn die Zeile ausgeführt wird (ggf. erst nach Wochen in einem selten genutzten Zweig)
Entwicklungnach jeder Änderung neu übersetzenschneller Test-Zyklus: ändern und sofort ausführen, interaktive Konsole (REPL)
Plattformausführbare Datei ist an Betriebssystem und Prozessor gebunden → je Plattform eigene ÜbersetzungQuellcode plattformunabhängig, sofern ein Interpreter für die Plattform existiert
Weitergabenur die ausführbare Datei, Quellcode bleibt geschützt; Zielrechner braucht keinen CompilerQuellcode wird weitergegeben (einsehbar); Interpreter muss auf dem Zielrechner installiert sein

Mischformen: Bytecode, virtuelle Maschine und JIT

Java wird vom Compiler javac nicht in Maschinencode, sondern in plattformunabhängigen Bytecode (.class-Dateien, gebündelt als .jar) übersetzt. Diesen führt die Java Virtual Machine (JVM) aus: Sie interpretiert den Bytecode zunächst und übersetzt häufig genutzte Programmteile („Hotspots“) zur Laufzeit mit dem Just-in-time-Compiler (JIT) in optimierten Maschinencode. Ergebnis: „Write once, run anywhere“ (dieselbe .jar läuft auf jedem System mit passender JVM) bei fast nativer Geschwindigkeit. Genauso arbeiten C# und andere .NET-Sprachen (Zwischencode IL, Laufzeitumgebung CLR) und Kotlin. Auch Python erzeugt intern Bytecode (.pyc), gilt aber als interpretierte Sprache; JavaScript-Engines im Browser kombinieren Interpreter und JIT.

Ein Transpiler (Source-to-Source-Compiler) übersetzt eine Hochsprache in eine andere, z. B. TypeScript → JavaScript (tsc). Vorteil: Die strengere Ausgangssprache (statische Typen) findet Fehler beim Übersetzen; ausgeführt wird das erzeugte JavaScript.

Merke„Kompiliert“ oder „interpretiert“ ist streng genommen eine Eigenschaft der Implementierung, nicht der Sprache. In der Prüfung zählen die typischen Zuordnungen: Compiler: C, C++, Go, Rust, Pascal · Interpreter: Python, PHP, JavaScript, Ruby, Shell/PowerShell · Bytecode + VM: Java, C#, Kotlin. Nennt man Java als Compilersprache, sollte man den Bytecode erwähnen.

Der Übersetzungsvorgang im Detail

  1. Präprozessor (C/C++): bindet Header-Dateien ein (#include), ersetzt Makros.
  2. Compiler:
    • lexikalische Analyse: Quelltext in Tokens zerlegen (Schlüsselwörter, Bezeichner, Zahlen, Operatoren),
    • Syntaxanalyse (Parser): prüft die Grammatik und baut einen Syntaxbaum → Syntaxfehler,
    • semantische Analyse: prüft Bedeutung, z. B. Typen, deklarierte Variablen → Typfehler,
    • Optimierung und Codeerzeugung: Objektcode (Maschinencode mit noch offenen Verweisen).
  3. Linker (Binder): verbindet die Objektdateien des Programms mit den benötigten Bibliotheken, löst Verweise auf Funktionen in anderen Dateien auf und erzeugt die ausführbare Datei.
  4. Loader (Betriebssystem): lädt die Datei beim Start in den Speicher.
Statisches LinkenDynamisches Linken
Wie?Bibliothekscode wird in die ausführbare Datei kopiertBibliothek (.dll, .so) wird erst beim Start/zur Laufzeit geladen
Vorteileigenständige Datei, keine fehlenden Bibliotheken auf dem Zielsystemkleinere Programme, Bibliothek von mehreren Programmen gemeinsam genutzt, Sicherheitsupdate der Bibliothek wirkt ohne Neukompilierung
Nachteilgrößere Datei; Fehler in der Bibliothek erfordern NeukompilierungBibliothek muss in passender Version vorhanden sein („DLL-Hölle“)

Fehlerarten

FehlerartBeschreibungBeispiel (Java)Erkannt …
SyntaxfehlerVerstoß gegen die Grammatik der Spracheint x = 5 (Semikolon fehlt)vom Compiler; beim Interpreter beim Einlesen
Semantischer Fehler / Typfehlersyntaktisch korrekt, aber unzulässig (falscher Typ, unbekannte Variable)boolean ok = "ja";bei statischer Typisierung vom Compiler; bei dynamischer Typisierung (Python) erst zur Laufzeit
LaufzeitfehlerProgramm stürzt bei der Ausführung ab bzw. wirft eine Exceptionint q = 10 / 0; → ArithmeticException; null-Zugriff → NullPointerExceptionerst zur Laufzeit, nur wenn die Stelle erreicht wird
Logischer FehlerProgramm läuft, liefert aber falsche Ergebnissei < n - 1 statt i < n (letztes Element fehlt)gar nicht automatisch – nur durch Tests, Debugging, Code-Review

Werkzeuge der Entwicklungsumgebung (IDE)

Eine IDE (Integrated Development Environment, z. B. IntelliJ IDEA, Eclipse, Visual Studio, Android Studio; VS Code als erweiterbarer Editor) vereint die Werkzeuge der Entwicklung unter einer Oberfläche: Editor mit Syntaxhervorhebung und Autovervollständigung, Fehleranzeige schon beim Tippen, Compiler/Build-Integration (Maven, Gradle), Debugger, Test-Runner (JUnit), Refactoring-Funktionen (z. B. Methode umbenennen in allen Dateien), Code-Formatierung, Git-Integration, Navigation (zur Definition springen, Aufrufe finden), Profiler.

Mit dem Debugger wird ein Programm kontrolliert ausgeführt, um logische Fehler zu finden:

Typische Fallen„Ein Interpreter erzeugt eine Datei“ – nein. · „Kompilierte Programme laufen überall“ – nein, nur auf der Zielplattform; plattformunabhängig ist der Quellcode bzw. der Bytecode. · „Interpretierte Sprachen haben keine Fehlermeldungen“ – sie melden sie nur später. · Beim Vorteil/Nachteil immer die Richtung beachten: gefragt ist meist „Interpreter gegenüber Compiler“.
So wird es in der Prüfung gefragtW21 T1 A1a (6 P): Bei der Vorbereitung eines Projekts sollen Compiler- und Interpretersprachen verglichen werden: aa) je eine Sprache nennen, ab) Unterschied beschreiben (Zeitpunkt der Übersetzung, ausführbare Datei ja/nein), ac) je einen Vor- und Nachteil des Interpreters (z. B. plattformunabhängig/schneller Test vs. langsamere Ausführung/Fehler erst zur Laufzeit). Vertiefungen wie Bytecode, JIT, Linker oder Fehlerarten sind naheliegende Varianten.

WZ-05 · Klassenbibliotheken, Frameworks & Dokumentation Sonstige

Vorkommen: 1/9 · Prüfung: W21 T1 A1b (10 P: ba) einen Vorteil und einen Nachteil des Einsatzes einer umfassenden Klassenbibliothek beschreiben (4 P), bb) drei Aspekte beschreiben, die bei der Dokumentation einer eigenen Erweiterung der Bibliothek zu beachten sind (6 P))

Eine Klassenbibliothek ist eine Sammlung wiederverwendbarer, bereits getesteter Klassen und Methoden für wiederkehrende Aufgaben, z. B. die Java-Standardbibliothek (java.util, java.time), Bibliotheken für JSON, PDF-Erzeugung, Logging oder Diagramme. Die öffentlich nutzbaren Klassen und Methoden bilden die API (Application Programming Interface) der Bibliothek – nur auf sie darf sich der eigene Code verlassen; interne Details können sich ändern.

Bibliothek oder Framework?

Bibliothek Dein Programm steuert den Ablauf CSV lesen PDF erzeugen Datum rechnen ruft auf Bibliotheksfunktionen (fremder Code) Framework Framework (fremder Code) steuert den Ablauf, z. B. HTTP-Anfrage annehmen Dein Code:Controller-Methode Dein Code:Test-Methode ruft auf
Abb. A-7: Bibliothek – dein Code ruft fremden Code auf. Framework – der fremde Code ruft deinen Code auf (Inversion of Control)

Ein Framework ist ein Rahmengerüst, das den Ablauf und die Struktur der Anwendung vorgibt. Der Entwickler ergänzt nur fachlichen Code an vorgesehenen Stellen (Klassen ableiten, Interfaces implementieren, Annotationen wie @GetMapping oder @Test), und das Framework ruft diesen Code zur richtigen Zeit auf. Diese Umkehr der Steuerung heißt Inversion of Control („Hollywood-Prinzip: Don’t call us, we call you“). Beispiele: Spring/Spring Boot, Jakarta EE, ASP.NET Core, Angular, Django, Laravel, Android-SDK, JUnit.

Vor- und Nachteile (umfangreicher) Klassenbibliotheken

VorteileNachteile
  • Zeit- und Kostenersparnis: Standardaufgaben müssen nicht selbst programmiert werden; das Team konzentriert sich auf die Fachlogik.
  • Erprobte Qualität: von vielen Nutzern getestet, weniger Fehler als eine Eigenentwicklung, Sonderfälle bedacht (z. B. Schaltjahre, Zeitzonen).
  • Wartung durch Dritte: Fehlerbehebungen und Sicherheitsupdates kommen vom Hersteller bzw. der Community.
  • Standardisierung: bekannte API, Dokumentation, Beispiele, neue Teammitglieder kennen sie oft schon.
  • Abhängigkeit: von Weiterentwicklung, Updates, Lizenz und Fortbestand des Projekts bzw. Herstellers.
  • Einarbeitungsaufwand in eine umfangreiche API.
  • Overhead: nur ein kleiner Teil wird genutzt, die Anwendung wird größer und ggf. langsamer.
  • Sicherheitslücken im Fremdcode betreffen die eigene Anwendung (z. B. Log4Shell in Log4j 2, Dezember 2021).
  • Begrenzte Anpassbarkeit, Versionskonflikte zwischen Bibliotheken, ggf. Lizenzkosten oder -pflichten.

Paketmanager und Abhängigkeiten

Paketmanager bzw. Build-Tools mit Abhängigkeitsverwaltung (Maven/Gradle für Java, npm für JavaScript, pip für Python, NuGet für .NET) erledigen: Bibliotheken in der angegebenen Version aus einem zentralen Repository (Maven Central, npm-Registry, PyPI) herunterladen, transitive Abhängigkeiten (Abhängigkeiten der Abhängigkeiten) automatisch mitladen, Versionskonflikte auflösen, Gültigkeitsbereiche trennen (z. B. Testbibliotheken nur zum Testen) und den Stand reproduzierbar machen (Lock-Datei wie package-lock.json hält die exakt verwendeten Versionen fest). Abhängigkeiten werden deklariert statt als JAR-Dateien ins Repository kopiert.

Beispiel package.json (npm)

"dependencies": {
  "express": "^4.19.2",
  "dayjs":   "~1.11.10"
},
"devDependencies": {
  "jest": "^29.7.0"
}

^4.19.2: kompatible Updates erlaubt, also ≥ 4.19.2 und < 5.0.0.
~1.11.10: nur Patch-Updates, also ≥ 1.11.10 und < 1.12.0.
devDependencies: nur für Entwicklung/Test, nicht im ausgelieferten Produkt.

Semantische Versionierung (SemVer)

Versionsnummern der Form MAJOR.MINOR.PATCH (z. B. 4.19.2) mit festen Regeln:

Teil erhöhtBedeutungFür Nutzer der Bibliothek
PATCH (4.19.3)abwärtskompatible Fehlerbehebunggefahrlos aktualisieren, keine Codeänderung
MINOR (4.20.0)neue Funktionen, abwärtskompatibel; auch: Funktionen als veraltet (deprecated) markiertohne Codeänderung möglich; Deprecation-Warnungen beachten
MAJOR (5.0.0)inkompatible Änderungen der API (Breaking Changes): Methoden entfernt/umbenannt, Verhalten geändert, neue MindestvoraussetzungenÄnderungen am eigenen Code wahrscheinlich; Migrationshinweise lesen, gründlich testen

Versionen 0.y.z gelten als Anfangsentwicklung – dort kann sich alles jederzeit ändern. Vorabversionen werden angehängt: 2.0.0-beta.1. Übliche Praxis: Veraltetes erst in einer MINOR-Version als deprecated markieren und frühestens in der nächsten MAJOR-Version entfernen.

Risiken durch Abhängigkeiten und Gegenmaßnahmen

RisikoGegenmaßnahme
bekannte Sicherheitslücke in einer (auch transitiven) Abhängigkeitautomatischer Schwachstellen-Scan in der Pipeline (z. B. OWASP Dependency-Check, npm audit, Dependabot/Renovate), zügig aktualisieren, SBOM führen (→ WZ-06)
Projekt wird nicht mehr gepflegt / verschwindet (npm „left-pad“, 2016)vor dem Einsatz Aktivität, Verbreitung, Maintainer prüfen; eigenes Artefakt-Repository als Zwischenspeicher (Nexus, Artifactory)
Breaking Change beim UpdateVersionen festlegen bzw. Lock-Datei, SemVer beachten, Release Notes lesen, automatisierte Tests vor dem Update
Schadcode in Paketen (Lieferkettenangriff, Tippfehler-Pakete)nur vertrauenswürdige Quellen, Prüfsummen/Signaturen, wenige und bekannte Abhängigkeiten
Lizenzpflichten (z. B. Copyleft)Lizenz vor dem Einsatz prüfen (→ WZ-06)

Eine eigene Bibliothekserweiterung dokumentieren

Wer eine Bibliothek um eigene Klassen erweitert, muss so dokumentieren, dass andere Entwickler (Zielgruppe!) die Erweiterung ohne Rückfrage korrekt einsetzen und später warten können. Worauf zu achten ist:

Beispiel: Javadoc-Kommentar

/**
 * Berechnet den Bruttobetrag aus einem Nettobetrag.
 * Das Ergebnis wird kaufmännisch auf zwei Nachkommastellen gerundet.
 *
 * <p>Beispiel: {@code berechneBrutto(new BigDecimal("100.00"), Steuersatz.ERMAESSIGT)}
 * liefert {@code 107.00}.</p>
 *
 * @param netto Nettobetrag in Euro; nicht {@code null} und nicht negativ
 * @param satz  anzuwendender Steuersatz; nicht {@code null}
 * @return Bruttobetrag in Euro mit zwei Nachkommastellen
 * @throws IllegalArgumentException wenn {@code netto} negativ ist
 * @since 1.4
 * @see Steuersatz
 */
public static BigDecimal berechneBrutto(BigDecimal netto, Steuersatz satz) { … }

Wichtige Javadoc-Tags: @param, @return, @throws, @since, @deprecated, @see, {@code …}, {@link …}. Daraus erzeugt das Werkzeug javadoc eine HTML-Referenz (entsprechend: XML-Kommentare in C#, Docstrings in Python, JSDoc).

Erweitern statt ändern: Eine Bibliothek erweitert man über ihre vorgesehenen Erweiterungspunkte – eigene Unterklassen, Implementierung von Interfaces, Komposition/Wrapper (eigene Klasse benutzt die Bibliotheksklasse) – und nicht durch Ändern ihres Quellcodes. Sonst gehen die eigenen Änderungen beim nächsten Update der Bibliothek verloren oder Updates (auch Sicherheitsupdates) werden praktisch unmöglich (Open-Closed-Prinzip: offen für Erweiterung, geschlossen für Änderung).

Typische FallenBibliothek und Framework verwechseln (Kriterium ist, wer wen aufruft). · Bei „Vor- und Nachteil beschreiben“ nur ein Stichwort nennen – „beschreiben“ verlangt einen ganzen Satz mit Begründung. · Dokumentation nur als „Kommentare im Code“ beschreiben – gefragt sind Inhalte (Parameter, Rückgabe, Ausnahmen, Version, Beispiele) und Zielgruppe.
So wird es in der Prüfung gefragtW21 T1 A1b (10 P): ba) Für die gewählte Sprache gibt es eine umfassende Klassenbibliothek – einen Vorteil und einen Nachteil beschreiben (je 2 P). bb) Die Bibliothek soll um eigene Klassen erweitert werden – drei Aspekte, die in der Dokumentation der Erweiterung zu beachten sind (je 2 P), z. B. Schnittstellen vollständig beschreiben, Versionierung/Kompatibilität, Beispiele, Verständlichkeit für die Zielgruppe, einheitliche Form (Javadoc).

WZ-06 · Open Source & Lizenzen Sonstige

Vorkommen: 1/9 · Prüfung: W22 T1 A2c (9 P: ca) Begriff Open Source erläutern (3 P), cb) begründen, ob jede Open-Source-Bibliothek ohne Einschränkungen eingesetzt werden darf (2 P), cc) einen Vor- und einen Nachteil von Open-Source-Bibliotheken beschreiben (4 P))

Was ist Open Source?

Open-Source-Software ist Software, deren Quellcode öffentlich zugänglich ist und deren Lizenz jedem erlaubt, sie für beliebige Zwecke zu nutzen, den Code zu untersuchen, zu verändern und – verändert oder unverändert – weiterzugeben. Welche Lizenzen das erfüllen, legt die Open Source Initiative (OSI) anhand der Open Source Definition fest. Deren zehn Kriterien zusammengefasst:

Die Free Software Foundation spricht von Freier Software mit vier Freiheiten (benutzen, untersuchen, weitergeben, verbessern). Gemeint sind praktisch dieselben Lizenzen, die Begründung ist eher ethisch; zusammengefasst oft „FOSS“.

MerkeOpen Source heißt nicht „rechtefrei“: Das Urheberrecht bleibt bei den Autoren. Nutzen darf man die Software nur, weil – und soweit – die Lizenz es erlaubt, und nur, wenn man ihre Bedingungen erfüllt. Software ohne Lizenzangabe (z. B. Code in einem öffentlichen Repository ohne LICENSE-Datei) darf man daher nicht einfach verwenden: Alle Rechte liegen beim Urheber.

Abgrenzung zu anderen Software-Arten

ArtBeschreibungBeispiel
Open SourceQuellcode offen; nutzen, ändern, weitergeben erlaubt (unter Lizenzbedingungen); meist kostenlos, kommerzielle Nutzung erlaubtLinux, LibreOffice, Firefox, PostgreSQL
Freewarekostenlos nutzbar, aber Quellcode nicht verfügbar, Veränderung verboten; Nutzung oft eingeschränkt (z. B. nur privat)viele kostenlose Tools und Viewer
Sharewaredarf zum Testen kostenlos genutzt und weitergegeben werden; nach Testzeitraum oder für den vollen Funktionsumfang kostenpflichtig; Quellcode nicht verfügbarTestversionen von Packprogrammen, Tools
Proprietär / kommerziellHersteller behält alle Rechte, Nutzung nur gegen Lizenz (Kauf, Abo), Quellcode geheim, Weitergabe verbotenMicrosoft Office, Adobe Photoshop
„Source available“Quellcode einsehbar, aber Lizenz schränkt Nutzung ein (z. B. kein konkurrierendes Cloud-Angebot) – keine Open Source im Sinne der OSISSPL, Business Source License (BSL)

Lizenztypen: permissiv und Copyleft

Kern der Unterscheidung ist die Frage, ob die Lizenz auf abgeleitete Werke „vererbt“ wird. Copyleft bedeutet: Wer die Software verändert oder in eigene Software einbaut und weitergibt, muss das Ergebnis unter derselben Lizenz und mit Quellcode weitergeben.

Permissiv MIT, BSD, Apache 2.0 Pflicht: Lizenztext und Copyright-Hinweis mitliefern Eigener Code: beliebige Lizenz, auch proprietär Schwaches Copyleft LGPL, MPL 2.0, EPL 2.0 Änderungen an der Bibliothek selbst unter gleicher Lizenz offenlegen Eigener Code, der sie nur nutzt: beliebige Lizenz Starkes Copyleft GPL-2.0, GPL-3.0 Bei Weitergabe: gesamtes abgeleitetes Werk unter GPL, mit Quellcode Nur interne Nutzung: keine Offenlegungspflicht Netzwerk-Copyleft AGPL-3.0 wie GPL, zusätzlich: Wer das (veränderte) Werk als Netzdienst anbietet, muss den Nutzern den Quellcode anbieten (SaaS) zunehmende Pflichten für den eigenen Code (Reichweite des Copylefts)
Abb. A-8: Spektrum der Open-Source-Lizenzen
LizenzTypWichtigste BedingungenBekannte Beispiele
MITpermissivCopyright- und Lizenzhinweis in allen Kopien beibehalten; Haftungsausschluss. Sonst praktisch keine Pflichten.React, jQuery
BSD (2-/3-Clause)permissivwie MIT; 3-Clause zusätzlich: Namen der Autoren nicht ohne Erlaubnis für Werbung nutzen.Programmiersprache Go
Apache 2.0permissivLizenztext beilegen, NOTICE-Datei weitergeben, Änderungen kennzeichnen; enthält ausdrückliche Patentlizenz.Spring Framework, Kotlin, Android (AOSP)
LGPL (2.1/3.0)schwaches CopyleftBibliothek darf von proprietärer Software genutzt (gelinkt) werden. Änderungen an der Bibliothek selbst müssen unter LGPL offengelegt werden; Nutzer müssen die Bibliothek gegen eine andere Version austauschen können (üblich: dynamisches Linken); Lizenztext und Bezugsquelle des Bibliotheks-Quellcodes mitliefern.Qt (auch GPL/kommerziell), FFmpeg (Grundkonfiguration)
MPL 2.0schwaches Copyleft (dateibezogen)geänderte MPL-Dateien bleiben MPL und müssen offengelegt werden; eigene neue Dateien frei lizenzierbar.Firefox
GPL (2.0/3.0)starkes CopyleftWer das Programm oder ein darauf basierendes Werk (auch durch Einbinden einer GPL-Bibliothek) weitergibt, muss es als Ganzes unter GPL lizenzieren und den vollständigen Quellcode mitliefern oder anbieten. Verkaufen ist erlaubt, zusätzliche Einschränkungen nicht.Linux-Kernel (GPL-2.0), WordPress, MySQL Community
AGPL-3.0Netzwerk-Copyleftwie GPL-3.0; zusätzlich gilt das Bereitstellen eines (veränderten bzw. darauf aufbauenden) Programms über ein Netzwerk als Auslöser: Den Nutzern des Dienstes muss der Quellcode angeboten werden. Schließt die „SaaS-Lücke“ der GPL.Nextcloud, Grafana; iText (AGPL oder kommerziell)

Wann greift das Copyleft? – Weitergabe ist der Auslöser

Dual Licensing: Manche Hersteller bieten dieselbe Software unter einer Copyleft-Lizenz (GPL/AGPL) und gegen Gebühr unter einer kommerziellen Lizenz an. Wer den Quellcode nicht offenlegen will, kauft die kommerzielle Lizenz.

Lizenzkompatibilität: Code unter permissiver Lizenz darf in GPL-Projekte übernommen werden (MIT → GPL: ja; Apache 2.0 → GPL-3.0: ja, aber nicht in „GPL-2.0-only“-Projekte). Umgekehrt nicht: GPL-Code darf nicht in ein MIT- oder proprietäres Projekt kopiert werden, weil die Lizenz des Ergebnisses dann GPL sein muss. GPL-2.0-only und GPL-3.0 sind untereinander nicht kompatibel („or later“-Klausel beachten).

Vor- und Nachteile von Open-Source-Bibliotheken

VorteileNachteile
  • keine Lizenzkosten
  • Quellcode einsehbar: Funktionsweise und Sicherheit prüfbar, Fehler selbst analysierbar, anpassbar
  • große Community: viele Nutzer finden Fehler, schnelle Fehlerbehebung bei aktiven Projekten, Wissen im Netz
  • keine Abhängigkeit von einem Hersteller: bei Einstellung kann das Projekt weitergeführt (geforkt) werden
  • offene Standards und Formate
  • kein garantierter Support, keine Gewährleistung/Haftung (Haftungsausschluss in der Lizenz); Support nur über Community oder kostenpflichtige Drittanbieter
  • Lizenzpflichten müssen geprüft und eingehalten werden (Copyleft kann eigenen Code betreffen) – Aufwand für Compliance
  • Fortbestand unsicher (Projekt wird eingestellt, Lizenzwechsel)
  • Sicherheitslücken sind öffentlich sichtbar; Updates muss man selbst einspielen
  • schwankende Qualität und Dokumentation

So gehst du vor: Darf diese Bibliothek eingesetzt werden?

  1. Lizenz ermitteln (LICENSE-Datei, Paketangaben) – keine Lizenz = nicht verwenden bzw. Erlaubnis einholen.
  2. Einsatz klären: Wird die Software weitergegeben (App, Download, Auslieferung an Kunden), nur intern genutzt oder als Netzdienst (SaaS) betrieben? Wird die Bibliothek verändert?
  3. Lizenztyp prüfen: permissiv → Hinweise beilegen; schwaches Copyleft → Bibliothek unverändert und austauschbar einbinden, Änderungen offenlegen; GPL bei Weitergabe bzw. AGPL bei SaaS → mit proprietärem Geschäftsmodell nicht vereinbar → Alternative oder kommerzielle Lizenz.
  4. Transitive Abhängigkeiten und kommerzielle Lizenzbedingungen (Nutzerzahl, Weitergabe) ebenso prüfen.
  5. Ergebnis dokumentieren (Lizenzliste/SBOM, Third-Party-Notices in der Anwendung); Prüfung in der Pipeline automatisieren.

Software Bill of Materials (SBOM)

Eine SBOM („Stückliste“ der Software) ist eine maschinenlesbare, vollständige Liste aller Komponenten eines Softwareprodukts – einschließlich transitiver Abhängigkeiten – mit Name, Version, Hersteller/Herkunft, Lizenz und Prüfsumme. Gängige Formate sind SPDX und CycloneDX; Build-Werkzeuge erzeugen sie automatisch in der Pipeline. Nutzen: Wird eine Sicherheitslücke in einer Bibliothek bekannt, sieht man sofort, welche Produkte und Versionen betroffen sind; Lizenzprüfung und Weitergabe von Lizenzinformationen an Kunden; Transparenz in der Lieferkette. Der EU Cyber Resilience Act (Verordnung (EU) 2024/2847) verpflichtet Hersteller von Produkten mit digitalen Elementen u. a. dazu, die enthaltenen Komponenten und Schwachstellen zu dokumentieren und dafür eine SBOM in einem gängigen, maschinenlesbaren Format zu erstellen. Die Meldepflichten für aktiv ausgenutzte Schwachstellen gelten seit 11. September 2026, die übrigen Pflichten ab 11. Dezember 2027.

Typische Fallen„Open Source = Freeware“ – falsch: Freeware ist kostenlos, aber ohne Quellcode und ohne Änderungsrecht. · „GPL verbietet kommerzielle Nutzung“ – falsch: Verkauf ist erlaubt, nur der Quellcode muss bei Weitergabe mit. · „Jede Open-Source-Bibliothek darf ich uneingeschränkt nutzen“ – falsch: Die Lizenzbedingungen müssen eingehalten werden. · „Auf dem Server ist GPL immer unproblematisch“ – nicht bei der AGPL.
So wird es in der Prüfung gefragtW22 T1 A2c (9 P): In einer Besprechung wurde diskutiert, ob es bei Open-Source-Bibliotheken Einschränkungen gibt. ca) Begriff Open Source erläutern (offener Quellcode, Nutzung/Veränderung/Weitergabe durch Lizenz erlaubt, 3 P). cb) Begründen, ob jede Open-Source-Bibliothek ohne Einschränkungen eingesetzt werden darf – erwartete Antwort: nein, die Lizenzbedingungen (z. B. Copyleft der GPL: Offenlegung des eigenen Quellcodes bei Weitergabe) sind zu beachten (2 P). cc) je einen Vor- und Nachteil beschreiben (je 2 P).

B · Belegsatz

Enthält nur, was dir auch die IHK beilegen würde: die Ausgangssituation und die Anlagen, auf die sich die Aufgaben beziehen. Notationshilfen legt die IHK für diese Themen nicht bei (die Belegsätze W21 und W22 enthielten nur UML, Pseudocode/Struktogramm und SQL). Alle Firmen, Personen und Bibliotheken sind frei erfunden; Lizenzen, Werkzeuge und Befehle sind real.

Anlage 1 · Ausgangssituation

Die Aufgaben dieses Blocks beziehen sich auf die folgende Ausgangssituation:

Die Lindner Digital GmbH in Kassel ist ein Softwarehaus mit 45 Mitarbeitenden. Sie sind Auszubildende/r zum Fachinformatiker/zur Fachinformatikerin Anwendungsentwicklung im Team „Field Service“ (acht Entwicklerinnen und Entwickler, eine Testerin, ein Administrator; Teamleiter Markus Feld).

Das Team entwickelt für die Haustechnik Albers GmbH & Co. KG (Heizung, Sanitär, Lüftung; sechs Niederlassungen in Nordhessen, 140 Monteurinnen und Monteure) die Software „MonteurPlus“:

Lindner Digital betreibt den Server im eigenen Rechenzentrum; Albers nutzt MonteurPlus über das Internet. Ab 2027 will Lindner Digital MonteurPlus auch anderen Handwerksbetrieben als Mietsoftware (Software as a Service) anbieten; die Monteur-App wird dann über den Google Play Store verteilt. Quellcode und Rechte an MonteurPlus sollen bei Lindner Digital bleiben (proprietäre Software).

Bisherige Arbeitsweise: Der Quellcode lag bisher auf dem Netzlaufwerk \\fs01\projekte\monteurplus. Seit September 2026 liegt der Server-Code testweise in einem Git-Repository auf dem GitLab-Server von Lindner Digital (Anlage 3). Erstellung und Auslieferung neuer Versionen erledigt der Administrator von Hand (Anlage 4).

Anlage 2 · E-Mail des Teamleiters zur Versionsverwaltung

Von: Markus Feld · An: Team Field Service · Datum: 28.09.2026
Betreff: Ab 1. Oktober: alle mit Git

Hallo zusammen,

nach dem Ärger letzte Woche (Lukas hat beim Kopieren auf das Netzlaufwerk Sarahs Änderungen am AuftragService überschrieben – zwei Tage Arbeit waren weg) stellen wir ab 1. Oktober komplett auf Git um. Damit es einfach bleibt, gelten folgende Regeln:

  1. Alle arbeiten ausschließlich mit Git und unserem GitLab-Server. Das Netzlaufwerk wird schreibgeschützt.
  2. Alle arbeiten direkt auf dem Branch main und pushen, sobald etwas fertig ist. Branches brauchen wir bei acht Leuten nicht.
  3. Code-Reviews kosten zu viel Zeit, die lassen wir weg. Frau Kaya testet ja vor jedem Release.
  4. Damit niemand etwas verliert, committen wir einfach alles, was im Projektordner liegt – auch den Ordner target/, die IDE-Einstellungen (.idea/) und die application-local.properties mit den Zugangsdaten zur Testdatenbank.
  5. Commit-Nachrichten sind freiwillig, jeder schreibt, was er will.
  6. Releases markieren wir wie bisher: Projektordner als ZIP auf dem Netzlaufwerk ablegen, z. B. monteurplus_v1.3_final2.zip.

Viele Grüße
Markus

Anlage 3 · Git-Repository des Servers (Stand 05.10.2026)

$ git log --oneline --graph --all
* 7d2e4b1 (HEAD -> main, origin/main) MP-118: Auftragsliste nach Termin sortieren
* 3c9a0f5 MP-112: REST-Endpunkt GET /auftraege/{id} ergänzt
* e58b3d7 asdf
* d0c4417 Zwischenstand Freitag
* a41c9e2 fix
* 19be7d0 Projektgerüst angelegt

$ git show --stat a41c9e2
commit a41c9e2b7f3d8e1c0a59b6d2f4e7c8a1b3d5e6f7
Author: Lukas Brandt <l.brandt@lindner-digital.example>
Date:   Tue Sep 15 16:42:10 2026 +0200

    fix

 src/main/java/de/lindner/monteurplus/auftrag/AuftragService.java | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

Inhalt der Änderung a41c9e2 laut Ticket MP-109: Beim Speichern eines Auftrags ohne Kundenadresse trat eine NullPointerException auf. Jetzt prüft der AuftragService die Adresse und meldet „Kundenadresse fehlt“.

Anlage 4 · Bisherige Bereitstellung des Servers und Störungsprotokoll

Alle zwei Wochen freitags ab 18 Uhr stellt der Administrator Herr Okafor eine neue Version bereit:

  1. Er kopiert den aktuellen Stand vom Netzlaufwerk auf seinen Rechner und erstellt die JAR-Datei mit seiner Entwicklungsumgebung.
  2. Die automatischen Tests führt er aus, „wenn noch Zeit ist“.
  3. Er lädt die JAR-Datei per SFTP auf den Produktivserver, stoppt den Dienst, ersetzt die Datei, passt bei Bedarf Konfigurationsdateien von Hand an und startet den Dienst neu.
  4. Datenbankänderungen spielt er mit SQL-Skripten ein, die ihm die Entwickler per E-Mail schicken.
Störungsprotokoll MonteurPlus (Auszug)
DatumStörungUrsache (laut Nachbetrachtung)
05.06.2026Server startet nach dem Update nicht (UnsupportedClassVersionError)auf dem Rechner des Administrators war Java 21 installiert, auf dem Produktivserver Java 17
19.06.2026Auftragsliste in der App bleibt leerSQL-Skript für eine neue Spalte wurde nicht eingespielt
03.07.2026Fotos können nicht gespeichert werdenein unfertiger, ungetesteter Stand eines Entwicklers lag mit auf dem Netzlaufwerk und wurde ausgeliefert
17.07.20263 Stunden Ausfall am FreitagabendAdministrator krank; die Vertretung kannte den Ablauf nicht und vergaß, den Dienst neu zu starten

Anlage 5 · Pipeline des Servers (.gitlab-ci.yml, seit Oktober 2026 im Einsatz)

# .gitlab-ci.yml – MonteurPlus Server (Spring Boot, Java 21)
stages:
  - build
  - test
  - analyse
  - package
  - staging
  - production

default:
  image: maven:3.9-eclipse-temurin-21

build:
  stage: build
  script:
    - mvn -B compile

unit-tests:
  stage: test
  script:
    - mvn -B test
  artifacts:
    reports:
      junit: target/surefire-reports/TEST-*.xml

integration-tests:
  stage: test
  services:
    - postgres:16
  variables:
    POSTGRES_DB: monteurplus_test
    POSTGRES_USER: ci
    POSTGRES_PASSWORD: $TEST_DB_PASSWORT    # geschützte CI/CD-Variable
  script:
    - mvn -B verify -P integrationstest

code-analyse:
  stage: analyse
  script:
    - mvn -B compile checkstyle:check spotbugs:check

package:
  stage: package
  image: docker:27
  services:
    - docker:27-dind
  script:
    # Das Dockerfile baut die JAR-Datei und verpackt sie mit Java 21 in ein Image
    - echo "$CI_REGISTRY_PASSWORD" | docker login -u "$CI_REGISTRY_USER" --password-stdin "$CI_REGISTRY"
    - docker build -t "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA" .
    - docker push "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA"
  rules:
    - if: $CI_COMMIT_BRANCH == "main"

deploy-staging:
  stage: staging
  script:
    - ./deploy.sh staging "$CI_COMMIT_SHORT_SHA"
  environment: staging
  rules:
    - if: $CI_COMMIT_BRANCH == "main"

deploy-production:
  stage: production
  script:
    - ./deploy.sh production "$CI_COMMIT_SHORT_SHA"
  environment: production
  rules:
    - if: $CI_COMMIT_BRANCH == "main"
      when: manual
Hinweise zur Syntax von GitLab CI/CD
ElementBedeutung
stagesReihenfolge der Stufen. Alle Jobs einer Stage laufen parallel; die nächste Stage startet erst, wenn alle Jobs der vorherigen Stage erfolgreich waren. Schlägt ein Job fehl, gilt die Pipeline als fehlgeschlagen.
scriptBefehle, die der Job nacheinander ausführt
image, servicesContainer-Image, in dem der Job läuft, bzw. zusätzlich gestartete Container (z. B. Datenbank)
rules: - if: …Job wird nur in die Pipeline aufgenommen, wenn die Bedingung erfüllt ist. Jobs ohne rules laufen bei jedem Push auf jeden Branch.
when: manualJob startet erst, wenn ihn eine berechtigte Person in GitLab per Klick auslöst
allow_failure: trueein Fehlschlag dieses Jobs hält die Pipeline nicht an
$CI_COMMIT_BRANCH, $CI_COMMIT_SHORT_SHAvordefinierte Variablen: Branch der Pipeline, Kurz-ID des Commits
environmentZielumgebung, in GitLab mit Versionshistorie angezeigt

Anlage 6 · Pipeline-Entwurf für die Monteur-App (Kollege Jonas Weber)

# .gitlab-ci.yml – Monteur-App (Android) – Entwurf J. Weber
image: registry.lindner.example/android-build:35

variables:
  KEYSTORE_PASSWORT: "Albers2026!"          # Passwort des App-Signaturschlüssels
  PLAY_STORE_ZUGANG: "pl4y-st0re-7731-mp"   # Zugang zum Play-Store-Konto

stages:
  - build
  - test
  - deploy

build-app:
  stage: build
  script:
    - ./gradlew assembleRelease

unit-tests:
  stage: test
  script:
    - ./gradlew testReleaseUnitTest
  allow_failure: true        # damit die Pipeline nicht so oft rot ist

deploy-playstore:
  stage: deploy
  script:
    - ./gradlew publishReleaseBundle --track production

Die Datei liegt im Repository der Monteur-App, auf das alle 45 Mitarbeitenden Lesezugriff haben. publishReleaseBundle --track production baut das App-Bundle und veröffentlicht es im Google Play Store für alle Nutzer.

Anlage 7 · Architekturbeschreibung MonteurPlus (Entwurf 0.3)

KomponenteBeschreibung
Web-Dispositionläuft im Browser der Disponenten (Windows-PCs). Die Seiten (z. B. Auftragsübersicht) erzeugt der Server mit Spring MVC und HTML-Templates; die Plantafel ist ein TypeScript-Modul im Browser, das Daten über die REST-API lädt und speichert.
Monteur-AppAndroid-App (Kotlin) mit lokaler SQLite-Datenbank für den Offline-Betrieb (Aufträge der Woche, Material, Berichte, Fotos). Sobald eine Verbindung besteht, gleicht die App ihre Daten über die REST-API ab (HTTPS, JSON).
AnwendungsserverSpring-Boot-Anwendung (Java 21) als Container auf einem Linux-Server im Rechenzentrum von Lindner Digital. Enthält: REST-API für App und Plantafel; Web-Controller und Templates der Web-Disposition; Dienste (Services) Auftragsverwaltung, Einsatzplanung, Synchronisation und Berichtserstellung (PDF); Datenzugriffsklassen (Repositories), die per SQL auf die Datenbank zugreifen.
DatenbankserverPostgreSQL 16: Kunden, Wartungsverträge, Aufträge, Monteure, Material, Arbeitsberichte. Nur vom Anwendungsserver erreichbar.
Kartendienst (extern)Geokodierung von Adressen und Berechnung von Fahrzeiten; Zugriff des Servers über eine HTTPS-API (JSON).
ERP-System Albers (extern)erhält jede Nacht die abgeschlossenen Aufträge als XML-Datei per SFTP.
Bestandteile der Funktion „Auftragsübersicht“ der Web-Disposition
BestandteilBeschreibung
auftragsliste.htmlHTML-Template; erzeugt die Tabelle der Aufträge und das Filterformular (Status, Niederlassung)
auftragsliste.cssGestaltung der Tabelle, z. B. rote Zeilen für Notdienst-Aufträge
AuftragControllernimmt die Anfrage GET /auftraege?status=OFFEN&niederlassung=Kassel entgegen, ruft den AuftragService auf und übergibt die Ergebnisliste an das Template
AuftragServicefachliche Logik: Aufträge filtern, nach Termin und Priorität sortieren, überfällige Aufträge kennzeichnen
AuftragKlasse mit den Auftragsdaten (Auftragsnummer, Kunde, Termin, Status, Priorität, zugewiesener Monteur)
AuftragRepositoryliest und speichert Aufträge per SQL in der Datenbank

Anlage 8 · Programmiersprachen und Werkzeuge im Projekt

TeilSpracheWerkzeuge / Laufzeitumgebung
ServerJava 21IntelliJ IDEA, Maven, javac; Ausführung auf der JVM (Eclipse Temurin 21) im Container
Plantafel der Web-DispositionTypeScript 5VS Code, npm, TypeScript-Compiler tsc; Ausführung im Browser
Monteur-AppKotlinAndroid Studio, Gradle
Datenübernahme (einmalig, ca. 60 000 Datensätze aus CSV-Dateien; Laufzeit unkritisch, wird über Nacht ausgeführt)noch offen: Python oder C++–
Kommandozeilenprogramm mp-export: wandelt die Lagerbestandsdateien der Niederlassungen in das Importformat von MonteurPlus um; läuft auf den Windows-PCs der Lager und auf einem Linux-ServerGoGo-Compiler (go build); Ergebnis soll eine einzelne ausführbare Datei ohne weitere Installation sein

Entwicklerrechner: Windows 11 · Server: Linux (Ubuntu) mit Container-Laufzeit

Anlage 9 · Abhängigkeiten des Servers und Release Notes der Bibliothek TerminKern

pom.xml (Auszug)

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
  <dependency>
    <groupId>de.example.terminkern</groupId>
    <artifactId>terminkern</artifactId>
    <version>2.4.1</version>
  </dependency>
  <dependency>
    <groupId>com.example.pdf</groupId>
    <artifactId>pdfmaker-core</artifactId>
    <version>7.1.0</version>
  </dependency>
  <dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <scope>test</scope>
  </dependency>
</dependencies>

Ausgabe von mvn dependency:tree (gekürzt)

[INFO] de.lindner:monteurplus-server:jar:1.3.0
[INFO] +- org.springframework.boot:spring-boot-starter-web:jar:3.5.6:compile
[INFO] |  \- (… 27 weitere Bibliotheken …)
[INFO] +- de.example.terminkern:terminkern:jar:2.4.1:compile
[INFO] |  +- org.example.kalender:feiertage-de:jar:1.8.0:compile
[INFO] |  \- org.example.json:json-mini:jar:0.9.2:compile
[INFO] +- com.example.pdf:pdfmaker-core:jar:7.1.0:compile
[INFO] \- org.junit.jupiter:junit-jupiter:jar:5.12.2:test

Der Server-Code verwendet die Methode Kalender.feiertage(int jahr) von TerminKern an 14 Stellen.

TerminKern – Release Notes (excerpt)
TerminKern follows Semantic Versioning 2.0.0.

3.0.0 (2026-10-01)

  • BREAKING: Java 21 is now the minimum required version.
  • BREAKING: The package de.example.terminkern has been renamed to de.example.termin.
  • BREAKING: The deprecated method Kalender.feiertage(int jahr) has been removed.
  • New: time zone support for appointments.

2.5.0 (2026-09-01)

  • New: Kalender.istBrueckentag(LocalDate) detects bridge days between a public holiday and a weekend.
  • Deprecated: Kalender.feiertage(int jahr). Use Kalender.feiertage(Year jahr, Bundesland land) instead. The old method will be removed in the next major release.

2.4.2 (2026-08-12)

  • Fixed: Easter Monday was calculated incorrectly for some years after 2100.
  • Security: Updated the dependency json-mini from 0.9.2 to 0.9.3. Version 0.9.2 can be forced into an endless loop by deeply nested JSON input (denial of service).

Anlage 10 · Erweiterung der Bibliothek TerminKern für MonteurPlus

package de.lindner.monteurplus.termin;

import de.example.terminkern.Bundesland;
import de.example.terminkern.Kalender;
import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Optional;

// Erweiterung von TerminKern 2.4.1 für MonteurPlus
public class EinsatzKalender extends Kalender {

    private static final int MAX_TAGE = 30;
    private final Arbeitszeitmodell modell;

    public EinsatzKalender(Bundesland land, Arbeitszeitmodell modell) {
        super(land);
        this.modell = modell;
    }

    // sucht termin
    public Optional<LocalDateTime> naechsterFreierTermin(
            Monteur m, LocalDate ab, Duration dauer, boolean notdienst) {
        if (dauer.isNegative() || dauer.isZero()) {
            throw new IllegalArgumentException("dauer");
        }
        LocalDate tag = ab;
        for (int i = 0; i < MAX_TAGE; i++) {
            if (notdienst || (!istFeiertag(tag) && modell.istArbeitstag(tag))) {
                Optional<LocalDateTime> slot =
                        m.getEinsatzplan().freierSlot(tag, dauer);
                if (slot.isPresent()) {
                    return slot;
                }
            }
            tag = tag.plusDays(1);
        }
        return Optional.empty();
    }
}

istFeiertag(LocalDate) ist eine Methode der Basisklasse Kalender aus TerminKern. freierSlot(tag, dauer) liefert den frühesten freien Zeitraum der Länge dauer im Einsatzplan des Monteurs an diesem Tag oder ein leeres Optional. Die Klasse soll künftig auch von zwei anderen Teams genutzt werden.

Anlage 11 · Lizenzübersicht der eingesetzten bzw. geplanten Bibliotheken

Nr.BibliothekEinsatz in MonteurPlusLizenzAnmerkung
1ChartLite 4.2Diagramme in der Web-Disposition (JavaScript, wird an die Browser ausgeliefert)MIT–
2JsonFast 2.17JSON-Verarbeitung im ServerApache License 2.0enthält eine NOTICE-Datei
3GeoKit 3.1Kartenanzeige in der Monteur-App; unverändert, als eigenständige Bibliothek eingebundenLGPL-3.0–
4SignPad 1.4Unterschriftenfeld in der Monteur-AppGPL-3.0–
5PdfMaker Core 7.1Erzeugung der Arbeitsberichte (PDF) auf dem ServerAGPL-3.0 oder kommerzielle Lizenz (Dual Licensing)kommerzielle Lizenz: 2 400 € pro Jahr
6RouteOpt SDK 5Tourenoptimierung auf dem Serverproprietär3 € je Monteur und Monat; Lizenzvertrag: „Nutzung nur für eigene interne Zwecke des Lizenznehmers“
7csv-quick 0.3Einlesen der CSV-Altdaten (einmalige Datenübernahme)keine Angabeöffentliches Repository einer Privatperson ohne LICENSE-Datei
8DbMigrate 2.0spielt Datenbankänderungen ein; läuft nur in der eigenen Pipeline, wird nicht ausgeliefertGPL-2.0–
9FeiertageDE 1.8 (feiertage-de)transitive Abhängigkeit von TerminKern (Feiertagsberechnung)BSD-3-Clause–
10TerminKern 2.4.1Kalenderfunktionen im Server (Anlage 9)Apache License 2.0–
11json-mini 0.9.2transitive Abhängigkeit von TerminKernMIT–

C · Aufgaben

Alle Aufgaben beziehen sich auf die Ausgangssituation in Anlage 1. Antworten Sie – wie in der Prüfung – in ganzen Sätzen und mit Bezug auf die Situation, sofern nicht ausdrücklich nur „nennen“ verlangt ist.

WZ-01 · Versionsverwaltung (Git)

Aufgabe WZ-01.1 ★☆☆ Grundlagen 5 Punkte

Zwei neue Kolleginnen haben bisher nur mit Subversion gearbeitet. Sie sollen ihnen die Grundlagen von Git erklären.

2 Pa) Beschreiben Sie den Unterschied zwischen einer zentralen und einer verteilten Versionsverwaltung.
3 Pb) Erläutern Sie die folgenden Begriffe jeweils in einem Satz.
BegriffErläuterung
Repository
Commit
Branch
Merge
Push
Tag

Angelehnt an: W21 Teil 1, Aufgabe 1c (Versionsverwaltung im Team)

Aufgabe WZ-01.2 ★★☆ Anwendung 10 Punkte

Sie übernehmen das Ticket MP-130 (Fotos zu Aufträgen hochladen). Ihr lokales Repository entspricht dem Stand in Anlage 3; den neuesten Commit 7d2e4b1 bezeichnen wir im Folgenden mit C. Sie führen nacheinander diese Befehle aus. Während Sie an Ihrem Branch arbeiten, pusht ein Kollege den Commit „MP-125: Notdienst-Kennzeichen“ (im Folgenden N) auf origin/main.

(1)  git switch -c feature/MP-130-fotos
(2)  git add FotoController.java                       # neue Datei
(3)  git commit -m "MP-130: Upload von Auftragsfotos"            # F1
(4)  git commit -am "MP-130: Fotos vor dem Upload verkleinern"   # F2
(5)  git switch main
(6)  git pull
(7)  git merge feature/MP-130-fotos                    # M, kein Konflikt
(8)  git tag -a v1.3.0 -m "Release 1.3.0"
(9)  git push origin main
(10) git push origin v1.3.0
4 Pa) Zeichnen Sie den Commit-Graphen nach Befehl (10). Beginnen Sie mit Commit C und kennzeichnen Sie die Commits F1, F2, N und M, die Branches main und feature/MP-130-fotos, den Tag und HEAD.
2 Pb) Geben Sie für die Befehle (6) und (7) jeweils an, ob ein Fast-Forward stattfindet, und begründen Sie Ihre Antwort.
3 Pc) Einige Tage später mergen Sie den Branch feature/MP-131-anfahrt (Anfahrtspauschale abhängig von der Entfernung) in main. Git meldet:
$ git merge feature/MP-131-anfahrt
Auto-merging src/main/java/de/lindner/monteurplus/auftrag/AuftragService.java
CONFLICT (content): Merge conflict in src/main/java/de/lindner/monteurplus/auftrag/AuftragService.java
Automatic merge failed; fix conflicts and then commit the result.
public double anfahrtspauschale(Auftrag a) {
<<<<<<< HEAD
    return a.isNotdienst() ? 89.00 : 39.00;
=======
    return a.isNotdienst() ? 79.00 : 35.00 + 0.50 * a.getEntfernungKm();
>>>>>>> feature/MP-131-anfahrt
}

Erläutern Sie, wie es zu dieser Meldung kam (1 P), und beschreiben Sie, wie Sie den Konflikt auflösen und den Merge abschließen (2 P).

1 Pd) Ein Kollege möchte nur sehen, welche neuen Commits auf origin/main liegen, ohne seinen lokalen Branch zu verändern. Nennen Sie den passenden Befehl und grenzen Sie ihn von git pull ab.
Aufgabe WZ-01.3 ★★★ Prüfungsniveau 18 Punkte

Teamleiter Markus Feld hat die Regeln für die Arbeit mit Git per E-Mail verschickt (Anlage 2). Er bittet Sie, die Regeln vor dem 1. Oktober fachlich zu prüfen.

4 Pa) Ein Entwickler aus einem anderen Team hält die Umstellung (Punkt 1) für überflüssig: „Ein Netzlaufwerk mit einem Ordner pro Tag reicht völlig.“ Entscheiden Sie, ob Sie der Umstellung zustimmen, und begründen Sie Ihre Entscheidung mit zwei fachlichen Argumenten.
6 Pb) Bewerten Sie die Punkte 2, 3 und 4 der E-Mail. Beschreiben Sie jeweils ein Problem und einen Verbesserungsvorschlag.
PunktProblemVerbesserungsvorschlag
2
3
4
4 Pc) Schlagen Sie dem Team eine geeignete Branching-Strategie vor. Nennen Sie die Strategie und beschreiben Sie, wie ein Teammitglied damit ein Ticket vom Beginn der Arbeit bis zur Übernahme in main bearbeitet.
2 Pd) Beurteilen Sie Punkt 6 und nennen Sie die Git-Funktion, die stattdessen eingesetzt werden sollte.
2 Pe) Bewerten Sie Punkt 5 anhand des Git-Logs in Anlage 3 und formulieren Sie für den Commit a41c9e2 eine aussagekräftige Commit-Nachricht.

Angelehnt an: W21 Teil 1, Aufgabe 1c (Vorschlag des Teams zur Versionsverwaltung bewerten), erweitert um Team-Workflow

WZ-02 · CI/CD & Deployment

Aufgabe WZ-02.1 ★☆☆ Grundlagen 5 Punkte

In einer Teamsitzung fallen immer wieder die Begriffe CI und CD. Sie sollen sie für die Projektdokumentation klären.

3 Pa) Grenzen Sie die Begriffe Continuous Integration, Continuous Delivery und Continuous Deployment voneinander ab.
2 Pb) Für den Server wird Maven eingesetzt. Nennen Sie zwei Aufgaben, die ein Build-Werkzeug wie Maven übernimmt.
Aufgabe WZ-02.2 ★★☆ Anwendung 10 Punkte

Seit Oktober baut und verteilt eine GitLab-Pipeline den Server automatisch (Anlage 5).

4 Pa) Stellen Sie den Ablauf der Pipeline für einen Push auf main als Diagramm dar. Berücksichtigen Sie die Reihenfolge der Stages, parallel laufende Jobs und den manuellen Schritt.
2 Pb) Begründen Sie, ob es sich um Continuous Delivery oder Continuous Deployment handelt.
2 Pc) Eine Entwicklerin pusht Commits auf den Branch feature/MP-140-material. Nennen Sie die Jobs, die dabei ausgeführt werden, und beschreiben Sie, was geschieht, wenn der Job unit-tests fehlschlägt.
2 Pd) Erläutern Sie den Zweck der Staging-Umgebung im Projekt MonteurPlus.
Aufgabe WZ-02.3 ★★★ Prüfungsniveau 18 Punkte

Durch die manuelle Bereitstellung kam es in den letzten Monaten mehrfach zu Ausfällen von MonteurPlus (Anlage 4). Die Geschäftsführung von Albers droht mit einer Vertragsstrafe. Sie sollen die Automatisierung vorbereiten.

3 Pa) Beschreiben Sie, wie die Kompilierung und Bereitstellung des Servers automatisiert werden kann.
4 Pb) Wählen Sie zwei Störungen aus Anlage 4 aus. Erläutern Sie jeweils, wie eine automatisierte Bereitstellung die Störung verhindert hätte, und leiten Sie daraus je einen Vorteil gegenüber der manuellen Bereitstellung ab.
6 Pc) Ihr Kollege Jonas Weber hat für die Monteur-App den Pipeline-Entwurf in Anlage 6 erstellt. Nennen Sie drei Schwachstellen des Entwurfs und beschreiben Sie jeweils eine Verbesserung.
Nr.SchwachstelleVerbesserung
1
2
3
3 Pd) Der Server wird künftig als Docker-Container betrieben (Anlage 5, Job package). Erläutern Sie, wie dadurch eine Störung wie die vom 05.06.2026 verhindert wird, und nennen Sie einen Unterschied zwischen einem Container und einer virtuellen Maschine.
2 Pe) Entwicklung und Administration sollen künftig nach dem DevOps-Gedanken zusammenarbeiten. Beschreiben Sie diesen Grundgedanken.

Angelehnt an: W22 Teil 1, Aufgabe 1c (automatisierte Kompilierung und Bereitstellung, Vorteile gegenüber manueller Bereitstellung)

WZ-03 · Softwarearchitektur

Aufgabe WZ-03.1 ★☆☆ Grundlagen 5 Punkte

MonteurPlus wird als 3-Schichten-Architektur umgesetzt (Anlage 7).

3 Pa) Nennen Sie die drei Schichten und beschreiben Sie jeweils eine Aufgabe der Schicht.
SchichtAufgabe
2 Pb) Unterscheiden Sie Thin Client und Fat Client und ordnen Sie die Web-Disposition (ohne Plantafel) und die Monteur-App jeweils zu.
Aufgabe WZ-03.2 ★★☆ Anwendung 10 Punkte

Die Auftragsübersicht der Web-Disposition ist nach dem MVC-Muster aufgebaut (Anlage 7, untere Tabelle).

3 Pa) Ordnen Sie die sechs Bestandteile den Rollen Model, View und Controller zu.
BestandteilRolle (Model / View / Controller)
auftragsliste.html
auftragsliste.css
AuftragController
AuftragService
Auftrag
AuftragRepository
4 Pb) Stellen Sie in einem Diagramm dar, wie Browser, Controller, Model (mit Datenbank) und View zusammenarbeiten, wenn eine Disponentin die offenen Aufträge der Niederlassung Kassel aufruft. Nummerieren und beschriften Sie die Schritte.
3 Pc) Ein Kollege fragt, ob man bei Verwendung von MVC überhaupt noch eine 3-Schichten-Architektur braucht. Erläutern Sie den Zusammenhang zwischen MVC und der 3-Schichten-Architektur am Beispiel der Auftragsübersicht.
Aufgabe WZ-03.3 ★★★ Prüfungsniveau 18 Punkte

Für das Angebot an weitere Handwerksbetriebe soll die Architektur von MonteurPlus dokumentiert und überprüft werden. Grundlage ist der Entwurf in Anlage 7.

6 Pa) Beschreiben Sie, wie die 3-Schichten-Architektur bei MonteurPlus aussieht und wie die Komponenten zusammenarbeiten. Verwenden Sie als Beispiel den Ablauf „Ein Monteur schließt einen Auftrag mit Arbeitsbericht in der App ab“.
5 Pb) Erstellen Sie eine Skizze der Architektur von MonteurPlus. Ordnen Sie alle Komponenten aus Anlage 7 einer Schicht bzw. den externen Systemen zu und beschriften Sie die Kommunikationswege mit Protokoll bzw. Datenformat.
5 Pc) Ein Kollege schlägt vor, den Server von Anfang an als Microservices umzusetzen (je ein Dienst für Aufträge, Einsatzplanung, Synchronisation und Berichte). Erläutern Sie je zwei Vor- und Nachteile gegenüber einem Monolithen und geben Sie eine begründete Empfehlung für das Team (Anlage 1).
2 Pd) Begründen Sie, warum die Monteur-App nicht direkt auf den Datenbankserver zugreifen soll, sondern über die REST-API des Anwendungsservers.

Angelehnt an: W22 Teil 1, Aufgabe 2a (3-Schichten-Architektur einer Webanwendung und Zusammenarbeit der Komponenten)

WZ-04 · Compiler vs. Interpreter

Aufgabe WZ-04.1 ★☆☆ Grundlagen 7 Punkte

In MonteurPlus werden mehrere Programmiersprachen eingesetzt (Anlage 8). Die Projektleitung möchte die grundlegenden Unterschiede der Übersetzungsverfahren verstehen.

2 Pa) Beschreiben Sie den Unterschied zwischen einem Compiler und einem Interpreter.
3 Pb) Kreuzen Sie an, wie die folgenden Sprachen üblicherweise ausgeführt werden.
SpracheCompiler → MaschinencodeInterpreterCompiler → Bytecode → virtuelle Maschine
C++
Python
Java
Go
PHP
C#
2 Pc) Nennen Sie je einen Vorteil und einen Nachteil eines Interpreters gegenüber einem Compiler.

Angelehnt an: W21 Teil 1, Aufgabe 1a

Aufgabe WZ-04.2 ★★☆ Anwendung 10 Punkte

Bei der Entwicklung des Servers (Java) und des Importskripts (Python) treten die folgenden Fehler auf.

4 Pa) Bestimmen Sie für die Java-Ausschnitte (1) bis (4) die Fehlerart (Syntaxfehler, Typfehler, Laufzeitfehler, logischer Fehler) und geben Sie an, wann bzw. wodurch der Fehler bemerkt wird.
Nr.Java-AusschnittFehlerartWann/wodurch bemerkt?
(1)String plz = 34117;
(2)for (int i = 0; i < auftraege.size(); i++ {
(3)Auftrag letzter = auftraege.get(auftraege.size());
(4)int summeMinuten = 250;
int anzahl = 4;
double schnitt = summeMinuten / anzahl;

Anzeige: Ø Einsatzdauer 62,0 min
2 Pb) Im Python-Importskript steht in Zeile 12 plz = 34117 und in Zeile 87 plz_text = plz.zfill(5) (zfill füllt einen Text links mit Nullen auf). Erläutern Sie, wann und warum dieser Fehler bemerkt wird, und vergleichen Sie mit Ausschnitt (1).
4 Pc) Der Fehler in Ausschnitt (4) ist zunächst niemandem aufgefallen. Beschreiben Sie, wie Sie einen solchen Fehler mit dem Debugger Ihrer Entwicklungsumgebung finden. Verwenden Sie dabei mindestens drei Funktionen des Debuggers.
Aufgabe WZ-04.3 ★★★ Prüfungsniveau 16 Punkte

Vor der Ausweitung des Projekts sollen die eingesetzten Sprachen und Übersetzungswege dokumentiert und offene Entscheidungen getroffen werden (Anlage 8).

4 Pa) Erläutern Sie, wie der Java-Quellcode des Servers vom Entwicklerrechner (Windows) bis zur Ausführung auf dem Linux-Server übersetzt und ausgeführt wird. Gehen Sie auf Bytecode, JVM und JIT-Compiler ein.
4 Pb) Für die einmalige Datenübernahme schlägt eine Kollegin Python vor; der Teamleiter bevorzugt C++, „weil kompilierte Programme schneller sind“. Bewerten Sie beide Vorschläge unter Berücksichtigung des Einsatzzwecks und geben Sie eine begründete Empfehlung.
3 Pc) Die Plantafel wird in TypeScript geschrieben und mit tsc übersetzt. Erläutern Sie, was dabei geschieht, und beschreiben Sie einen Vorteil gegenüber direkt in JavaScript geschriebenem Code.
5 Pd) Das Kommandozeilenprogramm mp-export wird in Go entwickelt (Anlage 8).
da) Beschreiben Sie den Übersetzungsvorgang vom Go-Quellcode bis zur ausführbaren Datei mp-export.exe und erläutern Sie dabei die Aufgabe des Linkers. (3 P)
db) Erläutern Sie, warum für den Linux-Server eine eigene ausführbare Datei erstellt werden muss, obwohl der Quellcode derselbe ist. (2 P)

Angelehnt an: W21 Teil 1, Aufgabe 1a (Compiler- und Interpretersprachen), vertieft um Bytecode, Transpiler und Linker

WZ-05 · Klassenbibliotheken, Frameworks & Dokumentation

Aufgabe WZ-05.1 ★☆☆ Grundlagen 6 Punkte

Der Server nutzt das Framework Spring Boot und mehrere Bibliotheken (Anlagen 1 und 9).

2 Pa) Erläutern Sie den Unterschied zwischen einer Klassenbibliothek und einem Framework.
4 Pb) Für die Arbeitsberichte (PDF) soll statt einer Eigenentwicklung eine umfangreiche PDF-Bibliothek eingesetzt werden. Beschreiben Sie je einen Vorteil und einen Nachteil dieser Entscheidung.

Angelehnt an: W21 Teil 1, Aufgabe 1ba

Aufgabe WZ-05.2 ★★☆ Anwendung 10 Punkte

Die Abhängigkeiten des Servers werden mit Maven verwaltet (Anlage 9).

3 Pa) Erläutern Sie anhand von Anlage 9, welche Aufgaben Maven bei der Verwaltung von Abhängigkeiten übernimmt. Gehen Sie auf transitive Abhängigkeiten ein.
4 Pb) Der Server nutzt TerminKern 2.4.1. Werten Sie die englischen Release Notes in Anlage 9 aus: Erläutern Sie für die Versionen 2.4.2, 2.5.0 und 3.0.0, was die Versionsnummer nach Semantic Versioning aussagt und ob ein Update ohne Änderungen am Code von MonteurPlus möglich ist (3 P). Empfehlen Sie, auf welche Version kurzfristig aktualisiert werden soll (1 P).
VersionAussage der Versionsnummer / InhaltUpdate ohne Codeänderung?
2.4.2
2.5.0
3.0.0
3 Pc) Beschreiben Sie das Risiko, das sich aus der Abhängigkeit json-mini für MonteurPlus ergibt, und zwei Maßnahmen, mit denen solche Risiken künftig früh erkannt oder begrenzt werden.
Aufgabe WZ-05.3 ★★★ Prüfungsniveau 16 Punkte

Das Team hat die Bibliothek TerminKern um die Klasse EinsatzKalender erweitert (Anlage 10). Die Erweiterung soll künftig auch von zwei anderen Teams genutzt werden und muss deshalb dokumentiert werden.

6 Pa) Beschreiben Sie drei Aspekte, die Sie bei der Dokumentation dieser Erweiterung beachten müssen. Beziehen Sie sich dabei auf den Code in Anlage 10.
5 Pb) Erstellen Sie für die Methode naechsterFreierTermin einen vollständigen Javadoc-Kommentar.
3 Pc) Ein Kollege schlägt vor, die Methode einfach direkt in die Klasse Kalender im Quellcode von TerminKern einzufügen. Begründen Sie, warum die Erweiterung stattdessen als eigene Unterklasse umgesetzt wurde.
2 Pd) Nennen Sie zwei Bestandteile der Dokumentation, die über die Beschreibung der einzelnen Methoden hinausgehen.

Angelehnt an: W21 Teil 1, Aufgabe 1bb (Dokumentation einer eigenen Bibliothekserweiterung)

WZ-06 · Open Source & Lizenzen

Aufgabe WZ-06.1 ★☆☆ Grundlagen 6 Punkte

In einer Projektbesprechung wird darüber gesprochen, welche Bibliotheken in MonteurPlus verwendet werden dürfen.

3 Pa) Erläutern Sie den Begriff Open Source.
2 Pb) Ein Kollege meint: „Open Source heißt, wir dürfen jede dieser Bibliotheken ohne Einschränkung einsetzen.“ Begründen Sie, ob er recht hat.
1 Pc) Nennen Sie je eine permissive Lizenz und eine Copyleft-Lizenz.

Angelehnt an: W22 Teil 1, Aufgabe 2ca und 2cb

Aufgabe WZ-06.2 ★★☆ Anwendung 10 Punkte

Für die Lizenzprüfung von MonteurPlus sollen Sie Software-Arten abgrenzen und erste Bibliotheken aus Anlage 11 prüfen.

4 Pa) Ergänzen Sie die Tabelle mit „ja“, „nein“ oder „eingeschränkt“.
Software-ArtQuellcode verfügbarVerändern erlaubtWeitergabe erlaubtkostenlos nutzbar
Open Source
Freeware
Shareware
Proprietäre Software
6 Pb) Prüfen Sie für die Bibliotheken Nr. 1, 3 und 4 aus Anlage 11, ob sie in MonteurPlus eingesetzt werden dürfen, und beschreiben Sie, welche Pflichten sich jeweils ergeben. Beachten Sie das Geschäftsmodell in Anlage 1.
Nr.Einsatz zulässig?Begründung und Pflichten
1
3
4
Aufgabe WZ-06.3 ★★★ Prüfungsniveau 18 Punkte

Bevor MonteurPlus ab 2027 als Mietsoftware an weitere Handwerksbetriebe angeboten wird, bittet Sie die Geschäftsführung um eine Lizenzprüfung (Anlagen 1 und 11).

8 Pa) Prüfen Sie die Bibliotheken Nr. 5 bis 8 aus Anlage 11. Geben Sie jeweils an, ob sie eingesetzt werden können (ja / ja, mit Auflagen / nein), und begründen Sie Ihre Entscheidung. Nennen Sie, wo nötig, eine Maßnahme.
Nr.Einsatz?Begründung / Maßnahme
5
6
7
8
4 Pb) Die Geschäftsführung fragt, ob man künftig grundsätzlich auf Open-Source-Bibliotheken setzen sollte. Erläutern Sie zwei Vorteile und zwei Nachteile von Open-Source-Bibliotheken.
3 Pc) Ein Entwickler möchte einige Funktionen aus dem Quellcode von SignPad (Nr. 4) in die Hilfsbibliothek lindner-utils kopieren, die Lindner Digital unter der MIT-Lizenz auf GitHub veröffentlichen will. Beurteilen Sie dieses Vorhaben.
3 Pd) Erläutern Sie, was eine Software Bill of Materials (SBOM) ist, und beschreiben Sie am Beispiel der Bibliotheken FeiertageDE und json-mini (Nr. 9 und 11) einen Nutzen für MonteurPlus.

Angelehnt an: W22 Teil 1, Aufgabe 2c (Open Source, Lizenzbedingungen, Vor- und Nachteile von Open-Source-Bibliotheken)

Originalaufgaben zum Üben

Diese echten Prüfungsaufgaben passen zu diesem Block (Dateien im Ordner Prüfungsvorbereitung). Für W21 und W22 gibt es keine Lösungsdateien; Lösungen liegen nur für 2023 Sommer, 2023 Winter, 2024 Sommer und 2025 Winter vor (dort vom u-form-Verlag). Vergleiche deine Antworten zu W21/W22 mit den Lösungen der entsprechenden Übungsaufgaben in diesem Block.

PrüfungAufgabeThemaDatei · Lösung
Winter 2021T1 A1a (6 P)Compiler- und Interpretersprachen: Beispiele, Unterschied, Vor-/Nachteil Interpreter2021/winter/AE 2021 Winter Teil 1.pdf · keine Lösung
Winter 2021T1 A1b (10 P)umfassende Klassenbibliothek: Vor-/Nachteil; Dokumentation einer eigenen Erweiterungwie oben · keine Lösung
Winter 2021T1 A1c (4 P)Vorschlag des Teams zur Versionsverwaltung bewertenwie oben · keine Lösung
Winter 2021T1 A4cb (5 P)verwandt: nur automatische Code-Reviews und Unit-Tests als QS – bewertenwie oben · keine Lösung
Winter 2022T1 A1c (6 P)automatisierte Kompilierung und Bereitstellung (CI/CD), Vorteile gegenüber manueller Bereitstellung2022/winter/AE 2022 Winter Teil 1.pdf · keine Lösung
Winter 2022T1 A2a (6 P)3-Schichten-Architektur einer Webanwendung, Zusammenarbeit der Komponentenwie oben · keine Lösung
Winter 2022T1 A2c (9 P)Open Source erläutern, Lizenzbedingungen, Vor-/Nachteil von OSS-Bibliothekenwie oben · keine Lösung
Winter 2022T1 A1a (4 P)verwandt: Schwachstellen veralteter IT-Infrastruktur (Verfügbarkeit)wie oben · keine Lösung
Sommer 2024T1 A1b (6 P)verwandt: drei qualitätssichernde Maßnahmen (z. B. Code-Review, CI)2024/sommer/AE Sommer 2024 Teil 1+2+3.pdf · Lösung: AE Sommer 2024 Teil 1 Lösungen.pdf