Nauczyłem się bardzo wcześnie, że wycinanie i wklejanie kodu innej osoby zajmuje na dłuższą metę pisanie go samodzielnie. Moim zdaniem, chyba że naprawdę to rozumiesz, w przypadku wycinania i wklejania kodu prawdopodobnie wystąpią problemy, które będą koszmarem do rozwiązania.
Nie zrozum mnie źle, mam na myśli znalezienie kodu innych ludzi i uczenie się z niego jest niezbędne, ale nie wklejamy go tylko do naszej aplikacji. Mamy przepisać te koncepcje w naszej aplikacji.
Ale ciągle słyszę o ludziach, którzy wycinają i wklejają, a oni mówią o tym, jakby to była powszechna praktyka. Widzę także komentarze innych, które wskazują, że jest to powszechna praktyka.
Czy więc większość programistów wycina i wkleja kod?
programming-practices
John MacIntyre
źródło
źródło
Odpowiedzi:
Dwa ogólne przypadki:
Z jednego projektu do drugiego:
Większość programistów wycina i wkleja kod w tym zakresie. Mogą znaleźć poprzedni projekt lub coś w Internecie i skopiować / wkleić go dokładnie lub skopiować / wkleić i wprowadzić w nim zmiany. Myślę, że ta praktyka jest zazwyczaj w porządku. Jest to szczególnie dobre, gdy jest to sprawdzony kod. (Przykłady: jakiś obiekt narzędziowy z poprzedniego projektu, który działał dobrze, lub ewentualnie z bloga z kilkoma potrzebnymi zmianami). Może to być złe, gdy kopiujesz kod, którego nie rozumiesz, lub gdzie kod jest słaby lub gdzie istnieje znacznie lepsze alternatywne rozwiązanie niż kod, który wklejasz.
Wewnątrz tego samego projektu: Kopiowanie i wklejanie w tym samym projekcie zazwyczaj nie jest dobrym pomysłem. To nieprzyjemny zapach, że kopiowany kod powinien po prostu znajdować się gdzieś w metodzie / klasie i wywoływać go wielokrotnie. Istnieją pewne wyjątki od tego, ale ogólnie programiści powinni myśleć: „ Czy istnieje sposób, aby sparametryzować kod, który kopiuję? ”.
źródło
Większość programistów to robi, ale to nie znaczy, że powinieneś
Jedną z moich mantr programistycznych jest: „Jeśli kopiuję i wklejam kod, robię coś złego” . Zasadniczo SUCHO .
Myślę, że powinno być oczywiste, że ponowne użycie kodu oznacza używanie kodu jako zasobu, a nie powtarzanie kodu. Czasami skopiowałem i wkleiłem kod własnego kodu, w większości przypadków kończę kodem płyty kotłowej lub czymś, co wygląda bardzo podobnie.
Po zainwestowaniu trochę więcej czasu w ten kod otrzymuję następujące informacje:
Można dyskutować, czy powinniśmy kopiować i wklejać kod, ponieważ klient / szef nie dba o to (przynajmniej bezpośrednio i krótkoterminowo) i możesz skończyć z tymi samymi wynikami, ale problem naprawdę pojawia się, gdy prowadzi do błędów, utraty modułowości, a ostatecznie do piekła utrzymania.
Co powinieneś zrobić: jak najszybciej refaktoryzować
Nikt nie pisze doskonałego kodu, nawet jeśli działa, nawet jeśli nie kopiujesz i nie wklejasz, a jest to twój własny kod, jeśli nie jesteś z niego w pełni zadowolony, po prostu dodaj notatkę w komentarzach (np. Docblock „@todo”), aby przypomnieć sam, co refaktoryzować i dlaczego ... nawet jeśli sam tego nie refaktoryzujesz, może to być różnica między szczęściem a całkowitą frustracją dla opiekuna.
Ostatecznie skończysz z dobrym kodem , nawet jeśli skopiujesz i wkleisz.
przez XKCD
źródło
Kiedy utknąłem i szukam rzeczy, które mogłyby rozwiązać mój problem i natrafiłem na jakiś pomocny fragment kodu, który robi to, co chcę, naturalnie go kopiuję. Czasami to tylko sedno. Następnie zmieniam go, aby odpowiadał moim potrzebom. Zdarza się to częściej, gdy zagłębiam się w rzeczy, w których nie jestem ekspertem (obecnie Objective-C).
Zawsze poświęcam czas na naukę czegoś z kodu, więc dla mnie jest to świetny sposób na naukę i unikanie ponownego tworzenia koła.
źródło
Będę tutaj mówić o kopiowaniu / wklejaniu kodu innych osób. Pobieranie części własnej pracy z mojej osobistej biblioteki to uczciwa gra. Znam je i rozumiem z definicji.
Uważam, że najczęstszą sytuacją, w której „wycinam i wklejam” kod jest sytuacja, gdy mam konkretny problem i napotykam post na blogu, który go rozwiązuje. Większość razy przepisuję rozwiązanie do mojego projektu (w końcu prawdopodobnie jest napisane w stylu autora bloga, jeśli nic więcej). To nie jest tak naprawdę mój kod, ale nie czuję się źle, używając go w tym scenariuszu.
Wyjście i pobranie całych metod lub systemów w celu wklejenia ich do mojego obecnego projektu i nazwanie go wykonanym jest czymś, czego nie rozumiem. Pewnego dnia na StackOverflow pojawiło się pytanie, które doskonale ilustruje problem z robieniem czegoś takiego.
Łączenie potwora Frankensteina z różnych części kodu po prostu nie może być aż tak wydajne. Mam na myśli to, że jeśli jesteś w tym dobry, oznacza to, że albo powtarzasz to samo rozwiązanie od nowa, albo masz wystarczającą wiedzę na temat kodu innych osób, że ten sam poziom kopiowania / wklejania nie powinien być dłużej potrzebny, a Twój produktywność poprawiłaby się bez konieczności rozwiązywania problemów między niekompatybilnymi próbkami kodu.
Osobiście nie spotkałem wielu programistów, którzy kopiują / wklejają na dużą skalę. Widziałem wielu, którzy kodują się w najgłębsze i najciemniejsze zakątki, ale to inna historia. Opierając się na moich osobistych anegdotach, powiedziałbym, że większość programistów nie kopiuje / wkleja razem całych aplikacji, ale naprawdę trudno powiedzieć na pewno.
źródło
Źle: Ciągłe kopiowanie i wklejanie tego samego bloku kodu
Jeśli to robisz, prawdopodobnie powinieneś poświęcić chwilę na zastanowienie się, co można wyodrębnić z kopiowanego kodu i stworzyć funkcję / metodę do obsługi tego. Tutaj liczy się zasada DRY (Don't Repeat Yourself).
Dobrze: Kopiowanie bloku kodu, o którym wiadomo, że działa
SUCHO (Don't Repeat Yourself) dotyczy również tutaj, tylko w innym znaczeniu. IE, nie powtarzaj pracy, którą już wykonałeś w przeszłości. Jeśli poświęciłeś czas na napisanie sekcji kodu, debugowanie, przetestowanie go, a okazało się, że działa on w bazie kodu produkcyjnego; głupio byłoby nie używać go ponownie.
Większość ludzi źle traktuje kopiowanie-wklejanie, ponieważ wielu początkujących programistów spędza czas na przeszukiwaniu sieci i kopiowaniu / wklejaniu miszmaszu kodu innych ludzi, nie rozumiejąc, co to właściwie robi.
Pisanie wszystkiego od podstaw za każdym razem nie jest lepsze. Wiem, że jest wielu purystycznych programistów oldschoolowych, którzy wszystko powinni pisać od zera i mam nadzieję, że nie utknę z nimi. Jeśli masz 5 lat doświadczenia w programowaniu, powinieneś mieć dość pokaźną bibliotekę kodu, który jest idealny do ponownego użycia. Jest to jeden z najlepszych zasobów, jaki doświadczony programista może wnieść do stołu, ponieważ potencjalnie pozwoli zaoszczędzić wiele czasu na programowanie.
Jeśli na początku nie rozumiesz swojego starego kodu, poświęć chwilę na przeczytanie komentarzy i ponowne zapoznanie się. Jeśli twoje komentarze są do bani ... cóż, to zupełnie inna kwestia.
źródło
Po 25 latach pisania kodu były chwile, kiedy (bez dostępu do kodu, który napisałem dla poprzedniego pracodawcy) żałowałem, że nie mogę wycinać i wklejać. JEDNAK było to bardzo rzadkie (i czytaj dalej).
Być może najlepszym przykładem jest naprawdę prosty parser wiersza poleceń, na który natknąłem się lata temu dla systemów operacyjnych unix. Prosta pętla przesuwająca się między argumentami i przetwarzająca opcje. To było diabelnie proste i eleganckie, i od tego czasu wiele razy używałem tego (bardziej jako wzoru niż dosłownego cięcia i wklejania). To raczej wyjątek niż reguła.
Zwykle zwykłe wycinanie i wklejanie ole jest całkowicie nieodpowiednie - jego bardziej wycinanie i wklejanie jest istotną koncepcją lub algorytmem.
Nie jestem zbyt dumny - chętnie będę się rozglądał, aby znaleźć naprawdę szybką parzystość lub algorytm weryfikacji kodu Hamminga lub coś takiego egzotycznego. Potem poświęć kilka godzin na zrozumienie, czy to naprawdę bardzo szybka rzecz, której szukałem, czy też naiwny stos śmieci.
Martwię się za każdym razem, gdy ktoś po prostu kopiuje kod, nie przerywając, aby go zrozumieć. Są albo geniuszem (zrozum to i wszystkie jego subtelności na pierwszy rzut oka), albo głupcem. Pomiędzy nimi nie ma zbyt wiele miejsca. Och, i nie ma też wielu prawdziwych geniuszy.
Bez zrozumienia, naprawdę nie masz pojęcia, co właśnie rzuciłeś NAPRAWDĘ, pod nie tylko szczęśliwymi, ale także nieszczęśliwymi okolicznościami lub warunkami wejściowymi. Czasami to nie ma znaczenia, ponieważ masz szczęście. A czasem powoduje to długotrwały ból.
źródło
Często zdarza się, że Zasadniczo POTRZEBUJESZ to zrobić, aby być produktywnym.
Trudno się nauczyć jakiejkolwiek nieznanej Ci technologii, chyba że masz praktyczny przykład na początek. Dlatego kopiujesz i wklejasz to, aby mieć coś, co faktycznie działa , a następnie zaczynasz majstrować przy tym.
źródło
Jako nowy programista (4 miesiące do mojej pierwszej pracy) bardzo polegam na pomocy (czy to z SO czy z innych miejsc). Chodzi mi o to, aby NIE ślepo kopiować i wklejać inne kody. Nawet jeśli podany kod będzie tym, którego będę używać, napiszę go w moim programie, a następnie poświęcę trochę czasu, upewniając się, że całkowicie rozumiem, co robi i jakie są tego przyczyny.
Chcę mieć pewność, że ciągle się uczę, a nie tylko ekspert od wycinania i wklejania
źródło
Mam wiele odczuć na ten temat i nie mogę szczerze powiedzieć, że którekolwiek z nich jest całkowicie obiektywne.
Istnieje wiele argumentów za wycinaniem i wklejaniem kodu innej osoby do aplikacji. Niektóre z nich mogą mieć sens, inne nie. Na przykład, jeśli masz metodę z czyjegoś bloga, która pobiera dane wejściowe i uruchamia skomplikowany algorytm matematyczny, który znacznie wykracza poza twoje zdolności matematyczne i wyrzuca wynik - to argument za wycinaniem i wklejaniem - uzyskaj zgodę autora na użycie ich zakoduj je i przypisz w odpowiednim czasie - to zaszczyt.
Istnieją argumenty przemawiające za tym, by nie wymyślać koła na nowo - teoretycznie ma to sens. Ale jeśli nie poświęcisz czasu na dokładne zapoznanie się z kodem, który wycinasz i wklejasz, nie wiesz, czy istnieje lepszy sposób na rozwiązanie tego problemu, nie wiesz, czy w kodzie są błędy . Co się stanie, jeśli koło, które wklejasz, jest zepsute?
Istnieją argumenty przemawiające za szybkością i wydajnością - tworzysz bibliotekę kodu innych osób, który zgubiłeś, ukradłeś, plagiat lub w inny sposób, pomyśleć, nigdy nie będziesz musiał wiedzieć, jak programować poza Frankensteining razem z odzyskanych części.
Są chwile i miejsca, w których uważam to zachowanie za całkowicie akceptowalne. Do hakowania razem narzędzi szybkiego wyrzucania, które nie są zaprojektowane z myślą o długowieczności, ale do wykonania zadania, teraz hakiem lub oszustem. W celu prototypowania i studiowania treści, aby uczyć się i robić postępy w kontekście teoretycznym, myślę, że jest to całkowicie uczciwa gra.
Wycinanie i wklejanie kodu innych osób jest plagiatem - jeśli masz ich błogosławieństwo i rozumiesz kod, który wklejasz i pasuje do konstrukcji standardów kodowania twojej aplikacji, to w porządku, przyznaję, że jest to uczciwa gra.
Jako profesjonalny inżynier oprogramowania otrzymuję wynagrodzenie za utrzymanie standardu i kodeksu etycznego. Nie otrzymuję zapłaty za kradzież, plagiat lub naruszanie praw autorskich innych osób, co naraża mojego klienta na postępowanie sądowe. Poza tym istnieje bardzo realne ryzyko, że uruchomienie tego wyciętego / wklejonego kodu ma katastrofalne skutki uboczne.
Nie kierując do ciebie tej odpowiedzi John, wiem, że jesteś bardzo etyczny, jeśli chodzi o takie tematy, więc tak naprawdę jest to tylko ogólny zwrot w kierunku samego pytania.
Dodatek : Powiedziałem, że uważam, że wycinanie i wklejanie własnego kodu między projektami jest całkiem do przyjęcia - chyba że został napisany jako praca do wypożyczenia dla kogoś innego, w którym to przypadku nie jesteś właścicielem praw autorskich i powinieneś uzyskać pozwolenie osoby, dla której kodowałeś. Przekonałem się, że o ile kod nie dotyczy zastrzeżonych koncepcji funkcjonalnych, większość pracodawców jest w porządku, jeśli ponownie wykorzystujesz własne pomysły dla innych klientów.
źródło
Biorąc pod uwagę, że w jednym repozytorium open source 15% wszystkich metod jest kopiowanych z jednego projektu do drugiego (pdf), odpowiedź wydaje się oczywista, że tak.
źródło
Jeśli kod jest dobry, zamiast kopiować i wklejać, należy go utworzyć we wspólnej bibliotece. Ale ludzie nie mogą przejmować się refaktoryzacją i wolą mieć tę samą funkcjonalność rozłożoną według kopii i metody.
Zamiast uniwersalnego bezwzględnego prawa kopiowania i wklejania jest dobre lub złe, należy sprawdzić, kiedy go użyć.
Zalety kopiowania i wklejania: Szybka praca Wady: Ten sam kod jest rozpowszechniany w wielu miejscach, a każdy znaleziony / rozwiązany problem musi zostać rozwiązany wszędzie, jeśli zamiast skopiować i wkleić jeden użył go jako wspólnej biblioteki, aktualizacja będzie rozmnażaj się wszędzie. Za niewielką początkową inwestycję polegającą na użyciu biblioteki zamiast rozpowszechniania tego samego kodu w różnych miejscach.
Wybór polega na tym, czy początkowo zaoszczędzić trochę czasu w porównaniu do dużo później, a następnie skopiować i wkleić, w przeciwnym razie przejrzyj ponownie i umieść je we wspólnej bibliotece.
źródło
W większości przypadków kod, który znajdziesz w sieci, nie pasuje dokładnie do Twoich celów.
To, co widzę, robię dużo, to kopiowanie kodu od kogoś, sprowadzanie go do samej istoty, a następnie dodawanie kodu, aż spełni moje wymagania. Zawsze zmieniam go tak, aby pasował do moich konwencji nazewnictwa i stylu kodowania.
Osobiście nienawidzę tego, gdy czytam samouczek, a zaczynają od pokazania kodu dla skomplikowanej sprawy. Zacznij od esencji i pokaż bloki konstrukcyjne, aby rozszerzyć kod. Jeśli kiedykolwiek założę własnego bloga, podam ludziom kod z komentarzem, który pokazuje istotę tego, co chcę zrobić, jak możesz dodać funkcjonalność / przypadki specjalne oraz w pełni działający przykład podstawowej funkcji.
źródło
Po co wymyślać koło, jeśli rozumiesz, co robi kod, masz pozwolenie na ponowne użycie kodu (lub jego otwarcia) i niekoniecznie potrzebujesz całego kodu napisanego przez drugą osobę. Często kopiuję implementację algorytmu i modyfikuję ją do własnych potrzeb. Zwykle jednak, kiedy po prostu wycinam i wklejam, dzieje się tak, ponieważ nie potrzebuję wszystkiego, co było w przykładzie, więc dodanie innego pliku byłoby po prostu marnotrawstwem (lub jest czymś wewnątrz funkcji). Zgadzam się z jzd, jeśli wycinasz i wklejasz swój własny kod w tym samym projekcie, to coś jest nie tak i prawdopodobnie powinieneś wymyślić ekonomiczny sposób na jego lib lub współdzielenie funkcji.
źródło
Uważam, że członkowie zespołu „ integracji ” lub ci, którzy nie mają dużego doświadczenia z kodem lub programowaniem, częściej kopiują i wklejają i nie rozumieją, co zrobili (wchodząc w problemy wymienione w pytaniu).
Uważam również, że programiści często trzymają się z daleka od wycinania i wklejania własnych szyderstw, ponieważ uwielbiają kod i często odkrywają koło, tylko dlatego, że chcą to zrobić lepiej lub dowiedzieć się więcej.
źródło