Ich arbeite für ein mittelständisches Unternehmen mit rund 250 Entwicklern. Leider stecken viele von ihnen in einer prozeduralen Denkweise fest und einige Teams liefern ständig große Transaktionsskriptanwendungen, obwohl die Anwendung tatsächlich eine umfangreiche Logik enthält. Sie können auch die Entwurfsabhängigkeiten nicht verwalten und erhalten Dienste, die von einer anderen großen Anzahl von Diensten abhängen (ein sauberes Beispiel für Big Ball of Mud ).
Meine Frage lautet: Können Sie vorschlagen, wie diese Art von Wissen verbreitet werden kann?
Ich weiß, dass das Problem darin besteht, dass diese Anwendungen eine schlechte Architektur und ein schlechtes Design aufweisen. Ein weiteres Problem ist, dass es einige Entwickler gibt, die gegen das Schreiben von Tests jeglicher Art sind.
Ein paar Dinge, die ich tue, um dies zu ändern (aber ich versage entweder oder die Änderung ist zu gering)
- Ausführen von Präsentationen zu Entwurfsprinzipien (SOLID, bereinigter Code usw.).
- Workshops zu TDD und BDD.
- Coaching-Teams (dies beinhaltet die Verwendung von Sonar, Findbugs, Jdepend und anderen Tools).
- IDE & Refactoring Gespräche.
Ein paar Dinge, an die ich in Zukunft denke (aber ich befürchte, dass sie möglicherweise nicht gut sind)
- Bilden Sie ein Team von OO-Evangelisten, die eine OO-Denkweise in unterschiedlichen Teams verbreiten (diese Personen müssten alle paar Monate das Team wechseln).
- Ausführen von Design-Überprüfungssitzungen, um das Design zu kritisieren und Verbesserungen vorzuschlagen (selbst wenn die Verbesserungen aus Zeitgründen nicht durchgeführt werden, halte ich dies für nützlich)
.
Ich habe festgestellt, dass die von mir trainierten Teams, sobald ich sie verlasse, zu den alten Praktiken zurückkehren. Ich weiß, dass ich nicht viel Zeit mit ihnen verbringe, normalerweise nur einen Monat. Was auch immer ich tue, es bleibt nicht hängen.
Es tut mir leid, diese Frage ist voller Frustration, aber die Alternative, dies zu schreiben, war, meinen Kopf an die Wand zu schlagen, bis ich ohnmächtig werde.
quelle
Antworten:
Versuche nicht, OOP zu drücken, es wird alles nur noch schlimmer machen. Nicht, weil OOP im Allgemeinen eine schlechte Idee ist: Es ist nicht. Aber weil es den Anschein hat, dass dem Verantwortlichen für diesen Hairball-Code nicht nur die Werkzeuge fehlen, um diese Probleme zu vermeiden, sondern auch die Erfahrung und, was noch wichtiger ist, die Motivation.
Leute, die den Wunsch haben, sauberen Code zu schreiben, tun dies in einem bestimmten Paradigma, sei es OOP, prozedural, funktional usw. Aber nicht alle Programmierer sind so, und wenn Sie ein Tool für sauberen Code auf Leute übertragen, die dies nicht tun Verstehen Sie die Notwendigkeit, werden Sie am Ende mit diesen Tools missbraucht, genau wie die Tools, die bereits vorhanden sind. Sie werden nicht verwandte Methoden in einer Klasse gruppiert sehen, Klassen, die von nicht verwandten Klassen erben, Methodensichtbarkeitssätze, die auf Trial-and-Error-Debugging statt bewusstem Design basieren, statische Methoden, die nicht statisch sein sollten, und nicht statische Methoden, die es kurz machen sollten Sie werden Ihre Zeit verschwenden.
Prüfen Sie stattdessen, ob Sie in die Bewusstseinsbildung für Wartbarkeit und Eleganz investieren können. Schließlich unterscheiden sich die Kernziele von OOP nicht von anderen Strategien zum Komplexitätsmanagement (und genau darum geht es bei Programmierparadigmen): Kapselung, Modulierung, lose Kopplung, geringer Grad an Interdependenz, Beibehaltung des veränderlichen Zustands und seines Umfangs ein Minimum, etc. etc. OOP ist sicherlich nicht das einzige Paradigma, das Ihnen die Werkzeuge gibt, die Sie benötigen, um dies zu erreichen.
Womit ich zum letzten Punkt komme: OOP ist eine großartige Idee, und sie funktioniert gut für bestimmte Arten von Problemen, aber (und ich spreche sowohl aus eigener Erfahrung als auch unter Umschreibung der Meinung einiger großer Köpfe hier) für viele Arten von Problemen Probleme, es ist völlig ungeeignet. Wenn Sie OOP noch nicht kennen und der semi-prozedurale Spaghetti-Code die einzige Alternative ist, die Sie kennen, erscheint OOP natürlich als Geschenk des Himmels (und auf eine relative Art und Weise ist es das), und Sie werden sich wahrscheinlich nähern alle Probleme als Nägel für Ihren OOP-Hammer. Das ist nur natürlich und es ist nicht nur negativ, OOP an seine Grenzen (und darüber hinaus) zu bringen, um Ihre OOP-Fähigkeiten auszubauen. Aber vielleicht (nur vielleicht) braucht diese spezielle Codebasis doch keine OOP. Vielleicht würde es viel mehr von einer prozeduralen Architektur profitieren,
TL; DR: Wenn Sie überhaupt etwas evangelisieren möchten, lassen Sie es (plattformunabhängige) gute Codierungspraktiken sein, nicht irgendein bestimmtes Paradigma oder eine bestimmte Methodik.
quelle
Sie können niemanden dazu bringen, sich zu ändern, der sich noch nicht ändern möchte. Aus diesem Grund sind die von Ihnen trainierten Teams zu ihren alten Gewohnheiten zurückgekehrt.
Ihre Frage sollte also lauten: "Wie bringe ich Entwickler dazu, auf OO-Ansätze umzusteigen?"
Fangen Sie einfach an, fangen Sie klein an, lassen Sie die Dinge von dort aus bauen. Zeigen Sie dem einzelnen Entwickler die Vorteile auf, anstatt dem Code, anderen Entwicklern oder der Firma abstrakte oder philosophische Vorteile zu bieten.
Zeigen Sie, wie die verschiedenen OO-Techniken zu weniger Code führen, den sie schreiben müssen, und zu kürzeren Entwicklungszeiten. Fast jeder Entwickler hört sich einen Vorschlag an, der seine Arbeit erleichtert.
Beginnen Sie dann mit der Demonstration, wie OO-Techniken zu einer einfacheren Pflege des Codes führen. Jeder in dieser Art von Umgebung hat Angst, " die Veränderung " vorzunehmen, die ein Drittel der Produktionsanwendung auslöscht. Die Kapselung ist der Schlüssel zur Vermeidung dieses Risikos und ermöglicht es jeder (zukünftigen) Schicht der Anwendung, ihren Vertrag mit den anderen Schichten aufrechtzuerhalten.
Ich würde schauen, wie Daten herumgereicht werden. Wenn es sich jedes Mal um eine lange Liste von Variablen handelt, sollten Sie als ersten Schritt erwägen, einige dieser Variablen in einer Struktur (oder keuch! Eine Klasse !!!) zusammenzufassen. Das einfache Einschließen der Daten in ein Objekt ist der Beginn von Verträgen zwischen Ebenen.
Auf einer breiteren Ebene - erwägen Sie, ein Management-Buy-in für diese Bemühungen zu erhalten, wenn Sie dies noch nicht getan haben. Das Management muss die konkreten Vorteile einer Verringerung der Mängel und des Risikos von Änderungen erkennen. Letztendlich sollte der Refactoring-Prozess zu schnelleren Entwicklungszeiten führen, aber das ist ein langfristiger Vorteil.
Ihre Vorstellungen von Überprüfungsteams und OO-Evangelisten sind gut. Es muss mehr als nur Sie sein, der diese Agenda vorantreibt.
quelle
Meiner Erfahrung nach ist der Wechsel von einer prozeduralen zu einer OO-Denkweise eine große Hürde. Es erfordert Ausdauer, die viele Entwickler nicht aushalten. Dies liegt hauptsächlich daran, dass die Grundlagen von OO überblickt werden.
ist eine gute Idee. Dies sollte gründlich sein und OO sollte von Grund auf besprochen werden. Als ich OO lernte, halfen historische Anekdoten sehr.
Ich würde auch vorschlagen,
quelle
Ich stimme Shuvo Naser zu. Es ist eine große Hürde, also behandeln Sie es eher wie einen Aufstieg. Das Erlernen des Entwurfs einer gesamten Anwendung mit OOP wird einige Zeit in Anspruch nehmen.
Annahme geht selten dem Sehen der Nutzen voraus. Wir sprechen von komplexem Design und nicht von TPS Report Cover Sheets .
quelle
Sie haben bereits gute Ideen
Die Ideen, die Sie in Ihrer Frage skizzieren, klingen ausgezeichnet. Es ist eine große Überraschung, dass Sie keinen Erfolg finden. Es ist 2012 und die objektorientierte Revolution ist längst vom Stand der Technik zum Stand der Praxis übergegangen. Es scheint so, als ob es Ihnen schwer fallen würde, nicht mehrere Dutzend oder sogar hundert gute solide objektorientierte Programmierer zu finden, es sei denn, Sie haben einen sehr geringen Umsatz und nur sehr wenige Einstellungen.
Agil oder objektorientiert?
Sie erwähnen einige agile Technologien wie TDD und einige neuere Konzepte. Gehen Sie also nicht zu streng mit den Leuten um, wenn Sie etwas nicht akzeptieren, das noch immer von einigen Management-Teams aktiv bekämpft wird. Einige behaupten, Agile anzunehmen, aber wenn sie darüber sprechen, bedeutet das, was sie sagen, dass es bedeutet. Die Organisation zeichnet sich nicht durch Teams aus, die Entscheidungen treffen und sich anpassen, sondern durch eine starke hierarchische Kontrolle des Vertragsstils.
Aber zurück zu objektorientiert. Sie erwähnen keine objektorientierte Analyse oder Design, und ich bin nicht ganz sicher, welche Programmiersprache welcher objektorientierten Programmiersprache Platz macht. Ich weiß, dass UML bei vielen objektorientierten Programmierern Probleme mit der Popularität hat. Nachdem ich in OOAD gründlich geschult worden bin, glaube ich, dass es so sein kann, als würde man die Kultur und Geschichte eines Landes lernen, dessen natürliche Sprache man lernen möchte. Wenn ich zum Beispiel Griechisch lernen wollte, könnte ich das Alphabet, den Wortschatz und die Grammatik lernen, aber wenn ich die reiche Geschichte und Kultur ignoriere, würde ich viel vermissen. Auf jeden Fall, wenn Sie alles über eine objektorientierte Programmiersprache lernen, aber nichts über OOAD, denke ich, dass eine wichtige Gelegenheit vertan wurde.
Probleme zu überwinden?
Brücke zu weit? Wenn Sie die Leute bitten, eine kleine Sache pro Woche und Jahr unter den Teilnehmern zu lernen, wird sich viel ändern. Wenn Sie sie bitten, alles zu ändern, was sie wissen, wird es von wenigen begrüßt, von vielen hart und von anderen unmöglich. Einige Änderungen wie die Quellcodeverwaltung sind lokalisiert. Sie haben vorher keine Übergänge gemacht, Sie hatten ein Training, bei dem die Grenzen des Gedächtnisses nicht überstrapaziert wurden, jemand hat Sie das erste Mal begleitet, und dann war der Alltag ziemlich einfach.
Andere Veränderungen sind allgegenwärtig. Zum Beispiel erfordert das Sichern von C und das Wechseln zu Java umfangreiche Schulungen, Einstellungen und große Änderungen im Tagesgeschäft, um eine neue IDE, einen neuen Compiler, eine neue Sprache, eine neue API, ein neues Bereitstellungsmodell usw. zu übernehmen von Dingen, die am häufigsten in Verbindung mit einem Pilotprogramm oder einer Unternehmensumstrukturierung auftreten.
Eine Revolution anführen? Wenn die Leute, die gerade arbeiten, in der Vergangenheit belohnt wurden und das Unternehmen nicht in Gefahr zu sein scheint, was ist ihre Motivation für Veränderungen? Wenn Sie wie ein Außenseiter wirken, der die Richtung vorgeben und die Verantwortlichen für die Ergebnisse, die sie nicht vorhersagen können, zur Rechenschaft ziehen möchte, scheint dies alles Risiko zu sein, keine Belohnung.
Positionsmacht oder Ideenführung? Viele Organisationen arbeiten mit Positionsmacht. Wenn Sie keine sichtbare Unterstützung durch Manager, Abteilungsleiter, Direktoren und Vizepräsidenten haben, sind Sie lediglich ein Ideenführer. Manche Menschen sind in der gefährlichen Lage, eine Idee zu haben und keine zweite zu haben. Wenn du sie zeigen kannst, anstatt sie zu erzählen, ist das ein langer Weg, um Skeptiker zu beruhigen und talentierte Verbündete zu interessieren.
Support-Basis zu klein? Machen Sie eine Triage unter diesen 250 Leuten und sortieren Sie sie in drei Kategorien: bereit zu umarmen, bereit zu lernen und nicht bereit zu lernen. Sie haben gute Gründe, frustriert zu sein von einigen Leuten, die kein Interesse daran haben, etwas zu ändern. Sie könnten genauso gut an einem Seil schieben. Das ist ungenutzte Mühe. Wenn Sie ein Gefühl dafür haben, wer Veränderungen unterstützt, können Sie herausfinden, was sie interessiert.
Im Gegensatz zu einer medizinischen Triage, bei der die ethische und praktische Entscheidung darin besteht, der Mittelgruppe zu helfen, die es mit Hilfe schaffen kann, können Sie Ihre Energie und Zeit nach Ihrem Urteilsvermögen und Ihren Vorlieben investieren. Pflegen Sie für Ihren Erfolg die Gruppe, die bereit ist, neue Ideen anzunehmen. Es sind zwar nur wenige, aber wie bei einem Schneeball wird Ihre Sichtbarkeit und Glaubwürdigkeit als Anwalt zunehmen. Bald werden Sie gefragt, wann das nächste Training stattfinden wird.
Darin auf lange Sicht? Bis Sie einen Champion kultivieren, um Dinge nach sich zu tragen, sollten Sie damit rechnen, Zeit für den Aufbau von Beziehungen zu investieren. Möglicherweise müssen Sie länger als einen Monat bei den von Ihnen trainierten Teams bleiben. Bis das Team verbesserte Methoden für sich selbst besitzt, sind Sie nur ein Technologie- oder Methodik-Cop. Mentoring ist ein Prozess, der Jahre dauern kann. Es gibt eine Menge Dinge, die Ihre Entwickler nicht tun möchten, die Sie für wichtig halten (ich denke, Sie haben speziell Unit-Tests erwähnt). Es kann eine Weile dauern, bis eine gemeinsame Vision des damit verbundenen Werts entsteht. Ich weiß das aus Erfahrung, weil ich mich einmal für ein Code-Coverage-Tool in einem Fortune-500-Unternehmen ausgesprochen habe, das einen hervorragenden Ruf für Qualität hatte, aber Manager und Kollegen waren besorgt, wenn es darum ging, sich dazu zu verpflichten.
Experte oder Basis? Viel schneller als Mentoring wäre es, die Unterstützung der Basis zu fördern, die von jedem Teammitglied kommt. Ausgehend von einem Team von zehn Softwarespezialisten würde ich die zweite auswählen, wenn ich die Wahl hätte, dass eine Person die ganze Zeit am Prozess arbeitet oder zehn Personen zehn Prozent der Zeit am Prozess arbeiten. Der Basisprozess ermöglicht es den Befürwortern, die Auswirkungen des Ansatzes zu spüren und den Ansatz so anzupassen, dass die Probleme des Teams, dem die Arbeit gehört, am besten gelöst werden.
Sehen Sie die Freiheitslinie? Ein Teil der Einführung von "Best Practices" besteht darin, die Menschen dazu zu bringen, die Freiheit aufzugeben, Dinge auf eine gemeinsame Art und Weise zu tun. Die Diskretion des Programmierers aufzugeben, ist schmackhafter, wenn Sie nach Möglichkeiten suchen, den Entwicklern viele Optionen zu überlassen. Was sie auswählen, wird von einer Partition bestimmt, die wir als Freiheitslinie bezeichnen können. Möglicherweise müssen ähnliche, gut begründete Aufteilungen über organisatorische, regionale / standortspezifische, Team- und persönliche Praktiken getroffen werden.
quelle
Dies hätte ein Kommentar sein sollen, aber da ich anscheinend noch nicht in der Lage bin, Kommentare abzugeben, könnte dies auch eine Antwort sein.
Das Wichtigste bei dieser Art von Durchbrüchen (sei es OOP oder irgendein anderes Paradigmenwechsel, sagen wir, funktionale Programmierung oder was auch immer im nächsten Jahr herauskommt) ist DO CODE REVIEWS AND PEER PROGRAMMING . Begleite sie und leite die Teams auf eine andere Art und Weise, um Dinge zu tun, die ihnen helfen.
Mein persönlicher Weg zur objektorientierten Programmierung begann, als mich einige zufällige Asshats, die Code-Reviews durchführten, dazu verurteilten, Dinge auf modulare Art und Weise zu tun und den Status beizubehalten, ohne vollständig C ++ OO zu werden. denke Code wie
(Beachten Sie, dass clients_total möglicherweise vollständig redundant ist, da dies ein besonders schlecht geplantes Beispiel ist.)
Und am Ende tat ich dies nur, wenn ein älterer Mitarbeiter auf meinen Bildschirm zeigte und sagte: "Wenn Sie dasselbe mehrmals schreiben, verwenden Sie eine Prozedur oder eine Funktion und rufen Sie es einfach immer wieder auf."
Vorträge und Besprechungen sowie optionale Übungen führen nicht zu einem Paradigmenwechsel oder einer Einführung einer neuen Praxis, da es keinen wirklichen Antrieb gibt, dies zu tun, außer Neugierde. Auf der anderen Seite erhöht es die Adoptionsrate sehr gut, wenn man es nicht schlecht macht oder es allgemein verpönt.
Seien Sie auf die jammernde und klassenorientierte Entwicklung vorbereitet, die folgen wird, bis sie das richtige Design in das integrieren, was sie tun. Du wirst viele Dinge sehen, die dich innerlich sterben lassen, aber so sieht der Weg zum Lernen aus.
quelle