<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://staging.moocwiki.org/index.php?action=history&amp;feed=atom&amp;title=Refactoring_mit_KI_-_Bestehende_Programme_verbessern</id>
	<title>Refactoring mit KI - Bestehende Programme verbessern - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://staging.moocwiki.org/index.php?action=history&amp;feed=atom&amp;title=Refactoring_mit_KI_-_Bestehende_Programme_verbessern"/>
	<link rel="alternate" type="text/html" href="https://staging.moocwiki.org/index.php?title=Refactoring_mit_KI_-_Bestehende_Programme_verbessern&amp;action=history"/>
	<updated>2026-10-22T06:42:45Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in MOOCsWiki Staging</subtitle>
	<generator>MediaWiki 1.46.2</generator>
	<entry>
		<id>https://staging.moocwiki.org/index.php?title=Refactoring_mit_KI_-_Bestehende_Programme_verbessern&amp;diff=72911&amp;oldid=prev</id>
		<title>Glanz: AI MOOC Plugin f57d4cf6ddfed972564e676627867444</title>
		<link rel="alternate" type="text/html" href="https://staging.moocwiki.org/index.php?title=Refactoring_mit_KI_-_Bestehende_Programme_verbessern&amp;diff=72911&amp;oldid=prev"/>
		<updated>2026-10-21T22:13:41Z</updated>

		<summary type="html">&lt;p&gt;AI MOOC Plugin f57d4cf6ddfed972564e676627867444&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{T}}&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= Einleitung =&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Zielgruppe:&amp;#039;&amp;#039;&amp;#039; Auszubildende im 2. und 3. Ausbildungsjahr. &amp;#039;&amp;#039;&amp;#039;Voraussetzungen:&amp;#039;&amp;#039;&amp;#039; A1 oder grundlegendes Python, Dateien, Git und einfache Tests. &amp;#039;&amp;#039;&amp;#039;Lernumfang:&amp;#039;&amp;#039;&amp;#039; fünf bis sieben Unterrichtsstunden plus Projektarbeit.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Lernziel:&amp;#039;&amp;#039;&amp;#039; Du lieferst ein kompatibles Refactoring des Importmoduls einer erfundenen Messdaten-App. Dafür sicherst du vorab das beobachtbare Verhalten, machst den Code verständlicher, führst Tests aus, prüfst die öffentliche Schnittstelle und dokumentierst eine Rücknahme. Drei Prüffragen begleiten alle Schritte: &amp;#039;&amp;#039;&amp;#039;Sind die Ergebnisse gleich? Ist die Schnittstelle erhalten? Kann ich die Änderung zurücknehmen?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Die vorhandene [https://moocwiki.org/index.php?curid=60512 Grundlage auf MOOCwiki] dient als Wiederholung. Ihr aktueller Inhalt war am 22.10.2026 extern nicht lesbar; deshalb werden hier keine unbelegten Details darüber behauptet. Rufe aus deinem Vorwissen Funktionen, Dateiverarbeitung, einen Git-Commit und einen Soll-Ist-Test ab. Der Schwerpunkt liegt auf dem &amp;#039;&amp;#039;&amp;#039;neuen Lernprodukt&amp;#039;&amp;#039;&amp;#039;, nicht auf Wiederholung. Sämtliche Messdaten, Namen und Beispiele sind synthetisch. Alles ist ohne bezahltes KI-Konto, lokal und offline bearbeitbar. Die verwendeten öffentlichen Medien sind freiwillig. Es werden keine realen Maschinen bedient, keine Sicherheitsfreigaben erteilt und keine vertraulichen Daten verarbeitet. Das Bildungsangebot ist unabhängig und weder eine offizielle Liebherr- noch eine IHK-Zertifizierung.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= Warum bestehender Code Pflege braucht =&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Refactoring als kontrollierte Änderung ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Refactoring&amp;#039;&amp;#039;&amp;#039; heißt: Die innere Struktur eines Programms wird verbessert, während sein vereinbartes, von außen beobachtbares Verhalten gleich bleibt. Diese Abgrenzung geht auf die etablierte Definition bei Martin Fowler zurück. &amp;#039;&amp;#039;&amp;#039;Lesbarkeit&amp;#039;&amp;#039;&amp;#039; meint verständliche Bezeichner und einfache Kontrollflüsse. &amp;#039;&amp;#039;&amp;#039;Wartbarkeit&amp;#039;&amp;#039;&amp;#039; beschreibt, wie gut ein anderes Team in Zukunft Fehler finden und Änderungen sicher umsetzen kann. &amp;#039;&amp;#039;&amp;#039;Kohäsion&amp;#039;&amp;#039;&amp;#039; ist die Zusammengehörigkeit einer Funktion; &amp;#039;&amp;#039;&amp;#039;Kopplung&amp;#039;&amp;#039;&amp;#039; beschreibt Abhängigkeiten zwischen Modulen.&lt;br /&gt;
&lt;br /&gt;
Eine lange Funktion kann Einlesen, Prüfen, Berechnen und Ausgeben vermischen. Das erschwert Fehlersuche und Tests. Eine kleine Hilfsfunktion kann dagegen die Verantwortung klarer abgrenzen. Aber: Eine neue Eingaberegel, ein neuer Datentyp oder eine andere Fehlermeldung ist nicht automatisch Refactoring. Ein solches verändertes Verhalten braucht eine eigene, fachlich abgestimmte Änderung. Ziel ist nicht möglichst wenig Code oder jede erdenkliche Abstraktion, sondern ein besser verständlicher und verlässlich veränderbarer Entwurf.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Kleine Schritte und überprüfbare Annahmen ==&lt;br /&gt;
Führe zuerst die bisherigen Tests aus. Ändere danach nur einen zusammenhängenden Teil, lies den &amp;#039;&amp;#039;&amp;#039;Diff&amp;#039;&amp;#039;&amp;#039; (die Darstellung der Unterschiede), teste erneut und sichere einen kleinen &amp;#039;&amp;#039;&amp;#039;Commit&amp;#039;&amp;#039;&amp;#039; (gespeicherten Versionsstand). Wiederhole dies nur bei grünem Ergebnis. Das ist sicherer und erklärbarer als eine vollständige Neuschreibung des Imports auf einmal. Ein schönerer Quelltext ist für sich allein kein Kompatibilitätsnachweis.&lt;br /&gt;
&lt;br /&gt;
[[File:Software Development Lifecycle Diagram.png|360px|frameless|center|alt=Zyklisches Schaubild der Phasen Entwicklung Test und Wartung]]&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Bild und Offline-Alternative:&amp;#039;&amp;#039;&amp;#039; Der Softwarelebenszyklus umfasst wiederholte Entwicklungs-, Test- und Wartungsphasen. [https://commons.wikimedia.org/wiki/File:Software_Development_Lifecycle_Diagram.png Dateiseite], Shawn Rider, [https://creativecommons.org/licenses/by-sa/4.0/ CC BY-SA 4.0]. Ohne Grafik: Zeichne einen Kreis aus Verstehen, Testen, Ändern und erneuter Prüfung.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Vertiefung:&amp;#039;&amp;#039;&amp;#039; Mehr Hilfsfunktionen können auch zu einer unübersichtlichen Verteilung führen. Begründe die Auslagerung immer anhand einer tatsächlich klarer abgegrenzten Aufgabe.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= Den bisherigen Vertrag mit Tests sichern =&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Beobachtbares Verhalten und Rückwärtskompatibilität ==&lt;br /&gt;
Ein &amp;#039;&amp;#039;&amp;#039;Schnittstellenvertrag&amp;#039;&amp;#039;&amp;#039; umfasst Eingaben, Aufruf, Ergebnisse und vereinbarte Fehler. Ein bestehender Aufrufer erwartet in unserem Modell die Funktion &amp;#039;&amp;#039;&amp;#039;importiere(text)&amp;#039;&amp;#039;&amp;#039;. Sie nimmt einen Text entgegen und liefert eine Liste von Paaren (Name, Zahl). Jede nichtleere Zeile besteht aus Name, Semikolon und Zahl, etwa &amp;quot;Pumpe;12,5&amp;quot;. Dezimalkomma und Dezimalpunkt werden akzeptiert. Leere Zeilen werden ausgelassen; die Reihenfolge bleibt erhalten. Eine Zeile mit drei statt zwei Feldern erzeugt einen ValueError mit Zeilennummer.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Kriterium !! Nachweis an konkreten Beispielen&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Gleiche Ergebnisse&amp;#039;&amp;#039;&amp;#039; || Vorher und nachher ergeben &amp;quot;Pumpe;12,5&amp;quot; und &amp;quot;Ventil;7.0&amp;quot; dieselbe Liste mit Zahlen 12.5 und 7.0 in identischer Reihenfolge.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Schnittstelle erhalten&amp;#039;&amp;#039;&amp;#039; || Derselbe Aufrufer verwendet weiter importiere(text), bekommt eine Liste und bei falscher Spaltenzahl denselben vereinbarten Fehlertyp und Fehlertext.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Änderung zurücknehmen&amp;#039;&amp;#039;&amp;#039; || Nach einem grünen Testlauf wird der überschaubare Refactoring-Schritt separat in Git gesichert; im Fehlerfall lässt er sich gezielt umkehren.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Fehlerfall:&amp;#039;&amp;#039;&amp;#039; Bei &amp;quot;Pumpe;1;2&amp;quot; muss der Fehler &amp;quot;Zeile 1: Spaltenzahl&amp;quot; entstehen. Wenn die neue Version diesen Datensatz schweigend auslässt, ist die zugesagte Wirkung verändert. Ein Test, der ausschließlich gültige Eingaben kontrolliert, würde diese Regression übersehen. Nicht spezifizierte Sonderfälle wie NaN und nicht endliche Zahlen müssen vor einer Verschärfung der Importregeln ausdrücklich verhandelt werden.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Tests als beobachtbare Beweise ==&lt;br /&gt;
Ein &amp;#039;&amp;#039;&amp;#039;Regressionstest&amp;#039;&amp;#039;&amp;#039; sucht nach unerwünschten Rückfällen. Er umfasst Normalwerte, Randbedingungen, Fehlerreaktionen und bestehende Nutzer der Schnittstelle. Ein &amp;#039;&amp;#039;&amp;#039;Unit-Test&amp;#039;&amp;#039;&amp;#039; prüft einen kleinen Teil isoliert, ein Integrationstest das Zusammenspiel mehrerer Teile. Grüne Tests sind ein guter Beleg für geprüfte Fälle, kein Beweis für alle möglichen Daten, Plattformen und Versionsstände.&lt;br /&gt;
&lt;br /&gt;
[[File:Testing Pyramid.svg|360px|frameless|center|alt=Testpyramide: viele Unit-Tests unten, weniger Integrationstests, wenige End-to-End-Tests]]&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Bild und Offline-Alternative:&amp;#039;&amp;#039;&amp;#039; Unter vielen schnellen Komponententests liegen die Grundlagen der Pyramide; darüber stehen weniger übergreifende Tests. [https://commons.wikimedia.org/wiki/File:Testing_Pyramid.svg Dateiseite], Abbe98, [https://creativecommons.org/licenses/by-sa/4.0/ CC BY-SA 4.0]. Ohne Grafik: Stelle drei Ebenen in einer Tabelle gegenüber und beschreibe, was jede prüft.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= Geführtes Werkstattbeispiel: das Importmodul =&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Ausgangszustand lesen ==&lt;br /&gt;
Lege eine Datei importmodul.py mit diesem &amp;#039;&amp;#039;&amp;#039;frei erfundenen&amp;#039;&amp;#039;&amp;#039; Ausgangscode an. Beachte: Eine Zeile wird nur dann ignoriert, wenn sie leer oder ausschließlich aus Leerzeichen besteht. Ein ungültiger Zahlenwert kann ebenfalls einen ValueError auslösen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def importiere(text):&lt;br /&gt;
    daten = []&lt;br /&gt;
    for nummer, zeile in enumerate(text.splitlines(), 1):&lt;br /&gt;
        if not zeile.strip():&lt;br /&gt;
            continue&lt;br /&gt;
        teile = zeile.split(&amp;quot;;&amp;quot;)&lt;br /&gt;
        if len(teile) != 2:&lt;br /&gt;
            raise ValueError(f&amp;quot;Zeile {nummer}: Spaltenzahl&amp;quot;)&lt;br /&gt;
        daten.append((&lt;br /&gt;
            teile[0].strip(),&lt;br /&gt;
            float(teile[1].strip().replace(&amp;quot;,&amp;quot;, &amp;quot;.&amp;quot;))&lt;br /&gt;
        ))&lt;br /&gt;
    return daten&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Arbeitsdiagnose:&amp;#039;&amp;#039;&amp;#039; In einer Schleife sind Filterung, Zerlegung, Prüfung, Umwandlung und Anhängen eng verschachtelt. Die bestehende öffentliche Funktion soll dennoch erhalten bleiben. Schreibe drei beobachtbare Anforderungen auf, bevor du Code bearbeitest.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Vier Basistests vor jeder Veränderung ==&lt;br /&gt;
Speichere Folgendes in test_importmodul.py und starte lokal &amp;#039;&amp;#039;&amp;#039;python -m unittest -v&amp;#039;&amp;#039;&amp;#039;. unittest gehört zur Python-Standardbibliothek; auch die spätere Lösung benötigt kein externes Konto.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import unittest&lt;br /&gt;
from importmodul import importiere&lt;br /&gt;
&lt;br /&gt;
class ImportTests(unittest.TestCase):&lt;br /&gt;
    def test_normalfall(self):&lt;br /&gt;
        eingabe = &amp;quot;Pumpe;12,5\n\nVentil;7.0&amp;quot;&lt;br /&gt;
        self.assertEqual(&lt;br /&gt;
            importiere(eingabe),&lt;br /&gt;
            [(&amp;quot;Pumpe&amp;quot;, 12.5), (&amp;quot;Ventil&amp;quot;, 7.0)]&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    def test_leer(self):&lt;br /&gt;
        self.assertEqual(importiere(&amp;quot;&amp;quot;), [])&lt;br /&gt;
&lt;br /&gt;
    def test_falsche_spaltenzahl(self):&lt;br /&gt;
        with self.assertRaisesRegex(&lt;br /&gt;
            ValueError, &amp;quot;^Zeile 1: Spaltenzahl$&amp;quot;&lt;br /&gt;
        ):&lt;br /&gt;
            importiere(&amp;quot;Pumpe;1;2&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    def test_schnittstelle(self):&lt;br /&gt;
        wert = importiere(&amp;quot;Sensor;0&amp;quot;)&lt;br /&gt;
        self.assertIsInstance(wert, list)&lt;br /&gt;
        self.assertEqual(wert[0], (&amp;quot;Sensor&amp;quot;, 0.0))&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    unittest.main()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Halte Anzahl und Ausgang der Tests, Python-Version und Commit-Kennung fest. Wenn bereits vor der Änderung ein Test rot ist, stoppe die Umstrukturierung und kläre den Ausgangszustand. Beurteile, welche weitere Randfallprüfung notwendig wäre. Teste nicht nur neue Eigenschaften, sondern besonders die alten Zusagen.&lt;br /&gt;
&lt;br /&gt;
[[File:Testgetriebener Entwicklungsprozess.svg|320px|frameless|center|alt=Deutsche Ablaufgrafik zum Zyklus von Test und Implementierung]]&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Bild und Offline-Alternative:&amp;#039;&amp;#039;&amp;#039; Die Grafik zeigt wiederholte Test- und Entwicklungsschritte. [https://commons.wikimedia.org/wiki/File:Testgetriebener_Entwicklungsprozess.svg Dateiseite], MovGP0; Lizenzhinweis auf der Dateiseite vor Weiterverwendung selbst kontrollieren. Unser Beispiel verwendet zunächst Charakterisierungstests für bereits vorhandenes Verhalten. Ohne Bild: Schreibe „Test vor Änderung – kleiner Schritt – derselbe Test erneut“.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Ein verhaltenserhaltender Eingriff ==&lt;br /&gt;
Ersetze nun &amp;#039;&amp;#039;&amp;#039;nur&amp;#039;&amp;#039;&amp;#039; den Inhalt von importmodul.py durch diese klar gegliederte Variante. Die Hilfsfunktion ist als intern gekennzeichnet. Keine neue Regel wird hinzugefügt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def _lese_zeile(zeile, nummer):&lt;br /&gt;
    teile = zeile.split(&amp;quot;;&amp;quot;)&lt;br /&gt;
    if len(teile) != 2:&lt;br /&gt;
        raise ValueError(f&amp;quot;Zeile {nummer}: Spaltenzahl&amp;quot;)&lt;br /&gt;
    name = teile[0].strip()&lt;br /&gt;
    wert = float(teile[1].strip().replace(&amp;quot;,&amp;quot;, &amp;quot;.&amp;quot;))&lt;br /&gt;
    return name, wert&lt;br /&gt;
&lt;br /&gt;
def importiere(text):&lt;br /&gt;
    daten = []&lt;br /&gt;
    for nummer, zeile in enumerate(text.splitlines(), 1):&lt;br /&gt;
        if not zeile.strip():&lt;br /&gt;
            continue&lt;br /&gt;
        daten.append(_lese_zeile(zeile, nummer))&lt;br /&gt;
    return daten&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Prüfe konkret:&amp;#039;&amp;#039;&amp;#039; Erstens müssen alle vier vorhandenen Tests mit &amp;#039;&amp;#039;&amp;#039;unveränderten&amp;#039;&amp;#039;&amp;#039; Erwartungen erfolgreich sein. Zweitens dürfen importiere(text), Listenformat und vereinbarter Fehlertext nicht geändert sein. Drittens muss die Änderung in einem eigenen Commit oder als benannte Vorher-Kopie zurücknehmbar sein. Prüfe den Diff: Wenn ein Agent auch test_importmodul.py heimlich verändert hat, ist sein Ergebnis kein ausreichender Nachweis. Bewahre unveränderte Ausgangstests auf.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Fehlerfall begründen:&amp;#039;&amp;#039;&amp;#039; Eine fehlerhafte Zeile kann auf einen versehentlichen Exportfehler hinweisen. Laut unserem Übungsvertrag ist die passende Reaktion eine Ausnahme. Lautloses Überspringen wäre nicht nur eine andere technische Implementierung, sondern könnte fehlerhafte Eingangsdaten verschleiern.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Importprüfung ausdrücklich als zweite Anforderung ==&lt;br /&gt;
Erst nach dem Refactoring soll die Messdaten-App optional strengere &amp;#039;&amp;#039;&amp;#039;Importprüfung&amp;#039;&amp;#039;&amp;#039; erhalten: Leere Namen und nicht endliche Zahlen werden dann abgelehnt. Das wäre eine &amp;#039;&amp;#039;&amp;#039;bewusste Änderung des Außenverhaltens&amp;#039;&amp;#039;&amp;#039;, weil die Altversion beispielsweise &amp;quot; ;5&amp;quot; nicht zurückgewiesen hat. Formuliere zuerst Akzeptanzkriterien und eigene Tests; entscheide mit dem Auftraggeber, ob eine neue Funktion oder eine versionierte Schnittstelle benötigt wird. Implementiere diese Erweiterung in einem &amp;#039;&amp;#039;&amp;#039;separaten Commit&amp;#039;&amp;#039;&amp;#039;. Bewahre ältere Aufrufer und deren Datenformate im Blick. Nenne dies nicht Refactoring, auch wenn der Code dabei lesbarer wird.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= KI-Agenten, Berechtigungen und menschliches Review =&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Enger Auftrag statt pauschaler Autonomie ==&lt;br /&gt;
Ein Coding-Agent ist ein Werkzeug, das Vorschläge erstellt und mit begrenzten Berechtigungen Projektfunktionen verwenden kann. Seine Erklärung, alles sei korrekt, ersetzt weder ausführbare Tests noch Review. Der folgende Auftrag lässt sich auch ohne KI als persönliche Arbeitsliste nutzen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Projekt: synthetische Messdaten-App.&lt;br /&gt;
Ändere nur importmodul.py.&lt;br /&gt;
Ziel: Zeilenparser intern auslagern.&lt;br /&gt;
Nicht ändern: importiere(text), Rückgabeliste,&lt;br /&gt;
Reihenfolge, Fehlerklasse, vereinbarter Fehlertext.&lt;br /&gt;
Nutze unveränderte bestehende unittest-Tests.&lt;br /&gt;
Keine Netzwerkzugriffe, neuen Pakete oder Geheimnisse.&lt;br /&gt;
Keine Produktionsdateien, keine Maschinenbefehle.&lt;br /&gt;
Liefere Diff, Testprotokoll, Risiken, Rücknahmeplan.&lt;br /&gt;
Frage bei Vertragsunsicherheit vor jeder Änderung.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Least Privilege&amp;#039;&amp;#039;&amp;#039; heißt minimal nötige Rechte: zunächst lesen, anschließend nur für die ausdrücklich ausgewählte Datei schreiben, Tests ausschließlich in einer isolierten Lernumgebung. &amp;#039;&amp;#039;&amp;#039;Prompt Injection&amp;#039;&amp;#039;&amp;#039; bezeichnet eine Manipulation, bei der ein fremder Text wie ein höherwertiger Handlungsauftrag erscheinen soll. Auch README-Inhalte, Kommentare oder Toolantworten können solche Anweisungen enthalten; sie überschreiben nicht den menschlichen Auftrag. Ein Agent darf sich weder selbst reale Betriebsrechte erteilen noch eine Sicherheitsfreigabe ersetzen.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Review- und Freigabegrenzen ==&lt;br /&gt;
Ein &amp;#039;&amp;#039;&amp;#039;Review&amp;#039;&amp;#039;&amp;#039; kontrolliert Risiken unabhängig von der Codeerstellung. Ein menschlicher Reviewer prüft den Diff, die Testbasis, öffentliche Schnittstellen, Grenzfälle, Änderungen außerhalb des Auftrags und den Rücknahmeweg. Bei fehlender Evidenz wird nicht gemergt. Ein fachlicher Änderungswunsch und ein technisches Refactoring werden als getrennte Arbeitspakete protokolliert.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Tätigkeit !! Grenze !! Nachweis&lt;br /&gt;
|-&lt;br /&gt;
| Änderung vorschlagen || Nur synthetisches Projekt || Sichtbarer Diff&lt;br /&gt;
|-&lt;br /&gt;
| Tests ausführen || Lokale Übungsumgebung || Wiederholbarer Testlauf&lt;br /&gt;
|-&lt;br /&gt;
| Neue Importregel beschließen || Mensch mit Fachverantwortung || Akzeptanzkriterien&lt;br /&gt;
|-&lt;br /&gt;
| Merge genehmigen || Berechtigter menschlicher Reviewer || Review-Protokoll&lt;br /&gt;
|-&lt;br /&gt;
| Reale Maschinen steuern || Hier ausdrücklich verboten || Keine Verbindung vorhanden&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die [https://modelcontextprotocol.io/docs/2026-07-28/tutorials/security/security_best_practices MCP Security Best Practices, Stand 28.07.2026] behandeln unter anderem Risiken von Berechtigung und Weitergabe von Tokens bei MCP-Implementierungen. Das [https://doi.org/10.6028/NIST.AI.600-1 NIST-Profil AI 600-1, Juli 2024] unterstützt die strukturierte Betrachtung generativer KI-Risiken. Diese Leitlinien ersetzen &amp;#039;&amp;#039;&amp;#039;keine&amp;#039;&amp;#039;&amp;#039; Produktprüfung und bestätigen nicht, dass irgendein konkreter Agent, eine Maschine oder dieses Übungsprogramm sicher ist.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Git als Rücknahme- und Reviewhilfe ==&lt;br /&gt;
Erstelle einen eigenen Arbeitsbranch, committe die Tests und die Strukturänderung getrennt und lass die Änderung prüfen. &amp;#039;&amp;#039;&amp;#039;git diff&amp;#039;&amp;#039;&amp;#039; zeigt die Änderungen. &amp;#039;&amp;#039;&amp;#039;git status&amp;#039;&amp;#039;&amp;#039; zeigt den Arbeitsstand. Für eigene ungesicherte Änderungen ist vor git restore eine Sicherung wichtig. Ein bereits gemeinsam geteilter Commit wird in der Regel mit einem dokumentierten &amp;#039;&amp;#039;&amp;#039;git revert&amp;#039;&amp;#039;&amp;#039; durch einen Gegencommit rückgängig gemacht, statt gemeinsame Historie unkontrolliert zu überschreiben. Prüfe nach jeder Rücknahme erneut die Tests.&lt;br /&gt;
&lt;br /&gt;
[[File:Basic git branching workflow (GitLab).svg|420px|frameless|center|alt=Git-Arbeitszweig mit eigener Änderung und geplanter Integration]]&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Bild und Offline-Alternative:&amp;#039;&amp;#039;&amp;#039; Branch, Prüfung und Zusammenführung werden getrennt gedacht. [https://commons.wikimedia.org/wiki/File:Basic_git_branching_workflow_(GitLab).svg Dateiseite], TheresNoTime, [https://creativecommons.org/licenses/by-sa/4.0/ CC BY-SA 4.0]. Ohne Bild: Skizziere main – Übungsbranch – Review – Merge.&lt;br /&gt;
&lt;br /&gt;
[[File:Merge bugFix.gif|320px|frameless|center|alt=Animierte Git-Geschichte eines Bugfix-Branches beim Merge]]&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Animation und Offline-Alternative:&amp;#039;&amp;#039;&amp;#039; Ein Bugfix-Zweig wird zusammengeführt; notiere die Commit-Abfolge als Text. [https://commons.wikimedia.org/wiki/File:Merge_bugFix.gif Dateiseite], MonkeyWaffle, [https://creativecommons.org/licenses/by-sa/4.0/ CC BY-SA 4.0].&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Video, deutsch:&amp;#039;&amp;#039;&amp;#039; {{#ev:youtube|https://www.youtube.com/watch?v=v1ibwg3zaQQ|500|center}} [https://www.youtube.com/watch?v=v1ibwg3zaQQ Git in 60 Minuten, Mit Mario, 2022]. Der öffentliche Videoeintrag beschreibt unter anderem Branch, Merge und Rücknahme. Verfügbarkeit und Einbettung können sich ändern. &amp;#039;&amp;#039;&amp;#039;Offline:&amp;#039;&amp;#039;&amp;#039; Erkläre anhand einer eigenen gezeichneten Commitfolge, wie du eine schlechte Änderung isoliert zurücknimmst.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= Selbstständiger Transfer und langfristige Wartbarkeit =&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Eigenständiges Importmodul liefern ==&lt;br /&gt;
Erstelle auf Grundlage der zwei Beispielversionen ein eigenes, &amp;#039;&amp;#039;&amp;#039;kompatibles&amp;#039;&amp;#039;&amp;#039; Refactoring. Ergänze mindestens zwei weitere Charakterisierungstests. Nutze absichtlich einen Fehlerfall, etwa &amp;quot;Motor;3;5&amp;quot;, und begründe die erwartete Reaktion. Prüfe die drei Kriterien im Abgabeprotokoll nicht nur mit Ja oder Nein, sondern mit tatsächlicher Eingabe, tatsächlichem Ergebnis, Funktionsaufruf und Rücknahme-Commit. Optional überträgst du denselben Ablauf auf ein neues synthetisches Importformat; dessen Verhaltensänderung ist klar getrennt zu kennzeichnen.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Wartung in sechs Monaten ==&lt;br /&gt;
Eine kurze README enthält: öffentlichen Vertrag, Beispielzeilen, Testbefehl, bekannten Fehlertext, Python-Version, akzeptierte Grenzen, offene Fragen und Rücknahmeverfahren. Beschreibe, wie eine unbekannte Person die Tests reproduzieren kann. Prüfe bei neuen Python-Versionen erneut; übertriebene Abstraktion, versteckte Abhängigkeiten und ungeklärte KI-Vorschläge erhöhen Wartungskosten. Bewerte die Änderung nach Verständlichkeit und unabhängiger Wiederholbarkeit, nicht nach der Menge erzeugten Codes.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Video, englische Vertiefung:&amp;#039;&amp;#039;&amp;#039; {{#ev:youtube|https://www.youtube.com/watch?v=bsU7AFjh4m8|500|center}} [https://www.youtube.com/watch?v=bsU7AFjh4m8 ArjanCodes: Python-Code schrittweise überarbeiten, 2025]. Der Inhalt betrifft allgemeine Python-Lesbarkeit und nicht die erfundene Messdaten-App. &amp;#039;&amp;#039;&amp;#039;Offline:&amp;#039;&amp;#039;&amp;#039; Identifiziere selbst drei Verbesserungen in der ausgelagerten Hilfsfunktion.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Hörimpuls:&amp;#039;&amp;#039;&amp;#039; [[File:Computer keyboard.ogg|none|Geräusche einer Computertastatur]]. [https://commons.wikimedia.org/wiki/File:Computer_keyboard.ogg Dateiseite], russiandoll, Public Domain. Die Geräusche belegen Aktivität, &amp;#039;&amp;#039;&amp;#039;nicht&amp;#039;&amp;#039;&amp;#039; korrektes Programmverhalten: Erkläre, warum ein vorzeigbares Testprotokoll stärkere Evidenz ist. &amp;#039;&amp;#039;&amp;#039;Ohne Ton:&amp;#039;&amp;#039;&amp;#039; Stelle Tätigkeitsbericht und Testergebnis schriftlich gegenüber.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= Interaktive Aufgaben =&lt;br /&gt;
Bei den Multiple-Choice-Aufgaben gibt die interaktive Quizfunktion eine Richtig-/Falsch-Rückmeldung. Die Lösungen werden nicht als frei sichtbare Antwortliste vorangestellt. Nach jeder Aufgabe sollst du zusätzlich einen belegbaren Grund für deine Wahl formulieren.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Quiz: Teste dein Wissen ==&lt;br /&gt;
{{MC}}&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Was unterscheidet Refactoring von einer neuen Funktion?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(Die innere Struktur ändert sich bei gleichbleibendem vereinbartem Verhalten)&lt;br /&gt;
(!Neue Dateiformate sind automatisch erlaubt)&lt;br /&gt;
(!Der Funktionsname muss immer geändert werden)&lt;br /&gt;
(!Tests werden nach der Änderung gelöscht)&lt;br /&gt;
{{E}}&lt;br /&gt;
&lt;br /&gt;
{{MC}}&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Wie lässt sich das Kriterium gleiche Ergebnisse konkret prüfen?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(Alte und neue Version mit identischen Eingaben vergleichen)&lt;br /&gt;
(!Nur die Zahl der Zeilen vergleichen)&lt;br /&gt;
(!Nur eine KI nach ihrer Einschätzung fragen)&lt;br /&gt;
(!Nur auf eine schöne Formatierung achten)&lt;br /&gt;
{{E}}&lt;br /&gt;
&lt;br /&gt;
{{MC}}&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Was gehört zum Schnittstellenvertrag des Beispiels?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(Funktionsname Argument und vereinbarter Rückgabewert)&lt;br /&gt;
(!Nur der Name einer lokalen Variablen)&lt;br /&gt;
(!Die Farbe des Editors)&lt;br /&gt;
(!Die Dateigröße eines Screenshots)&lt;br /&gt;
{{E}}&lt;br /&gt;
&lt;br /&gt;
{{MC}}&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Was bedeutet es wenn eine neue Prüfung bislang erlaubte Daten ablehnt?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(Es ist eine gesondert zu vereinbarende Verhaltensänderung)&lt;br /&gt;
(!Es ist immer nur eine kosmetische Änderung)&lt;br /&gt;
(!Die alten Tests dürfen still gelöscht werden)&lt;br /&gt;
(!Es ist automatisch rückwärtskompatibel)&lt;br /&gt;
{{E}}&lt;br /&gt;
&lt;br /&gt;
{{MC}}&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Warum ist ein Test für eine fehlerhafte Zeile wichtig?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(Auch ein vereinbarter Fehlertyp gehört zum beobachtbaren Verhalten)&lt;br /&gt;
(!Fehler dürfen stets ignoriert werden)&lt;br /&gt;
(!Nur gute Eingaben müssen getestet werden)&lt;br /&gt;
(!Fehlerfälle ersetzen die normalen Tests)&lt;br /&gt;
{{E}}&lt;br /&gt;
&lt;br /&gt;
{{MC}}&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Welche Berechtigung braucht ein Agent für einen ersten Änderungsvorschlag?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(Möglichst nur Einsicht in die erlaubten synthetischen Projektdateien)&lt;br /&gt;
(!Unbegrenzten Zugang zur Produktion)&lt;br /&gt;
(!Zugang zu sämtlichen Geheimnissen)&lt;br /&gt;
(!Rechte zur Maschinensteuerung)&lt;br /&gt;
{{E}}&lt;br /&gt;
&lt;br /&gt;
{{MC}}&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Was beweisen bestandene Regressionstests?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(Die untersuchten Fälle verhalten sich wie erwartet)&lt;br /&gt;
(!Es existieren keinerlei anderen Fehler)&lt;br /&gt;
(!Ein menschliches Review ist überflüssig)&lt;br /&gt;
(!Jede mögliche Eingabe wurde geprüft)&lt;br /&gt;
{{E}}&lt;br /&gt;
&lt;br /&gt;
{{MC}}&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Wie lässt sich ein geteilter Fehlercommit transparent rückgängig machen?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(Durch einen überprüften Revert-Commit)&lt;br /&gt;
(!Durch heimliches Überschreiben aller fremden Commits)&lt;br /&gt;
(!Durch Löschen des gesamten Repositories)&lt;br /&gt;
(!Durch Abschalten sämtlicher Tests)&lt;br /&gt;
{{E}}&lt;br /&gt;
&lt;br /&gt;
{{MC}}&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Was bedeutet eine mit Unterstrich benannte Python-Hilfsfunktion?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(Sie ist gemäß Namenskonvention für interne Nutzung vorgesehen)&lt;br /&gt;
(!Python verbietet jeden Aufruf dieser Funktion)&lt;br /&gt;
(!Die Funktion ist automatisch sicherheitszertifiziert)&lt;br /&gt;
(!Der Rückgabetyp muss ein String werden)&lt;br /&gt;
{{E}}&lt;br /&gt;
&lt;br /&gt;
{{MC}}&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Was unterstützt Wartbarkeit auf lange Sicht?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(Klare Verträge Tests kleine Änderungen und verständliche Dokumentation)&lt;br /&gt;
(!Unbeschränkte Änderungen ohne Versionsverlauf)&lt;br /&gt;
(!Das Löschen von Fehlerprotokollen)&lt;br /&gt;
(!Das alleinige Vertrauen auf KI-Vorschläge)&lt;br /&gt;
{{E}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Memory ==&lt;br /&gt;
Finde mindestens fünf zusammengehörende Begriffspaare.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;memo-quiz&amp;quot;&amp;gt;&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| Refactoring || Strukturänderung bei erhaltenem vereinbartem Verhalten&lt;br /&gt;
|-&lt;br /&gt;
| Regressionstest || Erneute Prüfung bereits zugesagter Ergebnisse&lt;br /&gt;
|-&lt;br /&gt;
| Schnittstelle || Für Aufrufer sichtbarer Funktionsvertrag&lt;br /&gt;
|-&lt;br /&gt;
| Review || Unabhängige Prüfung des Änderungsvorschlags&lt;br /&gt;
|-&lt;br /&gt;
| Commit || Dokumentierter gespeicherter Versionsstand&lt;br /&gt;
|-&lt;br /&gt;
| Rückwärtskompatibilität || Bisherige Aufrufer funktionieren weiterhin&lt;br /&gt;
|}&lt;br /&gt;
{{E}}&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Drag-and-Drop ==&lt;br /&gt;
Ordne jedem Begriff die passende Handlung zu.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;lueckentext-quiz&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Passenden Begriff zuordnen&lt;br /&gt;
! Handlung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Vertrag&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Frühere Eingaben Ausgaben und Fehlertypen festhalten&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Charakterisierungstest&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Bestehendes Verhalten vor der Umstrukturierung messen&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Extraktion&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Zusammengehörenden Zeilenparser als Hilfsfunktion auslagern&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Diffprüfung&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Nur tatsächlich beauftragte Zeilenänderungen prüfen&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Rücknahme&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Nach einem Fehler gezielt einen gesicherten Änderungsstand umkehren&lt;br /&gt;
|}&lt;br /&gt;
{{E}}&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Kreuzworträtsel ==&lt;br /&gt;
Trage zu jedem Hinweis ein einziges Wort ein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;kreuzwort-quiz&amp;quot;&amp;gt;&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| Vertrag || Vereinbarung über Aufruf Ergebnis und Fehler&lt;br /&gt;
|-&lt;br /&gt;
| Regression || Rückfall in ein früher behobenes Problem&lt;br /&gt;
|-&lt;br /&gt;
| Lesbarkeit || Verständlichkeit eines Quelltextes&lt;br /&gt;
|-&lt;br /&gt;
| Schnittstelle || Sichtbarer Zugangspunkt eines Programmmoduls&lt;br /&gt;
|-&lt;br /&gt;
| Wartbarkeit || Eignung für spätere Pflege und Erweiterung&lt;br /&gt;
|-&lt;br /&gt;
| Review || Unabhängige Prüfung eines Codes&lt;br /&gt;
|}&lt;br /&gt;
{{E}}&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== LearningApps ==&lt;br /&gt;
[https://learningapps.org/index.php?s=Refactoring+mit+KI+Bestehende+Programme+verbessern Suche nach passenden ergänzenden Übungen]. Die konkreten Treffer werden nicht als geprüft behauptet.&lt;br /&gt;
&amp;lt;iframe&amp;gt; https://learningapps.org/index.php?s=Refactoring+mit+KI+Bestehende+Programme+verbessern &amp;lt;/iframe&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Offline-Alternative:&amp;#039;&amp;#039;&amp;#039; Erstelle sechs Kartenpaare zu Refactoring, Vertrag, Test, Branch, Review und Revert.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Lückentext ==&lt;br /&gt;
&amp;lt;quiz display=simple&amp;gt;&lt;br /&gt;
{&amp;#039;&amp;#039;&amp;#039;Setze den passenden Fachbegriff ein.&amp;#039;&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
|type=&amp;quot;{}&amp;quot;}&lt;br /&gt;
Ein Refactoring erhält das vereinbarte { Verhalten } eines Programms.&lt;br /&gt;
Die nach außen zugängliche Funktion bildet eine { Schnittstelle }.&lt;br /&gt;
Ein Test gegen unbeabsichtigte Rückfälle heißt { Regressionstest }.&lt;br /&gt;
Der Zeilenparser wird als eigene { Hilfsfunktion } ausgelagert.&lt;br /&gt;
Ein Vergleich zweier Quelltextversionen heißt { Diff }.&lt;br /&gt;
Ein gesicherter Git-Änderungsstand heißt { Commit }.&lt;br /&gt;
Ein zusätzliches fachliches Prüfpaar Augen ist das { Review }.&lt;br /&gt;
Zum transparenten Umkehren eines geteilten Commits dient ein { Revert }.&lt;br /&gt;
Die langfristige Änderbarkeit nennt man { Wartbarkeit }.&lt;br /&gt;
Alte Aufrufer sollen ihre { Kompatibilität } behalten.&lt;br /&gt;
&amp;lt;/quiz&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= Offene Aufgaben =&lt;br /&gt;
{{BR}}&lt;br /&gt;
=== Leicht ===&lt;br /&gt;
# [[Refactoring]]: Erkläre den Unterschied zwischen einer inneren Strukturänderung und einer neuen Importfunktion in vier eigenen Sätzen.&lt;br /&gt;
# [[Python]]: Führe importiere lokal mit zwei erfundenen Zeilen aus und notiere Eingabe, Rückgabewert und Datentyp.&lt;br /&gt;
# [[Regressionstest]]: Ergänze einen Test für drei Leerzeilen und begründe das erwartete Ergebnis.&lt;br /&gt;
# [[Programmierschnittstelle]]: Kennzeichne im Beispiel den öffentlichen Namen und die neue private Hilfsfunktion.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
=== Standard ===&lt;br /&gt;
# [[Modultest]]: Ergänze zwei Randfalltests und zwei Fehlerfalltests, ohne die ursprünglichen Tests umzuschreiben.&lt;br /&gt;
# [[Git]]: Erstelle einen Test-Commit und einen getrennten Refactoring-Commit; erkläre dem Partner die Unterschiede.&lt;br /&gt;
# [[Code-Review]]: Tausche den Diff mit einer anderen Person und dokumentiere zwei nachvollziehbare Review-Entscheidungen.&lt;br /&gt;
# [[Fehlerbehandlung]]: Begründe an &amp;quot;Motor;3;5&amp;quot;, weshalb ein stilles Ignorieren nicht rückwärtskompatibel wäre.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
=== Schwer ===&lt;br /&gt;
# [[Rückwärtskompatibilität]]: Plane eine strengere Importprüfung als eigene Funktion oder Version mit eigenem Ticket und neuen Akzeptanztests.&lt;br /&gt;
# [[Versionsverwaltung]]: Simuliere in einem Übungsbranch einen Regressionstestfehler und führe eine dokumentierte kontrollierte Rücknahme durch.&lt;br /&gt;
# [[Künstliche Intelligenz]]: Erstelle einen begrenzten Agentenauftrag, prüfe einen hypothetischen unerlaubten Dateizugriff und erkläre den Stopp.&lt;br /&gt;
# [[Softwarewartung]]: Übertrage die drei Kompatibilitätskriterien auf einen synthetischen JSON-Import samt README, Grenzfällen und Review.&lt;br /&gt;
&lt;br /&gt;
{{:Offene Aufgabe - MOOC erstellen}}&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= Lernkontrolle =&lt;br /&gt;
# [[Softwarequalität]]: Begründe am Beispiel die Trennung von besserer Struktur und identischem beobachtbarem Verhalten.&lt;br /&gt;
# [[Testabdeckung]]: Ordne vier konkrete Testfälle den Vertragszusagen zu und benenne eine verbleibende Unsicherheit.&lt;br /&gt;
# [[Rückwärtskompatibilität]]: Entscheide, ob ein neuer Pflichtparameter vereinbarte Aufrufer bricht, und schlage eine sichere Alternative vor.&lt;br /&gt;
# [[Fehlerbehandlung]]: Erkläre die erwartete Reaktion auf drei Spalten und welche Änderung daran fachlich neu genehmigt werden müsste.&lt;br /&gt;
# [[Git]]: Beschreibe den Rücknahmeweg nach einem schon geteilten fehlerhaften Commit und begründe deine Entscheidung.&lt;br /&gt;
# [[Code-Review]]: Formuliere begründete Annahme- oder Ablehnungsentscheidungen für einen KI-Diff mit zusätzlichen Datenprüfungen.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= Lernnachweis =&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Lernprodukt:&amp;#039;&amp;#039;&amp;#039; Ein lauffähiges, kompatibel refaktoriertes Python-Importmodul mit unveränderter Funktion importiere(text), einer begründeten Hilfsfunktion, einem reproduzierbaren unittest-Testpaket und einer kurzen Wartungsdokumentation.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Abgabe:&amp;#039;&amp;#039;&amp;#039; Ausgangsversion und Refactoring-Version; unveränderte vier Basistests plus zwei eigene Fälle; Testprotokoll mit Python-Version und tatsächlichen Ergebnissen; Diff oder klar beschriebene Änderung; separater Git-Commit oder benannte Sicherungskopie; menschliche Review-Notiz; klarer Rücknahmeplan; begründeter Fehlerfall; Trennung eventuell neuer Validierungsregeln vom eigentlichen Refactoring. Ohne Internet, KI oder Git ist eine dokumentierte manuelle Versionierung zulässig.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Bewertungsraster:&amp;#039;&amp;#039;&amp;#039; 30 Prozent korrekte Kompatibilitätsbelege; 25 Prozent Klarheit der Struktur; 20 Prozent Fehlerszenarien und offene Unsicherheiten; 15 Prozent Review und Rücknahme; 10 Prozent langfristige Dokumentation und Transfer. Weise jedes der drei Kernkriterien an einem wirklichen Beispiel nach und erkläre eigene Entscheidungen.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= OER und Wikipedia =&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Recherche- und Medienstand: 22.10.2026.&amp;#039;&amp;#039;&amp;#039; Die aufgeführten Versionen und Videodatensätze wurden bei der Recherche geprüft, doch künftige Aktualisierungen und Embedding-Beschränkungen bleiben möglich.&lt;br /&gt;
* [https://refactoring.com/ Martin Fowler: Refactoring] – primäre Definition von Refactoring und Katalog; Buchauflage 2018, Webpräsentation fortlaufend.&lt;br /&gt;
* [https://docs.python.org/3/library/unittest.html Python: unittest] – offizielles Testmodul; dokumentierte Website-Version bei Recherche Python 3.15.1.&lt;br /&gt;
* [https://git-scm.com/docs/git-revert Git: git revert] – offizielle Anleitung zur gezielten Rücknahme eines Commits; Versionsdetails sind lokal zu prüfen.&lt;br /&gt;
* [https://modelcontextprotocol.io/docs/2026-07-28/tutorials/security/security_best_practices Model Context Protocol: Security Best Practices] – Security-Dokumentation in der Fassung vom 28.07.2026.&lt;br /&gt;
* [https://doi.org/10.6028/NIST.AI.600-1 NIST AI 600-1] – Generative AI Profile, Juli 2024; freiwilliges Risikomanagement und keine App-Zertifizierung.&lt;br /&gt;
* [https://de.wikipedia.org/wiki/Refactoring Wikipedia: Refactoring] und [https://de.wikipedia.org/wiki/Regressionstest Wikipedia: Regressionstest] – ergänzende, frei zugängliche Einordnungen.&lt;br /&gt;
* [https://moocwiki.org/index.php?curid=60512 Bereits vorhandene Lernbasis] – als Voraussetzung genannt; Seiteninhalt konnte nicht vollständig überprüft werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iframe&amp;gt; https://de.m.wikipedia.org/wiki/Refactoring &amp;lt;/iframe&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Dateiseiten, Urheberschaft und Nutzungsrechte:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Dateiname !! Dateiseite !! Autor !! Lizenz&lt;br /&gt;
|-&lt;br /&gt;
| File:Software Development Lifecycle Diagram.png || [https://commons.wikimedia.org/wiki/File:Software_Development_Lifecycle_Diagram.png Wikimedia Commons] || Shawn Rider || [https://creativecommons.org/licenses/by-sa/4.0/ CC BY-SA 4.0]&lt;br /&gt;
|-&lt;br /&gt;
| File:Testing Pyramid.svg || [https://commons.wikimedia.org/wiki/File:Testing_Pyramid.svg Wikimedia Commons] || Abbe98 || [https://creativecommons.org/licenses/by-sa/4.0/ CC BY-SA 4.0]&lt;br /&gt;
|-&lt;br /&gt;
| File:Basic git branching workflow (GitLab).svg || [https://commons.wikimedia.org/wiki/File:Basic_git_branching_workflow_(GitLab).svg Wikimedia Commons] || TheresNoTime || [https://creativecommons.org/licenses/by-sa/4.0/ CC BY-SA 4.0]&lt;br /&gt;
|-&lt;br /&gt;
| File:Merge bugFix.gif || [https://commons.wikimedia.org/wiki/File:Merge_bugFix.gif Wikimedia Commons] || MonkeyWaffle || [https://creativecommons.org/licenses/by-sa/4.0/ CC BY-SA 4.0]&lt;br /&gt;
|-&lt;br /&gt;
| File:Testgetriebener Entwicklungsprozess.svg || [https://commons.wikimedia.org/wiki/File:Testgetriebener_Entwicklungsprozess.svg Wikimedia Commons] || MovGP0 || [https://commons.wikimedia.org/wiki/File:Testgetriebener_Entwicklungsprozess.svg Lizenz auf der Dateiseite vor Nachnutzung prüfen]&lt;br /&gt;
|-&lt;br /&gt;
| File:Computer keyboard.ogg || [https://commons.wikimedia.org/wiki/File:Computer_keyboard.ogg Wikimedia Commons] || russiandoll || [https://commons.wikimedia.org/wiki/File:Computer_keyboard.ogg Gemeinfrei laut Dateiseite]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Videos:&amp;#039;&amp;#039;&amp;#039; [https://www.youtube.com/watch?v=v1ibwg3zaQQ Mit Mario: Git-Tutorial, 25.11.2022] und [https://www.youtube.com/watch?v=bsU7AFjh4m8 ArjanCodes: Python-Refactoring, November 2025]. Öffentliche Videodatensätze waren auffindbar; aktuelles Abspielen und Einbetten sind plattformabhängig und die Videos wurden nicht als OER-lizenziert verifiziert. Alle Kernaufgaben sind auch ohne externe Medien durch Text und lokale Dateien lösbar.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= Verknüpfte Lernbereiche =&lt;br /&gt;
{| align=center&lt;br /&gt;
{{:D-Tab}}&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;[[Refactoring]]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
# [[Lesbarkeit]]&lt;br /&gt;
# [[Wartbarkeit]]&lt;br /&gt;
# [[Rückwärtskompatibilität]]&lt;br /&gt;
# [[Code-Review]]&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;[[Softwaretest]]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
# [[Regressionstest]]&lt;br /&gt;
# [[Modultest]]&lt;br /&gt;
# [[Testautomatisierung]]&lt;br /&gt;
# [[Fehlerbehandlung]]&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;[[Versionsverwaltung]]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
# [[Git]]&lt;br /&gt;
# [[Commit]]&lt;br /&gt;
# [[Branch (Versionsverwaltung)|Branch]]&lt;br /&gt;
# [[Änderungsmanagement]]&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;[[KI-Agent]]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
# [[Künstliche Intelligenz]]&lt;br /&gt;
# [[Informationssicherheit]]&lt;br /&gt;
# [[Softwarequalität]]&lt;br /&gt;
# [[Softwareentwicklung]]&lt;br /&gt;
|}&lt;br /&gt;
[[Category:Sprache:Deutsch]]&lt;br /&gt;
[[Category:Locale:de-DE]]&lt;br /&gt;
[[Category:Programmierung]]&lt;br /&gt;
[[Category:Berufsausbildung]]&lt;br /&gt;
[[Category:Softwareentwicklung]]&lt;br /&gt;
[[Category:Informatik]]&lt;br /&gt;
[[Category:Python]]&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= aiMOOC-Projekte =&lt;br /&gt;
[[Category:AI_MOOC]] [[Category:GPT aiMOOC]]&lt;br /&gt;
{{MT}}&lt;/div&gt;</summary>
		<author><name>Glanz</name></author>
	</entry>
</feed>