Szukam dobrej analogii lub metafory, która mogłaby zilustrować problemy związane z programowaniem kopiuj-wklej dla nie-programistów. Od czasu do czasu przeprowadzam przeglądy kodu / systemu dla potencjalnych klientów, a jednym z typowych problemów, które widzę, jest ogromna ilość kodu kopiuj-wklej we wszystkich bazach kodu. Jest to coś, co rutynowo wzywam w recenzjach i za każdym razem muszę wyjaśnić, dlaczego jest to problem (jest to szczególnie trudne w przypadku klientów, którzy wiedzą wystarczająco dużo o programowaniu, aby zrozumieć, że ponowne użycie jest dobre, ale nie wystarczająco, aby zrozumieć, dlaczego kopiuj-wklej nie jest dobrą formą ponownego użycia). Oczywiście potrafię (i robię) wyjaśnić problem w zakresie utrzymania kodu, ale byłoby miło mieć dobrą, zwięzłą analogię do tego problemu, który trafiłby do domu z nie-programistami. Premia, jeśli analogia ilustruje, dlaczego wyszukiwanie i zamiana nie jest skutecznym rozwiązaniem tego problemu. Jakieś sugestie?
Tylko dla wyjaśnienia (na podstawie odpowiedzi Jaroslava poniżej) - nie mówię tu o stosowaniu fragmentów kodu; To, co widzę (niepokojąco często), to kopiowanie i wklejanie rozległych obszarów kodu lub dziesięcioliniowego fragmentu kodu w celu wklejenia niektórych danych użytkownika (wraz z wbudowanym zapytaniem SQL) do dziesiątek stron PHP lub ASP.NET. Powtórz kod z innego miejsca w tym samym projekcie.
Aktualizacja: Jest tu kilka naprawdę dobrych odpowiedzi; W komentarzach wyjaśniłem, dlaczego wybrałem odpowiedź Scotta Whitlocka, ale gorąco polecam również odpowiedź whatsisname, jeśli masz do czynienia z klientami, którzy w ogóle znają się na produkcji.
źródło
Odpowiedzi:
To jest tak ... masz jeden zegar w domu. Świetny! Wiesz, która jest godzina, ale zawsze musisz iść do tego jednego pokoju, żeby na to spojrzeć.
Ale oczywiście chcesz wiedzieć, która jest godzina bez ciągłego chodzenia do tego pokoju, więc kupujesz więcej zegarów i rozprowadzasz je po całym domu. Każdy z tych zegarów jest niezależny. Wszyscy zachowują swój czas. To znaczy:
Teraz wyobraź sobie ten sam problem w dużym obiekcie z dziesiątkami lub setkami zegarów. Dlatego potrzebujesz czegoś takiego jak ten zegar sieciowy, który utrzymuje synchronizację z centralną podstawą czasu. W ten sposób czas jest definiowany raz i tylko raz .
Programowanie z kopiowaniem i wklejaniem jest jak kupowanie większej liczby niezależnych zegarów. Nie skaluje się.
źródło
Wyobraź sobie, że projektujesz samolot. Masz jeden silnik odrzutowy. Dobrze się sprzedaje. Teraz zamierzasz zaprojektować czterosilnikowy samolot na długie rejsy przez ocean.
Teraz nie tworzysz pełnego zestawu specyfikacji technicznych i rysunków dla każdego silnika, prawda? Nie, używasz tego samego silnika we wszystkich czterech miejscach. Teraz wyobraź sobie, że masz 4 zestawy rysunków i musisz coś zmienić. Teraz musisz to zmienić we wszystkich czterech rysunkach silnika. Co się stanie, jeśli przypadkowo zapomnisz coś zmienić w 4. silniku, ponieważ się rozstawiałeś?
Powiedzmy, że zmieniasz długość śruby lub gwintu rury. Teraz nie możesz po prostu „wyszukiwać i zamieniać” w bazie danych rysunków technicznych, możesz przypadkowo zmienić śruby mocujące w pompach paliwowych, ponieważ okazały się mieć ten sam rozmiar. Lub linia hydrauliczna zasilająca ster ogona używała tego samego gwintu, ale teraz jest inaczej i nie można już zasilać ogona.
Teraz wyobraź sobie, że NTSB wprawia Cię w zakłopotanie, ponieważ twoje silniki losowo rzucają łopatkami turbiny i wybuchają podczas lotu na południe od Florydy. Teraz na jakie rysunki silnika patrzysz? Wszyscy, jeden z nich? Skąd wiesz, że wszystkie cztery są takie same? Być może wprowadzono poprawki, ale dotyczą one tylko pierwszego silnika, ponieważ facet, który zaprojektował silniki, opuścił rok temu, aby zagrać w zespole reggae i był jedynym, który pamiętał, że cztery silniki są w osobnych plikach, a facet, który naprawił wybuchającą turbinę, był jego zastępcą.
Kopiowanie i wklejanie kodu jest analogiczne do posiadania zduplikowanych rysunków części składowych, czy to śruby, czy silnika. Chcesz wyodrębnić komponenty do podstawowych elementów, które są ponownie wykorzystywane w jak największym stopniu.
Nie powielaj silników, po prostu napisz kod mocujący silniki do skrzydła.
źródło
Musisz to wyjaśnić w kategoriach udostępniania tego samego zasobu, a nie duplikowania tego samego zasobu.
Na przykład, czy miałoby sens, aby każdy dom w dużym mieście miał dedykowaną elektrownię dostarczającą energię elektryczną do domu, czy też byłoby bardziej sensowne, aby każdy dom miał tę samą elektrownię? Jeśli coś pójdzie nie tak z konkretnym komponentem zastosowanym w elektrowni (elektrowniach) i wymagane są naprawy, łatwiej byłoby dokonać napraw w jednym miejscu i wszyscy skorzystają z tych napraw, niż napraw w każdej dedykowanej elektrowni i tylko w każdej świadczenia domowe indywidualnie.
źródło
źródło
Kopiowanie i wklejanie jest jak próba wyprodukowania części bez formy. Jest powolny, a dostaniesz jednorazowe użycie z każdej części, ponieważ po ustaleniu, że jest uszkodzona lub zepsuta, nie możesz po prostu naprawić formy, aby stworzyć odpowiednią zamiennik.
Poszukując analogii, najpierw musimy wziąć pod uwagę niebezpieczeństwa związane z programowaniem kopiowania i wklejania :
Główną bronią w walce z programowaniem kopiowania i wklejania jest abstrakcja . Aby znaleźć dobrą analogię, poszukaj przykładów abstrakcji w otaczającym nas świecie.
Abstrakcja opiera się na idei tworzenia definicji, a następnie korzystania z nich w trakcie wykonywania. Jaki byłby świat bez definicji?
Kopiowanie ma miejsce tylko wtedy, gdy kopiowany kawałek jest trwały. W przeciwnym razie z każdą kopią powstaje zupełnie nowy oddział - osobno testowany, konserwowany i aktualizowany.
Abstrakcja walczy z tym, wiążąc wszystkie gałęzie razem w jeden pień i izolując modyfikacje mniejszych gałęzi, a nawet liści.
źródło
Myślę, że mówisz o zduplikowanym kodzie, a nie o wklejaniu (za pomocą urywków i podobnych).
Oto analogia z książki historycznej, która bardzo dobrze to ilustruje. Przed prasą Gutenberga mnisi siedzieli i ręcznie pisali książki, ciągle przepisując tę samą książkę. Książki, które napisali mnisi, często zawierały błędy i dzięki Gutenbergowi problem ten został wyeliminowany.
Kolejna analogia: bankomaty. Masz jeden bankomat, który może obsługiwać różne karty i zawsze dobrze je obsługuje. Duplikowanie kodu tworzy różne bankomaty, więc każdy musiałby przejść do innego, a czasami maszyna nawet dałaby ci BSOD.
Jest niesamowity artykuł na temat wklejania kopii z Jeffa http://www.codinghorror.com/blog/2009/04/a-modest-proposal-for-the-opy-and-paste-school-of-code-reuse. HTML
PS Wiem, że przed Gutenbergiem była prasa drukarska.
źródło
Dla nie-programistów zakładam, że rozmawiamy z ludźmi biznesu, więc byłbym krótki i dotyczył realiów pieniężnych.
Wytnij i wklej = Burning Money.
źródło
Czy nie mogę odpowiedzieć na pytanie, ale powiedzieć, że naprawdę nie potrzebujesz tutaj analogii, a próba znalezienia odpowiedniej analogii dla każdego idiomu rozwoju lub wzoru wydaje się przewrotna i często przynosi efekt przeciwny do zamierzonego. To tak, jakby ćwiczyć jogę płaskimi stopami ...
Istnieje kilka powodów, dla których kopiowanie / wklejanie prowadzi do problemów: propaguje istniejące błędy w nowo wklejonych obszarach, w niektórych środowiskach, w których kiedyś uważano je za zwiększenie wydajności, jest teraz wolniejsze (mogę podać przykłady, jeśli ktoś jest zainteresowany, ale sprowadza się to do JIT i czy naprawdę uważasz, że jesteś mądrzejszy niż nowoczesny kompilator?).
Pokazuje, że deweloper jest albo leniwy, albo samolubny, albo jedno i drugie. Jeśli jest to bitwa, w której aktualnie walczysz w zespole, w zależności od swojej pozycji w tej drużynie (kierownik zespołu / jnr dev, snr dev, cokolwiek), musisz ją naprawić, być może w drodze arbitrażu w organizacji.
EDYCJA: W świetle poniższego komentarza, że jest to kod przeglądający kod strony trzeciej w imieniu strony trzeciej (a może nawet czwartej strony :)) Mam nadzieję, że mogę dodać kilka użytecznych rzeczy.
Po pierwsze, kiedy kod został opracowany dla strony trzeciej, czy posiadali jakieś dane? Na przykład linie kodu (LoC).
Nadal uważam, że niektóre z powyższych słów wciąż się liczą. Prawdopodobnie powinienem też zapytać, jaki jest cel przeglądu. Jeśli chcesz uzyskać wycenę w celu jej utrzymania lub zastąpienia, musisz zadać wiele różnych pytań.
Tak czy inaczej, oceniasz jakość kodu, cóż, skopiuj każdą pastę należy do kategorii „Deweloper wykazał się wystarczającym zrozumieniem abstrakcji i / lub projektu kontroli przepływu programu”:
Komentarz: Deweloper nie wykazał się zrozumieniem abstrakcji, a ich podejście do kontroli przepływu programu było podatne na błędy. Tutaj możesz wprowadzić „złożoność cyklomatyczną”. W rzeczywistości jest to dość łatwe do zrozumienia i na okrągło myślę, że mogłem znaleźć odpowiedź: D Tak dla mnie.
Ok złożoność cyklomatyczna jest taka. Masz mapę Ma swoją pozycję początkową i każdy możliwy cel podróży. To nie musi być dużo. Pomyśl, parking, kawiarnia, toaleta. Cyklomatyczna złożoność jest miarą liczby różnych tras, które można dostać się do pozycji początkowej do dowolnego miejsca docelowego.
Skopiowanie i wklejenie kodu prawdopodobnie zwiększy złożoność cykliczną, ponieważ będzie zawierać powtarzalną logikę, którą można by wyodrębnić we własnym nazwanym bloku (lub metodzie).
Wydajesz się rozsądny?
źródło
Weź angielskie słowo na coś. Teraz wyobraź sobie, że za każdym razem, gdy chcesz to opisać, użyłeś pełnej definicji słownika zamiast samego słowa. Jak łatwo byłoby cię zrozumieć innym?
I tworzą wyobrażenie czegoś, co nie występuje lub nie jest przypadek (wyobrazić) to wykazujący działanie lub stan, który jest uzależniony od drugiego; Prosta przeszłość woli. Wskazanie przyszłości w odniesieniu do przeszłości. Wskazanie działania w przeszłości, które miało miejsce wielokrotnie lub często (byłoby), nie byłoby łatwe; wymagające wielkiego wysiłku fizycznego lub psychicznego, aby osiągnąć, zrozumieć lub znieść (trudne).
Nie zaszkodzi również pokazanie rzeczywistego przykładu przed i po prawdziwym kodzie, który został refaktoryzowany w celu usunięcia duplikacji.
źródło
Istnieją również obawy dotyczące bezpieczeństwa i integralności kodu.
Jak pokazano tutaj , możliwe jest osadzanie złośliwych danych w znakach Unicode, które są przenoszone do schowka.
W zależności od tego, jak Twój edytor reaguje na znaki Unicode, może to spowodować nieoczekiwane zmiany w kodzie źródłowym, nieoczekiwane wyniki kompilatora lub pewne rzeczy, o których jeszcze nie pomyślałem.
źródło
Widzę tutaj kilka różnych tras:
Plagiat - Niektórzy mogą pamiętać to ze szkoły, w której kradzież własności intelektualnej jest wielkim nie-nie. Program do kopiowania i wklejania może wyglądać tak, ponieważ ktoś może nie rozumieć źródła lub tego, co może pochodzić z używania konkretnego rozwiązania, które zostało po prostu ślepo skopiowane i wklejone bez analizy, jak to działa, i nie rozumiem, dlaczego tak się dzieje lub nie. skuteczne rozwiązanie problemu.
Ślepe podążanie za wskazówkami - Większość ludzi prawdopodobnie miałaby doświadczenia z dotarciem do miejsca, w którym wcześniej nie była. Niektórzy mogli użyć MapQuest lub Google Maps, aby znaleźć miejsce, a następnie postępować zgodnie z podanymi wskazówkami. Były historie o tym, że ludzie gubią się lub po prostu nie znajdują miejsca, w którym powinni być, mimo że oprogramowanie zawierało szczegółowe instrukcje, jak się tam dostać. To inne duże niebezpieczeństwo kopiowania i wklejania polega na tym, że to tak, jakby ktoś właśnie podał ci wskazówki dojazdu z punktu A do punktu B, nie pozwalając zobaczyć żadnej mapy obszaru, która może utrudnić podróż. Jeśli to nie wydaje się trudne, możesz podnieść stawkę, prosząc osobę, aby przedostała się z A do B w opasce, aby musiała polegać na innych zmysłach, aby określić kierunek, w którym się znajduje i dotrzeć do celu.
Dane, informacje, wiedza i mądrość mogą być dobrym modelem, do którego można się odwołać, aby pokazać, dlaczego wyszukiwanie i zamiana nie są skuteczne jako rozwiązanie, ponieważ kopiowanie i wklejanie jest bardzo mechaniczne i nie wymaga wiele myślenia, więc przesyłane dane mogą być bez wiedzy i mądrości właściwego korzystania z niego. Można by spojrzeć na energię jądrową, aby zobaczyć przykłady tego, jak zrozumienie różnicy może być dość potężne. Porównaj reaktor jądrowy z bombą nuklearną pod względem bezpieczeństwa i użyj, aby zobaczyć, jak wiedza, co się dzieje, nie wystarczy, aby bezpiecznie wykorzystać moc atomu.
źródło
Wyobraź sobie, że masz grupę uczniów i zbiór zasad dla szkoły. Zamiast zamieszczać reguły we wspólnym miejscu, wszyscy uczniowie muszą odnieść się do każdej z nich, egzemplarz zasad. Każdemu uczniowi mówi się, że musi postępować zgodnie z kopią zasad zawartych w liście.
Teraz zmodyfikuj jedną z zasad mówiących, że w przypadku katastrofy powinieneś udać się do nowego schronu. Musisz iść do każdego ucznia i zmodyfikować jego zestaw zasad. Jeśli jeden z uczniów zginie i tornado uderzy, uczeń pójdzie do starego miejsca i umrze straszną śmiercią.
źródło
Ktoś wysyła Ci wiadomość e-mail z załączonym szablonem dokumentu. Możesz go używać do momentu zmiany szablonu. Nie martw się, nie zapomną wysłać Ci odświeżonej kopii.
źródło
Model kosztów CoCoMo.
http://en.wikipedia.org/wiki/COCOMO
Zastosowany wysiłek (E) = a * (KLOC) ** b, gdzie b> 1,0
Ten wykładnik oznacza, że wysiłek związany z budowaniem / utrzymywaniem / obsługą / przepisywaniem rośnie szybciej niż liczba wierszy kodu.
źródło
Jest jeszcze jeden ważny aspekt tej złej praktyki, którego nikt jeszcze nie wziął pod uwagę: ślepo kopiując (pełny lub częściowy) kod od kogoś innego ( bez jego zgody ) możesz łamać prawa autorskie .
źródło
Widzę kodowanie kopiuj-wklej, w którym programista nie rozumie lub nie chce uzasadnić tego, co robi, i kopiuje razem różne części, które już robią „mniej więcej” to, czego potrzebują, losowo przesuwając je na końcu aby pasowały do siebie.
Są z tym trzy główne problemy:
źródło
Załóżmy, że masz 5 koleżanek (szczwany pies) i chcesz wysłać im wszystkim wiadomość walentynkową. Wpisujesz pierwszą literę, dodajesz jej imię i wspominasz coś niezapomnianego, które udostępniłeś. Następnie czterokrotnie kopiujesz i wklejasz list, za każdym razem brakuje instancji imienia dziewczyny nr 1 za pomocą funkcji kopiuj i wklej, ponieważ popełniłeś literówkę. Teraz 4 z twoich pięciu dziewczyn są w drodze do domu dziewczyny nr 1.
źródło