Czy lepiej jest używać wcześniejszych złych praktyk lub dobrych praktyk, które nie pasują do starego kodu?

25

Myślałem o tym, ponieważ próbowałem napisać rozszerzenie dla istniejącego oprogramowania innej firmy, a ich baza danych jest strasznie denormalizowana. Musiałem użyć ich istniejących tabel i dodać kilka nowych pól.

Miałem opcję albo utworzyć nowe tabele w ich stylu projektowania (który składa się z prawie wszystkich właściwości znajdujących się w jednym dużym stole), albo utworzyć nowy zestaw tabel razem i użyć czegoś dodatkowego, takiego jak wyzwalacze, aby zsynchronizować dane między nowym a stare stoły.

Skończyło się na pierwszej opcji użycia istniejącego złego stylu projektowania, ale pozostało mi pytanie: czy lepiej jest postępować zgodnie z wcześniejszymi złymi praktykami, czy wdrażać dobre praktyki, które nie działają dobrze z istniejącym kodem? Czy są jakieś sytuacje, w których powinienem wybrać jeden nad drugim?

UWAGA: Jak dotąd wiele odpowiedzi dotyczy powolnego refaktoryzacji złego kodu, jednak nie jestem w stanie tego zrobić. Kod nie jest nasz i jest często aktualizowany przez dostawcę. Mogę tylko na tym zbudować.

Rachel
źródło
Dzięki Peter, nie widziałem tego pytania. Jest bardzo podobny do tego, o co pytam, z tym wyjątkiem, że wydaje się, że odpowiedzi odnoszą się do refaktoryzacji istniejącego kodu, a nie do dodawania do istniejącego złego kodu. Nie mogę dokonać refaktoryzacji istniejącego kodu, mogę tylko na nim budować.
Rachel
Zależy od tego, jak długo chcesz zostać u obecnego pracodawcy;)
Job

Odpowiedzi:

21

Powinieneś wybrać lepszy projekt, jeśli:

  1. Będziesz przejmował dużą część przyszłego kodowania

  2. W dłuższej perspektywie lepszy projekt nie jest droższy dla klienta. Na przykład byłem świadkiem wielomiesięcznych „refaktoryzacji” projektów, które zostały przerwane do końca roku.

Wybierz „ten sam zły styl”, jeśli:

  1. Po prostu pomagasz. Nierealistyczne jest myślenie, że możesz wziąć istniejącą grupę i spełnić wyższe standardy projektowe, jeśli tylko wypełniasz projekt w niepełnym wymiarze godzin. Lepsze projektowanie jest subiektywne i prawie zawsze ma krzywą uczenia się. Jeśli reszta zespołu nie nauczy się tego nowego projektu, projekt skończy się miszmaszem stylów, a twój lepiej zaprojektowany kod może skończyć w stosie rzeczy, których nikt nie zmienia, ponieważ nie mogą zrozumieć to. W powyższym przykładzie, co się stanie, jeśli będą aktualizacje oprogramowania zewnętrznego?

  2. Poświęcenie „lepszego” projektu przyniesie wymierną korzyść biznesową. Podobnie jak złe dodanie funkcji X spowoduje zawarcie dużego kontraktu, ale niedotrzymanie terminu powoduje, że nie masz nic. W tym momencie dochodzi do historycznego konfliktu między mgmt a zespołem technicznym. Podobnie jak w przypadku remontu domu, ktoś musi zdecydować, kiedy zapłacić. Możesz spłacić dług początkowo, żyjąc bez prądu i kanalizacji przez rok. Możesz też zapłacić 3x tyle, ile zyskasz dzięki tym narzędziom.

Steve Jackson
źródło
Świetne przykłady, kiedy iść z dobrego projektu na złej konstrukcji i odwrotnie, dzięki :)
Rachel
11

Na dłuższą metę lepiej stosować dobre praktyki. Zaoszczędzi to czas i wysiłek, ponieważ wdrożenie zmian zajmie mniej czasu.

Jeśli to możliwe, podejmij małe kroki, aby przejść do dobrej praktyki (na przykład: w SQL byłoby to rozkładanie tabel denoramatyzowanych na znormalizowane i używanie widoków ze starymi nazwami tabel).

Zauważysz, że powiedziałem na dłuższą metę - tutaj również obowiązuje trójkąt „jakość, czas, pieniądze” (tj. - wybierz dwa). Jeśli nie masz czasu, być może będziesz musiał przejść na stare praktyki, ale będzie to oznaczało, że dodajesz problem i że twój projekt również musi zostać naprawiony.

Jeśli nadal będziesz pracować i dodawać kod złego projektu, nigdy nie skończysz z bazą kodu, która używa dobrego projektu. W miarę możliwości postaraj się użyć dobrego projektu i przebuduj go na dobry projekt.

Oded
źródło
Nigdy nie myślałem o tym rozwiązaniu dla danych SQL. Niestety nie mogę edytować bazy kodu, ponieważ wciąż publikują regularne aktualizacje. Wszystko, co dodam, musi być całkowicie oddzielne.
Rachel
1
@Rachel - Jeśli kontrolujesz nowe tabele, użyj dla nich dobrego projektu (zakładam, że aktualizacje starego projektu nie wpłyną na nowe tabele). Kiedy musisz zmienić kod, koszty utrzymania będą niższe.
Oded
Aktualizacje częstotliwości oprogramowania obejmują aktualizacje bazy danych i nowe pola, więc usuwanie istniejących tabel i przepisywanie ich jako widoków nie jest dla mnie opłacalną opcją. Użytkownicy nadal korzystają z istniejącej części oprogramowania, która korzysta z tych tabel, potrzebują tylko rozszerzenia. Gdyby to był nasz kod zamiast zewnętrznego dostawcy, zaimplementowałbym to w mgnieniu oka :) Ogólnie dobry punkt widzenia na moje pierwotne pytanie.
Rachel
1

Cóż, myślę, że bardzo zależy to od każdego przypadku. Jeśli pozwala na to wydajność i konstrukcja, lepiej stosować dobre praktyki. Ale jeśli na przykład ta tabela jest tabelą o wysokim dostępie, utworzenie wyzwalacza dla sincronization może mieć negatywny wpływ na wydajność.

Teraz twój klient nie zobaczy, że użyłeś lepszego projektu, po prostu zobaczy, że twoje rozwiązanie spowolniło jego system. Tego rodzaju decyzje powinny być podejmowane indywidualnie dla każdego przypadku, a do tego należy wykorzystać swoje doświadczenie i kryteria.

Myślę, że prawdopodobnie dokonałeś właściwego wyboru.

AJC
źródło
1

W miarę możliwości należy odizolować kod aplikacji od złego projektu danych.

Czy aktualizujesz ich tabele? Jeśli nie, utwórz widoki SQL, aby przedstawić te tabele w sposób wygodny dla Twojej aplikacji. Widoki SQL są stosunkowo łatwe do napisania i znacznie łatwiejsze do przetestowania niż kod aplikacji.

Jeśli musisz zaktualizować starsze tabele, rozważ zapisanie procedur przechowywanych w celu zarządzania aktualizacjami. Pisanie jest nieco bardziej skomplikowane, ale można je natychmiast przetestować.

Kevin Cline
źródło
1

Aby zsynchronizować stary kod podczas normalizacji bazy danych z wyzwalaczami, to dobre rozwiązanie, jeśli jest tymczasowe. Celem powinna być zmiana starego kodu, ale w kontaktach z firmą zewnętrzną może się to nie udać. Musisz być na bieżąco z ich zmianami schematu.

Coraz więcej funkcji na złym kodzie spowoduje ciągłe problemy. Obejścia stają się normą. Użytkownicy będą sfrustrowani, ponieważ zmiany potrwają zbyt długo i prawdopodobnie wprowadzą inne błędy lub ograniczenia. Kto chce być programistą i powiedzieć, że nie możemy tego zrobić zamiast tego, że nie powinniśmy tego robić?

Część kodu można zostawić w spokoju; nie zawsze mamy ten luksus.

JeffO
źródło
-1

Masz do czynienia z długiem technicznym tutaj. Krótko mówiąc, dług techniczny oznacza odsetki, które trzeba spłacić w miarę upływu czasu, a w pewnym momencie trzeba je spłacić.

Czas Develloper kosztuje, więc dług techniczny można postrzegać tak jak prawdziwy dług i kosztują prawdziwe pieniądze.

Masz w zasadzie dwa główne rozwiązania i wiele rozwiązań pośrednich. Możesz zdecydować, że nie chcesz teraz spłacać tego długu i nadal spłacać odsetki. Oczywiście na dłuższą metę będzie to kosztować więcej, ale teraz możesz mieć wynik. Możesz również spłacić ten dług, więc nie będziesz już iść do przodu, dopóki go nie zwrócisz, ale ostatecznie nie będziesz mieć odsetek.

Zwykle masz terminy dostawy, a niedotrzymanie terminu spowoduje brak zaufania do klienta, a ostatecznie go stracisz. Może to być uzasadniony powód do zaciągania długu technicznego: uważasz, że to, co zyskujesz z klientem, warte jest dodatkowych kosztów długu technicznego.

Wiesz, że na koniec musisz przyjąć nową metodologię, w przeciwnym razie będziesz mieć coraz więcej długów i ostatecznie zbankrutujesz (teraz, kiedy ludzie decydują się na rozpoczęcie od nowa lub gdy projekt źle się kończy).

Musisz zaplanować, w jaki sposób zmienisz istniejącą bazę kodu i przejdziesz do nowej praktyki w miarę upływu czasu, i rozprowadzaj zmiany krok po kroku codziennie. W pewnym momencie, gdy refaktoryzacja doprowadzi do innych strat, zastanów się, która strata jest gorsza i wybierz najlepszą.

Koszt braku refaktoryzacji wzrośnie z czasem (są to interesy długu technicznego). To ostatecznie stanie się najdroższym wyborem.

Upewnij się, że twój szef rozumie pojęcie długu technicznego. Nawet ostrożnie stworzysz dług techniczny. W pewnym momencie pieniądze, które zostaną wykorzystane do ich zwrotu. Kiedy celowo tworzysz dług techniczny, MUSISZ mieć uzasadniony powód i postrzegać go jako inwestycję (tak jak prawdziwy dług). W pozostałych przypadkach po prostu NIE NALEŻY celowo zadłużać się technicznie.

Możesz być zainteresowany metodologiami ewolucji DB i wdrażania tych ewolucji: http://richarddingwall.name/2011/02/09/the-road-to-automated-database-deployment

Nawiasem mówiąc, to trudne zadanie, więc powodzenia. Warto !

deadalnix
źródło
-1

Jest to typowy problem: „Czy muszę czerpać korzyści z mojej pracy teraz czy później?” i nie sądzę, aby kiedykolwiek istniało ogólne rozwiązanie tej odpowiedzi. Tylko Ty znasz wszystkie czynniki (techniczne i ludzkie) związane z taką decyzją.

Jednak twój problem rodzi interesujące pytanie:

Czy automatyczne refaktoryzowanie kodu robi wystarczające postępy, aby jednolitość kodu była bardziej ceniona?

Ostatecznie zły projekt powinien się zmienić lub umrzeć. Albo nie jest to zły projekt. Prawdziwe pytanie dotyczy kosztów refaktoryzacji. Z twojego pytania wynika, że ​​ty (lub twój pracodawca) nie jesteś skłonny zapłacić teraz ceny, a przy obecnym stanie technologii prawdopodobnie nigdy nie będzie chciał.

Jednak automatyzacja refaktoryzacji kodu robi pewne postępy. Jeśli kompilatory mogą dzisiaj zoptymalizować pliki binarne, kto powiedziałby, że nie zoptymalizowałby kodu jutro? W pewnym momencie pojawi się narzędzie, które pozwoli programistom i projektantom bardzo łatwo przefakturować kod, aby dostosować się do nowszych wymagań. W końcu radzenie sobie ze starszym kodem jest jednym z największych współczesnych wyzwań.

Jeśli takie narzędzie kiedykolwiek istnieje (nie byłbym zaskoczony, że już istnieje), dobrze byłoby wziąć to pod uwagę, podejmując taką decyzję.

rahmu
źródło
-2

Dobre praktyki zawsze przebijają biedne. Jeśli twoja baza kodu jest zaśmiecona kodem w niewłaściwy sposób, nie powinieneś po prostu kultywować własnych rzeczy w ten sam sposób, powinieneś pisać kod poprawnie, a następnie próbować edukować wszystkich innych we właściwy sposób.

Wayne Molina
źródło
Jako programista powinieneś znać niebezpieczeństwo bezwzględnych stwierdzeń.
whatsisname
Wiem też, że istnieje niebezpieczeństwo, że poradzimy sobie ze złymi praktykami i niepoprawnie piszemy kod, a IMO to najgorsze ze wszystkich.
Wayne Molina,