Jak ktoś powinien przyzwyczaić się do myślenia FP i czytać kod rozkazujący?

14

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.

an0nym0us c0ward
źródło
1
Wolisz nie mieć żadnych komentarzy lub niedokładnych komentarzy? Jestem pewien, że komentarze nie starzeją się dobrze w podanych przez ciebie warunkach.
Larry Coleman
O ile kod nie znajduje się w tym bardzo małym podzbiorze kodu, który można nazwać „komentowaniem własnym”, wolałbym mieć co najmniej kilka komentarzy, które mogą zawierać co najmniej szereg pomocnych wskazówek, które poprowadzą mnie przez nieczytelne bełkoty! Ale to tylko ja!
John Tobler
2
Nawet pilni programiści mają tendencję do ograniczania skutków ubocznych, przynajmniej intuicyjnie, i piszą małe metody. Myślę, że właśnie wylądowałeś na niezbyt idealnej bazie kodu.
Mauricio Scheffer,

Odpowiedzi:

14

Zrozumienie starszego kodu jest trudne. Nie ma to prawie nic wspólnego z funkcjonalnym a proceduralnym.

  1. Utwórz mapę. Schemat komponentów pakietów i modułów Pythona. Dla każdego modułu musisz utworzyć diagramy klas.

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

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

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

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

S.Lott
źródło
6
+1. Zrozumienie dowolnego starszego kodu jest trudne, nawet jeśli jest dobrze napisane.
quant_dev
12

Bardzo trudno mi czytać kod rozkazujący. Kiedy zagnieżdżanie „jeśli-inaczej-za -...” osiąga głębokość przekraczającą cztery poziomy, całkowicie tracę kontrolę nad tym, co dzieje się w kodzie.

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.

Może powinienem również wspomnieć, że tak naprawdę nie ma zbyt wielu komentarzy w kodzie, a nazwy też nie są zbyt intuicyjne.

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

Sokół
źródło
Problem z wcięciem może być gorszy: gdy językiem jest kod kolumnowy (jak RPG) i nie ma żadnego rzeczywistego wcięcia. Niektóre narzędzia próbują to naprawić ...
Clockwork-Muse
2

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.

Sardathrion - przeciw nadużyciom SE
źródło
2

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.

RTS - przeczytaj o Monice Cellio
źródło
1

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)

Liran Orevi
źródło