Czy warto sprawdzać kod w języku, którego nie znam?

108

Jestem doświadczonym programistą, ale nie przeprowadziłem wielu recenzji kodu. Poproszono mnie o przejrzenie kodu napisanego w Pythonie, ale nie znam Pythona.

Czy w ogóle ma sens przeglądanie kodu w języku, którego nie znam?

Heather Smith
źródło
62
Stycznie rozważ przejście do CodeReview.SE i zerknięcie na tag python. Patrząc tylko na pytanie, zastanów się, jaką radę dałbyś kodowi, a następnie sprawdź, czy jest to przedstawione w odpowiedziach.
14
Brzmi jak doskonały sposób, aby dowiedzieć się więcej o Pythonie. Kwestionuj cokolwiek, co wygląda śmiesznie - po części nie będziesz rozumiał języka, a niektóre będą stanowić uzasadnione pozycje do przeglądu kodu.
Dan Pichelman
9
@RobbieDee Absolutnie! Wyjaśnienie komuś kodu jest często opłacalne, nawet jeśli jest to tylko pluszowy miś .
Kilian Foth
34
Mówisz, że zostałeś o to poproszony. Osoba, która Cię pyta, uważa, że ​​wykonując to zadanie, doda wartość Twojej organizacji. Jeśli chcesz wiedzieć, jaki jest charakter tej wartości, zapytaj tę osobę , a nie obcych w Internecie! Nie wiemy, co dzieje się w głowie tej osoby. Być może kod ma tak niską jakość, że nawet nowicjusze mogą znaleźć problemy. Być może kod jest tak wysokiej jakości, że nauczysz się z niego dobrych nawyków. Kto może powiedzieć? Ktoś uważa, że ​​ma wartość; zapytaj tę osobę, jaka jest wartość.
Eric Lippert,

Odpowiedzi:

120

Czy masz jakiś sens? Tak. Nawet jeśli nie wiesz nic o semantyce języka programowania, nadal możesz czytać znaki i zauważać niespójne formatowanie, brakujące komentarze, źle dobrane identyfikatory, oczywiste powielanie itp.

Jaki sens, czy wystarczający sens, aby spłacić koszty twojego czasu ? Nie jestem pewny. Zależy to od twojego stanowiska, znaczenia przeglądów kodu w przepływie pracy twojego zespołu i kilku innych czynników, których nie jesteśmy w stanie określić wystarczająco dobrze.

Kilian Foth
źródło
50
Robienie recenzji kodu to świetny sposób na poznanie modułu, frameworku, a nawet języka, więc i tak może być warto poświęcić swój czas (a może sugeruje się ...). Nie podpisałbym się jednak pod taką recenzją, nie bez zainteresowania kogoś, kto zna zarówno język, jak i kod, aby na nią spojrzał.
Ordous
8
Również jeśli masz dobrą znajomość domeny, a kod jest dość dobrze nazwany / skomentowany, nadal możesz wykryć niepoprawne / źle zrozumiane / brakujące funkcje na wysokim poziomie (możesz jednak nie dostrzec błędów z powodu problemów ze składnią)
Dan
4
Jako osoba z zewnątrz może być bardziej prawdopodobne, że zauważysz błędy słupka ogrodzeniowego lub błędy w stosowaniu prawidłowej liczby znaków równości i tego rodzaju rzeczy.
KlaymenDK
2
@KlaymenDK Przypisania w kontekście logicznym to (przynajmniej zazwyczaj) błędy składniowe w Pythonie. Błędy ogrodzenia są mniej prawdopodobne, ponieważ dobrze napisany Python prawie nigdy nie pracował bezpośrednio z indeksami tablic / list. (Nawet kiedy to robisz, zwykle tak jest enumerate.) Myślę, że twój komentarz jest doskonałym przykładem tego, dlaczego próba przeglądu języka, którego nie znasz, powinna co najwyżej być pouczająca.
jpmc26
1
@Mawg - Powiedziałbym, że po to jest automatyczne testowanie. Nawet przy specjalistycznej znajomości języka trudno jest powiedzieć, czy kod rzeczywiście spełni specyfikację projektu, po prostu patrząc na nią / bez wykonywania go i obserwując wynik (chyba że specyfikacja projektu jest tak szczegółowa, że ​​jest to kod sam w sobie) . Aspekty wymienione w odpowiedzi obejmują wiele (choć nie wszystkie) uzasadnione powody dokonywania przeglądów kodu. Przegląd kodu zasadniczo nie obejmuje wykonania sprawdzanego kodu.
aroth
59

Jako regularny współpracownik w Code Review Stack Exchange napotykam wiele pytań związanych z językowymi problemami, na przykład:

  • Formatowanie, wcięcie
  • Zakres
  • Pętle
  • Wpisz operacje

i lista jest długa. Jednak chociaż nie muszę znać języka, nadal mogę sprawdzić te problemy / punkty.

Kilku naszych najlepszych użytkowników ma najlepsze odpowiedzi w językach, których albo nie używają aktywnie, albo nie znają. Nawet dwa z mojej pierwszej dziesiątki są w językach, których ani nie znam, ani nie mogę skompilować / uruchomić na moim komputerze.

Powiedziałbym nawet, że byłoby to tak samo jak sprawdzenie czyjegoś pseudo kodu. Tak długo, jak będziesz mógł obserwować i komentować rzeczy istotne dla rzeczy, które rozumiesz, nic ci nie będzie i będzie odpowiednie.

Lotka
źródło
2
Napisałem nawet odpowiedź na program PHP. To nie jest najlepsza odpowiedź, ale nadal twierdzę, że oryginalna deklaracja pętli jest brzydka.
Hosch250,
4
Nauczyłem się C # przez kombinację recenzowania, pisania i recenzowania tego, co napisałem.
RubberDuck,
5
Jeśli nie znasz Pythona, raczej nie docenisz znaczenia wcięcia w języku ...
Floris,
2
Jeśli chodzi o 2/10 swoich najlepszych odpowiedzi w językach, których nie znasz. Kto powiedział, że wyborcy coś o nich wiedzą?
Martin Smith,
Chociaż nie znam języków, wciąż sprawdzam swoje stwierdzenia, a jeśli popełniłem błąd ... Zaufaj mi, usłyszę o tym
Quill
44

Ogólna rada

Oto, moim zdaniem, wynik końcowy:

  • Jeśli nie znasz języka na tyle dobrze, aby znać funkcje i popularne idiomy , prawdopodobnie nie przyczynisz się do recenzji.
  • Jeśli chcesz poznać funkcje i idiomy języka, możesz wziąć udział w recenzji. Skup się na obserwowaniu idiomów i zadawaniu pytań na temat wzorców i organizacji, które nie mają dla ciebie sensu. Może to pomóc w identyfikacji obszarów problemowych, ale tylko w tym sensie, że możesz zmusić programistę do obrony tego, co zrobili. Zadawaj pytania w sposób, który pozostawia miejsce na brak wiedzy. Pamiętaj, że może to być koszt netto w samym przeglądzie, ale ten koszt jest inwestycją w twoją wiedzę.
  • Twoja zdolność do wnoszenia wkładu, dopóki nie zapoznasz się z funkcjami języka, idiomami i standardami, będzie ograniczona. Nie spodziewałbym się tego zmienić, dopóki nie zostały faktycznie napisany znaczną ilość kodu w języku.

Uwagi i przykłady dotyczące Pythona

W szczególnej sytuacji, gdy nie znam Pythona, byłbym szczególnie ostrożny. Python ma wiele idiomów i standardowych praktyk, które sprawiają, że dobry Python wygląda zupełnie inaczej niż można by oczekiwać w innych językach. (Rzeczywiście, myślę, że rzeczy, na które podkreśla Python, sprawiły, że mój kod wygląda lepiej w innych językach, a nie na odwrót.) Poza PEP8 jest dobry przykład tego, jak możesz całkowicie przegapić sposób myślenia, do którego zachęca Python.

Spójrzmy na prosty przykład. Weź ten kod:

f = open('/home/me/something.txt')
try:
    content = f.read()
finally:
    f.close()

Widzisz problem z tym kodem? Jeśli nie pracowałeś z Pythonem, prawdopodobnie nie. Problem polega na tym, że w Pythonie istnieje bardzo preferowany styl, który robi dokładnie to samo:

with open('/home/me/something.txt') as f:
    content = f.read()

To jest menedżer kontekstu. Czy wiesz, do czego są dobre? Czy wiesz, kiedy należałoby użyć jednego z nich? Czy wiesz, kiedy należałoby stworzyć własne? Nie? Prawdopodobnie nie jesteś gotowy na sprawdzenie Pythona.

Spójrzmy na inny przykład.

def add_fifty(other_list):
   result = list()
   for i in other_list:
       result.append(i + 50)
   return result

x = range(10)
y = add_fifty(x)

Widzisz problem? Problem polega na tym, że ta metoda jest całkowicie niepotrzebna . Prawdopodobnie powinieneś po prostu użyć rozumienia w miejscu, gdy operacja jest taka prosta:

x = range(10)
y = [i + 50 for i in x]

Jeśli tego nie widziałeś, nie znasz funkcji i idiomów Pythona.

jpmc26
źródło
1
W twoim ostatnim przykładzie, gdybym zobaczył końcowy kod, prawdopodobnie miałbym pojęcie, co on może zrobić (bez znajomości Pythona) i zacznę się zastanawiać, czy mogę zrobić coś podobnego w moim ulubionym języku, czego nigdy wcześniej nie rozważałem.
gnasher729
1
@ gnasher729 „Rzeczywiście, myślę, że to, co podkreśla Python, sprawiło, że mój kod wygląda lepiej w innych językach, a nie na odwrót”. =) Jedyne, co wiem w innych językach, które byłyby nawet zdalnie podobne, to LINQ .NET i Stream 8 Java . Ruby może coś mieć i jestem pewien, że funkcjonalne języki się do czegoś zbliżają. Chodzi mi o to, że możesz nawet nie wiedzieć, jak to zrobić, jeśli nie znasz Pythona, więc nie wiesz nawet, jak rzucić wyzwanie „złej” wersji.
jpmc26
@x = 1 .. 10; @y = mapa {$ _ + 50} @x;
rura
2
Przegląd kodu dotyczy bardziej błędów logicznych niż implementacji niektórych (dla zewnętrznych programistów) niejasnych składni w określonym języku. Chodzi o znalezienie błędów logicznych, takich jak całkowicie niepoprawne wdrożenie algorytmu (np. Użycie podziału, gdy powinien być dodany). Więc kod nie będzie dokładnie zgodny ze specyfikacjami. Nie jest to ważne, o ile wynikowe dane wyjściowe są prawidłowe. Przynajmniej jeśli martwisz się takimi konkretnymi optymalizacjami, przegląd kodu zespołu byłby jeszcze lepszy.
phyrfox
3
@phyrfox To po prostu nieprawda. Mogą występować błędy logiczne, ale przegląd kodu dotyczy również (lub przede wszystkim) najlepszych praktyk, bezpieczeństwa, wydajności, niezawodności, czytelności / konserwacji itp. Zanim coś zostanie sprawdzone, naprawdę powinno być przetestowane. Definicja przeglądu kodu przez StackExchange jest dość prosta , imo. W Pythonie przytoczone przykłady nie są „małymi optymalizacjami”. Deweloper języka Python, który nie korzysta z tych wzorców, jest bardzo niedoświadczony, spóźniony lub niekompetentny. To są podstawowe elementy języka.
jpmc26
21

Być może poprosili Cię o sprawdzenie kodu Pythona właśnie dlatego, że nie znasz Pythona . Istnieje teoria zarządzania , że warto mieć „głupca” w zespole. Nie nazywam cię złym imieniem :) Chodzi o to, że zespół może cierpieć z powodu myślenia grupowego i rozwijania wizji tunelu. Jednym ze sposobów wyjścia z tego jest włączenie kogoś z zespołu, którego inni członkowie zespołu uznaliby za „głupca”, to znaczy kogoś, kto nie zna tematu. Zadajesz pytania, aby się dowiedzieć, a pytania będą pochodzić z punktu widzenia, którego inni członkowie zespołu prawdopodobnie nigdy nie brali pod uwagę.

Nie znasz Pythona, więc to, co dla programistów Python może wydawać się zwyczajne, może ci się wydawać dziwne. Możesz zasugerować ulepszenie, którego zespół nigdy nie rozważał.

user2023861
źródło
1
To miała być moja odpowiedź. Chciałbym tylko dodać, że każdego dnia z dowolną procedurą Pythona i dowolną grupą guru Pythona ... ten kod to GARBAGE.
dwoz
I często sam fakt wyjaśnienia czegoś „głupcowi” wywoła „Doh!”. chwila od „eksperta”, kiedy nagle zdają sobie sprawę, że kod nie robi tego, co powinien, lub pomija jakieś kluczowe przypadki. To także dobry sposób na rozpoczęcie szerzenia wiedzy.
TripeHound,
21

Przegląd kodu nie polega na wyszukiwaniu zmiennych z niepoprawną pisownią i nieprawidłowym formatowaniem. Jeśli używasz recenzji kodu, aby znaleźć takie rzeczy, przestań marnować czas i użyj narzędzia.

Przegląd kodu polega na ulepszeniu projektowania i wykrywaniu typowych błędów przez początkujących programistów.

Ponieważ programuję w C ++ i nie znam wystarczająco dobrze Pythona, nie odważyłbym się przejrzeć kodu Pythona. Mogę jednak pomóc w przeglądzie kodu Java.

Nie powiedziałeś, w którym języku programujesz, ale nie widzę, co możesz wnieść do recenzji kodu, jeśli nie znasz języka, w którym jest programowany.

BЈовић
źródło
23
Naprawdę masz narzędzie, które potrafi odróżnić źle nazwane zmienne od dobrych? Byłbym naprawdę zainteresowany zobaczeniem jednego.
Davor Ždralo
1
@ DavorŽdralo Off the bat Wiem, że Java ma Checkstyle. Bardziej formalne narzędzia analizy statycznej są wspólne dla wielu języków, a egzekwowanie standardu kodowania jest zwykle najmniejszym z ich obowiązków.
Shaz
9
Mam wrażenie, że jest tu trochę różnicy między definicjami recenzji kodu, przypomina mi to pytanie w CR Meta: Czym jest przegląd kodu? . Nie wykluczałbym czegoś konkretnego i powiedziałbym, że „Code Review NIE dotyczy XYZ”. Brzmi również tak, jakbyś powiedział, że doświadczeni programiści nie potrzebują sprawdzania swojego kodu, z czym bardzo się nie zgadzam.
Simon Forsberg,
3
@ SimonForsberg Nie to mówię. Nawet starsi programiści mogą się czegoś nauczyć dzięki dobrej recenzji kodu. Ale jeśli jedynymi komentarzami są „źle wpisałeś zmienną tutaj” - rodzaj komentarzy, to tracą czas.
BЈовић
2
@ BЈовић Nie, to nie jest najgorsze, jakie można znaleźć, ale jest bardzo zbliżone do „najmniejszej znalezionej rzeczy, która wciąż jest warta”.
Vatine
11

Przeglądy kodu (oprócz faktycznego szukania błędów) są dobrym wprowadzeniem od jednego członka zespołu do innych w celu dodania lub zmiany kodu. Jeśli jesteś doświadczonym programistą , powinieneś być w stanie przeczytać wystarczająco dużo, aby w większości zrozumieć, co się dzieje.

Spójrz na recenzję kodu z punktu widzenia lidera zespołu: jest ktoś, kto rozumie, co powinna robić aplikacja (logika biznesowa), jest ktoś, kto rozumie kod (logika implementacji), i być może kilka innych osób tam, którzy muszą wiedzieć, jak to wszystko do siebie pasuje.

Adam Zuckerman
źródło
7

Zdecydowanie nie powinieneś być jedynym recenzentem, ale istnieje wiele dobrych powodów, aby zostać jednym z recenzentów. Nieznajomość języka nie stanowi dużej przeszkody w przypadku wielu pytań wymagających odpowiedzi podczas przeglądu kodu. Jako przykład, jestem jednym z 20 najlepszych odpowiedzi w tagu C # na tej stronie i nie napisałem tak bardzo w języku C #.

Pewna wiedza, którą możesz się podzielić bez znajomości języka:

  • Znajomość domen
  • Ogólne projektowanie obiektowe.
  • Ogólne praktyki programowania: nazewnictwo, klarowność itd.

Jest to również dobry sposób na przyspieszenie nowego produktu. Właśnie dołączyłem do nowego zespołu, w którym znam dość dobrze używane języki, ale nie znam domeny. Udział w recenzjach kodu pomógł mi lepiej nauczyć się domeny, mimo że nie byłem jeszcze w stanie wiele wnieść do tego.

W twoim przypadku będzie to dobry sposób na naukę idiomów nowego języka, gdy zobaczysz komentarze innych recenzentów. Tego rodzaju rzeczy bardzo trudno jest nauczyć się w inny sposób, ponieważ interpreter nie dba o to, czy kod jest pythoniczny, czy nie.

Karl Bielefeldt
źródło
5

Może to być sytuacja korzystna dla obu stron. Chciałbym powiedzieć, że możesz być szczególnie cennym recenzentem, ponieważ jesteś dziewicą Pythona, która nie została skażona Klątwą Wiedzy .

Pomyśl o tym w ten sposób: jeśli kod jest wystarczająco przejrzysty, aby nawet dziewica Pythona mogła go zrozumieć, to musi to być dobry kod. Części, które trudno ci zrozumieć, mogą być kandydatami do przeróbki lub lepszego komentowania.

Oczywiście byłoby to również korzystne dla ciebie, ponieważ wybierałbyś nowy język na bieżąco. (Mam nadzieję, że otrzymany kod jest dobrym przykładem do nauki.) To ustawienie powinno szczególnie dobrze działać w języku Python, który ma reputację „pseudokodu wykonywalnego”. Jeśli jesteś doświadczonym programistą, nie powinieneś mieć większych trudności ze zrozumieniem istoty programu Python.

Zastrzeżenie polega na tym, że nie można oczekiwać, że zauważysz błędy wynikające z błędów językowych . Ale wykrywanie błędów nie jest jedynym celem przeglądów kodu. Jeśli nic więcej, uczestniczysz w transferze wiedzy, po prostu wiedząc, jakie rzeczy dzieją się w kodzie kolegi.

200_sukces
źródło
2

Kiedyś zostałem poproszony o audyt projektu podwykonawcy, który wydawał się mieć poważne problemy z wydajnością. Dość szybko ustaliłem, że czynnikiem krytycznym był pojedynczy moduł Perla. Nigdy wcześniej nie spotkałem Perla i nie mieliśmy w organizacji nikogo, kto by o tym wiedział, więc postanowiłem sam to zrozumieć. Nigdy nie doszedłem tak daleko do zrozumienia szczegółów, ale było bardzo jasne, że algorytm, którego używał, miał kwadratowy rozmiar danych i to było przyczyną wszystkich problemów. Tak więc, czytanie kodu w języku, którego nie rozumiesz w pełni, może zdecydowanie być produktywne. Dodatkową korzyścią jest to, że uczysz się nowych trików, gdy o tym mówisz.

Michael Kay
źródło
1

Kilka uwag:

1) Jeśli jesteś doświadczonym programistą, wybierzesz Python (lub przynajmniej tyle, ile musisz wiedzieć), po prostu pracując z nim. Będzie to przypadek „uczenia się przez działanie”. Na początku będzie ciężko, ale będzie łatwiej, gdy zaczniesz mówić. Potraktuj to jako okazję do nauki innego języka (ludzie często uczą się języków „obcych” poprzez „zanurzenie”).

2) W witrynach SE znajduje się wiele cennych osób, które są „nietechniczne”, ale znają się na gramatyce, komunikacji i logice. Tacy ludzie przynoszą „świeże oko” badanym i dokonują szeregu poprawek „bez zastanowienia”, których inni pomijają, ponieważ są zbyt „związani” materiałem. Prawdopodobnie konsultowano się z tobą w sprawie twoich umiejętności „nie technicznych” (tj. Nie w języku Python), takich jak logika i ogólne umiejętności programowania.

A jeśli nie dokonałeś dużo recenzji kodu, prawie jakakolwiek znajomość kodu pomoże ci jako programista. Wygląda to na dobre dopasowanie umiejętności i potrzeb do potrzeb zespołu.

Tom Au
źródło
1
Pytam, czy przeglądanie kodu w znaczący sposób oznacza „uczenie się przez działanie”. Być może moje doświadczenie związane z recenzowaniem jest inne niż twoje, ale bardzo rzadko jest znaczące lub znaczące pisanie kodu i prawie nigdy nie jest wykonywane.
Ezoteryczna nazwa ekranowa
@EsotericScreenName - Myślę, że to zależy od tego, ile informacji zwrotnych otrzymujesz od kogoś, kto napisał lub zna kod. Bardziej prawdopodobne jest, że będzie w obszarze domeny, w którym pracujesz w innym języku, dzięki czemu jest bardziej odporny na zmiany niż typowy przykład kodu. Większość przykładów kodowania pokazuje tylko, jak wykonać małe fragmenty halsu i rzadko są pokazywane jako część dużego projektu.
JeffO
0

To zależy od celu przeglądu; czyli to, co masz na myśli przez skuteczne .

Nadal prawdopodobnie będziesz w stanie wykryć niektóre problemy. Jeśli jesteś wszystkim, z czym muszą się zapoznać i mają tylko nadzieję, że obejrzenie tego pomoże niektórym i być może coś złapie, to na pewno. Wiele koncepcji struktury jest podobnych w różnych językach. Szczególnie można przejrzeć komentarze. Należy na tyle dobrze skomentować, że programista nie z tego konkretnego języka powinien być w stanie dobrze zrozumieć, co się dzieje. Jeśli nie ... możesz powiedzieć im, gdzie brakuje ich komentarzy. Jeśli jest to tak dobrze skomentowane ... to powinieneś być w stanie przejrzeć sporo ich struktury tylko za pomocą adnotacji o tym, co się dzieje, zamiast faktycznie czytać kod tego, co się dzieje.

Ale prawdopodobnie nie wykryjesz wielu innych problemów. Więc jeśli zamierzają, aby twoja recenzja była wyczerpującym ustaleniem, czy jest to dobrze wykonany / wykonalny program, będą rozczarowani.

To, czy ten wynik jest wart twojego czasu, zależy w dużej mierze od projektu.

Jimbo Jonny
źródło