Ich suche nach einer guten Analogie oder Metapher, die die Probleme des Copy-Paste-Programmierens für Nicht-Programmierer veranschaulichen könnte. Ich führe gelegentlich Code- / Systemüberprüfungen für potenzielle Kunden durch, und eines der häufigsten Probleme, das ich sehe, sind große Mengen an Code, der durch Kopieren und Einfügen in die gesamte Codebasis eingefügt wird. Dies ist etwas, das ich regelmäßig in den Reviews erwähne, und jedes Mal muss ich erklären, warum dies ein Problem ist (dies ist besonders schwierig bei Kunden, die gerade genug Programmierkenntnisse haben, um zu verstehen, dass Wiederverwendung eine gute Sache ist, aber nicht genug, um zu verstehen, warum Kopieren-Einfügen ist keine gute Form der Wiederverwendung. Natürlich kann (und kann) ich das Problem in Bezug auf die Codewartung erklären, aber es wäre schön, eine gute, prägnante Analogie für dieses Problem zu haben, die sich bei Nicht-Programmierern durchsetzt. Bonus, wenn die Analogie zeigt, warum Suchen und Ersetzen keine effektive Lösung für dieses Problem ist. Irgendwelche Vorschläge?
Nur zur Verdeutlichung (basierend auf Jaroslavs Antwort unten): Ich spreche hier nicht von der Verwendung von Code-Snippets. Was ich sehe (beunruhigend oft), ist das Kopieren und Einfügen riesiger Codeschwaden oder eines zehnzeiligen Codes, um einige Benutzerdaten (einschließlich einer Inline-SQL-Abfrage) in Dutzende von PHP- oder ASP.NET-Seiten einzufügen. Kopieren Sie also Code von einer anderen Stelle im selben Projekt.
Update: Hier gibt es einige wirklich gute Antworten; Ich habe in den Kommentaren erklärt, warum ich die Antwort von Scott Whitlock gewählt habe, aber ich würde die Antwort von whatsisname auch wärmstens empfehlen, wenn Sie mit Kunden zu tun haben, die mit der Herstellung überhaupt vertraut sind.
quelle
Antworten:
Es ist so ... Sie haben eine Uhr in Ihrem Haus. Groß! Sie wissen, wie spät es ist, aber Sie müssen immer in diesen einen Raum gehen, um ihn anzusehen.
Aber natürlich möchten Sie wissen, wie spät es ist, ohne die ganze Zeit in diesen Raum zu gehen, also kaufen Sie noch ein paar Uhren und verteilen sie in Ihrem Haus. Jede dieser Uhren ist unabhängig. Sie alle behalten ihre eigene Zeit. Das heisst:
Stellen Sie sich nun dasselbe Problem in einer großen Anlage mit Dutzenden oder Hunderten von Uhren vor. Deshalb brauchen Sie so etwas wie diese vernetzte Uhr , die sich mit einer zentralen Zeitbasis synchronisiert. Auf diese Weise wird die Zeit einmal und nur einmal definiert .
Copy-Paste-Programmierung ist wie der Kauf unabhängigerer Uhren. Es skaliert nicht.
quelle
Stellen Sie sich vor, Sie entwerfen ein Flugzeug. Sie haben einen einmotorigen Jet. Es verkauft sich gut. Jetzt werden Sie ein viermotoriges Flugzeug für Langstreckenflüge über den Ozean entwerfen.
Jetzt erstellen Sie nicht für jeden einzelnen Motor die vollständigen technischen Spezifikationen und Zeichnungen, oder? Nein, Sie verwenden an allen vier Stellen den gleichen Motor. Stellen Sie sich nun vor, Sie hätten 4 Zeichnungssätze und müssten etwas ändern. Jetzt müssen Sie es in allen vier Motorzeichnungen ändern. Was passiert, wenn Sie versehentlich vergessen haben, etwas am 4. Motor zu ändern, weil Sie Abstand hatten?
Angenommen, Sie ändern die Länge einer Schraube oder eines Rohrgewindes. Jetzt können Sie in Ihrer Datenbank mit technischen Zeichnungen nicht mehr nur suchen und ersetzen, sondern möglicherweise versehentlich die Befestigungsschrauben in den Kraftstoffpumpen ändern, weil sie zufällig dieselbe Größe haben. Oder die Hydraulikleitung, die das Heckruder antreibt, hat das gleiche Gewinde, aber jetzt ist es anders und Sie können das Heck nicht mehr antreiben.
Stellen Sie sich vor, Sie werden vom NTSB belästigt, weil Ihre Triebwerke zufällig Turbinenschaufeln werfen und explodieren, während Sie südlich von Florida fliegen. Welche Motorzeichnungen sehen Sie jetzt an? Alle von ihnen, einer von ihnen? Woher weißt du, dass alle vier gleich sind? Vielleicht werden die Korrekturen vorgenommen, aber sie gelten nur für Motor eins, weil der Typ, der die Motoren entworfen hat, vor einem Jahr in einer Reggae - Band spielte und der einzige war, der sich daran erinnerte, dass die vier Motoren in getrennten Dateien sind, und Der Typ, der die explodierende Turbine reparierte, war sein Ersatz.
Das Kopieren und Einfügen von Code erfolgt analog zu doppelten Zeichnungen von Bauteilen, unabhängig davon, ob es sich um eine Schraube oder einen Motor handelt. Sie möchten Komponenten zu grundlegenden Teilen abstrahieren, die so oft wie möglich wiederverwendet werden.
Kopieren Sie nicht die Motoren, schreiben Sie einfach den Code, mit dem die Motoren am Tragflügel befestigt werden.
quelle
Sie müssen es in Bezug auf die gemeinsame Nutzung derselben Ressource und das Duplizieren derselben Ressource erklären.
Wäre es zum Beispiel sinnvoll, dass jedes Haus in einer Großstadt ein eigenes Kraftwerk hat, das das Haus mit Strom versorgt, oder wäre es sinnvoller, wenn sich jedes Haus das gleiche Kraftwerk teilt? Wenn mit einer bestimmten Komponente, die im Kraftwerk (in den Kraftwerken) verwendet wird, etwas schief geht und Reparaturen erforderlich sind, ist es einfacher, die Reparaturen an einem Ort durchzuführen, und jeder profitiert von diesen Reparaturen im Vergleich zu den Reparaturen an jedem Kraftwerk und nur an jedem Hausvorteile individuell.
quelle
quelle
Kopieren und Einfügen ist wie der Versuch, Teile ohne Form herzustellen.Es ist langsam und Sie erhalten eine einmalige Verwendung von jedem Teil, da Sie, sobald festgestellt wird, dass es defekt oder gebrochen ist, die Form nicht einfach reparieren können, um einen geeigneten Ersatz zu erstellen.
Bei der Suche nach einer Analogie müssen wir zunächst die Gefahren des Copy & Paste-Programmierens berücksichtigen :
Die Hauptwaffe im Kampf gegen das Kopieren und Einfügen von Programmen ist die Abstraktion . Um eine gute Analogie zu finden, suchen Sie nach Beispielen für Abstraktion in der Welt um uns herum.
Die Abstraktion basiert auf der Idee, Definitionen einzurichten und diese dann bei der Ausführung zu verwenden. Wie wäre die Welt ohne Definitionen?
Das Kopieren hat nur dann einen Platz, wenn das zu kopierende Stück dauerhaft ist. Andernfalls wird mit jeder Kopie ein ganz neuer Zweig erstellt, der separat getestet, gewartet und aktualisiert werden muss.
Abstraktion bekämpft dies, indem sie alle Zweige zu einem Stamm zusammenbindet und Modifikationen an kleineren Zweigen oder sogar Blättern isoliert.
quelle
Ich denke, Sie sprechen von dupliziertem Code, nicht von kopiertem Einfügen (mit Snippets und ähnlichem).
Hier ist eine Analogie aus einem Geschichtsbuch, die es sehr gut illustriert. Vor Gutenbergs Presse saßen die Mönche und schrieben die Bücher von Hand und schrieben sie immer wieder neu. Die Bücher, die Mönche schrieben, waren oft mit Fehlern behaftet und dank Gutenberg wurde dieses Problem beseitigt.
Eine andere Analogie: Geldautomaten. Sie haben einen Geldautomaten, an dem verschiedene Karten ausgegeben werden können und der sie immer gut bedient. Durch das Duplizieren von Code werden verschiedene Geldautomaten erstellt, sodass jeder zu einem anderen wechseln muss und der Automat manchmal sogar einen BSOD ausgibt.
Es gibt einen großartigen Artikel über das Einfügen von Kopien von Jeff http://www.codinghorror.com/blog/2009/04/a-modest-proposal-for-the-copy-and-paste-school-of-code-reuse. html
PS Ich weiß, dass es vor Gutenberg eine Druckerei gab.
quelle
Ich nehme an, wir sprechen mit Nicht-Programmierern über Geschäftsleute, daher würde ich mich kurz fassen und die Realität des Geldes einbeziehen.
Ausschneiden und einfügen = Geld verbrennen.
quelle
Kann ich die Frage nicht beantworten, aber sagen, dass Sie hier wirklich keine Analogie benötigen? Der Versuch, die richtige Analogie für jede Entwicklungssprache oder jedes Entwicklungsmuster zu finden, erscheint pervers und ist oft kontraproduktiv. Es ist, als würde man versuchen, mit platten Füßen Yoga zu machen ...
Es gibt einige Gründe, warum das Kopieren / Einfügen zu Problemen führt. In einigen Umgebungen, in denen es früher als Leistungssteigerung galt, werden vorhandene Fehler in neu eingefügte Bereiche übertragen. In der Tat ist es jetzt langsamer es kommt auf JIT an und denken Sie wirklich, Sie sind schlauer als ein moderner Compiler?).
Es zeigt, dass der Entwickler entweder faul oder egoistisch ist oder beides. Wenn dies ein Kampf ist, den Sie im Moment in einem Team führen, müssen Sie ihn abhängig von Ihrer Position in diesem Team (Teamleiter / JNR Dev, SnR Dev, was auch immer) beheben, möglicherweise durch ein Schiedsverfahren in Ihrer Organisation.
BEARBEITEN: In Anbetracht des Kommentars unten, dass dies Code ist, der den Code eines Drittanbieters im Auftrag des Drittanbieters (oder vielleicht sogar eines Vierten) überprüft. Es gibt einige nützliche Dinge, die ich hoffentlich hinzufügen kann.
Erstens, als der Code für die dritte Partei erstellt wurde, hatten sie irgendwelche Metriken an Ort und Stelle? Zum Beispiel Codezeilen (LoC).
Ich denke immer noch, dass einiges von dem, was ich oben gesagt habe, noch zählt. Ich hätte wahrscheinlich auch fragen sollen, was das Ziel der Überprüfung war. Wenn es darum geht, ein Angebot zu erhalten, um es zu pflegen oder zu ersetzen, müssen Sie eine ganze Reihe verschiedener Fragen stellen.
Wie auch immer, Sie beurteilen die Qualität des Codes. Kopieren Sie alle Einfügungen, die unter die Kategorie "Entwickler haben ein angemessenes Verständnis für Abstraktions- und / oder Programmflusssteuerungsdesign gezeigt" fallen:
Kommentar: Entwickler konnten kein Verständnis für Abstraktion zeigen, und ihr Ansatz zur Programmflusssteuerung war fehleranfällig. Sie könnten hier "Zyklomatische Komplexität" einführen. Es ist eigentlich ganz einfach zu verstehen und auf eine Art und Weise denke ich, dass ich vielleicht eine Antwort gefunden habe: D Yay for me.
Ok Die zyklomatische Komplexität ist so. Sie haben eine Karte. Es hat Ihre Startposition und jedes mögliche Ziel. Es muss nicht viel sein. Denken Sie, Parkplatz, Café, Toilette. Die zyklomatische Komplexität ist ein Maß für die Anzahl der verschiedenen Routen, die zum Erreichen Ihrer Startposition zu einem der Ziele erforderlich sind.
Kopieren und Einfügen von Code wird wahrscheinlich die zyklomatische Komplexität erhöhen, da er wiederholte Logik enthält, die in einen eigenen benannten Block (oder eine eigene Methode) abstrahiert werden könnte.
Scheint vernünftig?
quelle
Nimm ein englisches Wort für etwas. Stellen Sie sich nun vor, Sie hätten jedes Mal, wenn Sie dieses Ding beschreiben wollten, die vollständige Wörterbuchdefinition anstelle nur des Wortes verwendet. Wie leicht könnten andere Sie verstehen?
Ich bilde mir ein mentales Bild von etwas, das nicht vorhanden ist oder das nicht der Fall ist (stelle es dir vor) . Einfache Willensvergangenheit. Anzeige der Futurity in Bezug auf eine vergangene Zeit. Es ist nicht einfach, auf eine Aktion in der Vergangenheit hinzuweisen, die wiederholt oder häufig stattgefunden hat (wäre) . Erfordert große körperliche oder geistige Anstrengungen, um zu erreichen oder zu verstehen oder zu ertragen (schwierig).
Es würde auch nicht schaden, ein aktuelles Vorher-Nachher-Beispiel für echten Code anzuzeigen, der überarbeitet wurde, um Duplikate zu entfernen.
quelle
Es gibt auch Sicherheits- und Code-Integritätsbedenken.
Wie hier gezeigt , ist es möglich, schädliche Daten in Unicode-Zeichen einzubetten, die in die Zwischenablage übertragen werden.
Abhängig davon, wie Ihr Editor auf Unicode-Zeichen reagiert, kann dies zu unerwarteten Änderungen Ihres Quellcodes, unerwarteten Compiler-Ausgaben oder einigen Dingen führen, an die ich noch nicht gedacht habe.
quelle
Es gibt ein paar verschiedene Routen, die ich hier sehen könnte:
Plagiat - Einige erinnern sich vielleicht an die Zeit in der Schule, in der der Diebstahl von geistigem Eigentum ein großes Nein ist. Das Kopieren-Einfügen-Programmieren kann genauso sein, da jemand möglicherweise die Quelle nicht versteht oder die Ursache für die Verwendung einer bestimmten Lösung, die nur blind kopiert und eingefügt wurde, ohne zu analysieren, wie gut dies funktioniert, und zu verstehen, warum dies möglicherweise der Fall ist oder nicht eine effektive Lösung für das Problem.
Blinde Anweisungen befolgen - Die meisten Menschen hätten wahrscheinlich Erfahrungen damit gemacht, an einen Ort zu gelangen, an dem sie vorher noch nicht waren. Einige haben möglicherweise MapQuest oder Google Maps verwendet, um einen Ort zu finden und dann den angegebenen Anweisungen zu folgen. Es gab Geschichten von Menschen, die sich verirrten oder einfach nicht fanden, wo sie sich befanden, obwohl die Software spezifische Anweisungen gab, wie sie dorthin gelangen sollten. Dies ist die andere große Gefahr beim Kopieren und Einfügen: Es ist genau so, als hätte jemand Ihnen nur die Wegbeschreibung von A nach B gegeben, ohne dass Sie eine Karte des Gebiets sehen, die eine Reise möglicherweise etwas erschwert. Wenn das nicht schwer zu sein scheint, können Sie den Einsatz verbessern, indem Sie die Person bitten, mit einer Augenbinde von A nach B zu gelangen, damit sie sich auf andere Sinne verlassen kann, um zu bestimmen, in welche Richtung sie blicken und zu einem Ziel gelangen.
Daten, Informationen, Wissen und Weisheit sind möglicherweise ein gutes Modell, auf das verwiesen werden kann, um zu zeigen, warum Suchen und Ersetzen als Lösung nicht effektiv ist, da das Kopieren und Einfügen sehr mechanisch und ohne viel Nachdenken erfolgt, so dass die übertragenen Daten möglicherweise sind ohne das Wissen und die Weisheit, es richtig anzuwenden. Man könnte die Kernenergie betrachten, um Beispiele dafür zu finden, wie wichtig es sein kann, den Unterschied zu verstehen. Vergleichen Sie einen Atomreaktor mit einer Atombombe, um herauszufinden, ob es nicht ausreicht, genau zu wissen, was wohin geht, um die Kraft des Atoms sicher zu nutzen.
quelle
Stellen Sie sich vor, Sie haben Gruppenschüler und ein Regelwerk für die Schule. Anstatt die Regeln an einem gemeinsamen Ort zu veröffentlichen, müssen alle Schüler darauf verweisen, dass Sie jedem eine Kopie der Regeln aushändigen. Jedem Schüler wird gesagt, dass er seine Kopie der Regeln genau befolgen muss.
Ändern Sie nun eine der Regeln, die besagen, dass Sie im Katastrophenfall zum neuen Katastrophenschutz gehen sollten. Sie müssen zu jedem Schüler gehen und dessen Regelwerk ändern. Wenn einer der Schüler vermisst wird und ein Tornado zuschlägt, geht der Schüler zum alten Ort und stirbt an einem schrecklichen Tod.
quelle
Jemand sendet Ihnen eine E-Mail mit einer angehängten Dokumentvorlage. Sie können es weiter verwenden, bis sich die Vorlage ändert. Keine Sorge, sie werden nicht vergessen, Ihnen eine aktualisierte Kopie zuzusenden.
quelle
Das CoCoMo-Kostenmodell.
http://en.wikipedia.org/wiki/COCOMO
Aufwand (E) = a * (KLOC) ** b, wobei b> 1,0 ist
Dieser Exponent bedeutet, dass der Aufwand für das Erstellen / Warten / Unterstützen / Neuschreiben schneller wächst als die Anzahl der Codezeilen.
quelle
Es gibt einen weiteren wichtigen Aspekt dieser schlechten Praxis, den noch niemand in Betracht gezogen hat: Durch blindes Kopieren (vollständigen oder teilweisen) Codes von jemand anderem ( ohne deren Erlaubnis ) könnten Sie gegen das Urheberrecht verstoßen .
quelle
Die Copy-Paste-Codierung, die ich sehe, ist eine, bei der der Entwickler nicht versteht oder überlegen möchte, was er tut, und verschiedene Teile, die bereits "mehr oder weniger" das tun, was sie benötigen, zusammenkopiert und am Ende zufällig wackelt damit sie zusammenpassen.
Damit sind drei Hauptprobleme verbunden:
quelle
Angenommen, Sie haben 5 Freundinnen (Sie sind ein schlauer Hund) und möchten allen eine Valentinstag-Nachricht senden. Sie tippen den ersten Buchstaben, fügen ihren Namen hinzu und erwähnen etwas Denkwürdiges, das Sie mit anderen geteilt haben. Anschließend kopieren Sie den Buchstaben viermal und fügen ihn ein. Dabei fehlt jedes Mal eine Instanz des Namens der Freundin Nr. 1 mit Kopieren und Einfügen, weil Sie einen Tippfehler gemacht haben. Jetzt sind 4 Ihrer fünf Freundinnen auf dem Weg zum Haus von Freundin # 1.
quelle