{"id":322,"date":"2026-09-05T18:15:29","date_gmt":"2026-09-05T18:15:29","guid":{"rendered":"https:\/\/www.fabricioruch.ch\/?p=322"},"modified":"2026-09-05T18:15:30","modified_gmt":"2026-09-05T18:15:30","slug":"wann-ein-skript-aufhoert-ein-skript-zu-sein","status":"publish","type":"post","link":"https:\/\/www.fabricioruch.ch\/?p=322","title":{"rendered":"Wann ein Skript aufh\u00f6rt, ein Skript zu sein"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Ein Skript beginnt oft harmlos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Es soll eine klar umrissene Aufgabe erledigen. Eine API aufrufen. Dateien verschieben. Daten bereinigen. Benutzer anlegen. E-Mails verarbeiten. Einen wiederkehrenden manuellen Ablauf automatisieren.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die erste Version ist entsprechend einfach:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>verbinden\ndaten laden\ndaten ver\u00e4ndern\nfertig\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Das ist v\u00f6llig legitim. F\u00fcr kleine, lineare Aufgaben ist ein einzelnes Skript oft die beste L\u00f6sung. Wenig Struktur, wenig Overhead, kurze Entwicklungszeit.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Problematisch wird es nicht dadurch, dass das Skript l\u00e4nger wird. Problematisch wird es dann, wenn es beginnt, <strong>unterschiedliche Verantwortlichkeiten gleichzeitig zu tragen<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dann ist es funktional noch ein Skript, strukturell aber bereits eine Anwendung.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Der gef\u00e4hrliche \u00dcbergang<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Dieser \u00dcbergang passiert selten bewusst.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Kaum jemand entscheidet:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Ab heute ist dieses Skript eine Anwendung.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Stattdessen kommen Anforderungen einzeln dazu.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Zuerst soll das Skript nur eine Aktion ausf\u00fchren.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dann soll es Unterordner ber\u00fccksichtigen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dann Paging.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dann Retry.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dann Fortschritt anzeigen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dann einen Dry Run unterst\u00fctzen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dann Fehler nach einem Neustart fortsetzen k\u00f6nnen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dann sollen mehrere Konten unterst\u00fctzt werden.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dann braucht man Logs.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dann JSON-Ausgabe f\u00fcr Automatisierung.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dann Tests.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dann eine sch\u00f6nere Benutzeroberfl\u00e4che.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Jede einzelne Anforderung wirkt klein genug, um sie einfach noch in die bestehende Datei einzubauen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Genau hier entsteht das Problem.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die Architektur w\u00e4chst nicht mit den Anforderungen mit. Stattdessen w\u00e4chst nur die Datei.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Ein typischer Verlauf<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Eine erste Version sieht vielleicht so aus:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Connect-Service\n\n$items = Get-Items\n\nforeach ($item in $items) {\n    Update-Item $item\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Das ist \u00fcberschaubar.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dann kommt Pagination:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>while ($nextLink) {\n    ...\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Dann Retry:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>try {\n    ...\n}\ncatch {\n    Start-Sleep\n    ...\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Dann Fortschritt:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Write-Progress\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Dann Zust\u00e4nde:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$processed++\n$failed++\n$currentFolder = ...\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Dann Wiederaufnahme:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$checkpoint = Import-Clixml ...\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Dann Benutzeroberfl\u00e4che:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Write-Host ...\nClear-Host\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Dann verschiedene Betriebsmodi:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>param(\n    &#91;switch]$Audit,\n    &#91;switch]$Force,\n    &#91;switch]$Quiet,\n    &#91;switch]$Resume\n)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Irgendwann enth\u00e4lt dieselbe Datei:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Authentifizierung<\/li>\n\n\n\n<li>API-Zugriffe<\/li>\n\n\n\n<li>Paging<\/li>\n\n\n\n<li>Retry<\/li>\n\n\n\n<li>Batch-Verarbeitung<\/li>\n\n\n\n<li>Zustandsverwaltung<\/li>\n\n\n\n<li>UI<\/li>\n\n\n\n<li>Logging<\/li>\n\n\n\n<li>Fehlerbehandlung<\/li>\n\n\n\n<li>Persistenz<\/li>\n\n\n\n<li>Konfiguration<\/li>\n\n\n\n<li>Argumentverarbeitung<\/li>\n\n\n\n<li>Testbarkeit<\/li>\n\n\n\n<li>Ausgabeformatierung<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Dann ist die relevante Frage nicht mehr:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Wie f\u00fcge ich noch eine Funktion hinzu?<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Sondern:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Warum ist das alles \u00fcberhaupt noch in derselben Datei?<\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">L\u00e4nge ist nicht das eigentliche Problem<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Eine Datei mit 1&#8217;000 Zeilen ist nicht automatisch schlecht.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Eine Datei mit 150 Zeilen kann bereits strukturell problematisch sein.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Entscheidend ist nicht die Anzahl der Zeilen, sondern die Anzahl der <strong>Gr\u00fcnde, warum sich der Code \u00e4ndern muss<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn eine Datei ge\u00e4ndert werden muss, weil:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>die API ge\u00e4ndert wurde,<\/li>\n\n\n\n<li>das UI anders aussehen soll,<\/li>\n\n\n\n<li>ein neuer Betriebsmodus dazukommt,<\/li>\n\n\n\n<li>Checkpoints anders gespeichert werden,<\/li>\n\n\n\n<li>Retry-Verhalten angepasst wird,<\/li>\n\n\n\n<li>eine neue Ausgabeform hinzukommt,<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">dann tr\u00e4gt sie zu viele Verantwortlichkeiten.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Das ist genau die Art von Kopplung, die sp\u00e4tere \u00c4nderungen teuer macht.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Das klassische Symptom: Lokale Fixes erzeugen neue Fehler<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ein wichtiger Warnhinweis ist, wenn neue Fehler zunehmend durch fr\u00fchere L\u00f6sungen entstehen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Beispiel:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ein Skript flackert beim Rendern.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Also wird <code>Clear-Host<\/code> entfernt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Danach bleiben alte Bildschirmreste stehen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Also wird ein In-Place-Renderer gebaut.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Danach stimmen Zeilenl\u00e4ngen nicht mehr.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Also wird Padding erg\u00e4nzt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Danach funktionieren Unicode-Zeichen nicht zuverl\u00e4ssig.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Also wird Encoding angepasst.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Danach entstehen Probleme bei bestimmten PowerShell-Typen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Jeder einzelne Fix kann sinnvoll sein.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Trotzdem verschlechtert sich das Gesamtsystem.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Das Problem liegt dann nicht in einem bestimmten Bug.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Das Problem liegt in der Struktur.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Die entscheidende Erkenntnis<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ein Skript h\u00f6rt nicht dann auf, ein Skript zu sein, wenn es \u201egro\u00df\u201c wird.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Es h\u00f6rt dann auf, ein Skript zu sein, wenn es <strong>einen eigenen Lebenszyklus<\/strong> entwickelt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dazu geh\u00f6ren typischerweise:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Initialisierung<\/li>\n\n\n\n<li>Konfiguration<\/li>\n\n\n\n<li>Zust\u00e4nde<\/li>\n\n\n\n<li>Fehlerf\u00e4lle<\/li>\n\n\n\n<li>Wiederaufnahme<\/li>\n\n\n\n<li>Benutzerinteraktion<\/li>\n\n\n\n<li>verschiedene Betriebsmodi<\/li>\n\n\n\n<li>externe Schnittstellen<\/li>\n\n\n\n<li>Tests<\/li>\n\n\n\n<li>Persistenz<\/li>\n\n\n\n<li>Versionierung<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Ein lineares Skript hat einen Ablauf.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Eine Anwendung hat Zust\u00e4nde.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Das ist ein fundamentaler Unterschied.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Linearer Ablauf versus Zustandsmaschine<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ein einfaches Skript denkt so:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>start\n  \u2193\naktion 1\n  \u2193\naktion 2\n  \u2193\naktion 3\n  \u2193\nende\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Eine Anwendung denkt eher so:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>INITIALIZING\n      \u2193\nCONNECTING\n      \u2193\nREADY\n      \u2193\nPROCESSING\n      \u2193\nVERIFYING\n      \u2193\nCOMPLETED\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Zus\u00e4tzlich:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ERROR\nCANCELLED\nRETRYING\nRESUMING\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Sobald solche Zust\u00e4nde relevant werden, sollte der Code sie explizit modellieren.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Andernfalls entstehen sie trotzdem.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dann sind sie nur versteckt in:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$connected = $true\n$processing = $false\n$failed = 3\n$currentFolder = ...\n$retryCount = ...\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Das ist implizite Zustandslogik.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Und implizite Zustandslogik ist schwer zu testen und schwer zu verstehen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Der Moment f\u00fcr das Refactoring<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Der richtige Zeitpunkt f\u00fcr ein Refactoring liegt deutlich fr\u00fcher, als viele Entwickler denken.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nicht erst dann, wenn die Datei unwartbar ist.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sondern wenn erkennbar wird, dass zus\u00e4tzliche Anforderungen <strong>neue Arten von Verantwortung<\/strong> einf\u00fchren.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ein pragmatisches Signal ist:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn eine neue Funktion eine neue dieser Kategorien einf\u00fchrt, sollte die Struktur \u00fcberpr\u00fcft werden:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>UI\nPersistenz\nNetzwerk\nRetry\nState\nParallelit\u00e4t\nResume\nKonfiguration\nTests\nMachine Output\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn bereits mehrere davon existieren, ist die Schwelle meist \u00fcberschritten.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Aus einem Skript wird ein kleines System<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Der nat\u00fcrliche n\u00e4chste Schritt ist nicht automatisch ein gro\u00dfes Framework.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Oft gen\u00fcgt eine kleine, klare Modulstruktur.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Zum Beispiel:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>File-For-Bankruptcy.ps1\n\nFileForBankruptcy.psm1\n\nPublic\/\n    Invoke-FileForBankruptcy.ps1\n\nPrivate\/\n    Graph.ps1\n    State.ps1\n    Checkpoint.ps1\n    UI.Terminal.ps1\n    UI.Screens.ps1\n\nTests\/\n    Graph.Tests.ps1\n    Checkpoint.Tests.ps1\n    Module.Tests.ps1\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Das sieht zun\u00e4chst nach mehr Dateien aus.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Aber mehr Dateien bedeuten nicht automatisch mehr Komplexit\u00e4t.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Im Gegenteil.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die Komplexit\u00e4t existiert bereits.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die Dateien machen sie nur sichtbar.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Der Launcher<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Der Einstiegspunkt sollte m\u00f6glichst langweilig sein.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Zum Beispiel:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Import-Module .\/FileForBankruptcy.psd1\n\nInvoke-FileForBankruptcy @args\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Der Launcher ist nicht der Ort f\u00fcr Gesch\u00e4ftslogik.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Er startet nur die Anwendung.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Das klingt banal, hat aber einen gro\u00dfen Vorteil: Der eigentliche Code kann als Modul geladen, getestet und wiederverwendet werden.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Public und Private<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Eine sinnvolle Trennung ist:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Public\/\nPrivate\/\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Unter <code>Public<\/code> liegen Funktionen, die Teil der offiziellen Oberfl\u00e4che sind.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Zum Beispiel:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Invoke-FileForBankruptcy\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Unter <code>Private<\/code> liegt die Implementierung.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Zum Beispiel:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Get-FBMailFolders\nInvoke-FBGraphBatch\nSave-FBCheckpoint\nShow-FBProcessingScreen\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Das verbessert nicht nur die \u00dcbersicht.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Es zwingt dazu, \u00fcber die \u00f6ffentliche API des eigenen Tools nachzudenken.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">API-Zugriffe geh\u00f6ren in eine eigene Schicht<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Netzwerkcode sollte m\u00f6glichst nicht direkt mit UI-Code vermischt werden.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Schlecht:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Write-Host \"Processing folder...\"\n\n$response = Invoke-MgGraphRequest ...\n\nWrite-Host \"Done\"\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Besser:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$result = Invoke-FBFolderProcessing\nShow-FBFolderResult $result\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Die API-Funktion wei\u00df dann nichts \u00fcber Farben, Spinner oder Terminalbreite.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sie liefert Daten.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Zum Beispiel:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;pscustomobject]@{\n    Folder    = $folderName\n    Success   = 120\n    Failed    = 2\n    Retried   = 4\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Die UI entscheidet, wie diese Daten dargestellt werden.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Das ist mehr als \u201eClean Code\u201c<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Diese Trennung hat einen sehr praktischen Nutzen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn dieselbe Engine sowohl eine TUI als auch JSON-Ausgabe erzeugen kann, ist die Architektur wahrscheinlich gesund.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Zum Beispiel:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.\\tool.ps1\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">liefert eine interaktive Oberfl\u00e4che.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Und:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.\\tool.ps1 -Quiet\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">liefert:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n  \"processed\": 120,\n  \"failed\": 0,\n  \"remaining\": 0\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Die Gesch\u00e4ftslogik ist dieselbe.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nur der Renderer ist ein anderer.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Das ist ein gutes Architektur-Signal.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Quiet Mode als Architekturtest<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ein <code>-Quiet<\/code>-Modus wirkt zun\u00e4chst wie ein kleines Feature.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tats\u00e4chlich ist er ein hervorragender Test.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn <code>-Quiet<\/code> schwer einzubauen ist, weil \u00fcberall im Code direkt <code>Write-Host<\/code> verwendet wird, ist die UI zu stark mit der Logik gekoppelt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn die Kernlogik stattdessen nur Objekte zur\u00fcckgibt, ist es einfach:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$result = Invoke-Processing\n\nif ($Quiet) {\n    $result | ConvertTo-Json\n}\nelse {\n    Show-Result $result\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Die Ausgabeform wird damit austauschbar.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><code>-WhatIf<\/code> ist mehr als Komfort<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ein weiteres Reifezeichen ist echtes PowerShell-Verhalten.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mit:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;CmdletBinding(SupportsShouldProcess = $true)]\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">kann das Tool native Mechanismen unterst\u00fctzen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.\\tool.ps1 -WhatIf\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Das ist deutlich besser als ein selbst erfundener <code>-DryRun<\/code>, wenn das Tool ohnehin in PowerShell lebt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Der Vorteil ist nicht nur Konvention.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>ShouldProcess<\/code> zwingt dazu, klar zu definieren:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Was genau ist die mutierende Operation?<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Das ist eine Architekturfrage.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Audit und Mutation sollten getrennt sein<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ein gutes Tool trennt:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Was w\u00fcrde passieren?\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">von:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>F\u00fchre es aus.\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Das ergibt zwei klar unterschiedliche Phasen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>AUDIT\n\u2192 Zustand lesen\n\u2192 Umfang bestimmen\n\u2192 Risiken anzeigen\n\nEXECUTION\n\u2192 \u00c4nderungen durchf\u00fchren\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Das verbessert Sicherheit und Verst\u00e4ndlichkeit.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nebenbei kann der Audit oft mit geringeren Berechtigungen laufen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Beispiel:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Audit:\nMail.Read\n\nMutation:\nMail.ReadWrite\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Das ist Least Privilege praktisch umgesetzt.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Retry ist keine Fehlerbehandlung<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ein h\u00e4ufiger Fehler ist:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>catch {\n    Start-Sleep 2\n    retry\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Das wirkt robust, ist aber oft nur verschobenes Scheitern.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ausgereifte Retry-Logik unterscheidet mindestens:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>429\n5xx\n4xx\nTimeout\nPartial Batch Failure\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ein <code>429 Too Many Requests<\/code> ist etwas anderes als ein <code>403 Forbidden<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ein <code>500<\/code> ist etwas anderes als ein ung\u00fcltiger Request.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die Reaktion muss entsprechend unterschiedlich sein.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Partial Failure ver\u00e4ndert die Architektur<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Bei Batch-Operationen gibt es nicht nur:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>erfolgreich\nfehlgeschlagen\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ein Batch kann so aussehen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>20 Requests\n\n18 erfolgreich\n1 throttled\n1 dauerhaft fehlgeschlagen\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Dann muss der Zustand pro Element modelliert werden.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Zum Beispiel:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SucceededIds\nRetryIds\nFailedIds\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ein simples:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Success = 18\nFailed = 2\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">reicht sp\u00e4testens dann nicht mehr, wenn Resume oder Checkpoints unterst\u00fctzt werden.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Resume macht aus einem Skript endg\u00fcltig eine Anwendung<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Wiederaufnahme ist eine klare Grenze.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sobald ein Tool nach einem Abbruch sp\u00e4ter weiterarbeiten k\u00f6nnen soll, braucht es persistenten Zustand.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Zum Beispiel:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n  \"processedMessageIds\": &#91;\n    \"abc\",\n    \"def\"\n  ],\n  \"startedAt\": \"2026-09-05T14:00:00Z\"\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ab diesem Punkt existiert Zustand au\u00dferhalb des Prozesses.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Das bedeutet:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Versionierung<\/li>\n\n\n\n<li>Konsistenz<\/li>\n\n\n\n<li>Fehlerf\u00e4lle beim Laden<\/li>\n\n\n\n<li>veraltete Checkpoints<\/li>\n\n\n\n<li>teilweise abgeschlossene Arbeit<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Das ist Anwendungslogik.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Kein einfacher linearer Skriptablauf mehr.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Checkpoints m\u00fcssen semantisch korrekt sein<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ein besonders gef\u00e4hrlicher Fehler ist:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>versucht\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">mit:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>erfolgreich\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">zu verwechseln.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ein Checkpoint darf nicht einfach alle verarbeiteten IDs speichern.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Er muss wissen, welche Operation tats\u00e4chlich erfolgreich war.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sonst entsteht dieses Problem:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Message A\nPATCH erfolgreich\n\u2192 gespeichert\n\nMessage B\nPATCH fehlgeschlagen\n\u2192 ebenfalls gespeichert\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Beim Resume wird Message B dann \u00fcbersprungen, obwohl sie nie erfolgreich ver\u00e4ndert wurde.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Das ist ein gutes Beispiel daf\u00fcr, warum Datenmodelle wichtiger werden, sobald Resume existiert.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Verifikation geh\u00f6rt zum Erfolg<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ein Tool sollte nicht nur sagen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>56 requests completed\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">und daraus ableiten:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SUCCESS\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Die relevante Frage ist:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Ist der gew\u00fcnschte Zustand tats\u00e4chlich erreicht?<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Das sind zwei unterschiedliche Dinge.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Operation Success\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">und:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>State Success\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Beispiel:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>56 PATCH Requests erfolgreich\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">ist eine Aussage \u00fcber Operationen.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>0 unread messages remaining\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">ist eine Aussage \u00fcber den Zustand.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die zweite ist oft wichtiger.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Deshalb ist ein Post-Run-Audit sinnvoll:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Mutation\n  \u2193\nVerification\n  \u2193\nFinal Result\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Tests werden pl\u00f6tzlich sinnvoller<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Bei einem kleinen Wegwerfskript ist ein Testframework oft unn\u00f6tig.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Aber sobald Funktionen wie diese existieren:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Paging\nRetry\nResume\nBatching\nCheckpoint\nVerification\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">werden Tests extrem wertvoll.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nicht nur Happy-Path-Tests.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Gerade Fehlerf\u00e4lle sollten modelliert werden.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Zum Beispiel:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Paging ohne nextLink\nPaging mit mehreren Seiten\n\n429 \u2192 Retry\n500 \u2192 Retry\n403 \u2192 kein Retry\n\nBatch mit 20 Erfolgen\nBatch mit 19 Erfolgen und 1 Fehler\nBatch mit fehlender Response\n\nCheckpoint speichert nur erfolgreiche IDs\n\nResume verarbeitet fehlgeschlagene IDs erneut\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Das sind die Stellen, an denen reale Produktionsfehler entstehen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Der wichtigste Architekturtest<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ein sehr einfacher Test lautet:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Kann ich die Kernlogik ohne Terminal starten?<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn nein, ist die TUI wahrscheinlich zu stark gekoppelt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ein zweiter:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Kann ich die API-Schicht testen, ohne echte API-Calls auszuf\u00fchren?<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn nein, sind Abh\u00e4ngigkeiten wahrscheinlich zu hart verdrahtet.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ein dritter:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Kann ich die Verarbeitung mit einem gespeicherten Zustand wieder aufnehmen?<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn nein, ist State wahrscheinlich nicht explizit genug modelliert.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Nicht \u00fcber-engineeren<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Die Gegenreaktion w\u00e4re falsch:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Jedes Skript sofort in 30 Dateien zerlegen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Auch das erzeugt Komplexit\u00e4t.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ein einfaches Skript sollte einfach bleiben.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Zum Beispiel:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Get-ChildItem *.log |\n    Where-Object LastWriteTime -lt (Get-Date).AddDays(-30) |\n    Remove-Item\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Das braucht keine Module, Domain Objects und Repository Interfaces.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die Struktur sollte mit der tats\u00e4chlichen Problemkomplexit\u00e4t wachsen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nicht mit theoretischen M\u00f6glichkeiten.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Eine praktische Heuristik<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ein einzelnes Skript ist meist noch passend, wenn:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>der Ablauf linear ist<\/li>\n\n\n\n<li>kein persistenter Zustand existiert<\/li>\n\n\n\n<li>Fehler einfach behandelt werden k\u00f6nnen<\/li>\n\n\n\n<li>nur ein Betriebsmodus existiert<\/li>\n\n\n\n<li>keine aufwendige UI notwendig ist<\/li>\n\n\n\n<li>wenig externe Integration existiert<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Ein Umbau wird interessant, wenn mehrere dieser Punkte auftauchen:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>mehrere Betriebsmodi<\/li>\n\n\n\n<li>API-Paging<\/li>\n\n\n\n<li>Retry<\/li>\n\n\n\n<li>Batch-Verarbeitung<\/li>\n\n\n\n<li>komplexe Fehlerbehandlung<\/li>\n\n\n\n<li>UI oder TUI<\/li>\n\n\n\n<li>Resume<\/li>\n\n\n\n<li>Checkpoints<\/li>\n\n\n\n<li>Machine-readable Output<\/li>\n\n\n\n<li>Tests<\/li>\n\n\n\n<li>mehrere Konten oder Targets<\/li>\n\n\n\n<li>unterschiedliche Berechtigungen<\/li>\n\n\n\n<li>Post-Verification<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Nicht einer dieser Punkte allein macht eine Anwendung.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die Kombination tut es.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Die eigentliche Lektion<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Viele Entwickler betrachten Refactoring als Arbeit, die nach der eigentlichen Funktionalit\u00e4t kommt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Das ist zu kurz gedacht.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Refactoring wird notwendig, wenn die bestehende Struktur beginnt, neue Anforderungen falsch abzubilden.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Der entscheidende Zeitpunkt ist also nicht:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Der Code sieht unsauber aus.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Sondern:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Neue Features erzeugen \u00fcberproportional viele Wechselwirkungen mit bestehenden Features.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Dann ist die aktuelle Abstraktion ersch\u00f6pft.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Der zw\u00f6lfte Patch ist ein Signal<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn ein Tool bereits diese Geschichte hat:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Bug\n\u2192 Patch\n\u2192 neuer Bug\n\u2192 Patch\n\u2192 Seiteneffekt\n\u2192 Patch\n\u2192 neuer Sonderfall\n\u2192 Patch\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">dann ist der n\u00e4chste Fehler oft nicht mehr das eigentliche Problem.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Das System versucht mitzuteilen:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Die Struktur passt nicht mehr zur Komplexit\u00e4t.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Dann ist ein weiterer Patch m\u00f6glicherweise technisch korrekt und trotzdem die falsche Entscheidung.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die bessere Frage lautet:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Welche Verantwortung fehlt als eigene Abstraktion?<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Vielleicht:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Graph Client\nCheckpoint Store\nState Model\nRenderer\nCommand Handler\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Das ist der Punkt, an dem Refactoring nicht kosmetisch ist.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Es wird funktional.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Fazit<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ein Skript h\u00f6rt nicht auf, ein Skript zu sein, weil es viele Zeilen hat.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Es h\u00f6rt auf, ein Skript zu sein, wenn es beginnt, Eigenschaften einer Anwendung zu entwickeln:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>State\nLifecycle\nRecovery\nMultiple Interfaces\nPersistence\nVerification\nTests\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Dann sollte die Architektur das auch widerspiegeln.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nicht mit m\u00f6glichst vielen Patterns.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nicht mit unn\u00f6tigen Frameworks.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sondern mit klaren Verantwortlichkeiten.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die wichtigste Frage bei jedem weiteren Feature lautet deshalb nicht:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Wo f\u00fcge ich diesen Code ein?<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Sondern:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Geh\u00f6rt diese neue Verantwortung \u00fcberhaupt noch in die bestehende Struktur?<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn diese Frage zu sp\u00e4t gestellt wird, entsteht ein gro\u00dfes Skript.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn sie rechtzeitig gestellt wird, entsteht ein kleines, gut strukturiertes System.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ein Skript beginnt oft harmlos. Es soll eine klar umrissene Aufgabe erledigen. Eine API aufrufen. Dateien verschieben. Daten bereinigen. Benutzer anlegen. E-Mails verarbeiten. Einen wiederkehrenden manuellen Ablauf automatisieren. Die erste Version ist entsprechend einfach: Das ist v\u00f6llig legitim. F\u00fcr kleine, lineare Aufgaben ist ein einzelnes Skript oft die beste L\u00f6sung. Wenig Struktur, wenig Overhead, kurze [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":334,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[60,33,27,8,25,59,36],"tags":[],"class_list":["post-322","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-automation","category-methods","category-programming-principles","category-software-architecture","category-software-engineering","category-system-engineering","category-workflow-systems"],"_links":{"self":[{"href":"https:\/\/www.fabricioruch.ch\/index.php?rest_route=\/wp\/v2\/posts\/322","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.fabricioruch.ch\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.fabricioruch.ch\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.fabricioruch.ch\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.fabricioruch.ch\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=322"}],"version-history":[{"count":1,"href":"https:\/\/www.fabricioruch.ch\/index.php?rest_route=\/wp\/v2\/posts\/322\/revisions"}],"predecessor-version":[{"id":323,"href":"https:\/\/www.fabricioruch.ch\/index.php?rest_route=\/wp\/v2\/posts\/322\/revisions\/323"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.fabricioruch.ch\/index.php?rest_route=\/wp\/v2\/media\/334"}],"wp:attachment":[{"href":"https:\/\/www.fabricioruch.ch\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=322"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fabricioruch.ch\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=322"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fabricioruch.ch\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=322"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}