Wie kann ich mit Managern umgehen, die sich weigern, die Verwendung gängiger Software-Engineering-Entwurfsmuster zu akzeptieren?
Hintergrund
Ich bin ein Software-Ingenieur und ein TDD Praktiker in meinem Unternehmen. Mein Vorgesetzter ist auch für die Codierung (falls erforderlich) und die Verwaltung der ihm unterstellten Ingenieure verantwortlich.
Ich hatte kürzlich einige hitzige Debatten mit meinem Vorgesetzten über die Verwendung von Software-Entwurfsmustern.
Das Problem
Häufig werde ich, wenn ich mit der Implementierung einer Funktion und eines Codes beauftragt werde, von meinem Vorgesetzten bei Code-Reviews für meine Verwendung gängiger Software-Entwurfsmuster herausgefordert. Er hält es für unnötig und meint, man solle so ‘direkt’ wie möglich programmieren. Ich setze Zitate auf “geradlinig”, weil wir offenbar nicht einer Meinung darüber sind, welchen Umfang ein “Feature” haben sollte. In vielen Fällen ist das Feature nicht so ‘einfach’, wie mein Vorgesetzter denkt, und erfordert die Verwendung von Entwurfsmustern, um die Verantwortlichkeiten zu trennen und die Auswirkungen auf die (meist ungetestete) Codebasis zu minimieren.
Es gibt zwei häufige Anwendungsfälle, bei denen ich Entwurfsmuster zur Lösung eines Problems anwenden werde:
Implementierung neuer Features, die Änderungen an einer nicht testbaren, veralteten Klasse erfordern
Bewältigung von Unsicherheiten durch das Einbinden der Unbekannten
Wir gerieten aufgrund ähnlicher Entwurfssitzungen in ein paar Auseinandersetzungen. In einem hitzigen Streit wurde mir sogar gesagt, dass “[er] seit mehr als 20 Jahren programmiert!”, was impliziert, dass ich es nicht einmal wagen sollte, seine Autorität in Frage zu stellen.
Was ich versucht habe, um dieses Problem zu mildern
- Ausführliche Kommentare zu einigen nicht so offensichtlichen Komponenten geschrieben, warum ich diese brauchte und welchen Zweck sie erfüllen
- Passiv demonstriert, dass mein Design viel anpassungsfähiger an Änderungen ist
- Eine Komponente, die ich gebaut habe, hat eine wesentlich geringere Fehlerzahl als die meisten anderen Komponenten
- Eine Änderung der Anforderungen richtig vorausgesehen, was zu minimalen Code-Änderungen führte, die notwendig waren, um diese Anforderung zu erfüllen
- ging auf seine Bedenken im Voraus ein, wenn ich herausgefordert werde, indem ich meinen Gedankengang und meine Argumentation erläuterte
- Ich werde jedoch immer noch wegen übertriebenen Code-Engineerings gerügt.
- Ich habe dies informell mit meinen Kollegen diskutiert und sie unter vier Augen um ihre Meinung gebeten
- Die meisten von ihnen schätzen meinen gut durchdachten Ansatz, und einer erwähnte sogar, dass er viel von mir gelernt habe. Die meisten Ingenieure besprechen ihre Codierungsprobleme gern mit mir, weil ich ihnen gewöhnlich nützliche Ratschläge geben oder sie auf etwas hinweisen kann, das sie vielleicht übersehen haben
- Informelle Präsentationen halten, um meinen Kollegen (und meinem Manager) zu erklären, warum ich hier und da ein Entwurfsmuster anwende
Ich möchte nicht arrogant klingen, indem ich sage, dass meine Codierungsfähigkeiten absolut besser sind als die meines Managers, aber ich habe wirklich keine Ideen mehr, um ihn zu überzeugen, selbst nach den Demonstrationen, den Erklärungen und den objektiven Ergebnissen, die ihm gezeigt wurden. Auf der einen Seite möchte ich fehlerfreien, gut in der Einheit getesteten und entworfenen Code liefern. Auf der anderen Seite werde ich immer wieder kritisiert, weil sich mein Design nicht gut anfühlt und meinen Code sicherlich ‘kompliziert’ gemacht hat, indem ich ihn in den ‘genehmigten’ Weg gezwungen habe.
Wie können wir einen Mittelweg finden?
Update
Da viele Kommentare über meine dogmatische, sogar übereifrige Einstellung zur Befolgung von Software-Engineering-Prinzipien erwähnt werden, denke ich, ich sollte klarstellen:
Ich versuche nicht, dogmatisch oder übereifrig zu sein. Ich *kümmere mich *um Leute, die meinen Code lesen und verstehen, unabhängig davon, ob sie Entwurfsmuster verwenden/verstehen oder nicht. Ich habe meine Kollegen während der Code-Reviews um Feedback gebeten, ob sie meinen Code verstehen oder nicht. Sie sagten, dass sie es tun und verstehen, warum ich eine Komponente auf diese Weise entwerfe. Bei einer Gelegenheit trug meine Verwendung von Entwurfsmustern dazu bei, die Konfigurationsnachschlaglogik an einem Ort zu zentralisieren, anstatt sie auf Dutzende von Orten zu verteilen, die oft geändert werden müssen.
Um ehrlich zu sein, bin ich ziemlich enttäuscht, so viele Antworten mit dem starken Stereotyp “Warum könnt ihr Ingenieure nicht wie Manager denken” zu sehen. Am Ende des Tages kann man sagen, dass alles übertrieben ingenieurmäßig ist: Warum Felder als private
markieren, anstatt alles offen zu legen, warum Unit-Test, wenn kein Benutzer nur eine einzige Unit ausführen wird, usw.
Meine Motivation bei der Verwendung von Entwurfsmustern oder eigentlich bei jedem Software-Engineering ist es, Risiken zu minimieren und Wert für das Unternehmen zu schaffen (z.B. durch die Reduzierung der unnötigen Verbreitung von Logik in der Code-Basis, so dass sie an einem einzigen Ort verwaltet werden können).
Tut mir leid, wenn das wie eine Schimpftirade klingt. Ich suche nach Antworten nach dem Motto “Wie können wir einen Mittelweg finden” anstelle einiger herablassender Antworten wie “Ingenieure denken, sie seien schlau, indem sie Entwurfsmuster anwenden, die niemand versteht”.