Jak naprawić wzór kopiowania / wklejania?

16

Tam, gdzie pracuję, ludzie (konsultanci) odczuwają presję, aby jak najszybciej udostępnić funkcje. Zamiast więc spędzać zbyt dużo czasu na myśleniu o tym, jak robić rzeczy we właściwy sposób lub ponieważ nie chcą niczego zepsuć, kod jest kopiowany z różnych modułów i modyfikowany.

Nie jest łatwo temu zapobiec, ponieważ podstawa kodu jest otwarta dla całej firmy. Wiele osób nad tym pracuje.

Teraz, gdy bałagan już tam jest, jaki jest najlepszy sposób na usunięcie tych zwolnień bez nadmiernego zrywania?

LennyProgrammers
źródło
3
Najbardziej denerwujące jest to, że kod jest kopiowany / wklejany z jakiejś witryny, a nawet komentarze nie są usuwane. Możesz więc znaleźć: „// Dzięki za Carlo” ... A kiedy im to wskażesz, po prostu się śmieją i powiedzą: „Zostaw to!))”. To nie jest profesjonalne i smutne !!!
CoffeeCode
2
jego nie tylko konsultanci
AndersK

Odpowiedzi:

14

Jedną częścią odpowiedzi jest Refaktoryzacja .

Najpierw zacznij pisać testy jednostkowe, aby upewnić się, że nic nie zepsułeś przypadkowo swoich zmian. Następnie zacznij ulepszać projekt, usuwając duplikaty itp. W małych krokach, uruchamiając testy jednostkowe po każdym kroku, naprawiając wszelkie problemy, jeśli którykolwiek z testów zakończy się niepowodzeniem, lub natychmiast przywracając, jeśli napotkasz większy problem, niż można łatwo rozwiązać.

Druga część to edukacja .

Należy nauczyć ludzi, aby nie pozostawili za sobą złego kodu. To z pewnością długotrwała bitwa, ponieważ nawyki i procesy myślowe są trudne (czasem wręcz niemożliwe) do zmiany . Jednak bez niego nadal będziesz otrzymywać niekończącą się liczbę złych kodów krzyczących o refaktoryzację.

Możesz zdecydować się na grupowe przeglądy kodu, aby rozpocząć dyskusję na temat dobrych i złych nawyków kodowania i rozpowszechnić zalety tego pierwszego. Nie wystarczy powiedzieć „musisz (nie) pisać takiego kodu”, musisz przekonać ludzi logiką i twardymi faktami. Na przykład „jeśli n razy ten fragment metody został zduplikowany w bazie kodu , jakie są szanse, że jeśli w tej metodzie zostanie znaleziony błąd, zostanie on naprawiony w każdej kopii kodu metody?”

Twoja firma może również wymagać zmiany zachęt i kryteriów akceptacji dla konsultantów - jeśli uda im się napisać niechlujny kod, na pewno będą wybierać łatwiejszą ścieżkę. Jeśli firma w dalszym ciągu ceni sobie „szybką dostawę” w perspektywie długoterminowej konserwacji, nic się nie zmieni :-( Może być więc konieczne przedyskutowanie tego z kierownictwem. Jednym ze sposobów na ich zrozumienie jest to: refaktoryzacja oznacza utrzymanie kodu w czystości, łatwe do zrozum i utrzymuj. Pominięcie refaktoryzacji jest jak spłata zadłużenia na karcie kredytowej. Możesz sobie z tym poradzić na chwilę, ale jeśli nie będziesz aktywnie zarządzać swoimi nawykami zakupowymi i długami, pewnego dnia nieuchronnie spadnie ci na ramiona. W życiu projektu oprogramowania bankructwo ma miejsce, gdy projekt staje się niemożliwy do utrzymania: łatwiej jest przepisać go od zera niż dodać nową funkcję do istniejącej bazy kodu. Lub użytkownicy mają już dość gorszego poziomu wsparcia i funkcji, że po prostu przełączają się na konkurencję.

Péter Török
źródło
4
„Najpierw zacznij pisać testy jednostkowe, aby upewnić się, że nic nie zepsułeś przypadkowo swoimi zmianami” Woah, pompuj tam hamulce. Naprawdę nie lubię, jak wszyscy na stronach SE tak nonszalancko podają tę linię w odpowiedzi. Jest to niezwykle trudne do zrozumienia i nie jest tak zwyczajne, jak 99% użytkowników, którzy sugerują, że tak się dzieje.
@Sergio Tapia - prawda, ale bez niej nie można dokonać refaktoryzacji. Witamy w rzeczywistości, około 2011 r.
Scott Whitlock,
1
@Sergio, jeśli masz na myśli, że testowanie kodu starszego typu jest trudne, nie mogę się zgodzić. Cieszę się, że mogę przytoczyć cytowane zdanie w następujący sposób: „Po pierwsze, powinieneś rozpocząć żmudne i stresujące zadanie pisania testów jednostkowych ...” :-) Jednakże, jeśli masz na myśli, że ponieważ testy jednostkowe są trudne, należy spróbować przejść bez zdecydowanie się nie zgadzam (na podstawie praktycznego doświadczenia, a nie teorii). Nie ma królewskiej drogi do zachowania starszego kodu.
Péter Török
9

W ramach edukacji, takiej jak @Peter, możesz wprowadzić wykrywacz kopiuj i wklej, taki jak PMD, i używać go jako części cyklicznej kompilacji, aby pomóc w egzekwowaniu tej części standardów kodowania.

Upewnij się, że Twój standard kodowania projektów pokrywa się z tym wzorcem, abyś miał podstawę do rozpoczęcia dyskusji.

rsp
źródło
1
Podoba mi się to, fajne!
ozz
Czy można wymagać przestrzegania standardu kodowania w umowie wykonawcy?
Armand
1
@Aison Możesz wymagać przestrzegania czegokolwiek, o ile tylko zechcesz, pod warunkiem, że nie będziesz mieć problemu. Jako wykonawca przestrzegam wszelkich wymagań rozwojowych firm, w których pracuję, jedna z nich jest zgodna ze standardami kodowania. Przeglądanie kodu przed przesłaniem do pnia może również pomóc w rozwiązaniu tego problemu
DBlackborough
Dzięki, po twoim poście znalazłem także clonedigger.sourceforge.net dla Python / Java.
LennyProgrammers
@ G3D ma sens; lubisz mieć standard kodowania do pracy? Mój problem z recenzjami kodu jako formą akceptacji polega na tym, że jako kontrahent martwiłbym się, że kod może zostać odrzucony z arbitralnych powodów (np. Polityka lub zmiany w budżecie)
Armand
8

ludzie (konsultanci) odczuwają presję, aby jak najszybciej udostępnić funkcje

Nie masz problemu technicznego, masz problem społeczny. Rzeczywiście masz problem z zarządzaniem.

Nie jest łatwo temu zapobiec, ponieważ podstawa kodu jest otwarta dla całej firmy. Wiele osób nad tym pracuje.

„Baza kodów jest otwarta dla całej firmy” nie stanowi problemu. Nie ma znaczenia

Liczy się to, że istnieje system nagród dla zarządu za kopiowanie i wklejanie. Główną przyczyną jest to, że ludzie są nagradzani (tj. Płaceni, chwaleni, promowani lub rozszerzani) za kopiowanie i wklejanie.

Nie można tego przełamać bez zasadniczej zmiany kultury z „naciskanej na jak najszybsze uwalnianie funkcji” na „nagradzaną za dokonanie odpowiednich, dobrze przetestowanych zmian w podstawie kodu”.

Musisz

  1. Zacznij od góry, z menedżerami, którzy wzmacniają nagrody. Musisz ujawnić obecną praktykę i udokumentować koszty i ryzyko. Musisz zaproponować alternatywę, która zmniejsza koszty i ryzyko.

  2. Musisz nieustannie dokumentować i ujawniać koszty i ryzyko do końca swojej kadencji w tej organizacji. Bezwzględny. Oparte na faktach. Koszt i ryzyko. Każdego tygodnia wyższe koszty i ryzyko związane z kopiowaniem i wklejaniem.

  3. Będziesz musiał pomóc menedżerom przypisać sobie nowe podejście, które sprawi, że będą wyglądać dobrze, a ty zostaniesz zignorowany.

Bardzo ważne jest ograniczenie kopiowania i wklejania. Ale trudno jest zmienić kulturę organizacji. Musisz podać wiele faktów i w kółko kierować sprawę do menedżerów, którzy się z tobą nie zgadzają.

S.Lott
źródło
1
+1 szczególnie za „Musisz pomóc menedżerom wziąć udział w nowym podejściu, które sprawi, że będą wyglądać dobrze i zostaniesz zignorowany”. Lepiej bądź przygotowany, że zbyt często jest to rzeczywistość :-(
Péter Török
@ Péter Török: Zbyt wiele osób rezygnuje z tego. Albo nie zbierają faktów na temat problemów spowodowanych przez kopiowanie / wklejanie, albo nie powtarzają sprawy zarządowi.
S.Lott,
Wiem, że jest tutaj głębszy, nietechniczny problem. Ale to problem, którego nikt nie może naprawić w najbliższym czasie. To jest jak błąd w bibliotece innej firmy, którą musisz obejść.
LennyProgrammers,
@ Lenny222: Twój komentarz nie ma sensu. „To problem, którego nikt nie może naprawić w najbliższym czasie”, jest jasne z pytania. Co oznacza ten komentarz? Czego brakuje w odpowiedzi? Czego więcej potrzebujesz?
S.Lott,
Będzie to ciągły proces edukacji.
JeffO
5

Mam teraz bazę kodu, która zaczynała z tego gnić. Miałem ponad 10 funkcji statycznych na moduł, które były w zasadzie identyczne z tymi samymi funkcjami statycznymi w innych modułach. Każdy zachowywał się na tyle inaczej, aby uzasadnić nowe wcielenie w celu robienia rzeczy tak szybko, jak to możliwe.

Dzisiaj musiałem dodać jeszcze jedną funkcję i po prostu nie mogłem jej znieść. Utworzyłem nową bibliotekę, połączyłem funkcje 100+ w 10 funkcji ponownego wprowadzania, które nieznacznie zmieniają ich zachowanie w oparciu o flagi bitowe, a następnie napisałem serię testów, aby upewnić się, że wszelkie zmiany w tej bibliotece nie spowodują niczego innego.

Całkowity czas spędzony: 4 godziny. W razie potrzeby byłem gotowy na 20-godzinny maraton i byłem zaskoczony, jak szybko opanowałem narastający bałagan. Jako bonus łatwiej było później naprawić kilka problemów związanych z zależnością nagłówka. Dodatkowo, ponieważ wiele naszych zastrzeżonych rzeczy znajduje się teraz w statycznych obiektach do łączenia, możemy dać naszym klientom, którzy uzyskują dostęp do kodu źródłowego więcej niż wcześniej.

Moja rada: ugryź kulę i zmień na nowo ten bałagan, zanim zrobi to naprawdę źle . Prawdopodobnie nie potrwa to tak długo, jak myślisz, ale na wszelki wypadek stwórz dla siebie nową gałąź.

Ponadto nadal można kopiować / wklejać, aby uzyskać dostęp do funkcji podczas rozwiązywania podstawowego problemu. Kiedy skończysz, po prostu oderwij wklejone elementy i użyj nowej biblioteki.

Tim Post
źródło
Ciekawe, czy znalazłeś jakieś identyczne?
JeffO,
@Jeff - Tak, kilka. Ale głównie wzorzec pokazał, że duplikacja była wynikiem tego, że ktoś chciał (powinien być) kod biblioteki, aby zrobić coś nieco innego.
Tim Post
5

Zgadzam się z dotychczasowymi odpowiedziami. Powinieneś:

  • tworzyć testy jednostkowe
  • refaktor
  • kształcić
  • włóż wysiłek w kodowanie standardów i wykrywaj naruszenia

Ale z drugiej strony musisz spojrzeć na to, co powoduje, że ludzie kopiują wklej i to naprawiają.

  • ludzie mogą nie być w stanie ponownie wykorzystać kodu w dobry sposób, ponieważ jest on sprzężony z wieloma
  • ludzie mogą nie wiedzieć, że istnieje biblioteka, z której mogą korzystać
  • Kod biblioteki może być niewystarczający, a przygotowanie własnej wersji jest znacznie łatwiejsze niż korzystanie z istniejącej biblioteki
  • Może nie istnieć dobra strategia kontroli wersji (bez kontroli źródła), a zmiana biblioteki ogólnej może po prostu spowodować przetestowanie wielu innych aplikacji.

Myślę więc, że aby zatrzymać wzór kopiowania / wklejania, musisz ułatwić ponowne użycie.

  • sprawiają, że biblioteki są wykrywalne i dobrze udokumentowane
  • uniezależnić biblioteki od wszystkiego
  • pomyśl o dobrej strategii wersjonowania
  • zapewnić zgodność wsteczną
  • pomyśl o łatwej rozszerzalności bibliotek

przeczytaj Wytyczne dotyczące projektowania ram

Mam nadzieję że to pomoże.

KeesDijk
źródło
3

Istnieje silna postawa „kopiuj wklej uważany za szkodliwy”. Myślę, że to dobrze, ale idzie trochę za daleko. Skopiuj wklej jako ćwiczenie w odkrywaniu podobieństw i różnic między dwiema metodami lub klasami - jako krok w procesie triangulacji - myślę, że jest zdrowy. Ale zatrzymanie się przed całkowitą triangulacją - wyeliminowaniem duplikacji wprowadzonej przez wklejanie kopii - jest rzeczywiście szkodliwe.

Jeśli potrafisz znaleźć sposób na zastosowanie tego bardziej dopracowanego podejścia, aby powiedzieć programistom, że nie „to źle!”, A raczej „to jest niekompletne, czy możesz ze mną współpracować, aby dokończyć refaktoryzację?”, Może się okazać, że prowadzisz bardziej konstruktywne rozmowy.

Carl Manaster
źródło
2

Martwię się tutaj o ten sam problem, a moim podejściem jest: nie próbuj go unikać z góry, po prostu dokonaj refaktury, gdy stanie się zbyt źle.

Moduł, nad którym obecnie pracuję nad startetem, jako kopia innego modułu, teraz zmieniam wszystko, co musi być inne. Gdy to zrobisz i nowy moduł zostanie ukończony, porównuję go z oryginalnym modułem i dowiem się, które części są mniej więcej niezmienione i powinny zostać przeniesione do biblioteki, abstrakcyjnej klasy nadrzędnej itp.

użytkownik 281377
źródło
2

Kto jest odpowiedzialny, ponosi winę. Nie można oczekiwać, że jedna osoba przejrzy każdy wiersz kodu, ale określa standardy i ramy czasowe.

Kontrahenci (lub każdy, kto ma krótkoterminowy projekt) mogą zostać postawieni w sytuacji, w której otrzymują rekompensatę za uruchomienie go za pierwszym razem. Istnieje jakaś zachęta, aby zrobić to jak najszybciej. Skopiowany kod może nigdy nie wymagać modyfikacji, a jeśli tak, to nie będzie przez nich.

Możesz spróbować zmusić ich, aby naprawili to we własnym czasie. Potem zaczną to robić od samego początku, ale potem poświęcą nadmierną ilość czasu, aby załatwić sprawę. Myślę, że AmmoQ ma dobry pomysł na refaktoryzację rzeczy, które powodują problemy.

JeffO
źródło
Zgadzam się. Chodzi o to, że kierownicy projektów nie mają motywacji, aby płacić więcej za dobrze zaprojektowany kod. Jeśli będę musiał zmarnować tydzień, nie będą naliczane.
LennyProgrammers,
@ Lenny222 - możesz dążyć do wybrania miejsc w projekcie, aby poprawić kod. Punkt sprzedaży dla PM nie nastąpi, dopóki nie wrócą (zwykle z ogonem między nogami) i będą potrzebować tego, co według nich będzie poważną zmianą, tylko po usłyszeniu odpowiedzi „nie martw się, zbudowaliśmy tę część, aby była bardziej elastyczna” . W końcu mogą się dowiedzieć, że istnieje właściwy sposób robienia rzeczy i zarządzania oczekiwaniami klienta. Każdy chce wysokiej jakości oprogramowania, ale niewielu wie, ile to naprawdę kosztuje.
JeffO
1

Jedynym sposobem na wyeliminowanie kodu kopiowania / wklejania jest (IMHO) przegląd kodu, poproszenie osoby (lub najlepiej więcej) o sprawdzenie kodu, a kiedy znajdzie kod, który wydaje się pochodzić z operacji kopiuj / wklej, pozwól programatorowi zreformować.

AndersK
źródło
1

Jak sugerowano, jest to głównie problem w organizacji. Spróbuj zacząć od edukacji ludzi (nie zapomnij o warstwie bezpośredniego zarządzania powyżej swojej pozycji). Bardzo pomaga rozpocząć pociąg do jednej lub dwóch osób i pozwolić wirusowi się rozprzestrzeniać. Gdy większość uważa, że ​​to dobry pomysł, zapoznaj się z opisem i spróbuj wprowadzić recenzje, aby zagwarantować, że tak pozostanie. Jest to bardzo powolny i żmudny proces, ale nie można go szybko zmienić. Na początku będzie to wymagało dodatkowego czasu, dlatego ważne jest, aby kierownictwo znało i wspiera długoterminowy cel.

@Anders K. Recenzje są dobrym sposobem na utrzymanie praktyki. Zmuszanie ludzi do pisania kodu, w który nie wierzą, powoduje duże tarcie. Powrócą do starego habitu, gdy tylko będzie to możliwe. Mocno wierzę, że powinieneś zacząć od edukacji, aby nabrać tempa.

refro
źródło