Ukończyłem uniwersytet około pięć miesięcy temu i od czterech miesięcy pracuję w lokalnym startupie. Podczas studiów sam studiowałem Haskell, F # itp. Na uniwersytecie uczyliśmy się języka Java, ale bardzo szybko byłem narażony na programowanie funkcjonalne i spędziłem z nim znacznie więcej czasu niż na programowaniu imperatywnym. W rezultacie mój mózg jest podłączony do myślenia funkcjonalnego. Firma, do której dołączyłem, używa Pythona, a kod jest bardzo konieczny. Bardzo trudno mi czytać kod rozkazujący. Nie mogę śledzić mutacji. Kiedy zagnieżdżanie for-if-else-for -... osiąga głębokość przekraczającą cztery poziomy, całkowicie tracę kontrolę nad tym, co dzieje się w kodzie. Aby dodać do niego, Python jest językiem dynamicznym, więc w kodzie nie ma żadnych typów. To' minęły tygodnie, odkąd próbuję zrozumieć część naszej bazy kodu (która jest rzekomo „umiarkowanie złożona”), ale jak dotąd nie poczyniłem żadnych znaczących postępów w jej zrozumieniu. Proszę zaoferować mi kilka praktycznych technik, jak powinienem zrozumieć ten kod. Z góry dziękuję!
Edycja:
Może powinienem również wspomnieć, że tak naprawdę nie ma zbyt wielu komentarzy w kodzie, a nazwy też nie są zbyt intuicyjne.
źródło
Odpowiedzi:
Zrozumienie starszego kodu jest trudne. Nie ma to prawie nic wspólnego z funkcjonalnym a proceduralnym.
Utwórz mapę. Schemat komponentów pakietów i modułów Pythona. Dla każdego modułu musisz utworzyć diagramy klas.
Użyj interpretera języka Python. Powinieneś być w stanie importować moduły, tworzyć obiekty i ćwiczyć je interaktywnie. Właśnie dlatego Python jest popularny. Możesz wydrukować,
type(x)
aby zobaczyć, jaki typ jest zmienna ( x ).W razie wątpliwości należy przeczytać kod testu jednostkowego. Jeśli nie ma kodu testu jednostkowego, oprócz uczenia się nowej podstawy kodu masz duże problemy.
Zapisz rzeczy. Zacznij od dokumentów bocznych. Następnie, gdy myślisz, że wiesz, co się dzieje, dodaj komentarze do funkcji, metod i klas. Dodaj je wcześnie i często.
Użyj Sphinx z „autodoc”, aby zebrać to, czego się uczysz.
Najważniejsza jest to. Trudno jest zachować wszystko w głowie. Łatwiej jest przechowywać rzeczy w plikach dokumentacji.
źródło
Poczekaj ... ktoś całkowicie traci kontrolę nad kodem przy tak głębokich poziomach zagnieżdżania. Lub, jak ujął to Linus Torvalds:
Jeśli potrzebujesz więcej niż 3 poziomów wcięcia, i tak jesteś wkręcony i powinieneś naprawić swój program.
Nie brzmi to tak, jakby Twoja firma przestrzegała popularnych najlepszych praktyk.
Gdybym był tobą, po prostu starałbym się zrozumieć podstawy kodu według dyscypliny i siły. Po prostu zagłęb się w to raz po raz. Prawdopodobnie jak wszystko. W tej chwili masz wrażenie, że jesteś pod wodą i nie możesz oddychać, ale nadal badaj bazę kodów, a wkrótce wypłyniesz na powierzchnię.
Obawiam się, że w twoim pytaniu brakuje szczegółów technicznych, które mogłyby dać ci dobrą radę, jak zrozumieć bazę kodów, ale nigdy nie jest źle, aby przejść przez to z doświadczonymi kolegami w kilku sesjach. Pozwól im wyjaśnić ogólną architekturę i sposób interakcji różnych komponentów, wraz z podjętymi przez nich decyzjami dotyczącymi implementacji.
Trudno podać ogólne porady dotyczące przejścia z języków funkcjonalnych na języki rozkazujące / OO. Jasne, mógłbym wspomnieć kilka kwiecistych zwrotów, takich jak: „Musisz myśleć o stanach i zachowaniach przedmiotów”, ale to ci niewiele pomoże, myślę, że to jest coś, czego musisz doświadczyć.
źródło
Jeśli (duże, jeśli z powodu złych praktyk, które opisujesz) istnieją testy jednostkowe, możesz spojrzeć na te, aby zobaczyć, jak testowany jest kod. Może to zapewnić dobry wgląd w to, co robi kod.
W przeciwnym razie sugerowałbym przeczytanie bardziej ogólnego kodu python, aby przyzwyczaić się do sposobu pisania.
źródło
Możesz spróbować przetłumaczyć niektóre fragmenty z Pythona na pseudo-Haskell lub cokolwiek zechcesz. To może dać ci pojęcie o tym, jakie imperatywne konstrukcje luźno odwzorowują na jakie konstrukcje funkcjonalne. W miarę zdobywania doświadczenia imperatywne konstrukcje będą coraz bardziej rodzime.
Przeszedłem z programowania OCaml i Haskell do programowania Java i Python, a moje doświadczenie jest takie, że programowanie imperatywne nie jest tak dużym skokiem jak pisanie dynamiczne, które do dziś wydaje się obce.
źródło
Sugeruję umieszczenie punktów przerwania i rozpoczęcie korzystania z polecenia Dalej (tak jakbyś debugował), to pomoże ci zrozumieć przepływ (prawdopodobnie na gałęziach, są ścieżki, które są bardziej prawdopodobne, że zostaną podjęte, na tych, które powinieneś skoncentrować, aby uzyskać ogólna idea kodu).
(Miałem dobre wyniki z Eclipse wraz z PyDev jako wtyczką Eclipse)
źródło