Wielokrotnie słyszałem, że nieużywany kod trzeba usunąć z projektu. Jednak nie jest dla mnie jasne „dlaczego?”.
Moje punkty za nieusuwanie, które są:
- Kod jest już napisany, a wysiłki są wydawane
- Kod można testować w środowisku syntetycznym i rzeczywistym
- Jeśli jest dobrze zorganizowany (zgrupowany, oddzielny pakiet, luźno powiązany itp.), Nie przeszkadza Ci w ogólnej analizie lub refaktoryzacji kodu
- Kod może zostać użyty w przyszłości
- Po usunięciu autor może czuć się nieswojo
Czy ktoś mógłby wyjaśnić zalety usuwania (lub zachowania) nieużywanego kodu?
refactoring
Alex Turbin
źródło
źródło
Odpowiedzi:
Oto kilka powodów, dla których nieużywany kod powinien zostać usunięty:
Każdy, kto dopiero zaczyna pracę nad projektem, musi nie tylko rozumieć działający kod, ale także rozumieć nieużywane materiały. To strata czasu i powoduje zamieszanie.
Istnieje niebezpieczeństwo, że kiedyś ktoś dokona zmiany, która nieumyślnie dotyczy „uśpionego” kodu i może wprowadzić błędy. Wiem, że stało się to przy projektach, nad którymi pracowałem.
Utrzymanie dowolnego kodu jest obciążeniem administracyjnym. Zachowanie starego, nadmiarowego kodu zwiększa obciążenie. Na przykład scalanie zmian w głównej gałęzi staje się trudniejsze, ponieważ jest więcej kodu do przepracowania i więcej możliwości popełnienia błędu.
To, co dzieje się z biegiem czasu, polega na tym, że do bazy kodu dodaje się coraz więcej starego, nieużywanego kodu. Zwiększa to zamieszanie, potencjalne nieporozumienia i ogólne koszty administracyjne.
Szanse, że nieużywany kod kiedykolwiek zostanie ponownie użyty, są bardzo mało prawdopodobne. Z czasem ta możliwość ponownego wykorzystania maleje. Jeśli kod ma zostać usunięty i jest uważany za wystarczająco ważny, wówczas można go rozgałęzić i udokumentować.
Wszelkie osobiste odczucia programisty dotyczące kodu, nad którym mógł ciężko pracować, są zrozumiałe. Ale część bycia profesjonalistą wymaga odłożenia tych myśli na bok dla lepszego dobra. Czas nie jest dla nikogo i nie ma miejsca na przechowywanie kodu historycznego w działającym kodzie źródłowym.
źródło
@suspectus wykonał świetną robotę, przedstawiając powody usunięcia kodu; Chciałbym zająć się Twoimi indywidualnymi punktami dotyczącymi przechowywania kodu.
Ale jeśli już napisany kod nie jest używany, jest to koszt tylko bez (przyszłej) wartości. Jest to wysiłek włożony na próżno, a zachowanie niewykorzystanego produktu tych wysiłków nie potwierdza tych wysiłków. Utrzymujemy kod, ponieważ jest teraz użyteczny, a nie jako swego rodzaju pamiątka po wysiłkach autorów.
Przepraszam, nie wiem, co przez to rozumiesz.
Jeśli istnieje w bazie kodu, bez względu na to, jak dobrze jest zorganizowany, przyczynia się do obciążenia związanego z utrzymaniem i zrozumieniem. Prawdą jest, że można to zorganizować tak, aby było mniejszym ciężarem, ale jeśli zniknie, w ogóle nie będzie obciążeniem.
W szkole Agile mówimy YAGNI : nie będziesz tego potrzebować. Tak, być może przyda Ci się to w przyszłości, ale dziś nie możemy wystarczająco wiedzieć o potrzebach jutra, aby móc to przewidzieć z jakąkolwiek niezawodnością. Myślenie inaczej jest równoznaczne z pychą. Co nas może wiedzieć o jutro to: chcemy, aby nasza baza kodu, aby był łatwy do zmodyfikowania, a niewykorzystane umniejsza kod z tej cechy.
Autor musi się z tym pogodzić. Wszyscy napisaliśmy rzeczy, które okazały się nieprzydatne - o wiele lepiej jest móc wskazać cały kod, który jest używany (ponieważ nieużywany cruft został usunięty) niż zbiór kodu, w którym można powiedzieć kilka metod, "a ta jest aktualnie w użyciu!"
źródło
Czy nie jest wystarczająco trudne zebranie kodu i ustalenie celu, ale teraz musisz dowiedzieć się, które części nie są używane?
źródło
To też jest niepotrzebne. Jeśli nie używasz go do niczego, jest (z definicji) bezużyteczny, niezależnie od tego, co robi i ile wysiłku na to włożono.
Jeśli jest bezużyteczny, nadal jest bezużyteczny, nawet jeśli masz na nim testy. Jeśli kod jest bezużyteczny, testy dla niego również powinny być bezużyteczne (więc trzymanie tam skomentowanego kodu stwarza niejednoznaczność - czy zachowujesz testy? Jeśli miałeś kod klienta komentowanego kodu, czy komentujesz również kod klienta? )
Skąd. Wszystkie Twoje narzędzia (kontrola źródła, analiza statyczna, ekstraktor dokumentacji, kompilator itp.) Będą działać wolniej, ponieważ muszą przetwarzać więcej danych (a większa lub mniejsza część tych danych to szum).
Z drugiej strony, jeśli kod nie jest dobrze zorganizowany, zepsuje analizę statyczną, refaktoryzację i inne.
Wprowadzasz szum do danych wejściowych narzędzi i masz nadzieję, że sobie z nim poradzą.
Co się stanie, jeśli narzędzie do analizy statycznej obliczy stosunek komentarzy do kodu? Po prostu schrzaniłeś coś, co było istotne do wczoraj (lub za każdym razem, gdy kod był komentowany).
Co najważniejsze, skomentowane bloki kodu wprowadzają opóźnienia w zrozumieniu kodu w celu utrzymania i dalszego rozwoju, a takie opóźnienia prawie zawsze kosztują dużo. Zadaj sobie następujące pytanie: jeśli chcesz zrozumieć implementację funkcji, na co wolałbyś raczej spojrzeć? dwa wiersze czystego kodu lub dwa wiersze kodu i kolejne dwadzieścia sześć komentarzy, które nie są już aktualne?
Jeśli tak, znajdziesz go w wybranym przez siebie systemie zarządzania treścią.
Jeśli używasz kompetentnego SCM i polegasz na nim, aby zachować martwy kod (zamiast zaśmiecać źródło), powinieneś zobaczyć nie tylko, kto usunął ten kod (autor zatwierdzenia), ale z jakiego powodu (komunikat o zatwierdzeniu) i jakie jeszcze zmiany zostały wprowadzone wraz z nim (reszta różnic dla tego zatwierdzenia).
Więc?
Jesteście (zakładam) całym zespołem programistów, któremu płaci się za tworzenie najlepszego oprogramowania, jakie umiecie, a nie „najlepsze oprogramowanie, jakie umiecie, bez ranienia uczuć X”.
Jest to część programowania, w której większość napisanego kodu zostanie ostatecznie odrzucona; na przykład Joel Spolsky powiedział w pewnym momencie, że w przypadku jego firmy około 2% napisanego kodu to produkcja.
Jeśli przedkładasz ego programistów nad jakość kodu, poświęcisz jakość swojego produktu dla ... co dokładnie? Zachowujesz niedojrzałość innych programistów? Chroniąc nierealistyczne oczekiwania swoich kolegów?
Edycja: Widziałem jeden ważny powód, aby zostawić zakomentowany kod w źródle i jest to bardzo szczególny przypadek: kiedy kod jest napisany w dziwnej / nieintuicyjnej formie, a czysty sposób ponownego przepisania go nie działa pracować z naprawdę subtelnego powodu. Należy to również zastosować dopiero po ponownej próbie naprawienia problemu i za każdym razem, gdy próba powoduje ponowne wprowadzenie tej samej usterki. W takim przypadku należy dodać skomentowany intuicyjny kod jako komentarz i wyjaśnić, dlaczego nie działa (aby przyszli programiści nie spróbowali ponownie tej samej zmiany):
źródło
Martwy kod zanieczyszcza Twój kod
Martwy kod zmniejsza zrozumiałość i czytelność.
Najlepsze kody są zawsze używane ponownie, a jeśli masz martwe kody, zmniejsza to możliwość ponownego wykorzystania
Kierujemy się modułowym podejściem do kodowania, w którym projektujemy kody do interakcji z innymi programistami, a nie dla maszyny. Powinniśmy włożyć najwięcej energii, aby ułatwić mu zrozumienie naszego kodu. Maszyna i tak będzie dobrze.
Martwy lub skomentowany kod jest jak fałszywe znaki drogowe, które tylko dezorientują ludzi, więc unikaj go za wszelką cenę.
źródło
Ogromne zmiany . Jeśli coś, co trzeba zmienić w całym systemie, również istnieje w martwym kodzie, czy zmieniasz to? Bardzo trudno jest wiedzieć, czy zdecydowanie nie jest gdzieś używany, więc zawsze jest to ryzyko. A nawet gdyby niczego nie zepsuło, czy martwy kod w ogóle działałby, gdyby został przywrócony do użytku po tej zmianie?
Mając do czynienia z rozległą zmianą, programiści będą musieli również sprawdzić każde miejsce zawierające kod, aw przypadku martwego kodu jest to zbędne. A sprawdzenie ich trwa dłużej, gdy kod jest martwy, ponieważ trudno jest zweryfikować, czy nie jest nigdzie używany.
Jest to niezwykle cenne, jeśli wiesz, że część bazy kodu nie jest używana, ponieważ wtedy możesz ją usunąć. Jeśli pozwolisz mu pozostać, to w przyszłości może być trudne lub prawie niemożliwe uzyskanie pewności, że faktycznie nie jest ono używane. Na przykład niektóre rzeczy, które wykorzystują kod w zaskakujący sposób: odbicie, dynamiczne wywoływanie procedur połączonych z ciągami znaków, eval, magia frameworka .
Jeśli jednak istnieje duże prawdopodobieństwo, że kod zostanie użyty w przyszłości, łatwiej jest dodać, jeśli znajduje się obok innego kodu zamiast w systemie kontroli wersji. Po pewnym czasie możesz nie pamiętać żadnych słów, które zawierał kod, więc znalezienie kodu z trzewi VCS może być bardzo trudne. Ale ja pozwoliłbym, żeby martwy kod istniał rzadko, a nawet wtedy skomentowałbym go.
źródło
Ta lista może wydawać się prosta, ale każdy z nich przejawia się na setki różnych sposobów, dodając opór, który zapewnia synergię w całym procesie rozwoju. Nieefektywność można często udowodnić lub wykazać w prosty i matematyczny sposób.
W odpowiedzi na Twoje uwagi ...
Ale często trzeba to utrzymywać. Będzie również nadal pojawiać się w rzeczach, takich jak znajdowanie w pliku.
Nie jestem pewien, co masz na myśli przez to. Myślę, że jest taki sam jak poprzedni. Masz na myśli, że kod jest już przetestowany, a jego wyczyszczenie może oznaczać konieczność ponownego przetestowania. Jest to koszt, który zwykle jest tego wart, ponieważ opłaci się w 90% przypadków i aby uniknąć sytuacji, w której powinien zostać wyczyszczony przed rozpoczęciem produkcji. Prawie cały kod ma dwie iteracje, spraw, aby działał, spraw, aby był czysty. Powód, dla którego trzeba testować dwukrotnie, jest taki, że ktoś pominął ostatni krok. Jeśli twój kod jest również zbyt drogi, aby sprawdzić, czy odczytać różnice, przetestować (co prawdopodobnie jest bałagan z dużą ilością nieużywanego kodu), itd., To kolejny problem.
Twój kod i tak powinien być taki, ale to tylko umiarkowanie łagodzi problem. To najdziwniejszy argument, gdy słyszy się, że coś powinno być zorganizowane, ale nieczyste. To normalne, że próbujesz zachować modularny kod i zmniejszyć zależności, ale chcesz również kodu wielokrotnego użytku, a jeśli wszystkie twoje moduły są wyspami, prawdopodobnie nie byłeś SUCHY. Może się również zdarzyć, że nadmiernie odsprzęgasz, co nie robi nic, ale łagodzi problem nieużywanego niechlujnego kodu.
Wiele osób ponad ceni napisany kod. Jeśli nie jest teraz używany, jest to deadweight, aw rzeczywistości, gdy idziesz tą ścieżką, często tylko ułamek nieużywanego kodu staje się kodem używanym. Najprawdopodobniej nieużywany kod prawdopodobnie nie będzie użyteczny lub używany. Najprawdopodobniej zostanie ponownie użyty kod, który już jest używany.
Co gorsza, nieużywany kod nie ma celu. Kiedy ktoś przyjdzie i będzie musiał zmienić coś, co ostatecznie wpłynie na nieużywany kod, będzie zaskoczony, siedząc tam, próbując dowiedzieć się, co ten nieużywany kod musi robić bez celu.
Ludziom łatwo jest się tak czuć, gdy zaczynając pracę nad kodem, trzeba dużo wysiłku. Jednak gdy już biegnie i przyzwyczaisz się do tego kod, staje się jak jazda na rowerze. Przekonasz się, że koszt napisania takiego fragmentu kodu gwałtownie spada, koszt jego utrzymania rośnie.
To jest problem autora. Z jednej strony pozostawienie mnóstwa niewykorzystanego kodu dla innych jest samolubne. Z drugiej strony, jeśli autor stawia swoje uczucia na jakości kodu, prawdopodobnie nie powinien kodować. Idziesz dalej z tym, że nie możesz naprawić ich kodu, gdy jest zepsuty, ponieważ zrani ich uczucia. To nie jest dobry znak, jeśli ktoś jest przywiązany do kodu tylko dlatego, że jest jego, a nie dlatego, że jest dobry. Autor powinien czuć się zadowolony, że jego kod został wyczyszczony. To tak, jakby ktoś wynosił dla Ciebie śmieci i wrzucał je do kosza.
Byłbym oszołomiony, gdyby ktoś zrobił to za mnie. To, co może ułatwić przezwyciężenie tych uczuć, to zamiast czekać, aż ktoś inny to zrobi, spróbuje zrobić to sam. Kontynuuj iteracyjne przepisywanie kawałka kodu, który zrobiłeś, sprawiając, że działa lepiej, porusza się zwięźle, z mniejszym nadmiarem i bardziej elastycznym, ale za każdym razem z mniejszą ilością kodu. Staraj się nie czuć dobrze z ilością kodu, ale z tym, ile możesz osiągnąć przy niewielkiej ilości kodu. To mielenie w celu podniesienia poziomu, a kiedy już to zrobisz, cały kod będzie na dobrym poziomie, więc nie będzie trzeba go tak często poziomować.
źródło
Przede wszystkim należy zawsze używać narzędzia do kontroli źródła do zarządzania projektami, dlatego usuwanie nieużywanego kodu jest dobrą praktyką, ponieważ zawsze można wrócić, korzystając z kontroli źródła, aby uzyskać usunięty kod. Dla mnie powodem usunięcia nieużywanego kodu jest to, że wie o nim tylko osoba, która wie, że kod jest nieużywany, ktoś inny z zespołu natrafi na ten kod i spróbuje dowiedzieć się, co robi i jak pasuje do całej aplikacji i poczuje się zawiedziony po takim wysiłku, że kod w ogóle nie jest używany :)
źródło
Ta dyskusja ma kilka lat, ale właśnie ją spotkałem ...
Jedyną rzeczą, o której nie wspomniałem, jest praca, którą należy ponieść, aby usunąć nieużywany kod. W wielu przypadkach czas i wysiłek związany z usunięciem nieużywanego kodu nie jest z natury trywialny, a testowanie i dokumentowanie refaktoryzowanego systemu wiąże się z dodatkowymi kosztami. Kolejna rzecz do rozważenia w procesie decyzyjnym.
źródło
Myślę, że możesz mieć dwa przypadki: - kod aplikacji: jeśli jest nieużywany, może jest nieprzetestowany i nie jest utrzymywany przez czas, może możesz przejść do „wewnętrznego repozytorium kodu” - kod API: jeśli piszesz bibliotekę, to IMHO jest to lepszy wybór, aby go utrzymać, ale w ramach aktywnego procesu rozwoju
źródło
Czy na pewno kod jest nieużywany?
Nie wystarczy sprawdzić, czy kod nadal się kompiluje. W C ++, jeśli usuniesz „nieużywaną” niejawnie zdefiniowaną metodę, tak
operator=
jakbyś nie wystąpił błąd kompilatora, klasa po cichu zacznie używać (potencjalnie niepoprawnej) domyślnej implementacji. W Javie lub C # kod może być używany przez odbicie. W językach obiektowych dziedziczenie może odgrywać rolę (można teraz wywołać klasę bazową). W prawie każdym języku może przejąć inną przeciążoną funkcję.Sprawdź wiek kodu w kontroli wersji, a nie tylko to, że jest nieużywany. Widziałem kod, który wyglądał na nieużywany, ale został właśnie zatwierdzony i był właściwie pierwszym krokiem w projekcie innego dewelopera.
Agresywnie usuń nieużywany kod
Za utrzymanie kodu płacisz:
#include
zmian, wprowadzający nowe przeciążenie do nieużywanego kodu, co doprowadziło do rozsądnego bólu głowy dla każdego inżyniera w zespole kilkudziesięciu programistów.Powiedziałbym, że zasadniczo cały kod, który pisze przeciętny programista, staje się nieużywany w perspektywie pięciu lat, więc ta aktywność nigdy się nie kończy. Nie pozwól, żebyś to był ty; pisz tylko wysokiej jakości i absolutnie niezbędny kod.
źródło