Ich habe sehr früh gelernt, dass das Ausschneiden und Einfügen des Codes eines anderen langfristig länger dauert als das Schreiben selbst. Meiner Meinung nach wird es beim Ausschneiden und Einfügen von Code wahrscheinlich Probleme geben, die ein Albtraum sein werden, den es zu lösen gilt.
Versteht 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 schneiden und einfügen, und sie reden darüber, wie es üblich ist. Ich sehe auch Kommentare von anderen, die darauf hinweisen, dass es üblich ist.
Schneiden die meisten Programmierer Code aus und fügen ihn ein?
programming-practices
John MacIntyre
quelle
quelle
Antworten:
Zwei allgemeine Fälle:
Von einem Projekt zum anderen:
Die meisten Programmierer schneiden Code aus und fügen ihn in dieser Funktion 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 in der Regel 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, für das nur wenige Änderungen erforderlich sind.) Dies kann schlecht sein, wenn Sie Code kopieren, den Sie nicht verstehen, wenn der Code schlecht ist oder wenn es eine viel bessere alternative Lösung als den Code gibt, den Sie einfügen.
Innerhalb desselben Projekts: Kopieren und Einfügen in dasselbe Projekt ist normalerweise keine gute Idee. Dies ist ein übler Geruch, dass der Code, der kopiert wird, einfach 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? ".
quelle
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 die Verwendung von Code als Ressource und nicht die Wiederholung von Code bedeutet. Manchmal habe ich meinen eigenen Code kopiert und eingefügt, in den meisten Fällen endete ich mit Kesselplattencode oder ähnlichem.
Nachdem ich etwas mehr Zeit in diesen Code investiert habe, komme ich zu folgendem Ergebnis:
Es kann fraglich sein, ob wir Code kopieren und einfügen sollen oder nicht, da es dem Client / Chef egal ist (zumindest direkt und kurzfristig) und Sie möglicherweise mit den gleichen Ergebnissen enden, aber das Problem kommt wirklich, wenn es passiert führt zu Fehlern, Verlust der Modularität und letztendlich zur Wartungshölle.
Was Sie tun sollten: Refactor so schnell wie möglich
Niemand schreibt perfekten Code, auch wenn es funktioniert, auch wenn Sie nicht kopieren und einfügen, und es ist Ihr eigener Code, wenn Sie nicht ganz zufrieden sind, schreiben Sie einfach einen Hinweis in die Kommentare (zB einen Dokumentblock "@todo"), um daran zu erinnern Sie selbst, was Sie umgestalten möchten und warum ... Auch wenn Sie es nicht selbst umgestalten, kann es für den Betreuer zum Unterschied zwischen Glück und völliger Frustration werden.
Schließlich erhalten Sie am Ende einen guten Code , selbst wenn Sie ihn kopieren und einfügen.
über XKCD
quelle
Wenn ich nicht weiterkomme und nach etwas suche, um mein Problem zu lösen, und auf einen hilfreichen Codeausschnitt stoße, der 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, in denen ich kein Experte bin (derzeit Objective-C).
Ich nehme mir immer die Zeit, etwas aus dem Code zu lernen. Für mich ist es eine großartige Möglichkeit, etwas zu lernen und zu vermeiden, das Rad neu zu erfinden.
quelle
Ich werde hier über das Kopieren / Einfügen von Code anderer Leute sprechen. Teile meiner eigenen Arbeit aus meiner persönlichen Bibliothek zu holen, ist faires Spiel. Ich kenne sie und verstehe sie per Definition.
Die häufigste Situation, in der ich Code ausschneide und einfüge, ist, wenn ich ein bestimmtes Problem habe und auf einen Blog-Post stoße, der das Problem löst. Meistens gebe ich die Lösung erneut in mein Projekt ein (immerhin 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.
Es ist etwas, das ich nicht verstehe, ganze Methoden oder Systeme in mein Projekt einzufügen, wie sie sind und es als erledigt zu bezeichnen. Neulich gab es eine Frage zu StackOverflow, die das Problem mit so etwas perfekt veranschaulichte.
Das Zusammenschustern eines Frankenstein-Monsters aus verschiedenen Codeteilen kann einfach nicht so effizient sein. Ich meine, wenn Sie sich damit auskennen, bedeutet dies, dass Sie entweder immer wieder dieselbe Lösung replizieren oder den Code anderer Leute so gut verstehen, dass die gleiche Ebene des Kopierens / Einfügens nicht mehr erforderlich sein sollte und auch Ihre Die Produktivität würde sich dadurch verbessern, dass Probleme zwischen inkompatiblen Codebeispielen nicht behoben werden müssen.
Ich persönlich habe nicht viele Programmierer getroffen, die in großem Maßstab kopieren / einfügen. Ich habe schon viele gesehen, die sich in die tiefsten und dunkelsten Winkel hineingeschrieben haben, aber das ist eine andere Geschichte. Aufgrund meiner persönlichen Anekdaten würde ich sagen, dass die meisten Programmierer nicht ganze Anwendungen kopieren / einfügen, aber es ist wirklich schwer zu sagen, sicher.
quelle
Schlecht: Kopieren und Einfügen des gleichen Codeblocks immer und immer wieder
Wenn Sie dies bemerken, sollten Sie sich wahrscheinlich eine Sekunde Zeit nehmen, um zu überlegen, was aus dem zu kopierenden Code abstrahiert werden kann, und eine Funktion / Methode erstellen, um damit umzugehen. Hier gilt das DRY-Prinzip (Don't 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 und testen, funktioniert der Code nachweislich in einer Produktionscodebasis. Sie wären dumm, es nicht wiederzuverwenden.
Die meisten Leute geben dem Kopieren-Einfügen einen schlechten Ruf, weil viele Anfänger-Programmierer ihre Zeit damit verbringen, das Netz zu durchsuchen und einen Mischmasch des Codes anderer Leute zu kopieren / einzufügen, ohne zu verstehen, was es 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, bei denen alles von Grund auf neu geschrieben werden sollte, und ich hoffe, dass ich nicht daran gehindert bin, mit ihnen zu arbeiten. Wenn Sie über 5 Jahre Programmiererfahrung verfügen, sollten Sie über eine ziemlich umfangreiche Codebibliothek verfügen, die sich hervorragend zur Wiederverwendung eignet. Es ist eines der besten Vorteile, die ein erfahrener Programmierer mitbringen kann, da es möglicherweise viel Entwicklungszeit spart.
Wenn Sie mit Ihrem alten Code zunächst nichts anfangen können, nehmen Sie sich einen Moment Zeit, um die Kommentare zu lesen und sich erneut vertraut zu machen. Wenn deine Kommentare scheiße sind, ist das ein ganz anderes Problem.
quelle
Nach 25 Jahren, in denen ich Code geschrieben habe, gab es Zeiten, in denen ich mir wünschte, ich könnte ausschneiden und einfügen, da ich keinen Zugriff auf Code hatte, den ich für einen früheren Arbeitgeber geschrieben hatte. Dies war jedoch sehr selten (und lesen Sie weiter).
Das vielleicht beste Beispiel ist ein wirklich einfacher Kommandozeilen-Parser, den ich vor Jahren für Unix-Betriebssysteme kennengelernt habe. Eine einfache Schleife, die die Argumente durchläuft und die Optionen verarbeitet. Es war unglaublich einfach und elegant, und ich habe es seitdem viele Male verwendet (eher als Muster als als buchstäbliches Ausschneiden und Einfügen). Dies ist eher die Ausnahme als die Regel.
Normalerweise ist ein einfaches Ausschneiden und Einfügen völlig ungeeignet - es ist wichtiger, das Konzept oder den Algorithmus auszuschneiden und einzufügen.
Ich bin nicht allzu stolz - ich suche gerne nach einem wirklich schnellen Paritäts- oder Hamming-Code-Überprüfungsalgorithmus oder so etwas Exotischem. Dann verbringen Sie ein paar Stunden damit, zu verstehen, ob es wirklich das superschnelle ist, wonach ich gesucht habe, oder ein naiver Haufen Müll.
Ich mache mir jedes Mal Sorgen, wenn jemand nur Code kopiert, ohne anzuhalten, 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 es zu verstehen, 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, denn Sie haben Glück. Und manchmal führt dies zu lang anhaltenden Schmerzen.
quelle
Es gibt eine häufige Situation, in der Sie es im Grunde MÜSSEN, um produktiv zu sein.
Jede Technologie, die Ihnen unbekannt ist, ist schwer zu erlernen, es sei denn, Sie haben ein funktionierendes Beispiel. Daher kopieren Sie und fügen Sie, dass etwas, das tatsächlich läuft , und dann damit beginnen bastelt.
quelle
Als neuer Programmierer (4 Monate nach meinem ersten Job) bin ich ziemlich auf Hilfe angewiesen (egal ob von SO oder von anderen Orten). Ich lege Wert darauf, KEINEN Code blind zu kopieren und einzufügen. Selbst wenn der bereitgestellte Code das ist, was ich verwenden werde, gebe ich ihn in mein Programm ein und verbringe dann ein wenig Zeit damit, 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
quelle
Ich habe so viele Gefühle zu diesem Thema, und ich kann nicht ehrlich sagen, dass keines von ihnen ganz objektiv ist.
Es gibt viele Argumente für das Ausschneiden und Einfügen des Codes anderer Personen in Ihre Anwendung. Einige von ihnen können sinnvoll sein, andere nicht. Wenn Sie zum Beispiel eine Methode aus einem Blog haben, die Eingaben entgegennimmt und einen komplizierten mathematischen Algorithmus ausführt, der weit außerhalb Ihrer mathematischen Fähigkeiten liegt und ein Ergebnis ausgibt - das ist ein Argument für das Ausschneiden und Einfügen -, holen Sie sich die Erlaubnis des Autors, dessen zu verwenden Code und Kredit sie wo fällig - es ist die ehrenvolle Sache zu tun.
Es gibt Argumente, das Rad nicht neu zu erfinden - auch dies ist theoretisch sinnvoll. Aber wenn Sie sich nicht die Zeit nehmen, sich mit dem Code, den Sie ausschneiden und einfügen, vertraut zu machen, wissen Sie nicht, ob es eine bessere Möglichkeit 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 Leute auf, den Sie kopiert, gestohlen, plagiiert oder auf andere Weise kopiert haben. Vielleicht müssen Sie nicht einmal wissen, wie Sie eine Anwendung über Frankenstein hinaus programmieren zusammen aus wiedergewonnenen Teilen.
Es gibt Zeiten und Orte, an denen ich dieses Verhalten für völlig akzeptabel halte. Zum Hacken von schnellen Wegwerfwerkzeugen, die nicht auf Langlebigkeit ausgelegt sind, sondern um eine Aufgabe zu erledigen, gerade jetzt per Haken oder Gauner. Zum Zweck des Prototyping und des Studierens von Konzen- trationen, um in einem theoretischen Kontext zu lernen und voranzukommen, halte ich dies für ein völlig faires Spiel.
Das Ausschneiden und Einfügen von Code anderer Leute ist Plagiat - wenn Sie den Segen haben und den Code verstehen, den Sie einfügen, und der in das Konstrukt der Codierungsstandards für Ihre Anwendung passt, dann gebe ich zu, dass es fair 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, was mein Mandant dem Risiko einer Strafverfolgung aussetzt. Abgesehen davon besteht ein sehr reales Risiko, dass beim Ausführen des ausgeschnittenen / eingefügten Codes katastrophale Nebenwirkungen auftreten.
Ich habe diese Antwort nicht auf Sie gerichtet, John. Ich weiß, dass Sie in Bezug auf Themen wie dieses sehr ethisch eingestellt sind. Das ist also nur ein allgemeiner Spruch in Richtung der eigentlichen Frage.
Nachtrag : Trotzdem halte ich das Ausschneiden und Einfügen von Code zwischen Projekten für durchaus akzeptabel - es sei denn, er wurde als Leiharbeit für eine andere Person geschrieben. In diesem Fall besitzen Sie nicht das Urheberrecht und sollten die Erlaubnis dazu einholen der Person, für die Sie es codiert haben. Ich habe festgestellt, dass es den meisten Arbeitgebern recht ist, wenn Sie Ihre eigenen Ideen für andere Kunden wiederverwenden, es sei denn, der Code ist für Proprietriefunktionskonzepte relevant.
quelle
Da in einem Open Source-Repository 15% aller Methoden von einem Projekt in ein anderes kopiert werden (pdf), scheint die Antwort ein klares Ja zu sein.
quelle
Wenn der Code gut ist, sollte er anstelle von Kopieren und Einfügen in eine gemeinsame Bibliothek eingefügt werden. Aber die Leute können sich nicht mit Refactoring abfinden und bevorzugen es, die gleiche Funktionalität nach Kopie und Methode zu verbreiten.
Anstatt ein universelles absolutes Gesetz des Kopierens und Einfügens zu haben, sollte man sehen, wann man es benutzt.
Die Vorteile beim Kopieren und Einfügen sind: Schnelleres Arbeiten Nachteile sind: Der gleiche Code ist an mehreren Stellen verteilt, und jedes gefundene / gelöste Problem muss überall gelöst werden. Wenn anstelle des Kopierens und Einfügens eine Bibliothek als gemeinsame Bibliothek verwendet wird, wird das Update ausgeführt überall verbreiten. Für eine kleine Anfangsinvestition, eine Bibliothek zu verwenden, anstatt den gleichen Code überall zu verbreiten.
Sie können entscheiden, ob Sie zunächst ein wenig Zeit sparen möchten, im Vergleich zu viel später. Dann müssen Sie nur noch kopieren und einfügen, andernfalls überarbeiten und in eine gemeinsame Bibliothek stellen.
quelle
In den meisten Fällen entspricht der Code, den Sie im Internet finden, nicht Ihren genauen Zwecken.
Ich mache viel, indem ich Code von jemandem kopiere, auf das Wesentliche reduziere und dann Code hinzufüge, bis er meinen Anforderungen entspricht. Ich werde es immer so anpassen, dass es meinen Namenskonventionen und Codierungsstilen entspricht.
Ich persönlich hasse es, wenn ich ein Tutorial lese und sie Code für einen komplizierten Fall anzeigen. Beginnen Sie mit der Essenz und zeigen Sie Bausteine, um den Code zu erweitern. Wenn ich jemals ein eigenes Blog gründe, werde ich den Leuten ein kommentiertes Codebeispiel zur Verfügung stellen, das zeigt, was ich tun möchte, wie Sie Funktionen / Sonderfälle hinzufügen können und ein voll funktionsfähiges Beispiel für die Grundfunktionen.
quelle
Warum das Rad neu erfinden, wenn Sie verstehen, was der Code tut, die Erlaubnis haben, den Code (oder seinen offenen Code) wiederzuverwenden, und nicht unbedingt den gesamten Code benötigen, den die andere Person geschrieben hat? Ich kopiere häufig eine Algorithmusimplementierung und ändere sie an meine eigenen Bedürfnisse. Normalerweise liegt es jedoch daran, dass ich beim Ausschneiden und Einfügen nicht alles benötige, was im Beispiel enthalten ist. Das Hinzufügen einer weiteren Datei wäre also nur eine Verschwendung (oder etwas in einer Funktion). Ich bin mit jzd einverstanden, wenn Sie Ihren eigenen Code innerhalb desselben Projekts ausschneiden und einfügen, dann stimmt etwas nicht und Sie sollten wahrscheinlich einen wirtschaftlichen Weg finden, um ihn entweder zu libitieren oder die Funktion zu teilen.
quelle
Ich finde, dass " Integrations " -Teammitglieder oder solche, die nicht so viel Erfahrung mit Code oder Programmierung haben, dazu neigen, öfter zu kopieren und einzufügen und nicht zu verstehen, was sie getan haben (um auf die in Ihrer Frage genannten Probleme einzugehen).
Ich finde auch, dass Programmierer sich oft vom Ausschneiden und Einfügen fernhalten, weil sie Code lieben und das Rad oft neu erfinden, nur weil sie es besser machen oder mehr lernen wollen.
quelle