Jak cofnąć się o krok i spojrzeć na kod świeżymi oczami? [Zamknięte]


53

Spędziłem ostatni rok jako jednoosobowy zespół, opracowując aplikację dla bogatych klientów (ponad 35 000 LoC, za co jest warta). Obecnie jest stabilny i produkowany. Wiem jednak, że moje umiejętności były zardzewiałe na początku projektu, więc bez wątpienia w kodzie występują poważne problemy. W tym momencie większość problemów dotyczy architektury, struktury i interakcji - łatwe problemy, nawet problemy związane z architekturą / projektowaniem, zostały już wyeliminowane.

Niestety spędziłem tyle czasu z tym projektem, że trudno mi myśleć poza nim - podchodząc do niego z nowej perspektywy, aby zobaczyć wady głęboko ukryte lub nieodłączne w projekcie.

Jak wyjść poza głowę i poza kod, aby uzyskać świeży wygląd i poprawić go?


15
W przyszłości nie należy krzyżować . Jeśli popełniłeś błąd, publikując na niewłaściwej stronie StackExchange, oflaguj migrację i wyjaśnij, gdzie Twoim zdaniem należy, a moderator przeprowadzi migrację pytania za Ciebie.
wałek klonowy

Ok zrobi sie! :) Kilka osób zgłosiło się do zamknięcia, a nie do przeniesienia, więc usunąłem całe pytanie i przyniosłem je tutaj.
BenCole,

Tak! - ludzie kliknęli przycisk „zamknij”, a nie przycisk „flaga” (przynajmniej myślę, że tak się stało). Od tej pory sami go oznaczę i poczekam na migrację.
BenCole,


IMO, jeśli nie możesz znaleźć sposobów na ulepszenie, to nie wiesz wystarczająco dużo. W przeszłości tworzyłem naprawdę niesamowite projekty, ale kiedy wrócę do nich później, zawsze zastanawiam się, dlaczego zrobiłbym coś tak głupio. W każdym razie możesz przyjąć podejście, że twój projekt jest w porządku. Gdy dodasz funkcje, jeśli było to trudne, zastanów się, jak możesz to ułatwić.
Dunk

Odpowiedzi:


46

Sposoby podejścia do tego:

  • Znajdź osobę zaznajomioną z technologią i problemem biznesowym i omów ją. Może to być trudne w drużynie jednoosobowej, ale ogólnie jest najlepszą opcją.
  • Przez chwilę pracuj nad innym projektem. To również może być trudne, ale nawet zrobienie tygodniowej przerwy może dać ci świeże spojrzenie.
  • Spójrz na podobne projekty lub produkty, takie jak produkty open source, jeśli takie istnieją. Uważaj, aby nie skopiować kodu, ale mogli podchodzić do pomysłu zupełnie inaczej.
  • Naucz się nowego języka, biblioteki lub frameworka. Zastosowane techniki mogą dać ci wgląd w to, jak podejść do tych samych problemów, które masz inaczej.
  • Przeczytaj dobrą książkę / blog / czasopismo o projektowaniu lub języku / frameworku. Nie jestem pewien, na jakim jesteś poziomie umiejętności, ale istnieje wiele alternatyw w innych odpowiedziach na tej stronie.

Jeśli masz konkretne przykłady, które chcesz rozwiązać, być może opublikuj je tutaj.


6
+1 naucz się nowego języka / frameworka. Jeśli pracujesz w języku skryptowym, naucz się języka zorientowanego obiektowo. Jeśli OO, naucz się funkcjonalnego (seplenienia). Czytanie +1 - szczególnie struktury danych, wzorce projektowe, refaktoryzacja i najlepsze praktyki. Przeczytaj książki Joela na temat oprogramowania, jeśli jeszcze tego nie zrobiłeś. Poleciłbym również grupy użytkowników i tę witrynę, aby stale udostępniać Ci nowe pomysły. Jeśli ACM prowadzi rozmowy w twojej okolicy, dołącz i weź udział!
GlenPeterson

2
Mówiąc konkretnie o językach, jeśli jeszcze się tego nie nauczyłeś, naucz się Haskell, myślałem, że wszyscy przesadzają i są fanboysami na temat tego, jak fundamentalnie zmieni to podejście do problemów programistycznych. Jako dobry naukowiec poddałem testowi moją hipotezę, tak bardzo się myliłem. Państwo będzie zbliżać bieżący projekt różnie potem, jeśli jeszcze tego nie dowiedział Haskell.
Jimmy Hoffa,

1
Idź na konferencję należy dodać tutaj, IMO. Zobacz moją szczegółową odpowiedź poniżej.
Macke

+1 za inny projekt. Spróbuj czegoś całkowicie poza zakresem tego, co robisz na co dzień. Znajdziesz kilka podobieństw, a także nowe wyzwanie architektoniczne.
Leniency,

13

Debugowanie gumowej kaczki : usiądź z fragmentem kodu, modułu lub funkcji i wyjaśnij to na głos. Jeśli zauważysz, że mówisz coś, co brzmi źle, głupio lub zwyczajnie nie tak, zapisz to jako problem do zbadania.


9

Ucz się i rozwijaj swoje umiejętności. Trudno wiedzieć, czego nie wiesz, ale kiedy to zobaczysz, uderzy cię ta chwila „aha”. Może pochodzić z nauki innego języka lub wzorca projektowego.

Zostaniesz poproszony o zmianę. Możesz znaleźć części kodu, które nie są tak elastyczne i będą wymagały wielu przeróbek. To niekoniecznie porażka, ponieważ na początku nie możesz myśleć o wszystkim.

Użytkownicy zaczną narzekać. Właśnie wtedy, gdy myślisz, że wszystko jest świetnie ...


7

Pomaga krótka pamięć. Wiadomo, że narzekam na „idiotę”, który zmienił coś tydzień temu, ale z kontroli źródła dowiedziałem się, że to ja.

Dobrym pierwszym krokiem jest zidentyfikowanie kodu, który można ulepszyć. Sprawdź w kontroli źródła pliki, które zmieniają się najczęściej. Z którym kodem jest najtrudniej pracować? Który kod powoduje najwięcej błędów? Jakie zmiany powodują falowanie w całym kodzie? Na tym etapie nie musisz wiedzieć, dlaczego kod jest kłopotliwy, tylko że jest kłopotliwy.

Po zidentyfikowaniu obszarów do pracy spróbuj dowiedzieć się, na czym polega problem. Istnieją książki, które systematycznie podchodzą do kategoryzacji problemów projektowych. Spójrz na Refaktoryzację Martina Fowlera , Standardy kodowania C ++ Herb Suttera, Czysty kod Roberta Martina itp. Mają wiele „zasad”, które pozwalają spojrzeć na Twój kod w obiektywny sposób.

Po określeniu prawdopodobnego problemu wypróbuj różne sposoby jego rozwiązania. Na przykład jeśli reguła, którą złamałeś, to „wolisz kompozycję niż dziedziczenie”, zmień ją na kompozycję i zobacz, jak się czuje.

Oczywiście pomocne może być popatrzenie na kod przez kogoś innego, ale nie zawsze jest to tak pomocne, jak mogłoby się wydawać, ponieważ jesteś znacznie bardziej zaznajomiony z rodzajami problemów powodowanych przez kod niż ktokolwiek inny, a także z przyczynami projektu . Nauka niektórych sposobów obiektywnej oceny własnego projektu przyniesie duże korzyści.


3
+10 za uczciwość komentarza „idiota”. :)
Jennifer S

2
Związane z podejściem opartym na „regułach”, uruchamianie narzędzi analizy statycznej (np. Lint dla C, JsLint dla JavaScript, Findbugs dla Java, FxCop dla .NET) może często dawać użyteczne wskazówki, a metryki kodu (np. Złożoność cykliczna, LCOM4) mogą pokazywać jakie części kodu mogą być problematyczne. Oczywiście zawsze powinieneś używać mózgu i korzystać z porad takich narzędzi z odrobiną soli.
Daniel Pryden,

4

Poproś inną osobę o sprawdzenie Twojego kodu. Jeśli nie możesz znaleźć innej osoby, która mogłaby na to spojrzeć, napisz pełny opis interakcji, tak jakbyś miał zamiar pokazać ją innej osobie. Proces wyjaśniania swojej decyzji innej osobie (nawet jeśli jest to tylko ćwiczenie) może pomóc ci naprawdę przemyśleć DLACZEGO robisz pewne rzeczy w określony sposób i pomóc ci zobaczyć wszelkie dziury w logice.


3
Uważam, że wyjaśnienie rzeczy nawet nietechnicznej osobie jest pomocne. Jeśli potrafię sprawić, że nieprogramiści zrozumieją projekt i w satysfakcjonujący sposób wyjaśnią, dlaczego ktoś może potrzebować fabryki okien-fabryki-fabryki-fabryki, być może dobrze byłoby użyć fabryki okien-fabryki-fabryki.
Leif Carlsen,

4

Znam tę sytuację bardzo dobrze. Kiedy utknę w ten sposób, staram się spojrzeć na projekt z różnych punktów widzenia.

1.) Punkt widzenia użytkownika / klienta - wykorzystaj informacje zwrotne

Niestety nasz kod został złapany w taki sposób, że nie jesteśmy w stanie dostrzec własnych wad, ponieważ używamy naszych aplikacji w sposób, w jaki je zakodowaliśmy. Zobacz, jak ludzie go używają i spróbuj dowiedzieć się, jakie byłyby najbardziej intuicyjne wskazówki dla użytkownika. Baw się z prototypami interfejsu użytkownika. To wydaje się być zabawne, ale jeśli odkryjesz, że będziesz zmuszony przekodować ogromne części kodu po prostu zmieniając logikę użytkowania, to nadszedł czas, aby rozpocząć cykl przeprojektowywania.

2.) Wykonaj funkcjonalną analizę swojego kodu i wizualizuj go

Niektóre IDE i frameworki popychają cię np. Do mieszania interfejsu użytkownika i kodu zaplecza. Jeśli na to pozwolisz, pewnego dnia staniesz w obliczu sytuacji, w której twoja baza kodu będzie trudna do utrzymania z powodu mglistych i trudnych do złamania zależności. Szczególnie mieszanie kodu interfejsu użytkownika z innym kodem może prowadzić do kodu spaghetti i zbędnej funkcjonalności. Podziel swój kod na bloki funkcjonalne, takie jak np. Klasy baz danych, klasy komunikacji, klasy interfejsu użytkownika, klasy podstawowe itp. I nadaj blokom funkcyjnym wymawiające nazwy. Następnie wizualizuj funkcjonalność za pomocą narzędzia graficznego (używam narzędzia mapowania myśli), aby dowiedzieć się, czy twoja struktura jest na tyle logiczna i modułowa, że ​​możesz ponownie wykorzystać ogromne bloki kodu dla różnych projektów i możesz je zastąpić nowszymi wersjami bez duży ból.

Z mojego doświadczenia najlepiej to zrobić, tworząc dokument, który wizualizuje wszystkie zależności między twoimi klasami i ich wywołaniami z twojego kodu. Rezultatem jest wizualizacja projektu interfejsu. Jeśli ta mapa kodów wygląda jak kompletny klaster ***, to czas na działanie. Jeśli tak się nie stało, powinieneś pomyśleć o odpowiedniej konwencji nazewnictwa, która reprezentuje strukturę kodu w taki sposób, abyś nie musiał myśleć o tym, jak ją wywołać i co robi.

3.) Stosuj wspólne podejścia do zapewniania jakości

Moim ulubionym jest FMEA. Pod względem kodowania oznacza to nie tylko analizę tego, co poszło źle w przeszłości, ale także zastanowienie się, co może pójść nie tak. Dość częstym przykładem jest nagle przerwane połączenie sieciowe. Po wykonaniu tej czynności możesz sklasyfikować warunki błędu według konsekwencji, takich jak utrata danych, awaria, błędne obliczenia i ocena wpływu na użytkownika. Jeśli jeszcze tego nie zrobiono, zdefiniowanie usprawnionych klas błędów i wyjątków oraz procedur może pomóc w utrzymaniu kodu w czystości i prostocie. Najlepszym sposobem jest zaimplementowanie ich w każdym nowym kodzie kodu, zanim zaczniesz pisać cokolwiek innego. (Cóż, jestem winny nie zawsze sam stosować się do tej rady).

Ponadto pomógł mi wygenerować i często aktualizować „listę propozycji ulepszeń” dla mojego własnego kodu. (Szczerze mówiąc, w moich projektach wciąż jest dużo kodu, z którego zdecydowanie nie jestem dumny.) Staram się również poświęcić trochę czasu na zebranie i przyjrzenie się kodowi najlepszych praktyk z dokumentacji API, konferencji programistycznych lub czasopism programistycznych.

Do tego momentu nie trzeba dotykać kodu. To po prostu uświadomienie sobie, co się dzieje nie tak, i znalezienie sposobu na zdefiniowanie sposobu ulepszenia kodu.

Wreszcie kilka wskazówek dotyczących codziennej pracy ze starego pierdnięcia. Staraj się unikać gryzienia więcej niż możesz zjeść. Prowadzi to do zbyt dużej presji na czyste kodowanie. Rzadko masz czas, aby zrobić to dobrze, ale będziesz musiał poświęcić czas, aby naprawić wady.

Nic nie jest tak trwałe, jak rozwiązanie tymczasowe, ale gdy się zepsuje, często jest za późno, aby to naprawić na czas. Przykładami są paskudne ataki hakerskie lub dziwne wyjątki, w których zwykle znajdowałem coś do roboty, pomimo np. Wady w strukturze lub systemie operacyjnym. A potem błąd został naprawiony lub nowa wersja po prostu upuszcza API…

Jeśli utkniesz i zostaniesz zmuszony do znalezienia obejścia, dodaj komentarze i rób notatki, które należy od czasu do czasu sprawdzać. Zwykle stajemy się coraz lepsi dzięki uczeniu się czegoś nowego. Jeśli znajdziesz lepszy sposób, zastosuj go tak szybko, jak to możliwe. W przeciwnym razie może się okazać, że kodujesz obejście tego obejścia i wyjątek jednego dnia. (Ten, który jest między wami bez grzechu, niech rzuca we mnie pierwszym bajtem).


2

Nie przejmuj się małymi rzeczami.

Każdy może lepiej kodować. Robimy wszystko szybko, a potem zdajemy sobie sprawę, że kilka tygodni później można to zrobić bardziej efektywnie. Chodzi o to, że 90% twojego kodu jest prawdopodobnie wystarczająco dobre.

Przejrzyj dzienniki błędów i znajdź procedury, które mogą powodować problemy. Gdy znajdziesz błędy, możesz również przejrzeć kod i zastanowić się, co może poprawić jego wydajność. Przez większość czasu zdajesz sobie sprawę, że poza samym naprawieniem błędu, nie będziesz w stanie wprowadzić zauważalnej poprawy, ale czasami zdasz sobie sprawę, że istnieje lepszy sposób na zrobienie czegoś.

Porozmawiaj z użytkownikami i zobacz, gdzie zauważają problemy, UX lub problemy z prędkością. Napraw te problemy, starając się poprawić kod.

W pewnym momencie odkryjesz, że twój kod stał się zbyt kruchy i że po prostu nie ma sposobu na wprowadzenie zmian, które musisz wykonać. Zastanów się, w jaki sposób możesz uczynić system bardziej elastycznym, zarówno poprzez API, jak i programowanie oparte na testach. W wielu przypadkach odkryjesz, że możesz po prostu zacząć umieszczać te interfejsy API w kodzie, bez ogromnej ilości zmian. W innych przypadkach zdasz sobie sprawę, że wysiłek ulepszenia kodu nie jest tego wart.

Przyrostowe zmiany mogą być trudne. Celem nie jest całkowite przepisanie bazy kodu, jeśli nie musisz. Jasne, jesteś teraz lepszym programistą niż rok temu, ale to, co masz, musi teraz działać. Za 5 lat, kiedy młodszy programista skarży się na starszy kod, musi spróbować go naprawić, po prostu uśmiechnij się i przytaknij, i nie przyznawaj się, że to napisałeś.


1

Czy zastanawiałeś się nad odejściem i znalezieniem firmy, w której możesz być w zespole? Bardzo mocno czuję się odizolowany lub w stagnacji, programiści tracą wiele do zaoferowania.

Dzięki recenzjom możesz doradzić komuś, kto jest już poza twoją głową. Przegląd kodu wymiany stosu może być dobrym miejscem do wystawienia do przeglądu kodu, który nie jest szczególnie zastrzeżony dla Twojej firmy. Prawdopodobnie nie radzi sobie z dużymi blokami, ale wiele programów składa się z wielu prostych kodów i innych kodów, które nie są proste i powodują wiele problemów. Jeśli masz przykład typowego kodu, który jest powtarzany i zmieniany w wielu miejscach, może to być również dobry kandydat do recenzji. Na przykład, jeśli formatujesz wiadomości, nie proś o sprawdzenie całej przekazywanej wiadomości, tylko jedną dość złożoną przykładową wiadomość.

Jeśli chcesz być bardziej obiektywny w kwestii własnego kodu, myślę, że możesz go porównać ze standardem kodowania, uruchomić statyczne lub dynamiczne sprawdzanie kodu lub, jeśli jesteś słabo udokumentowany, dodanie komentarzy może pomóc.

Istnieje psychologia testowania, która utrudnia testowanie własnego kodu, ale z pewnością staramy się to zrobić podczas testu jednostkowego. Czytanie własnego kodu może być podobnym lub gorszym problemem. Wiele dziedzin korzysta z mentorów, sędziów konkurencyjnych, trenerów itp. Nasze działania dotyczą również architektów, inżynierów systemowych i testerów. Klienci z dostępem do narzędzia zgłaszania błędów lub działu obsługi klienta przekażą Ci informacje spoza Twojej głowy, gdy produkt zostanie wystawiony na działanie. To kolejny wielki powód, dla którego Agile stosuje wczesne i częste wydawanie. Możesz być jedynym programistą w swojej firmie, ale są osoby dotknięte twoim kodem, które mogą udzielić ci informacji zwrotnych na ten temat.


0

„Czy to mniejszy problem, niż myślę, czy jest to problem, którego doświadczają także inni?”

Do licha. Już wystarczy. Jeśli kod jest produkowany, wolny od błędów i robi to, co powinien, architektura jest nieistotna. Przynajmniej na razie.

Miejmy nadzieję, że wszyscy się uczymy w trakcie podróży. Napisałem dużo kodu, z którego byłem dumny w momencie, gdy go napisałem, ale zdecydowałem, że rok lub dwa później okropne. Obecnie pracuję nad wieloletnim projektem, który jest wypełniony niesamowicie niepewnym kodem, ale kod działa. Podchodzę bardzo ostrożnie do dotykania któregokolwiek z nich.

I ty też powinieneś. Jeśli nie widzisz teraz żadnych poważniejszych problemów architektonicznych, po roku pracy myślę, że możesz spokojnie założyć, że na razie nie ma żadnych ważnych problemów. To nie jest złe rzemiosło. Rusza się do przodu.


0

Oprócz innych odpowiedzi polecam pójść na konferencję programistów.

Narazi Cię to na wiele tematów i osób, które sprawią, że pomyślisz o własnej aplikacji i miejscu pracy. Zwłaszcza, że ​​będą rozmawiać o tym, co działa, a kiedy nie, i o nadchodzących problemach. Istnieje duże prawdopodobieństwo, że aplikacja częściowo się pokrywa.

Najlepiej poświęć na to 3 dni. Przekonałem się, że jest to wystarczająco długo, aby uzyskać niezbędny dystans mentalny do własnej pracy i spojrzeć na nią oczami większej społeczności (że tak powiem), a nie mojej.

Nawiasem mówiąc, dotyczy to również zespołów ludzi, ponieważ myślenie grupowe może się zdarzyć wszędzie.

Wreszcie, jeśli nie uzyskasz na to zgody, powiedz raz w roku, zmień pracę.


-1
  • Ćwicz wzorce projektowe i najlepsze praktyki
  • Wybierz platformę, narzędzia, pakiety itp. W oparciu o wymagania i potrzeby aplikacji - w tym celu musisz przeczytać wiele blogów etch i znaleźć rozwiązania dla każdego problemu technicznego
  • Stwórz projekt / architekturę i rozmawiaj z kimś, kto jest dobry w sprawach technicznych / architektonicznych. Popraw ten projekt za pomocą opinii i komentarzy. rób to, dopóki nie osiągniesz stabilnego stanu.
  • Zaimplementuj kod tak, aby wszystko, czego potrzebuje aplikacja, było konfigurowalne i konserwowalne

    re-architektura i reimplementacja twojego projektu z pewnością sprawi, że aplikacja będzie miała lepszą spójność, wydajność itp.


-1

Uważam, że pomaga rozwiązywanie problemów z kilkoma inteligentnymi ludźmi. Potrzebne są konkretne informacje. Czy to strona 24x7x365? Aplikacja LoB? Gdzie jest uruchomiony lub hostowany?

Po osiągnięciu głównych celów i pożądanych rezultatów inni mogą pomóc skupić i skierować uwagę. Twój kod może być najlepszym kodem, jaki kiedykolwiek napisano dla jednego określonego zadania - lub najgorszym. To naprawdę nie ma znaczenia - jak to wpływa na pożądany cel?

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.