Powiedzmy, że istnieją dwa możliwe rozwiązania problemu: pierwsze jest szybkie, ale zepsute; druga jest lepsza, ale jej wdrożenie zajmie więcej czasu. Musisz szybko rozwiązać problem, więc decydujesz się jak najszybciej włamać na miejsce, planując później rozpocząć pracę nad lepszym rozwiązaniem. Problem w tym, że gdy tylko problem zostanie rozwiązany, spada na dół na liście rzeczy do zrobienia. W pewnym momencie nadal planujesz wprowadzić lepsze rozwiązanie, ale trudno jest teraz uzasadnić jego wdrożenie. Nagle odkrywasz, że spędziłeś pięć lat, używając mniej niż idealnego rozwiązania, przeklinając je na chwilę.
Czy to brzmi znajomo? Wiem, że zdarzyło się to więcej niż raz, gdy pracuję. Jeden z kolegów opisuje celowe tworzenie złego GUI, aby nie został przypadkowo przyjęty na dłuższą metę. Czy masz lepszą strategię?
źródło
Odpowiedzi:
Napisz przypadek testowy, w którym hack się nie powiedzie.
Jeśli nie możesz napisać testu, którego hack się nie powiedzie, to albo mimo wszystko nie ma nic złego w hackowaniu, albo twoja struktura testowa jest nieodpowiednia. Jeśli to pierwsze, uciekaj szybko, zanim stracisz życie na niepotrzebną optymalizację. Jeśli to drugie, poszukaj innego podejścia (albo do oznaczania hacków, albo do testowania ...)
źródło
Strategia 1 (prawie nigdy nie wybrana): Nie wdrażaj kluge. Nawet nie daj ludziom poznać, że jest taka możliwość. Po prostu zrób to we właściwy sposób za pierwszym razem. Jak powiedziałem, ten prawie nigdy nie jest wybierany z powodu ograniczeń czasowych.
Strategia 2 (nieuczciwa): Lie and Cheat. Poinformuj kierownictwo, że podczas włamania są błędy i mogą one później spowodować poważne problemy. Niestety, w większości przypadków menedżerowie po prostu mówią, aby poczekać, aż błędy staną się problemem, a następnie napraw je.
Strategia 2a: taka sama jak strategia 2, z wyjątkiem błędów. Jednak ten sam problem.
Strategia 3 (i moja ulubiona): Zaprojektuj rozwiązanie, kiedy tylko możesz, i zrób to na tyle dobrze, aby mógł to zrobić stażysta lub programista. Łatwiej jest uzasadnić wydanie niewielkiej kwoty pieniędzy z małpy kodu niż uzasadnić własną pensję, więc może po prostu się udać.
Strategia 4: poczekaj na przepisanie. Czekaj dalej. Wcześniej czy później (prawdopodobnie później) ktoś będzie musiał coś przepisać. Równie dobrze mógłbym to zrobić od razu.
źródło
Oto świetny powiązany artykuł na temat długu technicznego .
Zasadniczo jest to analogia długu ze wszystkimi decyzjami technicznymi, które podejmujesz. Jest dobry i zły dług ... i musisz wybrać taki, który pozwoli ci osiągnąć zamierzone cele przy jak najmniejszych długoterminowych kosztach.
Najgorszym rodzajem długu są małe, kumulujące się skróty, które są analogiczne do zadłużenia na karcie kredytowej ... każdy z nich nie boli, ale wkrótce znajdziesz się w biednym domu.
źródło
Jest to poważny problem w przypadku pracy opartej na terminach. Uważam, że dodawanie bardzo szczegółowych komentarzy na temat tego, dlaczego wybrano ten sposób i kilka wskazówek, jak należy to zakodować, pomaga. W ten sposób ludzie patrząc na kod, widzą go i zachowują świeżość.
Inną opcją, która zadziała, jest dodanie funkcji bug.feature do struktury śledzenia (masz taką, prawda?), Szczegółowo opisującej przeróbkę. W ten sposób jest to widoczne i może w pewnym momencie wymusić problem.
źródło
Jedyny przypadek, w którym możesz usprawiedliwić naprawę tych rzeczy (ponieważ nie są one naprawdę zepsute, po prostu brzydkie), to sytuacja, gdy masz inną funkcję lub poprawkę błędu, która dotyka tej samej sekcji kodu, i równie dobrze możesz ją ponownie napisać.
Musisz obliczyć, ile czasu kosztuje programista. Jeśli wymagania oprogramowania są spełniane, a jedyną wadą jest to, że kod jest zawstydzający pod maską, nie warto go naprawiać.
Całe firmy mogą zbankrutować, ponieważ nadgorliwi inżynierowie nalegają na przebudowę architektury każdego roku lub dwa razy, kiedy stają się zdenerwowani.
Jeśli jest wolny od błędów i spełnia wymagania, to jest gotowe. Wyślij to. Pójść dalej.
[Edytować]
Oczywiście nie jestem zwolennikiem hakowania wszystkiego przez cały czas. Musisz starannie projektować i pisać kod w normalnym toku procesu programowania. Ale kiedy skończysz z hackami, które musiały zostać wykonane szybko, musisz przeprowadzić analizę kosztów i korzyści, czy warto wyczyścić kod. Jeśli przez cały okres użytkowania aplikacji poświęcisz więcej czasu na kodowanie wokół niechlujnego hacka niż na jego naprawianie, to oczywiście napraw to. Ale jeśli nie, to zbyt drogie i ryzykowne jest ponowne kodowanie działającej, wolnej od błędów aplikacji tylko dlatego, że patrzenie na źródło wywołuje u Ciebie chorobę.
źródło
NIE ROZPORZĄDZASZ ROZWIĄZAŃ TYMCZASOWYCH.
Czasami myślę, że programistom wystarczy to powiedzieć.
Przepraszam za to, ale poważnie - zhackowane rozwiązanie jest bezwartościowe i nawet przy pierwszej iteracji może zająć więcej czasu niż poprawne wykonanie części rozwiązania.
Proszę przestań zostawiać mi swój gówniany kod do utrzymania. Po prostu ZAWSZE PRAWIDŁOWO KODUJ. Nieważne, ile czasu to zajmie i kto na ciebie wrzeszczy.
Kiedy siedzisz i kręcisz kciukami po dostarczeniu wcześnie, podczas gdy wszyscy inni debugują swoje głupie sztuczki, podziękujesz mi.
Nawet jeśli nie uważasz się za świetnego programistę, zawsze staraj się robić wszystko, co w Twojej mocy, nigdy nie idź na skróty - nie kosztuje to ŻADNEGO czasu, aby zrobić to dobrze. Mogę uzasadnić to stwierdzenie, jeśli mi nie wierzycie.
źródło
Jeśli go przeklinasz, dlaczego znajduje się na dole listy TODO?
źródło
źródło
To trudne wezwanie. Osobiście robiłem hacki, ponieważ czasami MUSISZ przekazać ten produkt za drzwi i przekazać klientom. Jednak sposób, w jaki się tym zajmuję, to po prostu to robić.
Poinformuj kierownika projektu, swojego szefa lub klienta: jest kilka miejsc, które należy wyczyścić i lepiej zakodować. Potrzebuję na to tygodnia, a zrobienie tego teraz będzie mniej kosztować, a potem będzie to robić za 6 miesięcy od teraz, kiedy będziemy musieli wdrożyć rozszerzenie do podsystemu.
źródło
Zwykle takie problemy wynikają ze złej komunikacji z kierownictwem lub klientem. Jeśli rozwiązanie działa dla klienta, nie widzą powodu, aby prosić o jego zmianę. Dlatego muszą zostać poinformowani o kompromisach, które dokonałeś wcześniej, aby mogli zaplanować dodatkowy czas na naprawienie problemów po wdrożeniu szybkiego rozwiązania.
Sposób rozwiązania tego zależy trochę od tego, dlaczego jest to złe rozwiązanie. Jeśli Twoje rozwiązanie jest złe, ponieważ trudno je zmienić lub utrzymać, to za pierwszym razem, gdy musisz wykonać konserwację i mieć trochę więcej czasu, jest to właściwy czas na uaktualnienie do lepszego rozwiązania. W tym przypadku dobrze jest, jeśli powiesz klientowi lub szefowi, że wybrałeś skrót. W ten sposób wiedzą, że następnym razem nie mogą spodziewać się szybkiego rozwiązania. Poprawianie interfejsu użytkownika może być dobrym sposobem na upewnienie się, że klient wróci, aby naprawić rzeczy.
Jeśli rozwiązanie jest złe, ponieważ jest ryzykowne lub niestabilne, naprawdę musisz porozmawiać z osobą planującą i zaplanować trochę czasu, aby rozwiązać problem jak najszybciej.
źródło
Powodzenia. Z mojego doświadczenia wynika, że jest to prawie niemożliwe do osiągnięcia.
Kiedy zejdziesz po śliskiej ścieżce wdrażania hackowania, ponieważ jesteś pod presją, równie dobrze możesz przyzwyczaić się do życia z nim przez cały czas. Prawie NIGDY nie ma wystarczająco dużo czasu, aby przerobić coś, co już działa, bez względu na to, jak źle jest to wdrożone wewnętrznie. Dlaczego myślisz, że w magiczny sposób będziesz mieć więcej czasu „w późniejszym terminie” na naprawienie włamania?
Jedyny wyjątek od tej reguły, jaki przychodzi mi do głowy, to sytuacja, gdy włamanie całkowicie uniemożliwia wdrożenie innej funkcjonalności potrzebnej klientowi. W takim razie nie masz innego wyboru, jak tylko powtórzyć pracę.
źródło
Staram się zbudować zhackowane rozwiązanie, aby można je było przenieść na dłuższą metę tak bezboleśnie, jak to tylko możliwe. Powiedzmy, że masz faceta, który buduje bazę danych w SQL Server, ponieważ jest to jego najsilniejsza baza danych, ale standardem Twojej firmy jest Oracle. Zbuduj bazę danych z jak najmniejszą liczbą nieprzenoszalnych funkcji (takich jak typy danych Bit). W tym przykładzie nie jest trudno uniknąć typów bitów, ale ułatwia to późniejsze przejście.
źródło
Poinformuj wszystkich, którzy są odpowiedzialni za podejmowanie ostatecznej decyzji, dlaczego niecodzienny sposób robienia rzeczy jest zły na dłuższą metę.
Zasadniczo ludzie, którzy nie rozumieją oprogramowania, nie mają pojęcia o ponownym odwiedzaniu rzeczy, które już działają. Patrząc na to, programiści są jak mechanicy, którzy chcą ciągle rozbierać i składać cały samochód za każdym razem, gdy ktoś chce dodać funkcję, która brzmi dla nich szalenie.
Pomaga tworzyć analogie do codziennych rzeczy. Wyjaśnij im, w jaki sposób dokonując tymczasowego rozwiązania, dokonałeś wyborów, które pasowały do jego szybkiego zbudowania, w przeciwieństwie do bycia stabilnym, łatwym w utrzymaniu itp. To tak, jakbyś wybrał budowanie z drewna zamiast stali, ponieważ drewno jest łatwiejsze do cięcia, a zatem można szybciej zbudować rozwiązanie tymczasowe. Drewno po prostu nie może jednak utrzymać fundamentu 20-piętrowego budynku.
źródło
Używamy Java i Hudson do ciągłej integracji. „Rozwiązania tymczasowe” należy skomentować:
Za każdym razem, gdy Hudson uruchamia kompilację, dostarcza raport o każdym elemencie TODO, dzięki czemu mamy aktualny, dobrze widoczny zapis wszystkich zaległych elementów, które wymagają poprawy.
źródło
Świetne pytanie. Mnie to też bardzo przeszkadza - i przez większość czasu jestem jedyną osobą odpowiedzialną za nadawanie priorytetów problemom w moich własnych projektach (tak, małe firmy).
Dowiedziałem się, że problem, który należy naprawić, to zwykle tylko część problemu. IOW, klient, który potrzebuje pilnej naprawy, nie potrzebuje rozwiązania całego problemu, a jedynie jego części - mniejszej lub większej. To czasami pozwala mi stworzyć obejście, które nie jest rozwiązaniem całego problemu, ale tylko podzbiorem klienta, co pozwala mi pozostawić większy problem otwarty w narzędziu do śledzenia problemów.
To oczywiście może w ogóle nie dotyczyć Twojego środowiska pracy :(
źródło
To przypomina mi historię „CTool”. Na początku CTool został zaproponowany przez jednego z naszych deweloperów, nazywam go Don, jako jeden z możliwych sposobów rozwiązania problemu, który mieliśmy. Będąc bardzo pracowitym typem, Don odłączył się i dostarczył działający prototyp. Wiesz, dokąd z tym zmierzam. Z dnia na dzień CTool stał się częścią przepływu pracy firmy i zależał od niego cały dział. Drugiego lub trzeciego dnia zaczęły napływać gorzkie skargi na niedociągnięcia CTool. Użytkownicy kwestionowali kompetencje, zaangażowanie i IQ Dona. Protesty Dona, że to nigdy nie miała być aplikacja produkcyjna, trafiły w głuche uszy. Trwało to latami. W końcu ktoś zajął się ponownym napisaniem aplikacji, długo po odejściu Dona. W tym czasie do nazwy CTool przywiązano tyle nienawiści, że nazwanie jej CTool wersja 2 nie wchodziło w rachubę. Odbył się nawet oficjalny pogrzeb CTool, przypominający nieco scenę egzekucji na kopiarce (a może drukarce?) W przestrzeni biurowej .
Niektórzy mogą powiedzieć, że Don zasłużył na procy i strzały, ponieważ nie zmusił go do naprawienia CTool. Chodzi mi tylko o to, że mówienie, że nigdy nie powinieneś hakować rozwiązania, jest prawdopodobnie nieuzasadnione w prawdziwym świecie. Ale jeśli to ty to zrobisz, postępuj ostrożnie.
źródło
Zdobądź to na piśmie (e-mail). Kiedy więc pojawia się problem, później kierownictwo nie „zapomina”, że miało to być tymczasowe.
Pokaż to użytkownikom. Im bardziej jest to widoczne, tym mniej prawdopodobne jest, że ludzie zapomną o powrocie i zrobią to we właściwy sposób po zakończeniu kryzysu.
Negocjuj, zanim rozwiązanie tymczasowe zostanie wdrożone dla projektu, zasobów i terminów, aby uzyskać rzeczywistą poprawkę. Prace nad rzeczywistym rozwiązaniem powinny prawdopodobnie rozpocząć się zaraz po ukończeniu rozwiązania tymczasowego.
źródło
Zgłaszasz drugi bardzo opisowy błąd związany z własną „poprawką” i umieszczasz bezpośrednio w dotkniętych obszarach komentarz do zadania o treści „Ten obszar wymaga dużo pracy. Zobacz usterkę nr 555” (oczywiście użyj właściwej liczby) . Ludzie, którzy mówią „nie próbuj włamać się”, wydają się nie rozumieć pytania. Załóżmy, że masz system, który musi być teraz uruchomiony, twoje rozwiązanie niehackowe to 8 dni pracy, twój hack to 38 minut pracy, hack jest po to, aby kupić ci czas na wykonanie pracy i nie tracić pieniędzy podczas robisz to.
Teraz nadal musisz poprosić klienta lub kierownictwo o zgodę na zaplanowanie N * 100 minut potrzebnych na wykonanie prawdziwej naprawy, oprócz N minut potrzebnych teraz, aby to naprawić. Jeśli musisz odmówić wdrożenia hackowania, dopóki nie uzyskasz takiej zgody, może to właśnie musisz zrobić, ale pracowałem z niektórymi rozumiejącymi ludźmi w tym zakresie.
źródło
Prawdziwa cena wprowadzenia szybkiej poprawki polega na tym, że gdy ktoś inny musi wprowadzić drugą szybką poprawkę, wprowadzi ją na podstawie Twojej własnej szybkiej poprawki. Tak więc im dłużej szybka naprawa jest na miejscu, tym bardziej się zakorzeni. Dość często hackowanie trwa tylko trochę dłużej niż robienie rzeczy dobrze, dopóki nie natrafisz na drugi hack, który opiera się na pierwszym.
Oczywiście czasami konieczne jest (lub wydaje się) wprowadzenie szybkiej poprawki.
Jednym z możliwych rozwiązań, zakładając, że twoja kontrola wersji to obsługuje, jest wprowadzenie rozwidlenia ze źródła za każdym razem, gdy robisz taki hack. Jeśli zachęci się ludzi do unikania kodowania nowych funkcji w ramach tych specjalnych forków „do zrobienia”, to w końcu integracja nowych funkcji z forkiem będzie wymagać więcej pracy niż pozbycie się hacka. Bardziej prawdopodobne jest jednak, że „dobry” widelec zostanie odrzucony. A jeśli jesteś na tyle daleko od wydania, że zrobienie takiego rozwidlenia nie będzie praktyczne (ponieważ nie warto robić wspomnianej powyżej podwójnej integracji), to prawdopodobnie i tak nie powinieneś nawet używać hacka.
Bardzo idealistyczne podejście.
Bardziej realistycznym rozwiązaniem jest podzielenie programu na jak najwięcej ortogonalnych komponentów i od czasu do czasu całkowite przepisanie niektórych z nich.
Lepszym pytaniem jest, dlaczego to hackerskie rozwiązanie jest złe. Jeśli jest zły, ponieważ zmniejsza elastyczność, zignoruj go, dopóki nie będziesz potrzebować elastyczności. Jeśli jest zły, ponieważ wpływa na zachowanie programu, zignoruj go, a ostatecznie zostanie naprawiony i zostanie rozwiązany. Jeśli jest zły, ponieważ wygląda brzydko, zignoruj go, o ile hack jest zlokalizowany.
źródło
Niektóre rozwiązania, które widziałem w przeszłości:
HACK
w kodzie (lub podobnym schemacie, np.XXX
)HACK
pojawiają się komentarzeTo doskonałe pytanie. Zauważyłem jedną rzecz, gdy zdobywam więcej doświadczenia: hacki kupują cię w bardzo krótkim czasie i często kosztują znacznie więcej. Ściśle związana jest „szybka naprawa”, która rozwiązuje to, co Twoim zdaniem jest problemem - tylko po to, by odkryć, gdy wybuchnie, że to wcale nie był problem.
źródło
Odkładając na bok dyskusję o tym, czy powinieneś to zrobić, załóżmy, że musisz to zrobić. Sztuczka polega teraz na zrobieniu tego w sposób, który minimalizuje wpływ na daleki zasięg, łatwo go później wyrwać i sprawia, że staje się uciążliwy, więc pamiętaj, aby to naprawić.
Uciążliwa część jest łatwa: spraw, aby za każdym razem, gdy wykonujesz kludge, wyświetlało ostrzeżenie.
Wyrwana część może być łatwa: lubię to robić, umieszczając kludge za nazwą podprogramu. Ułatwia to aktualizację, ponieważ dzielisz kod. Kiedy otrzymasz swoje trwałe rozwiązanie, podprogram może go wdrożyć lub nie działać. Czasami podklasa też może się przy tym dobrze sprawdzić. Nie pozwól jednak innym polegać na tym, jak szybko rozwiązujesz problem. Trudno jest polecić jakąś konkretną technikę, nie widząc sytuacji.
Minimalizacja efektów dalekiego zasięgu powinna być łatwa, jeśli reszta kodu jest ładna. Zawsze przeglądaj opublikowany interfejs i tak dalej.
źródło
Postaraj się, aby ludzie w biznesie zrozumieli koszty włamania. Wtedy mogą podjąć świadomą decyzję tak czy inaczej.
źródło
Możesz celowo napisać to w sposób, który jest zbyt restrykcyjny i przeznaczony do jednego celu i wymagałby ponownego napisania w celu zmodyfikowania.
źródło
Musieliśmy to zrobić raz - stworzyć krótkoterminową wersję demonstracyjną, o której wiedzieliśmy, że nie chcemy zatrzymać. Klient chciał go mieć na skrzynce winTel, więc opracowaliśmy prototyp w SGI / XWindows. (Biegle mówiliśmy w obu, więc to nie był problem).
źródło
Wyznanie:
Użyłem '#define private public' w C ++, aby odczytać dane z innej warstwy kodu. Wszedł jako włamanie, ale działa dobrze, a naprawienie go nigdy nie było priorytetem. Jest teraz 3 lata później ...
Jednym z głównych powodów, dla których hacki nie są usuwane, jest ryzyko, że ktoś wprowadzi nowe błędy podczas naprawiania hacka. (Szczególnie gdy mamy do czynienia z bazami kodu sprzed wersji TDD).
źródło
Moja odpowiedź różni się nieco od pozostałych. Z mojego doświadczenia wynika, że poniższe praktyki pomagają zachować elastyczność i przejść od hackey pierwszej iteracji / rozwiązań alfa do wersji beta / produkcyjnej:
Rozwój oparty na testach
Małe jednostki refaktoryzacji
I powinno być oczywiste, że musisz mieć wsparcie interesariuszy, aby poprawnie wykonać którąkolwiek z tych czynności. Ale dzięki tym produktom masz odpowiednie narzędzia i procesy, aby szybko i pewnie zmienić produkt. Czasami twoją zdolnością do zmiany jest umiejętność zarządzania ryzykiem zmian, a z perspektywy rozwoju te narzędzia / techniki dają ci pewniejsze podstawy.
źródło