it-swarm-eu.dev

Kopieren und fügen die meisten Programmierer Code ein?

Ich habe sehr früh gelernt, dass das Ausschneiden und Einfügen des Codes eines anderen auf lange Sicht länger dauert als das Schreiben selbst. Meiner Meinung nach wird das Ausschneiden und Einfügen von Code, sofern Sie es nicht wirklich verstehen, wahrscheinlich Probleme haben, deren Lösung ein Albtraum sein wird.

Versteh mich nicht falsch, ich meine, es ist wichtig, den Code anderer Leute zu finden und daraus zu lernen, aber wir fügen ihn nicht einfach in unsere App ein. Wir schreiben die Konzepte in unsere App um.

Aber ich höre ständig von Leuten, die ausschneiden und einfügen, und sie reden darüber, wie es üblich ist. Ich sehe auch Kommentare von anderen , was darauf hinweist, dass es gängige Praxis ist.

Schneiden die meisten Programmierer Code aus und fügen ihn ein?

48
John MacIntyre

Zwei allgemeine Fälle:

Von einem Projekt zum anderen :

Die meisten Programmierer schneiden Code in dieser Funktion aus und fügen ihn ein. Sie können ein vorheriges Projekt oder etwas online finden und es genau kopieren/einfügen oder kopieren/einfügen und Änderungen daran vornehmen. Ich denke, diese Praxis ist normalerweise in Ordnung. Dies ist besonders gut, wenn es sich um bewährten Code handelt. (Beispiele: Eine Art Dienstprogrammobjekt aus einem früheren Projekt, das gut funktioniert hat, oder möglicherweise aus einem Blog mit wenigen erforderlichen Änderungen). Dies kann schlecht sein, wenn Sie Code kopieren, den Sie nicht verstehen, oder wenn der Code schlecht ist oder wenn es eine viel bessere alternative Lösung gibt als den Code, den Sie einfügen.

Innerhalb desselben Projekts : Das Kopieren und Einfügen in dasselbe Projekt ist normalerweise keine gute Idee. Dies ist ein schlechter Geruch, dass der Code, der kopiert wird, nur irgendwo in einer Methode/Klasse sein und wiederholt aufgerufen werden sollte. Es gibt einige Ausnahmen, aber im Allgemeinen sollte der Programmierer denken: " Gibt es eine Möglichkeit, diesen Code, den ich kopiere, zu parametrisieren? ".

46
jzd

Die meisten Programmierer tun es, aber das heißt nicht, dass Sie es tun sollten

Eines meiner Programmier-Mantras lautet: "Wenn ich Code kopiere und einfüge, mache ich etwas falsch" . Im Wesentlichen TROCKEN .

Ich denke, es sollte offensichtlich sein, dass die Wiederverwendung von Code bedeutet, Code als Ressource zu verwenden und keinen Code zu wiederholen. Manchmal habe ich meinen eigenen Code kopiert und eingefügt, in den meisten Fällen ende ich mit Kesselplattencode oder Sachen, die wirklich ähnlich aussehen.

Nachdem ich danach etwas mehr Zeit mit diesem Code investiert habe, habe ich Folgendes:

  • Eine Komponente (siehe auch: Trennung von Bedenken )
  • Ich kann auf Reflexion zurückgreifen, um die Dinge in Zukunft einfacher, sauberer und einfacher zu wiederholen.
  • Ein besseres Design , denn selbst wenn es funktioniert, warum nicht noch einmal machen, nachdem Sie die Lektionen gelernt haben?.
  • Ein Muster , das ich abstrahieren, in eine Bibliothekskomponente verwandeln und doppelten Code entfernen kann.

Es kann fraglich sein, ob wir Code kopieren und einfügen sollen oder nicht, da es dem Kunden/Chef egal ist (zumindest direkt und kurzfristig) und Sie möglicherweise mit den gleichen Ergebnissen enden, aber das Problem tritt wirklich auf, wenn es auftritt führt zu Fehlern, Verlust der Modularität und letztendlich zur Hölle der Wartung.

Was Sie tun sollten: Refactor ASAP

Niemand schreibt perfekten Code, auch wenn er funktioniert, auch wenn Sie nicht kopieren und einfügen und es sich um Ihren eigenen Code handelt. Wenn Sie damit nicht ganz zufrieden sind, fügen Sie einfach eine Notiz in die Kommentare ein (z. B. einen Dokumentblock "@todo"), um daran zu erinnern Sie selbst, was Sie umgestalten müssen und warum ... selbst wenn Sie es nicht selbst umgestalten, kann dies für den Betreuer zum Unterschied zwischen Glück und totaler Frustration werden.

Schließlich werden Sie am Ende mit guter Code enden, selbst wenn Sie kopieren und einfügen.

(Good Code

via XKCD

37
dukeofgaming

Wenn ich nicht weiterkomme und nach Dingen suche, um mein Problem zu lösen, und auf einen hilfreichen Codeausschnitt stoße, der das tut, was ich will, kopiere ich ihn natürlich. Manchmal ist es nur das Wesentliche. Ich ändere es dann, um meinen Bedürfnissen zu entsprechen. Dies passiert häufiger, wenn ich mich mit Dingen befasse, für die ich kein Experte bin (derzeit Objective-C).

Ich nehme mir immer die Zeit, etwas aus dem Code zu lernen, daher ist es für mich eine großartige Möglichkeit, das Rad zu lernen und nicht neu zu erfinden.

8
Martin Wickman

Ich werde hier über das Kopieren/Einfügen des Codes anderer Leute sprechen. Teile meiner eigenen Arbeit aus meiner persönlichen Bibliothek zu holen, ist ein faires Spiel. Ich kenne sie und verstehe sie per Definition.

Ich finde, dass die häufigste Situation, in der ich Code ausschneide und einfüge, darin besteht, dass ich ein bestimmtes Problem habe und auf einen Blog-Beitrag stoße, der es löst. Meistens tippe ich die Lösung erneut in mein Projekt ein (schließlich ist sie wahrscheinlich im Stil des Blog-Autors geschrieben, wenn nichts anderes). Es ist nicht wirklich mein Code, aber ich fühle mich nicht schlecht, wenn ich ihn in diesem Szenario verwende.

Ich verstehe es nicht, ganze Methoden oder Systeme zu nutzen, um sie so wie sie sind in mein Projekt einzufügen und es als erledigt zu bezeichnen. Neulich gab es ein Frage zu StackOverflow , das das Problem mit so etwas perfekt illustrierte.

Das Zusammenschustern eines Frankenstein-Monsters aus verschiedenen Codeteilen kann einfach nicht so effizient sein. Ich meine, wenn Sie gut darin sind, bedeutet dies, dass Sie entweder immer wieder dieselbe Lösung replizieren oder dass Sie genug Verständnis für den Code anderer Leute haben, dass nicht mehr dieselbe Kopier-/Einfügeebene erforderlich sein sollte und Ihre Die Produktivität würde sich verbessern, da Probleme zwischen inkompatiblen Codebeispielen nicht gelöst werden müssen.

Ich persönlich habe nicht viele Programmierer getroffen, die in großem Maßstab kopieren/einfügen. Ich habe viele gesehen, die sich in die tiefsten und dunkelsten Ecken codieren, aber das ist eine andere Geschichte. Aufgrund meiner persönlichen Anekdaten würde ich sagen, dass die meisten Programmierer nicht ganze Anwendungen zusammen kopieren/einfügen, aber es ist wirklich schwer zu sagen.

6
Adam Lear

Schlecht: Immer wieder denselben Codeblock kopieren und einfügen

Wenn Sie dies tun, sollten Sie sich wahrscheinlich eine Sekunde Zeit nehmen, um darüber nachzudenken, was aus dem zu kopierenden Code abstrahiert werden kann, und eine Funktion/Methode erstellen, um damit umzugehen. Hier zählt das Prinzip DRY (Repeat Yourself)).

Gut: Kopieren eines Codeblocks, von dem bekannt ist, dass er funktioniert

DRY (Don't Repeat Yourself) gilt auch hier, nur in einem anderen Sinne. IE, wiederholen Sie nicht die Arbeit, die Sie bereits in der Vergangenheit erledigt haben. Wenn Sie sich die Zeit genommen haben, einen Codeabschnitt zu schreiben, debuggen Sie ihn, testen Sie ihn und es funktioniert nachweislich in einer Produktionscodebasis. Sie wären dumm, es nicht wiederzuverwenden.

Die meisten Leute geben dem Kopieren und Einfügen einen schlechten Ruf, weil viele Anfängerprogrammierer ihre Zeit damit verbringen, das Netz zu durchsuchen und einen Mischmasch des Codes anderer Leute zu kopieren/einzufügen, ohne zu verstehen, was er tatsächlich tut.

Es ist nicht besser, jedes Mal alles von Grund auf neu zu schreiben. Ich weiß, dass es viele puristische Programmierer der alten Schule gibt, dass alles von Grund auf neu geschrieben werden sollte, und ich hoffe, dass ich nicht daran hängen bleibe, mit ihnen zu arbeiten. Wenn Sie über 5 Jahre Programmiererfahrung verfügen, sollten Sie über eine ziemlich umfangreiche Codebibliothek verfügen, die für die Wiederverwendung geeignet ist. Es ist eines der besten Vermögenswerte, die ein erfahrener Programmierer auf den Tisch bringen kann, da es möglicherweise viel Entwicklungszeit spart.

Wenn Sie mit Ihrem alten Code zunächst nichts verstehen, nehmen Sie sich einen Moment Zeit, um die Kommentare zu lesen und sich erneut vertraut zu machen. Wenn Ihre Kommentare scheiße sind ... nun, das ist insgesamt ein anderes Problem.

4
Evan Plaice

Nach 25 Jahren des Schreibens von Code gab es Zeiten, in denen ich mir (ohne Zugriff auf Code, den ich für einen früheren Arbeitgeber geschrieben habe) wünschte, ich könnte ausschneiden und einfügen. Dies war jedoch sehr selten (und lesen Sie weiter).

Das vielleicht beste Beispiel ist ein wirklich einfacher Befehlszeilenparser, den ich vor Jahren für Unix-Betriebssysteme kennengelernt habe. Eine einfache Schleife, die durch die Argumente zippt und die Optionen verarbeitet. Es war sehr einfach und elegant, und das habe ich seitdem viele Male verwendet (eher als Muster als als wörtliches Ausschneiden und Einfügen). Dies ist eher die Ausnahme als die Regel.

Normalerweise ist ein einfaches Ausschneiden und Einfügen völlig unangemessen - es ist mehr das Ausschneiden und Einfügen des Konzepts oder Algorithmus, das wichtig war.

Ich bin nicht zu stolz - ich suche gerne nach einem wirklich schnellen Paritäts- oder Hamming-Code-Überprüfungsalgorithmus oder so etwas Exotischem. Dann verbringe ein paar Stunden damit, es zu verstehen, um zu sehen, ob es wirklich das superschnelle Ding ist, nach dem ich gesucht habe, oder ein naiver Haufen Müll.

Ich mache mir jedes Mal Sorgen, wenn jemand nur Code kopiert, ohne eine Pause einzulegen, um ihn zu verstehen. Sie sind entweder ein Genie (verstehen Sie es und alle seine Feinheiten auf einen Blick) oder ein Narr. Dazwischen ist nicht viel Platz. Oh, und es gibt auch nicht viele wahre Genies.

Ohne Verständnis haben Sie wirklich keine Ahnung, was Sie gerade WIRKLICH getan haben, nicht nur unter den glücklichen, sondern auch unter den unglücklichen Umständen oder Eingabebedingungen. Manchmal spielt das keine Rolle, weil Sie Glück haben. Und manchmal verursacht dies viel Langzeitschmerz.

3
quickly_now

Es gibt eine häufige Situation, in der Sie dies grundsätzlich tun MÜSSEN, um produktiv zu sein.

Jede Ihnen unbekannte Technologie ist schwer zu erlernen, es sei denn, Sie haben zunächst ein funktionierendes Beispiel. Daher kopierst du das und fügst es ein, um etwas zu haben, das tatsächlich läuft, und fängst dann an, daran zu basteln.

3
user1249

Als neuer Programmierer (4 Monate nach meinem ersten Job) bin ich ziemlich auf Hilfe angewiesen (ob von SO oder anderen Orten). Ich lege Wert darauf, anderen Code NICHT blind zu kopieren und einzufügen Selbst wenn der bereitgestellte Code das ist, was ich verwenden werde, werde ich ihn in mein Programm eingeben und dann ein wenig Zeit damit verbringen, sicherzustellen, dass ich vollständig verstehe, was er tut und warum.

Ich möchte sicherstellen, dass ich ständig lerne und nicht nur ein Experte für Ausschneiden und Einfügen bin

3
Darren Young

Ich habe so viele Gefühle zu diesem Thema, und ich kann nicht ehrlich sagen, dass eines davon ganz objektiv ist.

Es gibt viele Argumente, um den Code anderer Personen auszuschneiden und in Ihre Anwendung einzufügen. Einige von ihnen mögen Sinn machen, andere nicht. Wenn Sie beispielsweise eine Methode aus einem Blog haben, die eine Eingabe übernimmt und einen komplizierten mathematischen Algorithmus ausführt, der weit außerhalb Ihrer mathematischen Fähigkeiten liegt und ein Ergebnis ausspuckt - das ist ein Argument für das Ausschneiden und Einfügen -, holen Sie die Erlaubnis des Autors ein, diese zu verwenden Code und Kredit sie, wo fällig - es ist die ehrenvolle Sache zu tun.

Es gibt Argumente dafür, das Rad nicht neu zu erfinden - auch dies ist theoretisch sinnvoll. Wenn Sie sich jedoch nicht die Zeit nehmen, sich mit dem Code, den Sie ausschneiden und einfügen, vertraut zu machen, wissen Sie nicht, ob es einen besseren Weg gibt, dieses Problem zu lösen, und Sie wissen nicht, ob der Code Fehler enthält . Was ist, wenn das Rad, das Sie einfügen, kaputt ist?

Es gibt Argumente für Geschwindigkeit und Effizienz: Sie bauen eine Bibliothek mit Code anderer Personen auf, die Sie abgezockt, gestohlen, plagiiert oder auf andere Weise erstellt haben. Wenn Sie darüber nachdenken, müssen Sie möglicherweise nie wissen, wie man über Frankensteining hinaus eine Anwendung programmiert zusammen aus zurückgewonnenen Teilen.

Es gibt Zeiten und Orte, an denen ich dieses Verhalten für völlig akzeptabel halte. Zum Zusammenhacken von schnellen Wegwerfwerkzeugen, die nicht auf Langlebigkeit ausgelegt sind, sondern eine Aufgabe erledigen sollen, gerade jetzt durch Haken oder Gauner. Um Prototypen zu erstellen und Konzente zu studieren, um in einem theoretischen Kontext zu lernen und voranzukommen, halte ich dies für ein völlig faires Spiel.

Das Ausschneiden und Einfügen des Codes anderer Personen ist ein Plagiat. Wenn Sie den Segen haben und den Code verstehen, den Sie einfügen, und er in das Konstrukt der Codierungsstandards für Ihre Anwendung passt, dann gebe ich zu, dass es ein faires Spiel ist.

Als professioneller Softwareentwickler werde ich dafür bezahlt, einen Standard und einen Ethikkodex einzuhalten. Ich werde nicht dafür bezahlt, das Urheberrecht anderer zu stehlen, zu plagiieren oder zu verletzen, wodurch mein Klient einem Strafverfolgungsrisiko ausgesetzt ist. Abgesehen davon besteht ein sehr reales Risiko, dass das Ausführen des ausgeschnittenen/eingefügten Codes katastrophale Nebenwirkungen hat.

Wenn Sie diese Antwort nicht auf Sie richten, John, wissen Sie, dass Sie in Bezug auf solche Themen sehr ethisch veranlagt sind. Dies ist also nur eine allgemeine Beschimpfung in Richtung der Frage selbst.

Nachtrag: Trotzdem halte ich das Ausschneiden und Einfügen Ihres eigenen Codes zwischen Projekten für akzeptabel - es sei denn, er wurde als Leiharbeit für eine andere Person geschrieben. In diesem Fall besitzen Sie den Code nicht Copyright und Sie sollten die Erlaubnis der Person einholen, für die Sie es codiert haben. Ich habe festgestellt, dass die meisten Arbeitgeber damit einverstanden sind, dass Sie Ihre eigenen Ideen für andere Kunden wiederverwenden, es sei denn, der Code ist für proprietäre Funktionskonzepte relevant.

1
BenAlabaster

Angesichts der Tatsache, dass in einem Open Source-Repository 15% aller Methoden werden von einem Projekt in ein anderes kopiert (pdf), scheint die Antwort ein klares Ja zu sein.

1
nes1983

In den meisten Fällen entspricht der Code, den Sie im Internet finden, nicht genau Ihren Zwecken.

Ich sehe viel, indem ich Code von jemandem kopiere, ihn auf das Wesentliche reduziere und dann Code hinzufüge, bis er meinen Anforderungen entspricht. Ich werde es immer so umgestalten, dass es meinen Namenskonventionen und meinem Codierungsstil entspricht.

Ich persönlich hasse es, wenn ich ein Tutorial lese und sie beginnen damit, Code für einen komplizierten Fall anzuzeigen. Beginnen Sie mit der Essenz und zeigen Sie Bausteine, um den Code zu erweitern. Wenn ich jemals ein eigenes Blog starte, werde ich den Leuten ein kommentiertes Codebeispiel zur Verfügung stellen, das die Essenz dessen zeigt, was ich tun möchte, wie Sie Funktionen/Sonderfälle hinzufügen können und ein voll funktionsfähiges Beispiel für die Grundfunktion.

0
J. Maes

Wenn der Code gut ist, sollte er anstelle des Kopierens und Einfügens in eine gemeinsame Bibliothek erstellt werden. Die Leute können sich jedoch nicht mit Refactoring beschäftigen und bevorzugen die gleiche Funktionalität, die durch Kopie und Methode verbreitet wird.

Anstatt ein universelles absolutes Gesetz des Kopierens und Einfügens zu haben, das gut oder schlecht ist, sollte man sehen, wann man es verwendet.

Die Vorteile für das Kopieren und Einfügen sind: Sie können schnell gehen Nachteile: Der gleiche Code wird an mehreren Stellen verbreitet, und jedes gefundene/gelöste Problem muss überall gelöst werden. Wenn anstelle des Kopierens und Einfügens eines als gemeinsame Bibliothek verwendet wird, wird das Update ausgeführt überall verbreiten. Für eine kleine Anfangsinvestition in die Verwendung einer Bibliothek, anstatt den gleichen Code überall zu verbreiten.

Sie haben die Wahl, ob Sie zunächst ein wenig Zeit sparen möchten, verglichen mit viel später. Dann ist Kopieren und Einfügen der richtige Weg, andernfalls überarbeiten und in eine gemeinsame Bibliothek stellen.

0
Arjang