Jak czytasz cudzy kod? [Zamknięte]

23

Prawie każdy zaawansowany programista mówi, że bardzo przydatne jest czytanie kodu innych specjalistów. Zwykle doradzają open source.

Czytasz to czy nie? Jeśli tak, to jak często i jaka jest procedura czytania kodu? Ponadto początkującym trudno jest poradzić sobie z SVN - wiązką plików. Jakie jest rozwiązanie

Siergiej
źródło

Odpowiedzi:

25

Czytasz to czy nie?

Tak.

Jeśli tak, to jak często

Codziennie. Stale. Pracuję z wieloma projektami typu open source (głównie związanymi z Pythonem) i muszę przeczytać źródło, ponieważ jest to najdokładniejsza dokumentacja.

a jaka jest procedura czytania kodu?

Um. Otwórz i przeczytaj.

Ponadto początkującym trudno jest poradzić sobie z SVN - wiązką plików. Jakie jest rozwiązanie

Otwórz i przeczytaj. Czytaj dalej.

To nie jest łatwe. Nic nie ułatwia. Nie ma Royal Road do zrozumienia. To wymaga pracy.

S.Lott
źródło
Dziękuję za odpowiedź. Jak określić, czy kod jest dobry, czy nie? Ponieważ nie każdy projekt open source jest wykonywany przez prawdziwych profesjonalistów?
Siergiej
1
@Sergey: „Jak można określić, czy kod jest dobry, czy nie?” Przeczytaj kod. „Dobry” jest subiektywny. Jeśli jest to pomocne i można to zrozumieć, jest dobre. Jeśli jest mylące lub w rzeczywistości nie działa, to nie jest dobre. Istnieje wiele, wiele atrybutów jakości: łatwych w utrzymaniu, bezpiecznych, adaptowalnych, o wysokiej wydajności itp. Itd. Itd. Itd. Kod może być dobry w jednym, a mniej dobry w innym.
S.Lott,
7
Nie mogłem się oprzeć: osnews.com/images/comics/wtfm.jpg
Gary Willoughby,
@Sergey - nawet jeśli jest to najlepszy kod, jaki kiedykolwiek napisano, jeśli nie możesz go odczytać (ze względu na swoje doświadczenie), nie przyniesie ci to nic dobrego. Chociaż może się wydawać, że nie jest to najlepsze wykorzystanie czasu, będziesz narażony na źle napisany kod, więc równie dobrze możesz poznać różnicę. Jak powiedział S.Lott, wymaga pracy i czasu.
JeffO
Podziwiam tych, którzy potrafią usiąść i czytać kod tak, jak czytają powieść, ale czasem wydaje mi się to trochę nudne. Zdałem sobie sprawę, że dla mnie „czytanie kodu” tak naprawdę nie opisuje działań, które podejmuję - lepszym wyrażeniem dla tego, co robię, jest „rozumienie kodu” i obejmuje czytanie dokumentacji, przechodzenie przez nią w debuggerze, a nawet czytanie testów. Napisałem długi post o czytaniu kodu - technikhil.wordpress.com/2010/07/06/how-to-read-code-a-primer
Nikhil
9

W twojej zagadce jest kilka warstw. Najpierw zacznij od wysokiego poziomu, że tak powiem, widok z lotu ptaka. Po sprawdzeniu projektu w strukturze katalogów będzie kilka plików. Tak samo jest, niezależnie od tego, czy patrzysz na źródło otwarte czy zamknięte (kod źródłowy to w końcu kod źródłowy). Zacznij od tego:

  • Jak zorganizowane są pliki źródłowe? Czy potrafisz rozpoznać po nazwie pliku lub katalogu zawierającym to, co możesz w nim znaleźć? My, programiści, lubimy przewidywalne nazwy i logiczną strukturę. Powinieneś być w stanie zorientować się, gdzie szukać konkretnego problemu.
  • Jaki jest charakter aplikacji, czy jest ona oparta na przeglądarce internetowej, wierszu polecenia i GUI? Jest to ważne, ponieważ chcesz wiedzieć, od czego zacząć śledzenie wykonania. Jeśli jest oparty na sieci, zacznij od miejsca, w którym aplikacja rozpocznie przetwarzanie żądania. Jeśli jest zbudowany na platformie, tym lepiej. Po poznaniu frameworka zazwyczaj można dobrze zrozumieć kod, który tam jest. W przeciwnym razie zaczniesz od odpowiedniego punktu wejścia dla aplikacji wiersza poleceń / GUI.
  • Weź kartkę papieru i ołówek, a jeśli masz szczęście, tablicę i markery do wymazywania na sucho. Podaj nazwy komponentów (lub użyj tych podanych w kodzie) i narysuj linie między polami za pomocą strzałek, aby zobaczyć, jak rzeczy są przetwarzane. Alternatywnie, jeśli patrzysz na algorytm, naszkicuj struktury danych w sposób umożliwiający zrozumienie i naszkicuj sposób manipulacji.

Wymaga praktyki, ale jest to z pewnością wykonalne. Im więcej wiesz o bibliotekach i ramach, z których korzysta aplikacja, tym więcej wiesz, jak należy zorganizować kod i gdzie szukać odpowiedzi na określone pytania. Niektóre kody są nieco trudniejsze do naśladowania, szczególnie jeśli są dość pośrednie. Dlatego potrzebujesz ołówka i papieru. W końcu żarówka gaśnie w twojej głowie i dostajesz ją. To wtedy czytanie reszty kodu ma o wiele większy sens.

Berin Loritsch
źródło
Jednym z aspektów czytania kodu jest abstrakcja. Takie rzeczy, jak ustalenie, w jaki sposób są zorganizowane źródła, z pewnością abstrakcyjnie odczyta proces odczytu kodu.
David Gao,
5

To nie jest tak, jak czytasz powieść, ale bardziej to, jak czytasz książkę informacyjną. Dobrym sposobem jest wybranie ostatnio naprawionego błędu z wiadomości sprawdzającej, zrobienie różnic co się zmieniło i przeczytanie odpowiednich części, dopóki nie zrozumiesz zarówno problemu, jak i rozwiązania. Dobrze rozpowszechnione luki w zabezpieczeniach to fajne błędy do wyboru, ponieważ na forach jest wiele dyskusji na ich temat. Następnie wybierz jeden z błędów „wiszących owoców” w narzędziu do śledzenia błędów i czytaj, dopóki nie zrozumiesz, jak to naprawić. Większość profesjonalistów czytających kod robi to przypadkowo w trakcie naprawy błędów lub dodawania funkcji.

Zwykle najlepsze próbki kodu są ledwo zauważalne. Natychmiast je zrozumiesz, nie czytając ich więcej niż raz. Sprawiają, że wygląda na to, że napisanie go było niezwykle łatwe, mimo że ten dobry kod zwykle przechodzi wiele szkiców. Powoduje to paradoksalne wrażenie, że oczywiście dany kod jest oczywistym sposobem na zrobienie tego, nawet jeśli nie jest to pierwszy sposób, o jakim myślałeś.

Kiedy natrafisz na taki kod, spróbuj zrozumieć wgląd w jego pisanie i związane z nim zasady projektowania, więc kiedy znajdziesz się w podobnej sytuacji w przyszłości, możesz mieć nadzieję, że zastosujesz te same zasady.

Karl Bielefeldt
źródło
4

Jedną sztuczką, której używam dość często podczas czytania skomplikowanych funkcji, segment kodu jest rozpoczęcie refaktoryzacji go do czegoś bardziej czytelnego bez zmiany logiki.

Michał Piaskowski
źródło
1
+1: Ja też. // Miałem kiedyś szefa, który zauważył refaktoryzację i oskarżył mnie o marnowanie czasu. Nie mógł zrozumieć. Co za głupiec.
Jim G.
2

Jak ciężko jest poradzić sobie z „wiązką plików”? Nie różni się niczym od pisania własnego kodu, z tym wyjątkiem, że nie posiadasz wcześniejszej wiedzy na temat jego organizacji, chyba że jest to udokumentowane.

Jeśli, jako rzekomy programista, nie jesteś w stanie zrozumieć struktury projektu na podstawie „zbioru plików”, to albo jest to wyjątkowo źle zorganizowany projekt, albo jesteś nieudolnym programistą (lub, w skrajnych przypadkach, jednym i drugim).

Zacznij czytać, spróbuj znaleźć punkty wejścia lub w inny sposób niezbędne klasy / metody przestawne i zbuduj zrozumienie, jak to wszystko się stamtąd łączy. Nie będzie natychmiastowy, zajmie trochę czasu, ale można to zrobić, nawet jeśli w ogóle nie ma dokumentacji.

jwenting
źródło
3
„Potrzeba czasu”, by „zbudować zrozumienie” jest w zasadzie definicją „trudnego”. Tylko dlatego, że jest to trudność, z którą powinniśmy się zmagać każdego dnia, nie czyni to mniej trudnym. „Gdzie mogę dokonać tej zmiany?” jest częstym pytaniem nawet wśród profesjonalistów. Ponadto kontrola źródła i obsługa dużych baz kodu jest jedną z ogromnych dziur w edukacji uczelni. Wydaje mi się, że wykonałem jeden lub dwa projekty na studiach, które wymagały więcej niż jednego pliku źródłowego, a dostały tylko około 10 plików.
Karl Bielefeldt,
0

Najlepszą rzeczą, na jaką możesz liczyć podczas czytania kodu innego projektu, niezależnie od tego, czy jest to interfejs API, czy oprogramowanie, jest to, że zmienne, funkcje i nazwy makr nie są skracane niejednoznacznie ani nazwane, abyś mógł zrozumieć ich zamiary.

Ale poza tym, potrzeba przyzwoitej wiedzy na temat języka, technik programowania, a także samego celu kodu, aby móc zanurzyć się w złożonym kodzie.

Obecnie próbuję zobaczyć, jak Lua robi część swojej magii, ale przechodzę do punktu powyżej, w którym wiele identyfikatorów jest nazwanych niejasno i raczej w skrócie do punktu, w którym nie mogę dowiedzieć się, która linia próbuje aby zrobić coś, co wiem, musi być zrobione w pewnym momencie w kodzie funkcji ... Często przychodzą mi do głowy zmienne jednoliterowe i raczej skrócone nazwy makr / funkcji.

Nick Bedford
źródło
0

Po spojrzeniu na „Po pierwsze, zacznij od wysokiego poziomu, widok z lotu ptaka”, jak sugerował @Berin Loritsch, możesz poszukać unittestów i / lub testów integracyjnych, jeśli takie istnieją.

unittests są interesujące, aby zobaczyć, jak działają (api) szczegóły.

test integracji zazwyczaj daje dobry przegląd procesów biznesowych.

k3b
źródło