Warum ist das Kopieren und Einfügen von Code gefährlich? [geschlossen]


130

Manchmal beschwert sich mein Chef bei uns:

Warum brauchen wir so viel Zeit, um eine Funktion zu implementieren?

Tatsächlich wurde die Funktion bereits in einer anderen Anwendung implementiert. Sie müssen lediglich Codes von dort kopieren und einfügen. Die Kosten sollten niedrig sein.

Es ist wirklich eine schwierige Frage, denn das Kopieren und Einfügen von Codes ist aus meiner Sicht nicht so einfach.

Haben Sie gute Gründe, dies Ihrem nicht-technischen Chef zu erklären?


19
Es klingt so, als würden Sie, anstatt Code aus Ihren vorherigen Anwendungen in eine neue zu kopieren und einzufügen, immer wieder dieselbe Funktionalität neu schreiben. Ich denke, das DRY-Prinzip zielt eher darauf ab, nicht die gleiche Funktionalität im gesamten System zu duplizieren, aber die Wiederverwendung von Code aus anderen Anwendungen ist besser als das erneute Schreiben.
Carson Myers

5
Denn jedes Mal, wenn Sie Code kopieren und einfügen, wird ein Seehundbaby getötet.
DeadlyChambers

@CarsonMyers Nur wenn die Komponente wiederverwendbar ist. Und es soll in den aktuellen Kontext passen.
Sreekanth Karumanaghat

Antworten:


171

Wenn Sie einen Fehler in Ihrem Code zum Einfügen und Kopieren finden, müssen Sie ihn an jeder Stelle beheben, an der Sie ihn gemacht haben, und hoffen, dass Sie sich an alle erinnern können (dies gilt auch für geänderte Anforderungen).

Wenn Sie die Logik an einem Ort aufbewahren, ist es einfacher, sie bei Bedarf zu ändern (wenn Sie also entscheiden, dass die Anwendung aktualisiert werden muss, tun Sie dies nur an einem Ort).

Lassen Sie Ihren Chef über das DRY-Prinzip lesen (Wiederholen Sie sich nicht).

Was Sie beschreiben, klingt nach der perfekten Verwendung für Bibliotheken , in denen Sie Code gemeinsam nutzen und nur an einem Ort aufbewahren.

Ich würde Code immer nur kopieren und einfügen, wenn ich ihn bald darauf umgestalten wollte - um sicherzustellen, dass ich später gemeinsamen Code extrahiere, damit ich so viel Logik wie möglich wiederverwenden kann. Und bald danach meine ich Minuten und Stunden später, nicht Tage und Wochen.


41
+1. Der Punkt ist, dass Kopieren und Einfügen billig ist, um das unmittelbare Problem zu lösen. Das eigentliche Problem ist, dass mittel- / langfristig die Kosten für die Pflege von doppeltem Code weitaus höher sind als für gut faktorisierten Code
Paolo

7
Es ist nicht nur ein Fehlerproblem; Programmanforderungen können sich ändern. Ich habe vier von fünf Stellen geändert, an denen vorher etwas geändert werden musste.
David Thornley

1
Wenn Sie bei Bedarf kopieren und einfügen und nachverfolgen können, wo die Duplikate leicht zu abstrahieren oder zu aktualisieren sind, ist das Kopieren und Einfügen keine schlechte Sache. Weitere Informationen und Tools finden Sie in der Diskussion zur Klonerkennung unter www.semanticdesigns.com/Products/Clone.
Ira Baxter

4
Viele davon ifsund die meisten Tools unterstützen derzeit keine Klonerkennung.
Oded

2
Es war einmal ein Programmierer, der für die ESA arbeitete . Er arbeitete an einer Software für die Ariane-5-Rakete und verwendete die Copy-Paste-Methode. Dann passiert ...
Hauleth

25

Sie würden weit besser dran , den Austausch durch den Aufbau einer Bibliothek den Code anstatt Kopieren Sie den Code Kopieren und Einfügen.

Sie erhalten immer noch einen Geschwindigkeitsvorteil gegenüber dem erneuten Schreiben (DRY nachschlagen), haben jedoch nur einen Platz, um den Code zu verwalten.


1
Ich bin nur neugierig, warum sollten Sie den Code "schneiden", wenn Sie ihn nur duplizieren müssen?
dpp

Guter Punkt dpp. Bearbeitet!
Ergebnisse

12

Der offensichtliche Grund ist, dass Sie eine „Schuld“ für die Zukunft übernehmen: Jede Änderung, die Sie jemals am Code vornehmen müssen (nicht nur Bugfixes, jede Änderung), ist jetzt doppelt so teuer, da Sie zwei Stellen aktualisieren müssen - und riskanter, weil Sie irgendwann einen von ihnen vergessen werden. Mit anderen Worten, wenn Sie es jetzt schneller arbeiten lassen, wird Ihre Arbeit in Zukunft noch langsamer. Dies kann wirtschaftlich sinnvoll sein, ist es aber normalerweise nicht.

Der wichtigere Grund ist jedoch, dass die Annahme "das ist das Gleiche wie das" meistens subtil falsch ist. Wenn Ihr Code von unausgesprochenen Annahmen abhängt, um korrekt zu sein, führt das Kopieren an einen anderen Ort zu Fehlern, es sei denn, diese Annahmen gelten auch für den neuen Ort. Daher ist der eingefügte Code häufig von Anfang an falsch und nicht erst nach der nächsten Änderung.


11

In Bezug auf das Design ist das Einfügen von Code sicherlich eine Katastrophe, die in Zukunft viele Probleme verursachen kann. Aber Sie fragen sich, warum Sie gerade jetzt viel Arbeit benötigen . Die Antwort lautet: Weil es nie nur Kopieren und Einfügen ist.

Wenn der ursprüngliche Code geschrieben wurde, um als ziemlich unabhängige Bibliothek unter Berücksichtigung der Flexibilität und der Verwendung durch den Client wiederverwendet zu werden - dann großartig, aber das ist kein Kopieren, sondern das Verwenden einer Codebibliothek. Das Einfügen von echtem Code funktioniert normalerweise eher so:

  • "Sicher, ich habe bereits Code, der genau das tut!"
  • "Warten Sie, welche dieser fünf Codeversionen möchte ich als Quelle verwenden?"
  • "Hmmm, was machen all diese 'util_func_023'-Funktionen? Habe ich sie nicht dokumentiert? Welche brauche ich jetzt?"
  • "Oh ja, dieser Code verwendet Code Base Y. Ich denke, ich muss [einen auswählen: Kopieren Sie den gesamten Code Base Y in mein neues Projekt / verbringen Sie einen Tag damit, die eine Funktion zu extrahieren, die ich aus Code Base Y herausholen möchte / verbringen Sie eine Woche damit, den Code zu extrahieren eine Funktion, die ich von Code Base Y möchte]. "
  • "Ich habe alles kopiert, yay!"
  • "Warum funktioniert das nicht?"
  • Dies ist der Punkt, an dem Sie Stunden / Tage / Wochen damit verbringen, vorhandenen Code zu debuggen, der dem entspricht, was Sie möchten, anstatt den Code zu schreiben, mit dem Sie tatsächlich beginnen möchten.

Zusammenfassend kann vorhandener Code, der nicht direkt verwendet werden kann, bestenfalls als gute Referenz für das Schreiben von ähnlichem Code dienen. Es kann sicherlich nicht ganz angehoben werden und es wird erwartet, dass es in einem völlig anderen System funktioniert. Im Allgemeinen ist es eine sichere Annahme, dass jeder Code, der geschrieben und vervollständigt wurde, mit so wenig wie möglich durcheinander gebracht werden sollte - selbst wenn es sich um eine Kopie handelt und nicht um das Original selbst.

Wenn Sie Ihr Projekt auf das Einfügen von Kopien stützen möchten, müssen Sie zunächst so codieren , dass eine einfache Wiederverwendung möglich ist, ohne den ursprünglichen Code zu kopieren und damit herumzuspielen. Das lohnt sich, und wenn Ihr Chef dies erwartet, müssen Sie beide sicherstellen, dass Sie in erster Linie so entwerfen und arbeiten.


9

Kopieren und Einfügen ist eine Katastrophe, die darauf wartet, passiert zu werden. Ihr Chef sollte den Preis für den Versand frühzeitig in Bezug auf den Preis für den Versand eines fehlerhaften Codes an den Endbenutzer bewerten.


9

Wenn Sie bereits die Funktionen implementiert haben , und Sie müssen kopieren und sie wieder zu verwenden, es klingt wie Sie etwas falsch gemacht haben. Können Sie diese Funktionen nicht in eine Bibliothek einfügen, damit Sie sie ohne Kopieren / Einfügen wiederverwenden können?


8

Das DRY-Prinzip (Wiederholen Sie sich nicht): DRY auf Wikipedia .

"Jedes Wissen muss eine einzige, eindeutige und maßgebliche Darstellung innerhalb eines Systems haben."

anderer Link .


Das ist so, als würde man sagen: "Stecke einem Mann niemals ein Messer in die Kehle", was nach einer sehr guten Regel klingt. Bis Sie feststellen, dass der Arzt diese Regel brechen muss, um die Trachiotomie durchzuführen, um das Leben eines Mannes zu retten (wenn er nicht atmen kann, möglicherweise aufgrund von Anaphylaxie, extremer allergischer Reaktion). Jede Regel hat eine Ausnahme (außer vielleicht für diese - dass jede Regel eine Ausnahme hat). Daher muss jede Regel ein Warum und ein Wann und eine Ausnahmeliste enthalten, die alle beigefügt sind, damit die wahre "technische" Realität, dass die wahre Antwort lautet, davon abhängt ...
MicroservicesOnDDD

Also ... wann folgst du DRY NICHT? Ich ringe bei meinem aktuellen Job ständig damit, was mit Firmware zu tun hat, und die Antwort ist, dass wir "Schleifen abrollen" und andere Dinge tun, weil dies "die Leistung verbessert". Wir haben eine sehr flache Vererbungshierarchie, und wir verwenden die meisten Klassen direkt, anstatt sie zu unterklassifizieren, und ... ... verwenden wir häufig das Kopieren und Einfügen. Und ich hasse es, weil es unsere Codebasis schwerer zu verstehen und schwerer zu pflegen macht. Aber wir haben unsere Gründe und sie sind akzeptable Gründe. Wir sind nicht die einzigen Stakeholder. Und das richtige Gleichgewicht zu finden, ist eher eine Kunst.
MicroservicesOnDDD

7

Es klingt für mich nach dem schlimmsten Missverständnis, das Ihr nicht-technischer Chef hat, dass Ihr Job hauptsächlich das Tippen ist. Sie denken, Sie können viel Zeit sparen, indem Sie das Tippen eliminieren.

Ich denke, die beste Ausbildung, die Sie dieser Person geben können, besteht darin, auf all Ihre Arbeit hinzuweisen, die Sie nicht tippen. Auch wenn der größte Teil dieser Arbeit normalerweise unsichtbar in Ihrem Kopf geschieht, gleichzeitig mit dem Tippen.

Sicher, das Eliminieren der Eingabe spart einige Zeit. Aber dann wird der viel größere, nicht tippende Teil Ihres Jobs größer und kostet Zeit und mehr.


4

Sind Sie sicher, dass Ihr Chef etwas über das DRY-Prinzip, Fehler und andere technische Dinge erfahren möchte?

Diese Art von Kommentaren hören Sie normalerweise, wenn Ihr Chef oder Ihr Unternehmen die für die Fertigstellung eines Projekts erforderliche Zeit unterschätzt hat. Und aufgrund einer falschen Schätzung wurde ein Vertrag unterzeichnet usw. In den meisten Fällen waren Programmierer nicht an Schätzungen beteiligt.

Warum passiert das? Manchmal hat der Projektsponsor ein zu kleines Budget. Möglicherweise ist ein Geschäftsprozess, den Sie mithilfe von Software automatisieren, Ihre Teamarbeit nicht wert. Manager sind in solchen Fällen im Allgemeinen für schlechte Nachrichten sehr geschlossen. Zu Beginn des Projekts gibt es Wunschdenken. Dann versuchen Manager, Programmierern die Schuld zu geben. In Ihrem Fall indirekt per Copy-and-Paste. In extremen Fällen spricht man von einem Todesmarsch .


3

Das Kopieren und Einfügen von Code führt normalerweise zur Programmierung durch Zufall


Ich finde diesen Artikel außergewöhnlich schlecht geschrieben. Die Erzählung bleibt abstrakt und beleuchtet den Fall nicht über die Tatsache hinaus, dass Fred iterativ arbeitet. Ein offensichtliches Problem, das Fred hat, ist, dass er keine gute Vorstellung von der Gesamtarchitektur hat. Leider ist dies sehr oft der Fall, wenn wir mit undokumentiertem Legacy-Code arbeiten, bei dem das Know-how verloren geht. Verweise auf Design by Contract und Assertive Programming sind recht gut, aber leider bleiben die Beispiele / Übungen auch danach ungeklärt.
Mapto

3

Ich denke, "eine andere Anwendung " ist hier der Schlüssel. Wenn die andere Anwendung bereits getestet und verwendet wird, sollte sie nicht geändert werden , um eine gemeinsame Bibliothek zu verwenden. Daher können Sie keinen Code mit ihr teilen.

Innerhalb derselben Anwendung ist "Kopieren und Einfügen" schlecht, aber zwischen Codebasen, die von verschiedenen Teams oder mit unterschiedlichen Veröffentlichungszyklen entwickelt wurden, kann "Kopieren und Einfügen" die beste Option sein.


Obwohl ich sehe, dass es wenig Sinn macht, ein Update für die andere Anwendung zu veröffentlichen, nur um die Bibliothek zu verwenden, wäre es wahrscheinlich eine gute Idee, zumindest die notwendigen Änderungen in einem Feature-Zweig vorzunehmen. Dies würde Ihnen ein gewisses Vertrauen geben, dass die Benutzeroberfläche der Bibliothek für mindestens die beiden fraglichen Anwendungen allgemein genug war, und es Ihnen ermöglichen, die Änderung an einem geeigneten Punkt im Veröffentlichungszyklus zusammenzuführen.
SamB

2

Ich habe für eine ähnliche Firma gearbeitet. Als Auszubildender wusste ich es damals nicht besser. Als ich ein neues Projekt startete, schlug mein Chef vor, den Code von einer anderen Stelle einzufügen. Nun, wie Sie vielleicht denken, war die gesamte Software ziemlich durcheinander, bis zu dem Punkt, an dem Sie versuchten, einen Fehler zu beheben, zwei neue Fehler auftraten.


2

Selbst wenn die andere Anwendung bereits über die von Ihnen benötigte Funktion verfügt, passt der Code für diese Funktion möglicherweise nicht ohne größere Umschreibung in Ihre aktuelle Anwendung. Es ist, als würde man den Motor eines Ford nehmen und versuchen, ihn in einen Toyota einzubauen. Im Allgemeinen gilt die Faustregel, dass es besser (billiger) ist, den von Grund auf neu geschriebenen Code neu zu schreiben, wenn Sie mehr als 25% des kopierten Codes ändern müssen.

Das Extrahieren des betreffenden Codes in eine Bibliothek klingt überzeugend, ist jedoch möglicherweise schwieriger als es sich anhört, je nachdem, wie das andere System aufgebaut ist. Beispielsweise ist der Code für diese Funktion möglicherweise schwer zu extrahieren, da er viele andere Codes auf unreine Weise miteinander verbindet (z. B. durch Zugriff auf viele globale Variablen usw.).


1

Sagen Sie Ihrem Chef, dass der Teil jedes Variablennamens den Namen des alten Projekts enthält, und jetzt müssen Sie alle manuell ändern. Wenn Ihr Chef nicht weiß (oder wissen möchte), warum Kopieren / Einfügen schlecht ist, könnte er das genauso gut glauben :)


1

Ja, das größte Problem ist, dass es nicht nur kopiert und eingefügt wird - es wird kopiert, dann eingefügt und dann leicht geändert.

Wenn später eine der eingefügten Varianten ein Problem hat, wird sie geändert. Später wird dann eine andere Variante geändert.

Dann stellen Sie fest, dass sich alle Varianten ändern müssen, da die Originalkopie Fehler aufwies. Jetzt sind Sie wirklich geschraubt, weil jetzt nicht alle geklebten Bereiche gleich sind.

Und würden Sie es nicht wissen, diese Art von beschissener Codierung ist normalerweise fast völlig kommentarlos.

Für mich besteht der Unterschied darin, dass Sie, wenn Sie mehrere Kopien von Code haben, die dasselbe tun, eine Menge Code haben. Wenn Sie nur einen Code haben, der die jeweilige Aufgabe ausführt, haben Sie ein System.

Das Verhalten eines Systems kann ganz einfach mit Einzelpunktänderungen geändert werden. Um das Verhalten einer Reihe von Codes zu ändern, ist eine Reihe von Codes erforderlich.

Ich mag Systeme, keine Menge Code.


1

Es gibt Kompromisse zwischen der Geschwindigkeit der Entwicklung der unmittelbaren Funktionalität vor Ihnen (insbesondere wenn die Anwendung klein ist) und den längerfristigen Wartungskosten, wenn die Anwendung wächst.

Das Kopieren und Einfügen ist für die sofortige Funktionalität schneller, kostet Sie jedoch mit zunehmender Größe der Anwendung viel Geld, da Fehler behoben, systemweite Änderungen vorgenommen und Workflows zwischen verschiedenen Komponenten der Anwendung beibehalten werden.

Das ist das Argument, das Unternehmer hören müssen. Es ähnelt den akzeptierten Kosten für die Wartung einer Fahrzeugflotte. Mit Software sind die fehlerhaften Aspekte der Softwarearchitektur jedoch im Allgemeinen für die Unternehmensseite verborgen und können nur von Entwicklern gesehen werden.


0

Er hat Recht, wenn das Team zuvor ähnliche Funktionen implementiert hat, wird es beim zweiten Mal viel einfacher sein , sie zu wiederholen .

Sie sollten jedoch wahrscheinlich erklären, dass jede Anwendung anders ist. Nur weil Sie eine Tür in einem Haus installiert haben, heißt das nicht, dass Sie in kürzester Zeit eine andere Tür in einem anderen Haus installieren können - Sie werden aufgrund der Erfahrung schneller sein (# Türen installiert), aber es wird immer noch einige Zeit dauern, bis Sie Ihre Ausrüstung erhalten Montieren Sie die Tür, stellen Sie sicher, dass sie lotrecht ist, und schrauben Sie sie in den Rahmen.


0

In meiner Firma arbeiten wir immer mit Klassen und Methoden und erstellen technische Dokumentationen für diese. Ich denke, es ist die beste Vorgehensweise, wenn Sie Ihre eigenen SVN-Suchanwendungen mit guten Schlüsseln verwenden können, um die zuvor verwendete Methodenklasse zu finden :)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.