Jak mogę refaktoryzować bazę kodu, a inni szybko się do niej zobowiązują?

18

Jestem przy prywatnym projekcie, który ostatecznie stanie się open source. Mamy kilku członków zespołu, wystarczająco utalentowanych z technologiami do tworzenia aplikacji, ale nie dedykowanych programistów, którzy potrafią pisać czysty / piękny i co najważniejsze długoterminowy kod, który można utrzymać.

Postanowiłem przebudować bazę kodu, ale jest to trochę niewygodne, ponieważ ktoś w zespole w innym kraju, z którym nie mam regularnych kontaktów, może aktualizować tę całkowicie oddzielną rzecz.

Wiem, że jednym z rozwiązań jest szybka komunikacja lub przyjęcie lepszych praktyk PM, ale nie jesteśmy jeszcze tacy wielcy. Chcę tylko wyczyścić kod i połączyć się ładnie z tym, co zaktualizował. Czy korzystanie z oddziału byłoby odpowiednim planem? Połączenie najlepszych starań? Coś innego?

Incognito
źródło

Odpowiedzi:

35

Ludzie często nie biorą pod uwagę faktu, że czysta architektura nie tylko przyspiesza długoterminową konserwację, ale także przyspiesza rozwój teraz . Nie próbuj izolować swoich zmian przed kolegami, dopóki nie zostaną „wykonane”. Twoje zmiany pomogą im być bardziej produktywnymi i mniej podatnymi na błędy.

Najczęstszym błędem popełnianym przez ludzi przy podejmowaniu dużych działań jest to, że nie łączą się wystarczająco często, zamiast tego próbują to zrobić jednym „wielkim wybuchem”. Właściwy sposób to zrobić jak najmniejszym możliwym refaktorem, przetestować go, a następnie scalić z oddziałem kolegi i nauczyć go o zmianie, aby mógł wprowadzić ją w przyszłości. Najlepiej, jeśli wykonujesz jedno scalenie dziennie lub przynajmniej raz w tygodniu.

Karl Bielefeldt
źródło
17
Tak tak tak. Oprzyj się pokusie pójścia na miesięczną wycieczkę solową, by przekonać się, że baza kodów, którą chcesz przerobić, zmieniła się całkowicie i musisz zacząć wszystko od nowa. Lepiej zrób to krok po kroku.
tdammers
Dokładnie tak! Wielkie refaktoryzacje nigdzie nie idą (patrz Netscape 6 lub Project Pyramid )
Andomar,
8

Nigdy nie jesteś „wystarczająco duży, aby się komunikować”. Jeśli potrafisz pisać na klawiaturze, twoje usta też mogą mówić. Na koniec dnia poprawa technologii to 85% komunikacji i 15% techniczne. To, że wolisz siedzieć i pisać kod, zamiast mieć z kimś trudną rozmowę ... nie oznacza, że ​​to dobry pomysł. Komunikacja jest w rzeczywistości trudnym elementem tego, czego próbujesz, ale nie tylko tego unikaj.

Michael Durrant
źródło
To nie jest tak naprawdę trudność w komunikacji, ale to, że nie chcę, aby obecny programista zwolnił. Właściwie nie jestem nawet pewien, czy musi nauczyć się właściwej drogi, o ile można ją zrefaktoryzować. Najpierw nie jest programistą, jest naukowcem z innej dziedziny.
Incognito,
+1. Nie możesz udostępnić komuś kodu bez komunikacji
MarkJ
4

Tak, oddział jest na to dobrym rozwiązaniem.

Sugeruję, abyś zaczął pracować nad tym w gałęzi i upewnić się, że HEADw międzyczasie ma on czystą kontrolę nad bieżącym (tj. Wykonuj zmiany w testach i łączą się w regularnych odstępach czasu, aby upewnić się, że możesz łatwo zastosować zmiany, a testy nadal przebiegają pomyślnie - - szukajgit rerere też pomocy gitw tym zakresie). Następnie, gdy skończysz, dokonaj zmiany bazy i scal zmiany w swoimHEAD .

Im szybciej zaczniesz nad tym pracować, tym lepiej, ponieważ zmiana architektury staje się coraz większa, tym zimniejszy jest kod. Ponadto może istnieć wiele przykładów kodu zakodowanego ręcznie w całej bazie kodu, gdzie np. Nowa funkcja pomocnika shinera może uprościć sprawę.

Benjamin Bannier
źródło
1
-1: Nie. Zobacz odpowiedź @Karl Bielefeldt.
Jim G.
Tak? Nie zgadzam się z Karlem, dlatego postanowiłem zacząć szybko.
Benjamin Bannier
I mówię: „Nie rozgałęziaj, a następnie ponownie łącz”. W najlepszym wypadku to zmarnowany wysiłek. W najgorszym wypadku zrobisz wielki bałagan.
Jim G.
3

Czy rozważałeś opcję „Nie rób tego jeszcze”?

Podczas gdy wykonywanie tej pracy w osobnej gałęzi jest prawdopodobnie najlepszym podejściem, przygotowujesz się na masywne bolesne scalenie wzdłuż linii.

Inni faceci prawdopodobnie dodają wiele nowych funkcji, zmieniając istniejącą i ewentualnie usuwając niektóre.

Gdy główny nurt deweloperów zwolni nieco w pewnym momencie w przyszłości, możesz być w znacznie łatwiejszej pozycji do refaktoryzacji.

ozz
źródło
+1. Jeśli twoja baza kodu jest w ciągłym przepływie, prawdopodobnie nie jest to najlepszy czas, aby spróbować dużego przepisywania. Wybierz czas w swoim cyklu rozwoju, kiedy wszystko będzie spokojniejsze.
anon
2

tl; dr - Wygląda na to, że czas wkroczyć do wielkich lig. Nałożenie pomadki na świnię nie sprawia, że ​​jest ładniejsza, chyba że lubisz takie rzeczy ...

Problem ludzi

Pierwszym problemem jest synchronizacja zatwierdzeń. JEŚLI masz wiele osób pracujących nad tym samym kodem w tym samym czasie, potrzebujesz tylko jednej reguły, aby zapobiec problemom:

Rule 1: Always pull before you merge/rebase

Jeśli chodzi o DVCS, trudno jest wprowadzić zmiany w zdalnej gałęzi (tj. Głównym repozytorium) i bardzo łatwo wprowadzić zmiany w lokalnym. Każda osoba jest odpowiedzialna za dopasowanie własnych dodatków kodu do większej całości bez problemów. Jeśli 2 osoby nie zaangażują się dokładnie w tym samym czasie, nie powinieneś tego doświadczać. Zatwierdź dostęp do źródła / zdalnego wzorca powinien być ograniczony tylko do kilku programistów i powinni pobierać zmiany od innych programistów za pośrednictwem zdalnych gałęzi śledzenia.

Problem z kodem

Skąd wiesz, że wprowadzone zmiany nie powodują uszkodzenia kodu?

Prosta odpowiedź ... Napisz testy, aby udowodnić, że nie. Jeśli zignorujesz szkołę myślenia TDD (Test Driven Design), cały sens testów polega na dodaniu poziomu weryfikacji, który umożliwia zmianę kodu bez jego łamania.

Rule 2: Don't make assumptions, write proofs (ie tests).

Ponadto, zanim przejdziesz do źródła / zdalnego wzorca, należy uruchomić pełną gamę testów.

Zachowaj swoje zobowiązania tak małe i zwięzłe, jak to możliwe. W ten sposób, jeśli będziesz musiał wycofać się z zmiany, która później coś popsuła, zaoszczędzisz od konieczności ponownego wdrażania części, które nie złamały kodu.

Najpierw może być konieczna restrukturyzacja organizacji

Jeśli powyższe rozwiązania nie mogą być łatwo zastosowane, prawdopodobnie istnieją pewne problemy ze strukturą programistyczną, które należy rozwiązać w pierwszej kolejności.

Właścicielem projektu powinien być strażnik. Jeśli występują problemy z synchronizacją zatwierdzeń, prawdopodobnie zbyt wiele osób ma dostęp do zatwierdzania. Nawet w przypadku dużych projektów, takich jak jądro Linuksa, tylko garstka programistów ma dostęp do źródłowego / zdalnego głównego repozytorium. W rzeczywistości istnieje wiele poziomów repozytoriów do zarządzania zatwierdzeniami. Zamiast modelu zatwierdzania jednowarstwowego, w którym wszyscy wypychają swoje zmiany do źródła, model hierarchiczny ma strażników, którzy dokonują zmian i sprawdzają ich jakość przed włączeniem do projektu. Hierarchiczny model zatwierdzania może skalować się o wiele większy i bardziej efektywny niż model jednowarstwowy bez utraty jakości.

Dla deweloperów, którzy nie mają dostępu do zatwierdzania, powinni nauczyć się tworzyć własne gałęzie zdalnego śledzenia (git i gitorious są do tego dobre), więc deweloperzy, którzy to robią nie popełnić dostępu można łatwo wyciągnąć / zintegrować gałęzie do pochodzenia. Jeśli zmiany są niewielkie, łatki będą działać równie dobrze.

Zdolność do wyciągania zmian przed scaleniem / rebasesem zakłada, że ​​nie rozwijasz się w lokalnym oddziale głównym. Najłatwiejszym sposobem jest poradzenie sobie z tym, zanim zaczniesz kodować, a następnie wykonasz całą pracę w tej gałęzi. Trudno jest rozgałęzić go tuż przed scaleniem i wycofać master.

Zdefiniuj styl kodowania dla całego projektu i spraw, aby deweloperzy podążali za nim. Współpracujący deweloperzy powinni pisać kod, który jest zgodny ze standardami / normami projektu, aby zminimalizować czyszczenie. Styl kodowania może stanowić dużą barierę ego w otwartym projekcie. Jeśli nie zostanie ustawiony żaden standard, wszyscy będą kodować w swoim preferowanym stylu, a baza kodów stanie się bardzo brzydka bardzo szybko.

Mit „Miesiąca mitycznego człowieka”

Wierzcie lub nie, większe / bardziej udane projekty open source nie są prowadzone jak demokracja. Są prowadzone jako hierarchia. Stwierdzenie, że projekt nie może skutecznie przekroczyć 8-10 programistów, jest naiwne. Gdyby tak było, to nie istniałyby tak wielkie projekty jak jądro Linuksa. Głębszą kwestią jest to, że udzielenie każdemu dostępu tylko utrudnia efektywną komunikację.

Problem mitycznego miesiąca człowieka można rzeczywiście rozwiązać. Musisz tylko uruchomić swój projekt jak wojsko. W hierarchii istnieje wiele poziomów, ponieważ powszechnie wiadomo, że poszczególne osoby są tak naprawdę skuteczne tylko w zarządzaniu komunikacją z garstką ludzi. Dopóki żadna osoba nie jest odpowiedzialna za zarządzanie pracą więcej niż 5-7 osób, system może skalować się w nieskończoność.

Może ograniczyć najlepszych / doświadczonych programistów do większej integracji i projektowania / planowania wyższego poziomu, ale to nie jest złe. Częścią zwiększenia skali jest podjęcie decyzji, że projekt potrzebuje długoterminowego planu. Osoby na najwyższych poziomach, które mają największe inwestycje (czas jest również zasobem) w przyszłe projekty, powinny być odpowiedzialne za podejmowanie wielkich decyzji.

Miło jest słyszeć o projekcie open source przechodzącym bóle. Gratulacje i powodzenia.

Evan Plaice
źródło
-1

czysty / piękny i co najważniejsze długoterminowy kod, który można utrzymać.

Z mojego doświadczenia wynika, że ​​czysty / piękny jest wrogiem utrzymania. Piękny kod często:

  • Ma warstwę na ramie, która wprowadza wyższy poziom abstrakcji
  • Optymalizuje ponowne użycie kodu, co powoduje wiele zależności
  • Próbuje rozwiązać ogólny problem zamiast konkretnego

Z drugiej strony, możliwy do utrzymania kod:

  • Jest napisany bezpośrednio na frameworku, więc wszyscy programiści mogą go przeczytać
  • Optymalizuje pod kątem małej liczby zależności, więc zmiana w jednym obszarze nie wpływa na inny
  • Nie próbuje rozwiązać więcej problemów niż musi
Andomar
źródło
Twój piękny opis kodu może również iść w parze z kodem, który można utrzymać, ponieważ kiedy wprowadzasz wyższy poziom abstrakcji i optymalizujesz kod do ponownego użycia, jest to i tak łatwiejsze do utrzymania.
Karthik Sreenivasan
Tyle że abstrakcja nie przetrwa próby czasu. A każdy problem z abstrakcją przenosi lokalną poprawkę na poprawkę, która potencjalnie ma wpływ na całą aplikację.
Andomar