Wikipedia · einfach zusammengefasst · Stand
Anti-Pattern
Ein Anti-Pattern (aus dem Englischen, übersetzt etwa Antimuster) ist ein Oberbegriff für Verhaltensmuster, die speziell in der Softwareentwicklung …
Inhalt6 Abschnitte
Begriff und Zweck
Ein Anti-Pattern (etwa: Antimuster) bezeichnet in der Softwareentwicklung einen Lösungs- oder Verhaltensansatz, der für den Erfolg eines Projekts oder einer Organisation ungünstig oder schädlich ist. Es ist das Gegenstück zu einem Pattern, also einem guten, bewährten Problemlösungsansatz. Anti-Pattern helfen dabei, wiederkehrende Fehler zu erkennen, zu dokumentieren und Gegenmaßnahmen zu finden.
Das Musterkonzept wurde besonders durch das Buch „Entwurfsmuster. Elemente wiederverwendbarer objektorientierter Software“ von 1994 bekannt. Anti-Pattern betreffen nicht nur Quelltext und Softwarearchitektur, sondern auch Projektmanagement, Unternehmensprozesse, Organisation und Management. Sie entstehen meist durch fehlende Erfahrung oder Qualifikation; sie können aber auch bewusst eingesetzt werden, um eigene Ziele zu verfolgen, die vom eigentlichen Projektziel abweichen.
Der Artikel weist darauf hin, dass seine Angaben nicht ausreichend belegt sind.
Einordnung und Projektmanagement
Anti-Pattern werden von der Programmierung über Architektur und Entwurf bis zu Projektmanagement, Unternehmensorganisation und Management unterschieden. Probleme direkt im Programmcode heißen oft Code-Smells; sie können bei Erkennen durch Refactoring, also das Umstrukturieren des Codes ohne Änderung seines Verhaltens, beseitigt werden. Meta-Patterns fassen mehrere Muster zu abstrakteren Mustern zusammen oder ergänzen neue Betrachtungsdimensionen.
Im Projektmanagement bedeutet Blendwerk (Smoke and mirrors), unfertige Funktionen als fertig erscheinen zu lassen. Aufgeblähte Software enthält unnötige Zusatzfunktionen oder verschwendet Ressourcen, ohne den eigentlichen Zweck wesentlich zu verbessern.
Feature creep ist die dauernde Erweiterung der geplanten Funktionalität. Dadurch können Design, Termine und Kosten aus dem Plan geraten. Systematisches Anforderungs- und Änderungsmanagement ist deshalb sowohl bei konventionellen als auch bei agilen Prozessen wie Extreme Programming (XP) erforderlich. Änderungen sind in großen Projekten dennoch oft schwer vermeidbar, weil Anforderungen erst während der Entwicklung sichtbar werden können. Scope creep ist ähnlich, bezieht sich aber auf nachträglich vergrößerte Anwendungsbereiche; dagegen soll konsequentes Inhalts- und Umfangsmanagement helfen.
Das Brooks’sche Gesetz besagt: „Adding manpower to a late software project makes it later.“ Neue Mitarbeitende brauchen Einarbeitung und bremsen dabei die bereits eingearbeiteten Kollegen. Ein Death Sprint liefert in viel zu kurzen Iterationen scheinbar erfolgreich neue Versionen aus, während die sichtbare und technische Qualität stetig sinkt. Beim gegenteiligen Death March zieht sich das Projekt endlos hin, Meilensteine fehlen oder werden nicht erreicht, Vorabversionen sind schlecht und verbindliche Lieferzusagen fehlen. Ohne Anforderungs- und Änderungsmanagement kann das Produkt orientierungslos werden und weiter an Qualität verlieren. Als Beispiel formuliert der Artikel: „Neuanforderungen von gestern sind (nicht: beinhalten!) die Bugs von morgen.“
Schwache Architektur und Entwürfe
Ein Big Ball of Mud ist Software ohne erkennbare Architektur. Eine Gasfabrik ist ein unnötig komplexer Systementwurf für ein vergleichsweise einfaches Problem.
Ein Gottobjekt, auch Gottklasse oder Blob, ist ein Objekt der objektorientierten Programmierung, das zu viel weiß oder zu viel erledigt. Eine klare Aufteilung von Verantwortlichkeiten, Kapselung und die Einhaltung von Entwurfsmustern sollen dies vermeiden. Der Innere-Plattform-Effekt entsteht, wenn ein System so umfassend konfigurierbar wird, dass es eine schwache Kopie der Plattform nachbaut, auf der es entwickelt wurde. Der Artikel nennt Datenmodelle mit allgemeinen Tabellen und eigener Verwaltungsschicht statt konkreter anwendungsbezogener Datenbanktabellen. Solche Systeme sollen flexibel sein, sind aber oft schwer beherrschbar und haben Performanceprobleme.
Spaghetticode ist ein monolithisch wirkender Codeblock mit vielen Sprungbefehlen und unübersichtlichem Kontrollfluss. Er ist schlecht wartbar und wiederverwendbar. Ein Train Wreck verkettet Methodenaufrufe, etwa „vertrag.getKunde().getAdresse().getLand()“. Dadurch entstehen zusätzliche Abhängigkeiten und das Prinzip der losen Kopplung wird verletzt; es ist nicht mit dem sinnvollen Decorator-Pattern zu verwechseln.
Bei einer Sumo-Hochzeit hängt ein Fat Client besonders stark von der Datenbank ab, weil viel Logik etwa in Oracle PL/SQL liegt. Bei einem Datenbankwechsel oder einer Migration zur Internet-Anwendung müssen dann Client und Datenhaltung weitgehend neu entwickelt werden. Eine Integrationsdatenbank wird von mehreren Anwendungen direkt zur Synchronisierung verwendet. Als Alternative nennt der Artikel eine Shared Database, auf die nur ein Webservice zugreift und deren Funktionen per REST- oder SOAP-Schnittstelle für verschiedene Anwendungen bereitstellt.
Probleme im Programmcode
Doppelt überprüfte Sperrung (double-checked locking) wird im Artikel als fehleranfälliges Anti-Pattern unerfahrener Entwickler bezeichnet. Eine Zwiebel (Onion) entsteht, wenn neue Funktionalität einfach über alte gelegt wird, statt die vorhandene Lösung ausreichend zu verstehen. Über viele Versionen und Entwickler kann so ein schwer überschaubares Zwiebelsystem entstehen.
Copy and Paste Programming übernimmt Passagen bestehenden Quelltexts, statt sie neu zu entwickeln oder wiederverwendbar zu gestalten. Dabei können Fehler mitkopiert werden; gleicher oder fast gleicher Code an vielen Stellen senkt die Wartbarkeit. Stattdessen sollte eine gemeinsame Funktion erwogen werden.
Ein Lavafluss (Lava flow oder Dead Code) besteht aus immer mehr nicht mehr genutztem Quelltext, um den weitere Verzweigungen gebaut werden. Redundanter Code umfasst toten Code, also ausgeführten Code, dessen Ergebnis nie verwendet wird, und unerreichbaren Code, der wegen der Ablaufsteuerung nie ausgeführt werden kann. Die Begriffe toter und redundanter Code werden oft gleich verwendet.
Magische Werte sind hartkodierte Literale mit besonderer Bedeutung, die nur mit Zusatzwissen verständlich sind. Sie sollen zentral als Konstanten definiert werden; bei mehreren zusammengehörigen Werten eignet sich ein Aufzählungstyp. Reservierte Wörter, etwa in SQL, können schwer auffindbare Fehler verursachen, besonders beim Wechsel des Datenbankprodukts. Durchgängige Start- und Endmarker wie Anführungszeichen für Bezeichner und Zeichenketten können helfen. Unbeabsichtigte Komplexität bezeichnet eine Lösung, die komplexer ist, als das Problem verlangt; sie ist mit der Gasfabrik verwandt.
Organisation, Führung und Arbeitsabläufe
Eine Wunderwaffe (Golden hammer) ist ein bevorzugter Lösungsweg, der fälschlich als universell passend gilt: „if all you have is a hammer, everything looks like a nail.“ Das Rad neu erfinden bedeutet, Software immer wieder ohne bestehende Lösungen oder Frameworks neu zu erstellen; Aufwand, Kosten und Unreife steigen. Das quadratische Rad neu erfinden heißt, eine schlechte Lösung bereitzustellen, obwohl bereits eine gute existiert.
Beim Body ballooning wählt ein Vorgesetzter bewusst arbeitsintensivere statt effizienter Lösungen, um seine Machtposition durch mehr unterstellte Mitarbeitende auszubauen. Empire building umfasst weitere nicht konstruktive Machtstrategien, etwa das Beschuldigen anderer, Diskreditierung oder das Verhindern schriftlicher Nachweise, um Verantwortung abwälzen zu können. Eine warme Leiche (warm body) ist eine Person mit zweifelhaftem oder keinem Beitrag zum Projekt.
Ein Single head of knowledge besitzt als einzige Person unternehmensweit wichtiges Wissen über Software, Werkzeuge oder andere Mittel. Verlässt diese Person das Unternehmen, geht das Wissen verloren. XP, Teambuilding, Bindung und Förderung von Mitarbeitenden sowie zugängliche Dokumentation werden als Gegenmaßnahmen genannt. Beim Mushroom management bleiben Mitarbeitende uninformiert und werden klein gehalten; Führungskräfte entscheiden ohne Spezialisten einzubeziehen und kennen teils Stärken, Schwächen und Rollen des Teams nicht.
„Noch ein Meeting mehr wird es lösen“ beschreibt ein zusätzliches Meeting in einem verspäteten Projekt, das den Verzug weiter erhöht. Ein Net Negative Producing Programmer ist so unproduktiv, dass seine Entfernung die Produktivität stärker erhöhen kann als das Hinzufügen eines guten Entwicklers. Management nach Zahlen legt übermäßig Gewicht auf quantitative Kennzahlen, besonders Kosten, und vernachlässigt etwa Qualität, Motivation, Erfahrung und Fluktuation. Die Vorstellung einer Softwarefabrik betrachtet Programmierer als austauschbare Produktionsfaktoren, berücksichtigt aber den kreativen Charakter der Softwareentwicklung und die über Zeit erworbene Produkterfahrung unzureichend.
Angst vor Erfolg oder eine Atmosphäre der Angst hemmt konstruktive Arbeit, Innovation und Wettbewerbsfähigkeit: Gute Lösungen werden aus Angst vor Ablehnung oder Argwohn verborgen oder abgebrochen. Ein falscher System-Architekt wird vom Management aufgrund vermeintlich außergewöhnlicher Fähigkeiten eingesetzt, ohne interne Fachleute einzubeziehen; Erwartungen können sich später als unrealistisch erweisen. Die Beurteilung muss laut Artikel stets das gesamte Projekt und Rahmenbedingungen berücksichtigen. Crocodile Management beschreibt einen Projektleiter, der nur teilweise anwesend ist, bei unerledigten Details „auftaucht“, „Maul aufreißt“ und wieder „abtaucht“.
Ein Programmer Interrupt ist eine Unterbrechung durch Kollegen, E-Mails oder Meetings. Studien zufolge braucht ein Programmierer danach zwischen 10 und 15 Minuten, um wieder effektiv zu arbeiten, erhält aber nur etwa einmal täglich mehr als zwei ununterbrochene Stunden. Besonders problematisch sind Unterbrechungen bei mehreren parallelen Codeabschnitten, Problemlösungs-Suchen, dem Durchdenken von Abläufen – besonders bei parallelem Code – oder wenn die Entwicklungsumgebung aus dem Blick gerät. To-do-Listen, bewusst erzeugte Kompilierungsfehler, Klebezettel, Kopfhörer oder das Schließen von E-Mail sollen die Rückkehr zur Arbeit erleichtern. Beim Micromanagement ändern Führungskräfte Prioritäten und Aufgaben in sehr kleinen Zeitabständen, ohne deren Komplexität zu verstehen; dies verursacht Unterbrechungen und Meetings und nimmt Entwicklern die nötige Zeiteinteilung.
Meta-Muster
Programmer Experience Clumping beschreibt einen Teufelskreis: Unerfahrene Entwickler arbeiten häufig für geringe Vergütung unter schlechten Bedingungen und können sich nicht weiterentwickeln. Erfahrene Fachleute erkennen dies, wechseln zu Arbeitsplätzen, an denen gute Programmierung geschätzt wird, und im Unternehmen bleiben zunehmend unerfahrene Personen zurück. Hohe Fluktuation, fehlende erfahrene Vorbilder und weniger Weiterbildung verstärken den Effekt, bis der Maßstab für gute Entwicklung verloren geht. Das Muster kann auch andere Fachabteilungen betreffen. Eine Variante liegt vor, wenn gute Mitarbeitende zwar bleiben, ihre Leistung aber stark drosseln und nur geringfügig besser als schwächere Kollegen arbeiten.
Zersetzung (Corrosion) ist die gewollte oder ungewollte Nutzung vieler Anti-Pattern aus verschiedenen Bereichen. Sie geht mit einer konsequenten, meist unsachlichen und undiskutablen Verteidigung des Vorgehens einher. Laut Artikel kann dadurch der Eindruck entstehen, dass jemand dem Unternehmen oder Produkt grob fahrlässig schaden oder eine erfolgreiche beziehungsweise kostengünstige Einführung verhindern will; möglich ist auch die Absicht, einer anderen beteiligten Partei zu schaden.