Czy w odniesieniu do uszkodzonych okien najlepiej jest zostawić refaktoryzację do przyszłej działalności?
Na przykład, jeśli projekt dodania nowych funkcji do istniejącego systemu wewnętrznego zostanie przypisany zespołowi, który do tej pory nie pracował z systemem, i otrzyma krótki harmonogram, z którym można pracować - czy kiedykolwiek będzie to uzasadnione odroczyć poważne refaktoryzacje do istniejącego kodu w celu zachowania terminu w tym scenariuszu?
project-management
refactoring
maintenance
Bullines
źródło
źródło
Odpowiedzi:
Refaktoryzacja jest - i powinna być - ciągłym procesem. Nie wystarczy po prostu spełnić wymagania dzięki działającej i przetestowanej implementacji, która wciąż jest nieco niekompletna.
Nie pamiętam, gdzie przeczytałem ten cytat, ale jest to klucz do dobrego zastosowania refaktoryzacji i uważam to za nieprofesjonalne, aby zrobić inaczej.
Ciągłe refaktoryzowanie jest jak wycieranie rozlanych płynów podczas gotowania i czyszczenie naczyń po zjedzeniu posiłku. Ukierunkowane refaktoryzacja jest jak znalezienie brudnej kuchni, ale tylko czas na umycie brudnej szklanki lub dwóch. Czy wolisz mieszkać z ciągle brudną kuchnią, czy wolisz utrzymywać porządek w czystości?
Dostajesz kod do działania, a następnie refaktoryzujesz kod, aby zapewnić najlepszą możliwą implementację. Jeśli robisz coś znajomego, być może za pierwszym razem wdrażasz najlepszy kod, jednak upewnienie się wymaga czasu. Jeśli wygląda na to, że możesz poprawić swój kod, to spróbuj refaktoryzować, aby upewnić się, że Twój kod jest co najmniej tak ubogi i czysty, jak to tylko możliwe. Oznacza to, że redukujesz kwotę długu technicznego, który pozostawiasz za sobą, a także ułatwiasz czytanie i refaktoryzację, gdy następnym razem zajdzie potrzeba załatwienia kodu. Jest to podstawowa wartość mantry TDD „Red-Green-Refactor”, z tym wyjątkiem, że w TDD refaktoryzujesz przede wszystkim w celu usunięcia duplikacji, opłaca się również przejrzeć inne elementy, które można zrefaktoryzować, takie jak duże klasy, długie metody
Jeśli znajdziesz się w obliczu poważnego przeprojektowania, być może możesz go odłożyć na chwilę, szczególnie jeśli masz mało czasu w harmonogramie. Jest to jednak możliwe pod warunkiem, że funkcjonalność Twojego kodu nie zostanie naruszona, a także pod warunkiem, że implementacja będzie nadal spełniać wymagania. Tego rodzaju sytuacja powinna być rzadka i możesz pomóc w zapewnieniu, że będzie to jeszcze rzadsze, jeśli będziesz ciągle refaktoryzować w trakcie. Jeszcze ważniejsze jest jednak to, że nie możesz ryzykować zbyt długiego pozostawienia poważnych zmian, w przeciwnym razie później stworzysz jeszcze większe obciążenie, które może być o wiele bardziej kosztowne do naprawienia, lub może skończyć się jeszcze bardziej kosztownym niepowodzenie projektu.
Mam wrażenie, że wiele osób często mylić definicje Refaktoryzacja i re-engineering . Te dwa terminy opisują strategie radzenia sobie z bardzo różnymi sytuacjami. Jeśli chcesz przeprojektować, zobowiązujesz się dokonać drastycznej zmiany, która zmieni zachowanie systemu. Spowoduje to unieważnienie niektórych testów, a także będzie wymagać nowych testów. Po dokonaniu refaktoryzacji upewniasz się, że system nadal zachowuje się dokładnietak samo jak przed zmianą, ale zapewniasz również, że Twój kod będzie miał długowieczność i że będzie łatwiej utrzymać go z czasem. Do cholery nie „wypychasz” swojego kodu, zobowiązujesz się do profesjonalnego standardu czystego kodu, który zmniejszy ryzyko niepowodzenia i zapewni, że Twój kod pozostanie przyjemnością do pracy, i profesjonalnym standardem .
Wracając do analogii zepsutych okien, jeśli rozbisz okno, powinieneś je natychmiast naprawić. Jeśli nie zauważyłeś, że okno jest zepsute, musisz zdecydować o kosztach, jeśli pozostawisz okno zepsute. Teraz powtórzyć poprzednie dwa zdania, ale substytutem Bug za oknem. W końcu potrzebujesz innej strategii. Jeśli stworzyłeś błąd podczas kodowania, naprawisz go od razu lub zobaczysz, czy zmiany będą wymagały ponownego zaprojektowania i podejmiesz komercyjną decyzję, kiedy najlepiej będzie rozwiązać problem. Aby uniknąć problemów, nie dokonujesz refaktoryzacji, refaktoryzujesz, aby łatwiej było znaleźć i naprawić problemy. Nie obchodzi mnie, jak zdumiewający jest twój kod, złożone systemy zawsze będą miały problemy, z którymi trzeba będzie się uporać. Na tym właśnie polega dług techniczny i dlaczego refaktoryzacja musi być procesem ciągłym podczas wdrażania kodu , a nie pozostawiona na jakiś arbitralny przyszły czas.
Krótko mówiąc, odpowiedź, że w rzadkich przypadkach akceptowalne może być odroczenie poważnych zmian w kodzie w celu dotrzymania terminu, nie należy jednak uważać za normalną praktykę traktowania refaktoryzacji jako ćwiczenia niezależnego od codziennej pracy wdrożeniowej, a na pewno nigdy nie wykorzystywane jako wymówka dla zespołów niezaznajomionych z bazą kodu jako opcja, aby uniknąć zapewnienia, że ich implementacja jest tak uproszczona i czysta, jak to możliwe, w danych okolicznościach.
źródło
Niektórzy programiści twierdzą, że „naprawiają rozbite okna”, a tak naprawdę „przestawiają leżaki w Titanicu”. Kod refaktoryzacji, który działa, ale obraża zmysł węchu, jest stosunkowo łatwy. Jeśli zauważysz, że powracasz do tego rodzaju zadań zamiast dodawać nowe możliwości dla użytkowników lub zwiększać użyteczność aplikacji (optymalizacja oznacza, że aplikacja działa szybciej, dobrze tutaj, optymalizacja oznacza, że kod jest bardziej czytelny) inny) to może zbyt dużo sprzątacie. Nie dlatego, że porządkowanie jest złe, ale dlatego, że firma płaci za rozwój, aby coś rozwinąć. Z pewnością nie chcą kruchego, trudnego do odczytania, źle zaprojektowanego rozwiązania, ale nie chcą też dopracowanego i pięknego pół-rozwiązania.
Posprzątaj, kiedy musisz zrobić coś prostego „na start”, lub gdy czekasz na inny zespół, który powie ci, czy twój problem jest rzeczywiście ich winą, lub kiedy czekasz na decyzję. Będzie wiele możliwości. Jeśli masz szansę przesunąć całą aplikację do przodu, weź ją, chyba że zaczynasz czuć, że cała sprawa stała się krucha. Prawdopodobnie nie. Otrzymasz szansę na refaktoryzację - nie musisz się tym martwić.
Wracając do drugiej połowy pytania, sprintu w celu dodania funkcji w krótkim horyzoncie czasowym, błędem byłoby powiedzieć „i nie będziemy robić żadnych refaktoryzacji, nie ma czasu”. Błędem byłoby również powiedzieć „Wiem, że minęło 6 tygodni i wygląda dokładnie tak samo dla użytkowników, ale te zepsute okna naprawdę musiały zostać naprawione”. Dopasuj refaktoryzację do luk, które występują w każdym projekcie. Nie szukaj schronienia w sprzątaniu kosztem osiągnięcia celu projektu.
źródło
Z perspektywy biznesowej refaktoryzacja to inwestycja spekulacyjna - inwestowanie czasu i wysiłku (pieniędzy) teraz w nadziei, że pozwoli zaoszczędzić więcej czasu i wysiłku (pieniędzy) w przyszłości.
Bez wchodzenia w debatę na temat tego, ile wysiłku przy refaktoryzacji zaoszczędzi w przyszłości (zależy to od zbyt wielu zmiennych, aby była to sensowna dyskusja tutaj), jasne jest, że czas na refaktoryzację to moment, w którym „wartość bieżąca netto” kosztu pozostawiania go przekracza koszt teraz.
To proste, ale nie masz pojęcia, ile będzie kosztować przyjazd. Musisz także uwzględnić wszystkie zwykłe pomysły dotyczące planowania finansowego, takie jak zwrot z inwestycji, zarządzanie ryzykiem (wartość marki, odpowiedzialność prawna, ryzyko ubezpieczalne kontra ryzyko nieubezpieczone), koszty operacyjne itp.
W większości przypadków decyzję o tym, kiedy dokonać refaktoryzacji, najlepiej pozostawić osobom zarządzającym firmą. Pomimo tego, że wiele plakatów na tym forum wokalizuje, menedżerowie zwykle wiedzą więcej na temat prowadzenia firmy niż programiści. Mają na myśli szerszy obraz, który obejmuje maksymalizację zwrotu dla akcjonariusza. Rzadko zdarza się, że naprawianie nieuszkodzonych elementów przyczynia się do tego, kod nie jest wyjątkiem.
Edycja: Przeczytałem interesujący artykuł o harmonogramach przeglądów infrastruktury krytycznej. Istotą jest to, że ruch jest z dala od rutynowej konserwacji (refaktora) do naprawy w razie potrzeby (naprawianie błędów). Główną różnicą są poziomy monitorowania - na przykład elektrownia jądrowa monitoruje bardzo szczegółowo i naprawia, gdy jest „zepsuta”, ale na długo przed awarią. Stwierdzono, że przymocowanie do schematu konserwacji nie tylko kosztuje więcej, ale jest mniej niezawodne z powodu awarii spowodowanych przez program konserwacji. Podobny pomysł jest wymagany w przypadku oprogramowania - refaktoryzacji bitów, które mają się złamać - które można poznać tylko poprzez pomiar.
źródło
Dopuszczalne jest, gdy szkoda dla firmy przez naprawienie ich jest większa niż przez ich nie naprawienie.
Sytuacje, w których to występuje, mogą być:
I takie sytuacje się zdarzają - sytuacje handlowe często wymuszają sztuczne terminy, które muszą być dotrzymane w przypadku, gdy minęła możliwość ich negocjacji, oraz wymogi, które mają element czasowy - na przykład zmiana ustawodawstwa lub przepisów podatkowych, które wchodzą w życie konkretna data - istnieją.
Sztuką jest identyfikowanie tych sytuacji i ich właściwa ocena. Kod, który ma zostać wycofany, będzie często pozostawał przez lata. Konieczne może być dotrzymanie sztucznych terminów, ale często mogą one być dotrzymywane na różne sposoby (na przykład oprogramowanie może być prezentowane, prezentowane i „uruchamiane” w danym dniu bez konieczności finalnej wersji ostatecznej wersji do późniejszego końca).
Kiedy masz do czynienia z tego rodzaju rzeczami, musisz podejść do tego z otwartym umysłem, ale zawsze pytaj, czy to się pojawia? Czy związane z tym założenia są realistyczne? Czy istnieje inny sposób osiągnięcia celu bez wysyłania niestandardowego kodu? Jeśli nie ma, jak najlepiej wykorzystać dostępny mi czas?
A jeśli nie ma alternatywy, zawsze dobrze, ale kiedy to naprawimy?
Ponieważ powinno prawie, prawie, prawie zawsze być kiedy , a nie jeśli .
źródło
Jeśli menedżerowie zdecydują, że chcą narastać dług techniczny . Jest to słuszna decyzja, jeśli na przykład chcesz, aby niektórzy początkowi klienci otrzymali wczesny prototyp, aby uzyskać wczesną informację zwrotną.
źródło
Możesz myśleć o tym w taki sam sposób, jak proszenie o kredyt. Czy można pożyczać pieniądze, aby inwestować w X w perspektywie krótkoterminowej i płacić za nie w perspektywie długoterminowej? Nie ma jednoznacznej odpowiedzi, może to być w najlepszym interesie organizacji (np. Aby spełnić obecne oczekiwania klientów), lub może być katastrofą, jeśli zostanie wykonane w sposób nieodpowiedzialny.
Wszystko sprowadza się do priorytetów, a kierownictwo powinno mieć świadomość, że chociaż priorytetem numer jeden jest sprawienie, by kod działał, wdrożenie nowych funkcji i spełnienie oczekiwań klienta, za każdym razem, gdy opuszczasz rozbite okna, spowalniasz priorytet numer jeden , trudniejsze i wymagające większej inwestycji zasobów. Ponadto w 99% przypadków nie można przestać opracowywać nowych funkcji i skoncentrować każdy wysiłek na „naprawie bazy kodu”.
Podsumowując, tak, czasami można zostawić rozbite okna, tak jak dopuszczalne jest poproszenie o pożyczkę ... pamiętaj tylko, że naprawdę, naprawdę musisz za to zapłacić w przyszłości. A w przyszłości czas na zrobienie tego najprawdopodobniej nie będzie znacznie większy niż czas, który masz teraz.
źródło
Zwykle, gdy możesz, powinieneś to naprawić. Pozwoli to uniknąć potencjalnego czasu poświęconego na konserwację. Jednak jakaś barbarzyńska nie zwinna praktyka pozwala pozostawić status quo tak długo, jak długo działa. Niektórzy menedżerowie obawiają się „nieprzewidzianych skutków” zmiany.
Uważam, że należy zostawić to tylko wtedy, gdy działa tak, jak powinno (tylko zepsute przez optymalizację, ale nie funkcjonalność) i nie masz czasu na przetestowanie go, jeśli dokonujesz refaktoryzacji. Należy jednak pamiętać, że należy to naprawić jak najszybciej.
Jeśli jest zepsuty przez funkcjonalność, a nowe funkcje zależą od niego, najlepiej byłoby to naprawić jak najszybciej.
źródło
Większość programistów zarabia pieniądze dla swojego pracodawcy. Kiedy zatem powinno się dokonać refaktoryzacji: kiedy przyniesie to firmie pieniądze. Refaktoryzacja to czas nie spędzony na innych projektach i czas zaoszczędzony w przyszłości na tym projekcie.
To, czy warto, zależy głównie od Twojego menedżera.
źródło
Programiści powinni poinformować stronę biznesową o wielkości długu technicznego, aby mogli podjąć świadomą decyzję. Jeśli potrzeba wcześniejszego wejścia na rynek przewyższa ryzyko związane z kodem, nie masz dużego wyboru. Brak przepływu gotówki przebije wiele decyzji technicznych.
Aby umieścić niektóre problemy w nietechnicznej perspektywie, zwróć uwagę na wydłużony czas na naprawę błędów i dodanie nowych funkcji. Jeśli kierownictwo ma doświadczenie sprzedażowe i marketingowe, może to zrozumieć. Nienawidzą konieczności informowania klientów, że to zajmie dłużej.
Jeśli zastanawiasz się nad powiększeniem zespołu, może to być dobry moment na zatrudnienie młodszego programisty. Pokrycie testowe będzie w tym przypadku ogromnym wybawcą. Nauczą się więcej, robiąc niż czytając dokumentację.
źródło
Jeśli jednak mówisz o ponownym faktorowaniu działającego kodu, rozważę następujące kwestie:
Gdyby to zależało od naszych starszych programistów lub dyrektora technicznego, nigdy nie wydalibyśmy żadnego oprogramowania. Zawsze staraliśmy się ponownie rozłożyć czynniki i dążyć do perfekcjonizmu.
Jeśli faktoring będzie miał negatywny wpływ na rentowność biznesu, należy go ponownie zaplanować.
Jeśli Twoja firma obiecała dostarczyć określoną funkcjonalność w określonym terminie, dokonaj refaktoryzacji później. Pomyśl o organizacji charytatywnej z okazji Czerwonego Nosa - co roku mogą zbierać datki przez okres 24 lub 48 godzin. Nie ma możliwości, aby zmienili fakturę swojej bazy kodów, jeśli pomyśleli, że może to powstrzymać ich od przyjmowania darowizn w tym czasie. Dodatkowo, jeśli jest rozbite okno, ale nie wpłynie to na ich zdolność do przyjmowania darowizn, jest całkiem prawdopodobne, że zdecydują się nie uwzględniać ponownie.
Zawsze znajdziesz lepszy sposób na zrobienie czegoś. To naturalny proces i bardzo ważne jest, aby móc narysować linię.
źródło
W odpowiedzi na twoje pytanie dotyczące refaktoryzacji powiedziałbym „tak”. Jak ktoś inny wskazał w powyższych odpowiedziach, refaktoryzacja jest procesem ciągłym, a czasami podejmowane są taktyczne i biznesowe decyzje, które zastępują potrzebę przepisania kodu, który już działa (choć może w klugey sposób).
Jeśli chodzi o „rozbite okna”: ten termin pierwszy raz usłyszałem w kontekście tworzenia oprogramowania, około 10 lat temu. Ale w tym czasie używano go do opisania dopuszczania zepsutych testów jednostkowych . Opisywało to scenariusz, w którym ludzie mają pokusę, aby nie naprawiać uszkodzonych testów jednostkowych, ponieważ wydaje się celowe po prostu pamiętać, które testy są „w porządku, aby zakończyć się niepowodzeniem”, zamiast naprawiać uszkodzone testy (które zostały poprawnie zerwane z powodu interfejsu lub wymagań zmiany, na przykład).
Myślę, że zastosowanie metafory zepsutego okna do testów zepsutych jednostek jest bardziej odpowiednie i bardziej opisujące niebezpieczeństwo dopuszczenia „wybitych okien” w sąsiedztwie oprogramowania. Moim zdaniem, jeśli mówisz o uszkodzonych testach jednostkowych (jak rozbite okna), odpowiedzią byłoby, że nigdy nie jest w porządku. (Do tego stopnia, że możemy powiedzieć: nigdy ...)
źródło
Jeśli jest naprawdę zepsuty, należy go naprawić.
Ale czy to naprawdę zepsute? Czy jesteś pewien, że nie utożsamiasz „nie ładnego” ze złamanym.
Musisz zastosować obliczenie „wartości zatopionej”, zanim ponownie uwzględnisz działający kod, ponieważ nie podoba ci się styl lub, ponieważ uważasz, że spowoduje to problemy w przyszłości.
W przypadku ponownego faktorowania kodu napisanego w zeszłym tygodniu kosztem jest czas spędzony na kodowaniu go w zeszłym tygodniu, nie warto się martwić, czy kod zostanie znacznie ulepszony.
Kod refaktoryzacji, który przeszedł test jednostkowy. Teraz nie musisz tylko pisać od nowa, musisz ponownie zdefiniować i ponownie uruchomić wszystkie dotychczasowe testy, to zaczyna wyglądać na drogie.
Ponowny faktoring kodu, który trafił do produkcji. Jeszcze więcej testów do zrobienia, a także wdrożenie dla użytkowników, a także ryzyko dostarczenia czegoś, co nie działa tak dobrze, jak starej wersji. Musisz to uzasadnić i wyjaśnić to dużemu szefowi, zanim przejdziesz dalej.
Kod faktoringowy, który od dłuższego czasu jest w trakcie produkcji i został poddany kilku wydaniom i poprawkom. Jeśli nie wiesz, że oprogramowanie przestanie działać, nawet tam nie wchodź!
źródło
Z mojego doświadczenia wynika, że termin jest najważniejszy dla biznesu. To zależy od tego, kto będzie korzystał z Twojej aplikacji. W moim przypadku było to oprogramowanie na telefony komórkowe ... przekroczenie terminów oznaczało przekroczenie celów sprzedażowych i uderzeń cen akcji.
Podczas odziedziczenia kodu, który odziedziczyliśmy i wyraźnie trzeba go było zmienić, natrafiliśmy na wiele momentów WTF. Ponieważ jednak ten kod działał „prawie” (asynchroniczność jest słabo rozumiana), nie było zachęty dla kierownictwa, aby faktycznie zezwoliło na refaktoryzację, podczas gdy należało wypełnić zaległe zobowiązania. Dopiero po zauważeniu błędu „na wolności” pozwolono by nam cokolwiek zmienić, nawet jeśli sami moglibyśmy go łatwo złamać przez mało znane przypadki. Kiedyś przerobiłem około 10 000 wierszy kodu w swoim czasie i musiałem go wyrzucić. Czas potrzebny na testowanie i inne recenzje itp. Nie mógł być uzasadniony.
źródło