Wie kann ich mit Managern umgehen, die sich weigern, die Verwendung gängiger Entwurfsmuster für die Softwareentwicklung zu akzeptieren?

Hintergrund

Ich bin Software-Ingenieur und TDD - Praktiker in meinem Unternehmen. Mein Vorgesetzter ist auch für die Programmierung (falls erforderlich) und die Verwaltung seiner Untergebenen als Ingenieur verantwortlich.

Ich hatte kürzlich einige hitzige Debatten mit meinem Vorgesetzten über die Verwendung von Softwaredesignmustern.

Das Problem

Wenn ich mit der Implementierung einer Funktion und eines Codes beauftragt werde, werde ich häufig von meinem Vorgesetzten bei Codeüberprüfungen herausgefordert, ob ich gängige Softwaredesignmuster verwende. Er denkt, dass es unnötig ist und man so 'geradeaus' wie möglich codieren sollte. Ich setze Anführungszeichen auf direkt, weil wir uns anscheinend nicht einig sind, was der Umfang eines „Features“ sein sollte. In vielen Fällen ist die Funktion nicht so „einfach“, wie mein Manager denkt, und erfordert die Verwendung von Entwurfsmustern, um Verantwortlichkeiten zu trennen und die Auswirkungen auf die (größtenteils ungetestete) Codebasis zu minimieren.

Es gibt zwei häufige Anwendungsfälle, in denen ich Entwurfsmuster anwenden werde, um ein Problem zu lösen:

  • Implementieren neuer Funktionen, die Änderungen an einer nicht testbaren Legacy-Klasse erfordern

    • Ich löse dies, indem ich einen Decorator auf die ursprüngliche Schnittstelle anwende, damit der neue Code, den ich schreibe, einfach auf Einheiten getestet werden kann, und stelle sicher, dass sich mein Code gut in den Legacy-Code integrieren lässt.
    • Seine Antwort ist, dass er es verwirrend findet, mehrere Implementierungen einer Schnittstelle zu haben, und er denkt, dass die Erstellung einer neuen Schnittstelle mit einem anderen Namen (mit denselben Mitgliedern) der richtige Weg ist. Dies bricht jedoch das Abhängigkeitsinversionsprinzip, da die High-Level-Logik nun geändert wird, um den Low-Level-Details zu entsprechen.
    • Ich versuchte zu argumentieren, indem ich erklärte, dass ich versuche, das Risiko zu minimieren, indem ich Änderungen an ungetestetem Code minimiere, außerdem ist mein Design einfacher zu testen und als korrekt zu erweisen, aber er denkt, dass ich Dinge übertechnisiere.
  • Bewältigung von Unsicherheiten durch Schnittstellen zu den Unbekannten

    • Häufig werden die Anforderungen an ein neues Feature nicht gründlich durchdacht. Angesichts von Fristen müssen wir „Löcher“ in unserem Code lassen, damit sich das Unternehmen entscheiden kann, ohne den Fortschritt zu beeinträchtigen.
    • Beispielsweise könnte ich eine Schnittstelle implementieren, um einen Laufzeitwert aus einer unbekannten Datenquelle abzurufen, für die ich einen Decorator implementiert habe, der einen IRuntimeValueProvider benötigt , um ihn während der Laufzeit abzurufen. Ich kann die eigentliche Implementierung belassen, bis die Entscheidung getroffen ist, ohne andere Geschäftslogik zu beeinflussen.
    • Der Manager denkt, ich führe Schnittstellen mit Namen ein, mit denen er nicht vertraut ist, wie z. B. IHttpContentFactory , IHttpClientProvider . Er ist immer noch nicht zufrieden mit meiner Erklärung und Demonstration, dass diese Fabriken bestimmten Zwecken beim Bau von Komponenten dienen und eine Naht zur Erweiterbarkeit bieten.
      • In der Debatte über meine Verwendung von IHttpClientFactory , um die Konstruktion von HttpClient von seinen Verbrauchern zu abstrahieren, erwähnte er ausdrücklich, dass er der Meinung ist, dass der Verbraucher für die Konstruktion jedes Implementierungsdetails verantwortlich sein sollte, was dazu führen würde, dass die Konstruktionslogik überall verteilt wird.

Wir hatten aufgrund ähnlicher Design-Meetings einige Auseinandersetzungen. In einem hitzigen Streit wurde mir sogar gesagt, dass „[er] seit mehr als 20 Jahren programmiert!“ , was bedeutet, dass ich es nicht einmal wagen sollte, seine Autorität in Frage zu stellen.

Was ich versucht habe, um dieses Problem zu mildern

  • Detaillierte 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 erstellt habe, hat eine deutlich geringere Fehleranzahl als die meisten anderen Komponenten
    • Eine Änderung der Anforderungen wurde korrekt antizipiert, was zu einer minimalen Codeänderung führte, die zur Erfüllung dieser Anforderung erforderlich war
  • Er ging auf seine Bedenken im Voraus ein, wenn ich herausgefordert wurde, indem ich meinen Denkprozess und meine Argumentation erklärte
    • Ich werde jedoch immer noch wegen Over-Engineering-Code gerügt.
  • Habe dies informell mit meinen Kollegen besprochen und privat um ihre Meinung gebeten
    • Die meisten von ihnen schätzen meine wohlüberlegte Herangehensweise und einer erwähnte sogar, dass er viel von mir gelernt habe. Die meisten Ingenieure besprechen gerne ihre Codierungsprobleme mit mir, weil ich ihnen normalerweise nützliche Ratschläge geben oder auf etwas hinweisen kann, das sie vielleicht übersehen haben
  • Halten von informellen Präsentationen, um meine Kollegen (und Manager) darüber aufzuklären, warum ich hier und da ein Designmuster anwende

Ich möchte nicht arrogant klingen, indem ich sage, dass meine Programmierkenntnisse absolut besser sind als die meines Managers, aber mir gehen wirklich die Ideen aus, ihn zu überzeugen, selbst nachdem ihm die Demonstrationen, Erklärungen und objektiven Ergebnisse gezeigt wurden. Einerseits möchte ich fehlerfreien, gut getesteten und designten Code liefern. Auf der anderen Seite werde ich immer wieder dafür kritisiert, dass sich mein Design nicht gut anfühlt und meinen Code sicherlich „kompliziert“ hat, indem ich ihn auf die „genehmigte“ Weise gezwungen habe.

Wie können wir einen Mittelweg finden?


Aktualisieren

Da ich viele Kommentare erhalte, in denen meine dogmatische, sogar übereifrige Haltung erwähnt wird, Software-Engineering-Prinzipien zu befolgen, sollte ich Folgendes klarstellen:

Ich versuche nicht, dogmatisch oder übereifrig zu sein. Es ist mir wichtig, dass Leute meinen Code lesen und verstehen, egal ob sie Designmuster verwenden/verstehen oder nicht. Ich habe meine Kollegen während der Code-Reviews um Feedback gebeten, ob sie meinen Code verstehen oder nicht. Sie haben gesagt, dass sie es tun, und sie verstehen, warum ich ein Bauteil so konstruiere. Bei einer Gelegenheit half meine Verwendung von Entwurfsmustern dabei, die Konfigurationssuchlogik an einem Ort zu zentralisieren, anstatt sie auf Dutzende von Orten zu verteilen, die häufig geändert werden müssen.

Um ehrlich zu sein, bin ich ziemlich enttäuscht, so viele Antworten mit einem starken Klischee zu sehen: „Warum ihr Ingenieure nicht wie Manager denken könnt“. Am Ende des Tages kann man alles als Over-Engineering bezeichnen: Warum Felder als markieren, privateanstatt alles offenzulegen, warum Unit-Tests, wenn kein Benutzer nur eine einzelne Unit ausführen wird usw.

Meine Motivation bei der Verwendung von Entwurfsmustern oder eigentlich jeder Softwareentwicklung besteht darin, Risiken zu minimieren und einen Mehrwert für das Unternehmen zu schaffen (z. B. indem die unnötige Verbreitung von Logik in der Codebasis reduziert wird, sodass sie an einem einzigen Ort verwaltet werden können).

Tut mir leid, wenn das wie ein Rant klingt. Ich suche nach Antworten im Sinne von „Wie können wir einen Mittelweg finden“ statt nach herablassenden Antworten wie „Ingenieure halten sich für schlau, indem sie Designmuster anwenden, die niemand versteht“.

Kommentare sind nicht für längere Diskussionen gedacht; Diese Konversation wurde in den Chat verschoben .
Eine Sache, die Sie nicht erwähnen, scheint wichtig zu sein: Wie erfahren sind Sie in der Softwareentwicklung? Genauer gesagt, wie viele Jahre praktizieren Sie schon und in wie vielen signifikant unterschiedlichen Problembereichen haben Sie gearbeitet? "Problemdomänen" entsprechen normalerweise "Unternehmen", können jedoch verschiedene Projekte innerhalb eines großen Unternehmens sein.
Sind andere in Ihrem Team in der Lage, Ihren Code so zu modifizieren/ändern, wie Sie sagen?
Ich stimme dafür, diese Frage als nicht zum Thema gehörend zu schließen, da sie sich auf der falschen Seite befindet. Es ist für die Software, Programmierung oder TDD-Sites.
@Fattie: Dies ist keine Programmierfrage. Hier wurde keine einzige Frage zum Programmieren gestellt. Dies ist eine Frage zu einer zwischenmenschlichen Beziehung zwischen einem Mitarbeiter und einem Manager an einem Geschäftsort. Der Konflikt dreht sich um die Programmierung.
Hallo @Ellesedil - Ich bin anderer Meinung, aber deshalb gibt es eine Abstimmung!
Ich bin seit mehr als 15 Jahren Softwareentwickler. Ich habe noch nie ein interessantes Szenario wie Ihres gesehen. :-) Sie sind wahrscheinlich ein ausgezeichneter Entwickler, was mich für Sie freut. Im Allgemeinen ist es jedoch wahrscheinlich am besten, sich mit den Managern gut zu verstehen, solange sie Sie nicht absichtlich bitten, fehlerhaften Code zu schreiben. :-) Außerdem arbeiten Entwickler nicht für den Rest ihrer Karriere für einen Manager. Eines Tages können Sie vielleicht für einen Manager arbeiten, der Ihnen mehr Freiheit beim Schreiben von Code lässt. Im Moment ist es wahrscheinlich eine gute Idee, mit dem Manager gut auszukommen.
Mein Vorgesetzter ist ein viel besserer Vorgesetzter als ich es wäre. Ich bin ein viel besserer Softwareentwickler als er. Es ist gesunder Menschenverstand, dass ich die Entscheidungen treffe, wie die Software geschrieben wird.

Antworten (12)

Hat es jemals geholfen, es auf Ihre Art zu tun? Gab es jemals eine Zeit, in der Sie Indirektion und Injektion und zusätzliche Schnittstellen verwendet haben, und es gab eine Abweichung in letzter Minute, und alles wurde reibungslos und schön ohne Fluchen gehandhabt? Selbst bei einem früheren Job, wenn Sie diesen Code nie hierher bekommen konnten?

Ich gehe mal davon aus, dass es das gab. Übe, diese Geschichte zu erzählen . Es ist spezifisch und real. Es ist nicht "x könnte passieren" oder "y könnte sich ändern", sondern "Ich habe es einmal so gemacht und so hat es geklappt." Manager (ich spreche als einer) sind misstrauisch, wenn es darum geht, Geld auszugeben (und glauben Sie mir, wenn Sie komplizierteren Code schreiben, den andere auf Anhieb nicht verstehen können, geben Sie Geld aus) für das, was passieren könnte . Sie wollen keine Spekulation finanzieren, die laut Internet nur auf "Buchlernen" und der neuesten Modeerscheinung beruhen könnte. Aber wenn Sie auf Ihre Erfahrung zurückgreifen? Das ist eine ganz andere Situation.

Ich bin kein großer Fan von Fabriken, Anbietern, Injektoren und so weiter. Sie sind im Allgemeinen für Dinge eingerichtet, die nie wirklich passieren werden (Wechsel von MS SQL zu Oracle) oder wenn sie es tun (Wechsel des Ordners, in dem die Dateien gespeichert sind), nur geringe Auswirkungen haben. Sie haben einen Platz in sehr volatilen Arrangements, in denen Sie sich zu befinden scheinen. Sie müssen also zeigen, dass sie diesen Platz haben. Sie scheinen aus einer Position zu kommen, in der Sie sagen: "Das ist der normale Weg, Dinge zu tun, und ich brauche einen Grund, es nicht zu tun." Ihr Manager kommt von: „Das ist nicht normal; normal ist direkt und einfach. Geben Sie mir einen guten Grund, eine weitere Schicht in den Weg zu legen.“ Arbeite an diesem Grund. Arbeiten Sie an einer real passierten Erfolgsgeschichte in der Vergangenheitsform, bei der diese zusätzliche Schicht Tage oder Wochen Arbeit gespart hat. Begründen Sie Ihr Engineering, sonst ist es wirklich Over-Engineering.

Kommentare sind nicht für längere Diskussionen gedacht; Diese Konversation wurde in den Chat verschoben .
Sie können nicht "von SQL zu Oracle wechseln", da Oracle-Datenbanken SQL verwenden. Meinten Sie „Umstieg von SQL Server auf Oracle“?
@MT0 Sie haben offensichtlich noch nie mit Oracle gearbeitet. schaudern
Jede Komplexität hat ihren Preis, der durch eine klare Artikulation des Wertes gerechtfertigt sein sollte. Ich habe festgestellt, dass, wenn ich nicht klar erklären kann, warum eine gewisse Komplexität notwendig ist, entweder (a) es nicht wirklich notwendig ist, oder (b) es nicht viel Schaden anrichtet, zu warten, bis der Grund klar ist, um das hinzuzufügen Komplexität ein.

Dieses Zitat aus einem Ihrer Kommentare beunruhigt mich.:

Als Software-Ingenieur wird es mir zur zweiten Natur, Dinge zu tun, die an der Oberfläche keinen triftigen Grund haben könnten, wie das Verbinden der Unbekannten, die ich erwähnt habe. Ständig am Rande stehen zu müssen, mich zu sehr technischen (und manchmal sehr eigensinnigen) Themen zu erklären, erschöpft mich.

Ich habe mehrere Wiederholungen des folgenden Lebenszyklus gesehen:

  • Ein erfahrenes Programmierteam entwickelt einen anderen Ansatz für die Programmierung.
  • Es wird für einige Jahre bis zu einem Jahrzehnt als etwas angesehen, das trotz aller Nachteile und Einschränkungen universell verwendet werden sollte. In dieser Phase genügt es zu sagen „Ich wende Methode X an“, ohne zu analysieren, ob X ein Nettonutzen ist.
  • Es kommt aus der Mode, aber seine nützlichsten Ideen bleiben als Teil des Softwareentwicklungs-Toolkits erhalten, um herausgezogen und verwendet zu werden, wann immer sie Nettovorteile bringen.

Meiner Meinung nach bewegen sich sowohl TDD als auch Entwurfsmuster um die Trennung zwischen der zweiten und dritten Phase im Lebenszyklus der Programmiermethodik. Ich bin mir sicher, dass TDD und viele Designmuster ein langes und wertvolles Leben im Toolkit haben werden, um immer dann eingesetzt zu werden, wenn sie mehr helfen als schaden. Ich denke auch, dass sie immer noch überbeansprucht werden, eher aus Gewohnheit als aus absichtlichem Denken.

Sie sollten niemals ein Designmuster anwenden, da es Ihnen zur zweiten Natur geworden ist oder Sie Schwierigkeiten haben, Ihre Verwendung zu erklären. Denken Sie stattdessen vor der Anwendung eines Entwurfsmusters über dessen Kosten und Nutzen in dieser speziellen Situation nach. Wenn die Vorteile die Kosten wirklich überwiegen, sollten Sie genau wissen, warum, also sollte es Sie nicht ermüden, den Kompromiss zu erklären. Wenn die Vorteile die Kosten nicht überwiegen, verwenden Sie es nicht. Auch hier sollten Ihre eigenen Überlegungen zu Ihrem Design Sie darauf vorbereiten, zu antworten, wenn Sie gefragt werden, warum Sie kein möglicherweise anwendbares Designmuster verwendet haben.

Denken Sie daran, dass Sie über diese Kompromisse im Hinblick auf die allgemeine Wartbarkeit des Programms nachdenken müssen, und nicht nur, um Ihr Stück schnell zum Laufen zu bringen. Zu viele Indirektionen können es zukünftigen Programmierern erschweren, herauszufinden, was wirklich vor sich geht.

+1 für das Ganze, aber besonders für den Lebenszyklus des Paradigmas. Als ich anfing zu arbeiten, waren Objekte das A und O. Jetzt sind sie ein nützliches Werkzeug.
Muster gehen bereits in die dritte Stufe: softwareengineering.stackexchange.com/a/335894/92517
Ich gebe zu, ich erkläre mich vielleicht nicht gut mit „Tu-Sachen-was-möglicherweise-keinen-guten-Grund-an-der-Oberfläche-hat“. Vielleicht lässt es sich anhand eines Beispiels besser erklären: Ich wurde gefragt, warum ich an einer bestimmten Stelle einen Dekorator verwendet habe -> Ich erklärte dies damit, dass ich versuche, ein neues Feature zu implementieren, bei dem eine nicht testbare Klasse geändert wird. Ich habe den Dekorator so darüber gewickelt dass ich den Anruf abfangen und basierend auf einem Laufzeitwert an die neue Logik umleiten kann -> Mein Manager erklärte, dass dies schwer zu verstehen sei, da es zwei Implementierungen einer Schnittstelle gibt.
..Ich antwortete dann, indem ich sagte, dafür seien Schnittstellen (wie in C # / Java) für Polymorphismus -> Er ist mit meiner Erklärung nicht zufrieden, bis zu dem Punkt, an dem wir uns im Grunde über die Grundlage von OO nicht einig sind, weshalb ich kommentierte, dass ich mich nicht mehr erklären kann. Dies führte dazu, dass ich abhängig von der alten Schnittstelle an einem Dutzend Stellen Änderungen vorgenommen habe, um zu einer neuen Schnittstelle mit völlig identischen Mitgliedern darin zu wechseln.
@rexcfnghk Polymorphismus ist wie der Rest von OO nur ein Werkzeug, das Gewinne bringen oder die Netzkomplexität erhöhen kann. Angesichts von nur einem Dutzend Verwendungsmöglichkeiten, die alle relativ leicht zu finden sind, würde ich wählen, ob ich sie bearbeiten oder Polymorphie hinzufügen möchte, je nachdem, was zu einem einfacheren, besser lesbaren Programm führt.
Stimmen Sie der Notwendigkeit einer Begründung zu, stimmen Sie nicht zu, dass ein Schalter in 12 Anwendungsfällen anstelle von Polymorphismus verwendet werden sollte.
it is difficult to understand as there are two implementations of an interface.huh, das ist im Grunde das Gegenteil von dem, was ich über Schnittstellen denke; Ich werde misstrauisch, wenn eine Schnittstelle nicht mehr als eine Implementierung hat. Mir ist klar, dass dies nicht der einzige Grund ist, eine Schnittstelle zu haben, aber die gemeinsame Adressierung mehrerer implementierender Klassen war schon immer der Hauptgrund für mich, eine Schnittstelle zu verwenden.
Während alles, was PS sagt, korrekt ist, könnten wir jetzt genauso gut offen Code-Syntax-Fragen auf dieser Seite haben. Diese QA ist urkomisch off-topic - Sie konnten es sich nicht ausdenken. Es gibt tatsächlich Diskussionen über Funktionsbenennung, Inversion, Schnittstellensyntax usw. - es ist total lächerlich (und lustig). Klicken Sie einfach auf "Schließen". OP, verschieben Sie Ihre interessante Frage auf jeden Fall in die comp.sci. Website, oder wo immer es am besten ist.
@Fattie Ich habe versucht, den technischen Inhalt in der Antwort zu minimieren und es auf das Prinzip anzustellen, ob eine Technik als gut angesehen werden sollte, nur weil sie der aktuellen Mode entspricht.
@Fattie: Antworten, die Diskussionen über Codierungsparadigmen enthalten, stellen im Wesentlichen den Umfang der Frage in Frage. Die Frage lautet ganz klar, wie der Konflikt zwischen Mitarbeiter und Führungskraft gelöst werden kann, nicht wie der Mitarbeiter anders kodieren sollte. Wenn diese Frage in die Softwareentwicklung verschoben würde, wäre sie wahrscheinlich nicht zum Thema, da es um Konflikte in einer Mitarbeiter-Manager-Beziehung geht.
@ThomasW Die Verwendung von Polymorphismus anstelle von a switchbeim Schreiben eines Tokenizers (abgeleitet von einer endlichen Zustandsmaschine und wahrscheinlich viel mehr als 12 Fällen) wäre ein Leistungsselbstmord für Ihren Sprachparser und noch schwieriger zu lesen. Es gibt immer Kompromisse.
Danke @jpmc26, ich arbeite manchmal mit Parsern. Ich lese diese Frage jedoch nicht in den Domänen von Lexern/Parsern oder FSM - vorgeschlagene Verwendung von Decorator-Mustern, Schnittstellennamen wie IRuntimeValueProvider, IHttpClientFactory, IHttpContentFactory usw.

Bin ich die einzige Person, die darüber verblüfft ist, dass wir in Workplace sehen, dass wir uns so sehr auf Programmierpraktiken konzentrieren und nicht auf den tatsächlichen Konflikt am Arbeitsplatz? Also werde ich einen anderen Ansatz wählen.

Hier sind die allgemeinen Aspekte Ihres Problems, wie ich es sehe:

  1. Sie befinden sich in einem Fachgebiet, das Zusammenarbeit erfordert
  2. Es gibt keine dokumentierten Verfahren, die regeln, wie diese Zusammenarbeit durchgeführt werden sollte
  3. Es herrscht Uneinigkeit darüber, wie diese Zusammenarbeit erfolgen soll
  4. Einer von denen, die anderer Meinung sind, ist Ihr Vorgesetzter

Für mich klingt es so, als müsste Ihre Gruppe zusammenkommen und sich darauf einigen, welche Standards und Praktiken Sie übernehmen werden, und sie global übernehmen, zum Guten oder zum Schlechten. Denn nichts ist schlimmer für ein Produkt als ein Team, das ständig zerstritten ist, und nichts ist schlimmer für Ihre Beziehung zu Ihrem Arbeitgeber, als ständig Streit mit ihm aufzuwärmen .

Versuchen Sie also, Ihr Team zusammenzubringen, um sich auf einige Standards zu einigen, und nutzen Sie dieses Treffen, um Ihre Argumente für die von Ihnen verwendeten Praktiken zu vertreten. Wenn du sie bekommst, großartig! Wenn nicht, dann sei es so. Ihre Aufgabe ist es nicht, schönen Code zu schreiben. Ihre Aufgabe ist es, ein fertiges Produkt zu liefern. Wenn Ihr Arbeitgeber (verkörpert durch Ihren Vorgesetzten) und eine Vielzahl Ihrer Gruppe darauf besteht, dass Sie es auf eine bestimmte Weise tun, wer sind Sie dann, um ihnen zu widersprechen?

Es hört sich jedoch so an, als würde der Großteil Ihres Teams Ihnen zustimmen, also sollte es während dieser Diskussionen ziemlich offensichtlich werden, dass Ihr Vorgesetzter der Außenseiter ist. Wenn sich diese Person immer noch weigert, zum Teamkonsens zu wechseln, dann ist das eine Funktionsstörung, bei deren Lösung wir Ihnen nicht helfen können (außer Ihnen zu empfehlen, zu einem anderen Team zu wechseln).

Sie haben Recht mit dem Fokus der Antworten. Kommt von so vielen von uns, die Softwareentwickler sind.
Ich bin nicht der Meinung, dass die Art von Designfrage, die das OP aufwirft, durch das Setzen von Standards behandelt werden kann. Weder „Verwende niemals Technik X“ noch „Verwende Technik X, wo immer sie anwendbar ist“ wird wahrscheinlich gut funktionieren. Stattdessen sollte jede Diskussion darüber geführt werden, wie man Kompromisse zwischen schneller Implementierung neuer Funktionen und langfristiger Wartbarkeit eingehen kann.
Was ist, wenn Sie schönen Code schreiben UND ein fertiges Produkt liefern möchten ? Sie schließen sich nicht wirklich gegenseitig aus, oder?
Das lag daran, dass das OP sehr spezifisch ist, wie er Software entwickelt. Und die Art und Weise, wie er es tut, ist nicht unumstritten, es gibt viele Seiten, die man betrachten kann, und viele Leute mit starken Meinungen überall. Die Frage ist auch geladen: "Wie gehe ich mit einem Manager um, der sich weigert, gängige Designmuster zu verwenden ..." Und viele Menschen sagen aus dem Bauch heraus: "Weil das dumm wäre." Die Beantwortung der Frage, wie man mit dem Manager umgeht, würde also zu einer Vereinbarung mit diesen Praktiken. Vielleicht wäre es besser, wenn die Einzelheiten der Aufgaben aus der Frage entfernt würden.
Ja, und wahrscheinlich muss dies stattdessen zu Software Engineering migriert werden.
„Bin ich die einzige Person, die darüber verblüfft ist, dass wir in Workplace sehen, dass wir uns so sehr auf Programmierpraktiken konzentrieren und nicht auf den eigentlichen Konflikt am Arbeitsplatz?“ konnte nicht mehr zustimmen .

Leider ist er Ihr Manager, und Sie schreiben Code nicht so, wie er es möchte. Wenn er im Management ist, plant er vielleicht nicht, in 2-3 Jahren aus dem Unternehmen auszuscheiden, wie es die meisten Entwickler planen. Sie schreiben Code, der für Ihre Nachfolger schwieriger zu reparieren sein wird, weshalb er hart zu Ihnen ist, wenn Sie ihn so erstellen.

Wenn ich hier eine Vermutung anstellen darf, wohl wissend, dass ich weit daneben liegen könnte, wofür schreibst du dieses Zeug? Ich wäre eher überrascht, wenn es um mehr als LOB-Anwendungen geht. Entwurfsmuster verkomplizieren wahrscheinlich Code für eine LOB-Anwendung, die nicht besonders kompliziert sein muss, viel zu sehr.

In meinen 10 Jahren der Entwicklung wurde ein echtes Strategie-/Factory-Pattern nur dreimal benötigt, von denen zwei aus Jobs stammen:

  • In einer Anwendung, in der Produktinformationen angezeigt wurden, bei denen einige dieser Produkte im Wesentlichen eine Reihe kleinerer Produkte in einer Schachtel waren, haben wir eine Strategie verwendet, um zu bestimmen, welche Fabrik benötigt wird, um die Produktinformationen (die über einen Schlüssel angefordert werden) in eine Ansicht umzuwandeln. Nicht sehr glorreich, aber es hat seinen Zweck erfüllt. Wenn ich mich Ihrer bescheidenen Prahlerei über Fehler anschließen darf, hatten wir in meiner gesamten Amtszeit dort nie einen einzigen Fehler! (Einer wurde gemeldet, nachdem ich gegangen war, stellte sich aber als Benutzerfehler heraus :)).
  • In einer Anwendung, die Benutzern zeigte, wohin sie für einen Kurs gehen sollten, an dem sie teilnahmen, verwendeten wir eine Fabrik und eine Abstraktion, um einen schnellen Wechsel zwischen einer Bing Maps-API und einer Google Maps-API zu ermöglichen. Dies lag daran, dass beide ein Kosten-Nutzen-Verhältnis hatten und das Unternehmen keine Fortschritte bei der Entscheidung machte, welches verwendet werden sollte. Schließlich hörten wir von unserem Home Office, dass wir bereits einen API-Schlüssel für einen von ihnen hatten und in letzter Sekunde direkt vor dem Start zu dieser API wechseln konnten.

Und ein drittes ist ein Projekt, mit dem ich herumspiele, das die Serverüberwachung für Windows-Server durchführt:

  • Ich verwende eine Schnittstelle für die Ausgabe der Überwachungsdaten und für die Monitore selbst. Die Monitore sind in hohem Maße konfigurierbar (basierend auf den Anwendungseinstellungen). Die Ausgabeimplementierung variiert je nachdem, ob ich einen neuen Monitor teste oder zur Bereitstellung übergehe, sodass IOutputInterface ConsoleOutput und SqlOutput als Implementierungen hat, die variieren können.

Beachten Sie, dass mein persönliches Projekt Muster und Inversion of Control (IoC) sofort häufiger verwendet als meine Arbeitsprojekte.

Wenn ich dir nach all dem einen Rat geben kann, dann lass es sein: Job ist Job, und wenn du die Dinge auf deine Art machen willst, dann versuche, einen goldenen Mittelweg zu finden. Tech-Leute bleiben im Allgemeinen nicht lange an einem Ort und es lohnt sich nicht, sich mit dem Management darüber zu streiten, wie es gemacht wird. Lassen Sie Ihre persönlichen Heimprojekte zu einem Musterstapel werden, so viel Sie wollen.

Gute Verwendung des Strategiemusters.
Wofür steht die Abkürzung „LOB“?
Ich war in Projekten, in denen Programmierer überall Designmuster angewendet haben, wo es früher 2 Klassen gab (eine Schnittstelle und eine Implementierung), jetzt gibt es 7. OP, brauchen Sie wirklich eine ProxyProviderDecoratorFactory? Sie erhöhen die Komplexität für alle anderen. Das sieht auch Ihr Vorgesetzter. Google "YAGNI" und versuche, die Dinge einfacher zu machen.
@ThorbjørnRavnAndersen LOB steht für Line of Business, typischerweise eine Anwendung, die zur Unterstützung einer Art von Geschäftsprozess verwendet wird.
@C Bauer "In meinen 10 Jahren der Entwicklung wurde nur dreimal eine echte Strategie / ein echtes Fabrikmuster benötigt." Ich kann es kaum glauben. Verwenden Sie eine andere Möglichkeit, Polymorphime zu implementieren? Wie Vorlagen/Generika oder Funktionszeiger? Wie wenden Sie das Open-Close-Prinzip an? Sicherlich können Sie die Schnittstelle nicht jedes Mal ändern, wenn eine neue Funktionalität benötigt wird?
jap das im Grunde. Wenn Sie etwas tun, das zu einem Problem wird (weil es zu fortgeschritten ist oder was auch immer), dann wird es, wenn Sie nicht mehr da sind, zum Problem Ihres Managers.
Auf einer Entwicklerseite gab es einen Beitrag: „Wir haben angefangen, Designmuster zu verwenden und sind von 70 Klassen auf 700 gegangen. Was machen wir jetzt?“ Ernsthaft.

Einfache Lösung: beenden .

Schwierige Lösung: Bei jeder Meinungsverschiedenheit liegt die halbe Schuld bei Ihnen .

Nehmen Sie sich eine Auszeit, studieren Sie, wie andere Teams arbeiten, finden Sie heraus, wo die Impedanz-Fehlanpassung zwischen Ihnen und der anderen Partei liegt. Sprechen Sie mit ihnen persönlich, früh und oft. Wenn Sie dies gut machen, werden Sie beide lernen, die Bedenken und Referenzen der anderen Partei zu verstehen, und sie werden lernen, Sie für Ihren Beitrag, Ihre Erfahrung und Ihre entschiedene Meinung zu schätzen. Hier sind einige Bereiche, die Sie berücksichtigen sollten:

  • Qualitätsprodukt vs. Time-to-Market
  • gutes Produkt vs. guter Code
  • Smart Code vs. selbsterklärender Code
  • Top-down-Unternehmenskultur vs. Bottom-up-Engineering-Kultur

Wenn es nicht gut funktioniert, ziehen Sie eine andere Rolle im Team, ein anderes Team im Unternehmen oder schließlich ein anderes Unternehmen in Betracht .

Wenn Sie sich diesen Leuten direkt stellen, werden Sie auf den größten Widerstand stoßen, Heuschrecke. Ich war am effektivsten darin, Veränderungen herbeizuführen, wenn ich strategisch die richtigen Druckpunkte getroffen habe. Es erfordert viel Geduld und viel Hingabe. Ich muss mich erst darauf einstellen, bevor ich an den Schwachstellen Druck ausübe.

Leere deinen Geist, sei formlos. Formlos, wie Wasser. Wenn du Wasser in eine Tasse füllst, wird es zur Tasse. ... Jetzt kann Wasser fließen oder es kann abstürzen. - Bruce Lee

Hören Sie ihnen zu und stellen Sie viele Fragen. Jemandem wirklich zuzuhören, nimmt ihm den Wunsch, sich zu widersetzen. Verstehen Sie, was ihr Denken motiviert, und sprechen Sie dann ihre Sprache. Da Ihre Überzeugungen im Moment axial sind, spiegelt er wahrscheinlich Ihre Sturheit, Verachtung und Frustration wider. Da Sie untergeordnet sind, ist es seine Entscheidung, sich nicht Ihrer Wellenlänge anzuschließen, und es liegt an Ihnen, die Brücke zu bauen.

Wenn du ihn siehst, wirst du dich selbst sehen. Wenn Sie ihn behandeln, behandeln Sie sich selbst. Wenn du an ihn denkst, wirst du an dich selbst denken. Vergiss das nie, denn in ihm wirst du dich finden oder verlieren. -Helen Schumann

Ein Meister des Wing Chun Kung Fu zieht seinen Gegner heran und schließt die Distanz, bevor er die Mittellinie sucht und angreift, wo er am verwundbarsten ist. Streiten Sie nicht um Kleinigkeiten, nur um zu gewinnen, finden Sie die Mittellinie des größeren Problems und konzentrieren Sie sich dort auf den Druck.

Ich habe täglich mit Ingenieuren zu tun, die sich weigern, umzurüsten oder neue Programmierparadigmen zu lernen, und mir wurde öfter als ich zählen kann, irgendeine Art von „Ich bin hier, seit es Lochkarten gibt“-Argumente gegeben. Ich schätze, ich habe 80 % der Kämpfe verloren, aber diese 20 % … woh … ich habe große Veränderungen bewirkt. Ich mag vage klingen, aber wenn Sie einige dieser Schlüsselwörter bei Google recherchieren, werden Sie verstehen, was ich meine.

Versuchen Sie auch, an einem neuen Eichhörnchenprojekt teilzunehmen , bei dem Sie es auf Ihre Weise tun können. Wenn es wirklich funktioniert und Zeit oder Geld spart, werden sich die Leute Ihrer Denkweise anschließen. Wenn es kein neues Projekt gibt, erstellen Sie eines in Ihrer Freizeit, um einen Schwachpunkt des Unternehmens zu lösen, und niemand ist daran interessiert, sich die Zeit für die Lösung zu nehmen.

Ich mag deine Art. Analogie ist ein mächtiges Werkzeug, wenn es richtig eingesetzt wird.

Was soll ich machen?

Wie gut Code geschrieben (oder überschrieben) wird, unterliegt in der Softwareentwicklung immer einem gewissen Maß an Interpretation (Meinung). Für mich unternehmen Sie die Schritte, die ich an Ihrer Position tun würde, aber letztendlich ist Ihr Manager derjenige, der das Licht sehen muss .... zeigen Sie es ihm weiterhin.

Ich würde weiterhin, so schmerzhaft es auch sein mag , genau das tun, was Sie tun, und darauf hinweisen, wie sich die Investition in die Verwendung des Designmusters auszahlt, wo immer Sie können, ohne Ihren Manager schlecht dastehen zu lassen .

Ändere nicht, was du tust, es sei denn , du fühlst dich in Gefahr von Schlimmerem als einem Verweis. Zeigen Sie ihnen weiterhin die Vorteile der Verwendung des Musters, und schließlich sollten sie vorbeikommen.

Versuchen Sie, während Sie den Kampf fortsetzen, einige andere Verbündete im Team zu gewinnen. Auf diese Weise sind Sie nicht die einzige Stimme, die sich für das Muster ausspricht.

Wenn sie sich jedoch weigern, haben Sie irgendwann die Wahl, ob diese Umgebung für Sie geeignet ist. Ich glaube, Sie sind noch nicht so weit, aber Sie müssen möglicherweise zu einer Umgebung wechseln, die für gute Programmierpraktiken akzeptabler ist.

Denken Sie daran, dass dieser Kampf, in dem Sie sich befinden, ein Marathon ist . Wenn Sie die Codierungskultur ändern möchten, liegt es an Ihnen, den Wert des Musters zu demonstrieren.

Ich habe nicht aufgehört, was ich immer tue, aber ich habe die ständige Debatte und die Notwendigkeit, mich ständig wegen meines Codes zu verteidigen, ziemlich satt. Als Software-Ingenieur wird es mir zur zweiten Natur, Dinge zu tun, die an der Oberfläche keinen triftigen Grund haben könnten, wie das Verbinden der Unbekannten, die ich erwähnt habe. Ständig am Rande stehen zu müssen, mich zu sehr technischen (und manchmal sehr eigensinnigen) Themen zu erklären, erschöpft mich.
Ich habe nicht abgelehnt, aber ich denke, dass es nicht der beste Rat ist, vorzuschlagen, dass OP das Verhalten fortsetzt, das dazu führt, dass er mit seinem Manager aneinanderstößt.
@cdkMoose Wenn er die Programmierkultur ändern möchte, ist Beharrlichkeit der einzige Weg. Ohne zu sagen, dass sie unterwegs keinen Advil brauchen werden.
Könnte auch ein Rezept sein, um gefeuert zu werden, was mehr braucht als Advil. Hartnäckigkeit kann zu Ungehorsam werden, wenn der Vorgesetzte oft genug Nein sagen muss. Ohne weitere Details der Projektgeschichte zu kennen, ist mir nicht klar, dass OP hier ganz im Recht ist. Das Erzwingen guter Codierungspraktiken für ein Legacy-Projekt kann immer noch zu Verwirrung und Fehlern bei anderen Teammitgliedern führen.
@cdkMoose Sie machen einen gültigen Punkt.
@rexcfnghk "es [ist] für mich selbstverständlich, 'Sachen zu tun, die an der Oberfläche vielleicht keinen guten Grund haben'". Warte ab. Meinen Sie, Dinge zu tun, für die der Grund ein tieferes als oberflächliches Verständnis erfordert? Wenn ja, erklären Sie das Ihrem Vorgesetzten in der erforderlichen Tiefe. Oder meinst du Dinge tun, für die du eigentlich keinen guten Grund kennst? Denn das ist nur Frachtkult .
Jedes Projekt füllt den "richtigen Weg" und den "falschen Weg". So kommt es, dass bei vielen Projekten der „richtige Weg“ häufig der „falsche Weg“ ist. Das Ignorieren der scheinbar klaren Anweisung des Vorgesetzten, das zu tun, was Sie für den „richtigen Weg“ halten, wird nicht sehr oft gut funktionieren. Kopfschütteln und Beharrlichkeit schaffen kein "glückliches" Arbeitsumfeld. Der richtige Ansatz ist, sich zuerst selbst zu beweisen. Es ist viel einfacher für jemanden mit dem Ruf eines erstklassigen Entwicklers, der konsequent liefert, seine Ideen zu akzeptieren, als für jemanden, der auf das Internet zeigt.
Ich habe miterlebt, wie ein leitender Entwickler gefeuert wurde, weil er Features so implementierte, wie er es für am besten hielt. Der Manager versuchte ein paar Mal zu erklären, wie er die Dinge erledigen wollte, und trat ihn schließlich an den Bordstein. Niemand ist unersetzlich, und Compliance wird oft als wichtiger angesehen als reines technisches Können. Und wie mein Manager (er war ein wirklich guter Typ und hat den leitenden Entwickler nicht leichtfertig gefeuert) uns danach sagte: „Ich brauche Code, den jeder Ihrer Leute aktualisieren/debuggen/erweitern kann. Eine schicke Lösung, die nur eine Person kann verstehen schadet mehr als es nützt".
@AndreiROM Ja, das kann passieren.
@IamSoNotListening Sie und das OP finden vielleicht Repennings und Stermans „ Nobody Ever Gets Credit for Fixing Problems that Never Happened “ interessant.
@AndreiROM: Diese Geschichte hört sich auch so an, als hätte Ihr Entwicklungsteam eine hervorragende Lerngelegenheit verpasst, um neue Programmierkenntnisse aufzubauen.
@ellesedil - glaube was du willst. Entwickler sind nicht einfach Programmierer, wir sind Problemlöser. Die Lösung muss nicht immer perfekt sein.

Erstens können wir anhand der gegebenen Informationen nicht sagen, wer Recht hat. Wenn ich hinzugezogen würde, um das Projekt zu prüfen, hätte ich möglicherweise immer noch Schwierigkeiten zu entscheiden, wer Recht hat, weil Sie möglicherweise mit anderen Zielen entwerfen. Aber ich vermute, dass der Chef die Ziele besser kennt als Sie.

Zweitens Ihre Frage: "Wie kann ich meinen Chef überzeugen?" Die Antwort ist, Sie können wahrscheinlich nicht. Am Ende ist er der Boss. Das einzige Mal, dass ich meinen Chef überredete, seine Ansichten zum Software-Engineering zu ändern, war, nachdem wir ein Jahr damit verbracht hatten, ein unzuverlässiges Stück Software zu patchen, das so geschrieben war, wie er es wollte, und wir ihm sagten, dass wir es nur durch Design zuverlässig machen könnten anders.

Aus technischer Sicht wissen wir nicht, wer hier richtig ist – es könnte ein Manager sein, der tief in der Vergangenheit steckt, oder ein neuer Entwickler, der blind an den ganzen Hype glaubt.

Aber er ist Ihr Manager, und Sie beschäftigen sich nicht mit dem Manager, sondern mit seiner Weigerung, das zu tun, was Sie für das Beste halten, und bestehen darauf, das zu tun, was er für das Beste hält. Und das ist der Normalzustand, dass Ihr Vorgesetzter die Entscheidung trifft. Es ist auch der Normalzustand, dass letztendlich er für Erfolg oder Misserfolg verantwortlich ist und nicht Sie. Er hat die Autorität. Und er hat recht, man sollte seine Autorität nicht in Frage stellen. Sie können in Frage stellen, ob er Recht hat, aber nicht seine Autorität. Also kümmerst du dich entweder darum oder wechselst zu einem Unternehmen, das die Dinge auf deine Art macht.

Anstatt zu denken, dass die Dinge nicht so laufen, wie Sie es möchten, denken Sie in der Zwischenzeit darüber nach, wie Sie innerhalb Ihrer Grenzen den qualitativ hochwertigsten Code produzieren. Vieles lässt sich auf unterschiedliche Weise erledigen. Es gibt „einfach, schlecht gestaltet“ und „einfach, gut gestaltet“. Entscheiden Sie sich für Letzteres.

Die Erfahrung erlaubt es zu beurteilen, ob die Vorteile aus dem Entwurfsmuster in der Zukunft möglich und wahrscheinlich sind. Wenn der Vorgesetzte das Muster kennt und es trotzdem ablehnt, erkennt er wahrscheinlich den Fall, wenn sich die Anwendung dieses oder eines ähnlichen Musters nicht auszahlt. Manchmal widersprechen Erfahrungen den Regeln oder eher Interpretationen.

Es gibt eine bekannte Meinung, dass kürzerer und einfacherer Code leichter zu verstehen und offener für signifikante Änderungen ist.

Im Grunde versuchen Sie, eine weitere Ebene der Indirektion zu haben, und noch eine und so weiter. Es verkompliziert die Dinge.

Lösen diese Schichten tatsächlich ein Problem? Das Hinzufügen von Funktionen in Zukunft einfacher zu machen, löst kein Problem. Der Kunde ist nicht bereit, dafür zu zahlen. Daher ist es kein Problem, das Unternehmen lösen müssen. Für Unternehmen besteht das Problem nicht.

Außerdem geht das nicht. Es ist nicht abzusehen, welche besondere Funktion der Kunde in Zukunft wünschen könnte. Wenn Sie ein Produkt auf eine besondere Weise entwerfen, erschweren Sie es, bestimmte Funktionen hinzuzufügen. Es ist besser, das Design offen zu halten.

Sie tätigen also nicht nur eine nicht autorisierte Investition im Namen Ihres Unternehmens, sondern haben auch keine Ahnung von dem damit verbundenen Risikofaktor.

Komplizierte Dinge brauchen mehr Zeit, um erledigt und gewartet zu werden. Zeit ist Geld.

Komplizierte Dinge begrenzen, wie viel und welche Art von anderen Dingen im System hinzugefügt werden können. Wenn man einmal auf den Weg geht, Dinge kompliziert zu machen, dann muss man auch andere bestehende und neue Dinge kompliziert machen, selbst wenn sie selbst nicht kompliziert sein müssen.

Darin liegt eine letzte Botschaft. Es heißt, dass die Zahl zwei in der Informatik nicht existiert. Wenn ein Ding zwei Variationen hat, fügen Sie keine weitere Indirektionsebene hinzu. Sie lassen die beiden Varianten einfach bestehen. So ist es einfacher. Wenn Sie nicht drei oder mehr Variationen haben, ist die Gemeinsamkeit nicht klar, also abstrahieren Sie sie nicht. Sie wissen nicht, was Sie extrahieren sollen, Sie gehen Risiken ein und machen Wunschdenken.

Ich würde Pair Programming und Peer Review vorschlagen. Dies wird Ihren Kollegen helfen, Ihren Code besser zu verstehen, da Sie erklären müssen, warum und wie Sie es tun, anstatt nachträglich.

Entweder werden sie von Ihnen lernen und sehen, warum es klug ist, oder Sie werden lernen, dass die besten Programmierer Code schreiben, den andere pflegen können.

Dies setzt voraus, dass sie es nicht bereits verstehen, aber sie sind möglicherweise einfach nicht mit der Notwendigkeit einverstanden oder denken, dass es nicht kosteneffektiv ist. Auch kann das OP dem Unternehmen kein Produktionssystem wie Pair Programming aufzwingen. Er kann es höchstens vorschlagen. Das OP scheint blind für die Möglichkeit zu sein, dass er einfach falsch liegt und möglicherweise das Gesamtbild verpasst.
@StephenG Es fehlt eindeutig an OP, der kommunizieren kann, warum sein Ansatz objektiv besser ist, und wiederum versteht, warum andere seine Designentscheidungen für nicht optimal halten. Paarprogrammierung ist vielleicht der beste Weg, den ich gefunden habe (in den wenigen Fällen, in denen es für uns von Vorteil war), um den Designprozess während des Geschehens diskutieren zu können, da Sie jede getroffene Entscheidung anfechten können, wenn Sie dies nicht tun beide stimmen zu. Das mag bei „Tausend Stiche in der Zeit spart neun“ der Fall sein.
Für mich klingt es so, als hätte das OP seine Meinung zu viel und zu aggressiv mitgeteilt , aber die Gelegenheit dazu gehabt. Es klingt, als ob ihm die Soft Skills (und vielleicht die Geduld) fehlen, die erforderlich sind, um die Dinge in einer Organisation so zu erledigen, wie Sie es möchten, in der Sie nicht sehr erfahren sind. Sein Chef klingt tatsächlich verärgert über ihn – Zeit, die Dinge zu beruhigen und ihm Respekt zu zeigen sein Chef, nicht mehr drängen - er muss der Aufrechterhaltung guter Arbeitsbeziehungen Vorrang vor seiner persönlichen technischen Meinung geben (die äußerst eigensinnig klingt, unabhängig von den technischen Vorzügen oder nicht).
@StephenG Vielleicht. Deshalb mache ich daraus eine Mentoring-Situation, in der der hoffentlich erfahrenere Senior-Entwickler aufzeigen kann, wo die Vermutungskette von OP versagt.