Jak powstrzymać tymczasowe rozwiązania przed wiecznym trwałością?


79

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ę?


Świetne pytanie - zostałem właśnie przeniesiony do projektu z wieloma tego typu rozwiązaniami. Z niecierpliwością czekam na odpowiedzi.
Chris Marasti-Georg,

Szybki, ale hacky ma nieprzyjemną tendencję do stania się trwałym. W projekcie osobistym (małej witrynie internetowej) „tymczasowe” rozwiązanie, które napisałem 10 lat temu, jest nadal używane.
Powerlord

Odpowiedzi:


37

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 ...)


To możliwe, najlepsze rozwiązanie. Testy zakończone niepowodzeniem mają często wysoki priorytet.
Toon Krijthe

1
Właśnie dlatego, że nieudany test ma wysoki priorytet, nie jest to rozwiązanie problemu, ale dobry sposób na zantagonizowanie zespołu i / lub menedżera.
Michael Borgwardt

1
Jeśli to zantagonizuje mój zespół, to ewidentnie nie zgadzają się z moim „planem rozpoczęcia od lepszego rozwiązania”. Jeśli mają rację, to „szybka” wersja to nie hack, to prawidłowe rozwiązanie. Próba zaprojektowania niepowodzenia testu jest najlepszym sposobem sprawdzenia, czy mój kod jest wystarczająco dobry.
Steve Jessop

1
... moja ogólna uwaga jest taka, że ​​jeśli „szybka” poprawka jest wystarczająco dobra, to pytanie przedstawia fałszywy problem, którego nie należy rozwiązywać: „jak mam wykonywać pracę, której nie trzeba wykonywać?”. Jeśli „szybka” poprawka nie jest wystarczająca do wydania, to koledzy nie będą zrażeni testem, który to mówi.
Steve Jessop

1
Proszę również zauważyć, że nie proponuję, w 8 słowach, dostarczenia metodyki tworzenia srebrnej kuli, którą głupi ludzie mogą raz przeczytać, a następnie bezmyślnie podążać, a tym samym śledzić i naprawiać wszystkie możliwe defekty kodu ;-) Po prostu użyj mechanizmu, który masz (testy ), inteligentnie, aby zmierzyć defekty, do czego przecież służą. Jeśli naprawdę nie możesz napisać testu, OK, poszukaj innego sposobu określenia, czy kod zawiera defekt. Jeśli kod jest dostarczany z defektem, pomyśl o „opcjonalnych” testach. Przede wszystkim jednak obiektywnie oszacuj problem.
Steve Jessop

17

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.


Jedyny problem ze Strategią 4 - kiedy w końcu zajmiesz się przepisywaniem, istnieją również poważne ograniczenia czasowe i budżetowe - więc hack zostanie skopiowany - lub inne niezdarne rozwiązania zostaną wprowadzone do przepisywania.
Ken Ray,

1
Problem ze strategią 4 polega na tym, że po 5 latach obejść i poprawek coś zaginie w tłumaczeniu, gdy będziesz gotowy do ponownego napisania.
Giovanni Galbo

Dokładnie. Nic tak nie złości interesariuszy biznesowych, jak zapłacenie za 6-miesięczny przepis, który w zasadzie daje im tę samą aplikację, którą mieli, ale z dodatkowymi błędami. Startegy 5: stopniowo i ostrożnie modyfikuj rzeczy, gdy ma to sens.
Eric Z Beard

16

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.


Świetny artykuł - dzięki. Kiedy zadałem to pytanie, myślałem o długach typu II-A-1 (analogia kredytu samochodowego), a nie II-A-2 (karty kredytowe). Teraz widzę, że takie długi mogą być dobre i że organizacja może je wyraźnie zaplanować.
Tommy Herbert

14

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.


Zgoda. Dodaj przedmiot do systemu śledzenia. Problem polega na tym, że zwykle rozwiązanie tymczasowe nie zostanie rozwiązane, chyba że wystąpi z nim istotny problem związany z funkcjonalnością. Być może jest to w porządku, chyba że utrzymujesz kod nie do utrzymania. Jak podnosisz ten problem?
s_t_e_v_e

Tak. Jeśli wiesz, że fragment kodu się nie powiedzie, to jest to błąd, nawet jeśli jeszcze się nie powiódł i powinien być śledzony jako jeden. Kolejną zaletą psychologiczną jest to, że liczba błędów w projekcie rośnie, gdy wprowadzasz niechlujne poprawki.
Robert Rossney,

13

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ę.


1
„Jeśli jest wolny od błędów i spełnia wymagania, to gotowe. Wyślij go. Dalej”. Nie zgadzam się. Obecnie pracuję z bazą kodu, która jest tak zawikłana, że ​​każda prosta zmiana zajmuje raczej dni niż godziny. Nie ma "błędów", ale jego słaba konstrukcja narzuca stały koszt.
Kristopher Johnson

Cóż, nie chcesz po prostu włamać się do wszystkiego , wtedy skończysz z bałaganem. To wszystko jest opłacalne: jeśli spowalnia cię tak bardzo, to musi zostać ponownie zakodowane, jeśli czas, który zaoszczędzi przez cały okres użytkowania aplikacji, przeważy długie poprawki bez przeprojektowania.
Eric Z Beard

Myślę, że twój komentarz jest słuszny, Eric. Może mógłbyś zmienić swoją odpowiedź, aby ją odzwierciedlić?
Tommy Herbert

7

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.


Istnieje kilka rzadkich przypadków, w których włamanie jest słuszne - generalnie gdy wykres Gantta mówi, że gdy robisz to poprawnie, 23 inne osoby będą siedzieć w pobliżu i nic nie robić. Dyskusja dotyczy również zarówno prototypów, jak i włamań do IMO.
Steve Jessop,

Nie ma czegoś takiego jak prototyp. Prototyp to inna nazwa kodu produkcyjnego.
Greg D,

Zwróć uwagę w szczególności, że chociaż wykonanie hakowania zajmuje w sumie więcej czasu, a następnie zrób to dobrze, może to skrócić czas projektu. Wszyscy inni mogą przynajmniej zacząć testować swój kod pod kątem twojego hacka, który może na przykład być funkcjonalnie kompletny, ale z niedopuszczalną wydajnością.
Steve Jessop,

@Greg D: Prototyp jest produkt, ale nie jest to produkt. Chyba że, oczywiście, nie masz środków, aby zapobiec temu, czemu pytający chce zapobiec, dlatego IMO problemy są podobne.
Steve Jessop

Nie rób prototypu, zrób skok. Spike to pionowy fragment kodu produkcyjnego, który implementuje funkcję i nigdy nie powinien zająć więcej czasu niż kod prototypowy - szybsze hakowanie jest całkowitą iluzją, nawet na krótką metę.
Bill K

7

Nagle odkrywasz, że spędziłeś pięć lat, używając mniej niż idealnego rozwiązania, przeklinając je na chwilę.

Jeśli go przeklinasz, dlaczego znajduje się na dole listy TODO?

  • Jeśli to na ciebie nie wpływa, dlaczego to przeklinasz?
  • Jeśli ma to na Ciebie wpływ, to jest to problem, który należy rozwiązać TERAZ.

Często potrzeby firmy nie są dostosowane do Twojego bólu. IT służy biznesowi. Jeśli to, co robimy, nie służy realizacji ich celów, ryzykujemy niebezpieczną utratę łączności. Od czasu do czasu mamy okazję robić projekty tylko IT, ale nawet wtedy ...

1
Zgoda, kierownictwo nie dba o to, czy ma to na nas wpływ, o ile ich model biznesowy nadal funkcjonuje. Musisz wymyślić biznesowy uzasadnienie, dlaczego należy to naprawić TERAZ, inaczej twoje bolesne zawodzenie dotrze do głuchych uszu.
Adam Bellaire,

Jeśli potrzeby biznesowe nie są dopasowane do twojego bólu, to „nie powinieneś” zastępować hacka odpowiednią wersją, a to pytanie sprowadza się do „jak mogę podważyć cele mojego pracodawcy, aby służyć moim własnym?”. Odpowiedź: utwórz związek.
Steve Jessop

5
  • Upewniam się, że mówię głośno o priorytecie poprawki długoterminowej, SZCZEGÓLNIE po wprowadzeniu poprawki krótkoterminowej.
  • Wyszczególniam powody, dla których jest to hack, a nie dobre długoterminowe rozwiązanie, i używam ich, aby przekonać interesariuszy (menedżerów, klientów itp.), Aby zrozumieć, dlaczego należy to naprawić
  • W zależności od przypadku, mogę nawet wstrzyknąć trochę strachu przed najgorszym scenariuszem. "Jeśli ta bezpiecznie pęknie, cały most może się zawalić!"
  • Biorę odpowiedzialność za wymyślenie długoterminowego rozwiązania i upewnienie się, że zostanie ono wdrożone

4

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.


Co w twoim doświadczeniu programistycznym prowadzi cię do przekonania, że ​​źle zaprogramowane rozwiązanie będzie szybsze we wdrożeniu, przetestowaniu i wydaniu niż dobrze zaprogramowane rozwiązanie? Poważnie. Widziałem ludzi, którzy to mówili, zwykle kiedy nie wiedzą, jak to zrobić dobrze.
Bill K

@ Bill K: Słabo zaprogramowany nigdy nie był w moim oświadczeniu. Być może mniej pożądane rozwiązanie. Chodzi o dług, ty nie zaciągasz długów, ja biorę małe długi, które mogę szybko spłacić. Zawsze mogę później refaktoryzować, klienta to nie obchodzi, ale zależy mu na raporcie, którego potrzebuje na tablicę w ciągu godziny.
MagicKat

@Bill K: więc w tym przypadku upewnij się, że baza kodu nie jest SUCHA, ale jesteś bohaterem dla klienta. Następnie, gdy już trafisz do klienta, możesz łatwo zmienić kod. Co ważniejsze w DŁUGOTRWAŁEJ bazie kodu bez SUCHEGO przez godzinę, ale zadowolony klient lub SUCHA baza kodu i niezadowolony klient.
MagicKat,

4

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.


4

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ę.


„Dlaczego myślisz, że w magiczny sposób będziesz mieć więcej czasu 'później' na naprawienie włamania?” Teraz wiem, jak odpowiedzieć: firma może podjąć decyzję o umorzeniu długu technicznego, gdy koszt jego obsługi przewyższa koszt jego naprawienia. Zobacz artykuł, z którym łączył się Mike Stone.
Tommy Herbert

2

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.


2

Poinformuj wszystkich, którzy są odpowiedzialni za podejmowanie ostatecznej decyzji, dlaczego niecodzienny sposób robienia rzeczy jest zły na dłuższą metę.

  • Opisz problem w kategoriach, do których mogą się one odnosić.
  • Uwzględnij wykres krzywych kosztów, produktywności i przychodów.
  • Naucz ich o długu technicznym .
  • Regularnie refaktoryzuj, jeśli jesteś popychany do przodu.
  • Nigdy nie nazywaj tego „refaktoryzacją” lub „powrotem i sprzątaniem” w obecności nietechnicznych ludzi. Zamiast tego nazwij to „przystosowaniem” systemu do obsługi „nowych funkcji”.

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.


2

Używamy Java i Hudson do ciągłej integracji. „Rozwiązania tymczasowe” należy skomentować:

// TODO: Better solution required.

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.


1

Ś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 :(


1

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.


1
  • 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.


1

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.


1

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.


1

Niektóre rozwiązania, które widziałem w przeszłości:

  • Oznacz to komentarzem HACKw kodzie (lub podobnym schemacie, np. XXX)
  • Miej uruchamianie automatycznego raportu i wysyłanie go e-mailem co tydzień do tych, którym zależy, zliczając, ile razy HACK pojawiają się komentarze
  • Dodaj nowy wpis do swojego systemu śledzenia błędów z numerem linii i opisem odpowiedniego rozwiązania (aby wiedza uzyskana z badań przed napisaniem hacka nie została utracona)
  • napisz przypadek testowy, który pokaże, jak hack się nie powiedzie (jeśli to możliwe) i sprawdź go w odpowiednim zestawie testowym (tj. tak, aby wyrzucał błędy, które ktoś w końcu będzie chciał wyczyścić)
  • Po zainstalowaniu hacka i wyłączeniu ciśnienia natychmiast zacznij od właściwego rozwiązania

To 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.


1

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.


1

Postaraj się, aby ludzie w biznesie zrozumieli koszty włamania. Wtedy mogą podjąć świadomą decyzję tak czy inaczej.


1

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.


0

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).


0

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).


0

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:

  1. Rozwój oparty na testach

  2. Małe jednostki refaktoryzacji

  3. Ciągła integracja
  4. Dobre zarządzanie konfiguracją
  5. Zwinne techniki baz danych / refaktoryzacja baz danych

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.