Jak sprawdzić kod, którego nie rozumiesz?

25

Dano mi rolę, aby poprawić rozwój w naszej firmie. Pierwszą rzeczą, którą chciałem zacząć, były recenzje kodu, ponieważ nigdy wcześniej tego nie robiono.

W naszej firmie jest 3 programistów. Jestem programistą internetowym, moje znane języki to głównie PHP, ActionScript i JavaScript. Pozostali dwaj programiści piszą aplikacje wewnętrzne w VB.net

Od kilku tygodni robimy recenzje kodu. Trudno mi zrozumieć kod VB. Więc kiedy mówią, co robi, w większości muszę po prostu uwierzyć im na słowo.

Jeśli widzę coś, co wygląda nie tak, wyjaśniam swoją opinię i wyjaśniam, w jaki sposób rozwiązałbym ten problem w jednym ze znanych mi języków.

Czasami moje sugestie są mile widziane, ale wiele razy słyszę takie rzeczy, jak: „to najlepszy sposób na zrobienie tego w tym języku” lub „to nie dotyczy tego języka” lub podobnych rzeczy tego rodzaju.

To może być prawda, ale nie znając języka, nie jestem pewien, jak potwierdzić lub obalić te twierdzenia.

Wiem, że jednym z możliwych rozwiązań byłoby nauczenie się języka vb, dzięki czemu mogę robić lepsze recenzje kodu. Naprawdę nie interesuję się nauką vb (zwłaszcza, że ​​mam listę innych technologii, których staram się nauczyć na potrzeby własnych projektów) i chciałbym zachować to w ostateczności, ale jest to opcja.

Innym pomysłem, który przyszedł do mnie, jest to, że obaj interesują się C #, podobnie jak ja. Jest on względny do nich, ponieważ jest .net i względny do mnie, ponieważ jest bardziej podobny do języków, które znam. Jest to jednak nowość dla nas wszystkich. Pomyślałem o korzyściach płynących z współpracy przez nas nad projektem C # .net dla zwierząt domowych i wzajemnego sprawdzania kodu.

Sądzę też, że istnieje możliwość wynajęcia konsultanta, który mógłby przyjść i dać nam recenzje kodu.

Co poleciłbym zrobić w tej sytuacji.

JD Isaacks
źródło
6
okazać się trudne do zrozumienia kodu VB? Jesteś pewny? pozwól, że zapytam ponownie, czy jesteś pewien! :)
Darknight
4
Nie jesteś zainteresowany nauką VB? Prawdopodobnie powinieneś zrezygnować z wykonywania recenzji kodu kodu VB!
JacquesB

Odpowiedzi:

22

Twoje osobiste pragnienia uczenia się innych rzeczy powinny zająć miejsce w tyle, aby dowiedzieć się, czego aktualnie potrzebujesz do pracy. Dowiedz się VB.net. Możesz skutecznie kodować kod recenzji, którego nie rozumiesz, gdy znasz język, w którym się on znajduje, zadając wiele pytań (zwykle jest to znak, że kod nie jest dobrze napisany, jeśli znasz język i nie możesz zrozumieć, co on robi i czemu). Ale nie rozumiejąc kodu, najlepiej możesz go wyjaśnić i mieć nadzieję, że zobaczą jakieś błędy w procesie wyjaśniania. Nie dlatego, że nie znalazłem błędów we własnym kodzie podczas recenzji, ale nie jest to najskuteczniejszy sposób na sprawdzenie kodu. Przegląd kodu jest teraz częścią twojej pracy, radzisz sobie z nim i dowiadujesz się, czego potrzebujesz, aby nauczyć się robić to skutecznie.

Kiedy się uczysz, kiedy mówią dobrze, że nie jest to sposób, w jaki robimy to w tym języku, spraw, aby pokazali ci źródło, które mówi, że jest to dobra technika do użycia. To do nich należy uzasadnienie przeglądu kodu, a nie na odwrót. Będziesz także lepszy w języku, gdy zaczniesz widzieć te linki.

HLGEM
źródło
5
+1 Aby dowiedzieć się, czego musisz się nauczyć, a nie tego, czego chcesz się nauczyć. Najlepiej jest uczyć się obu - nauka języków jest szybka.
Orbling
1
+1: Jeśli chodzi o „spraw, aby ci pokazali”, łagodniejszym sposobem jest zapytanie, czy mają jakieś książki, w których wyjaśniono te zasady, abyś mógł się również nauczyć. To samo, tylko mniej atakujące. A ludzie nie lubią być atakowani.
Joris Meys,
@Joris Meys, tak, możesz i powinieneś zrobić to grzecznie, ale trzeba je popchnąć, aby odpowiedzieć, zanim poświadczysz, że kod minie, jeśli polegają na „bo tak powiedziałem”.
HLGEM
1
@Jeff O: Nie uważam uprzejmości za przywilej. W środowisku pracy jest to również ważne narzędzie pozwalające uzyskać to, czego chcesz. Lub przekazać wiadomość w sposób trudny do skontrowania. Nikt nie może nazywać cię imionami uprzejmości ...
Joris Meys
1
@Jeff O, bycie uprzejmym nie oznacza bycia wycieraczką. Oznacza to zadawanie pytań w sposób neutralny. Możesz nalegać na odpowiedź, nie będąc niegrzecznym. Nieuprzejmość nigdy nie jest odpowiednia w miejscu pracy. Zawsze będziesz musiał pracować z ludźmi, których nie lubisz lub którzy cię denerwują, ale nigdy nie należy źle się do nich zachowywać. Kiedy to zrobisz, główną osobą, którą krzywdzisz, jesteś sam, ponieważ inni stracą dla ciebie szacunek.
HLGEM
13

Właściwie nie zgadzam się ze wszystkimi powyższymi. Dzięki JS / PHP / ActiopnScript masz podstawowe zrozumienie tego, co ma język programowania i jak on działa. W rzeczywistości argumentowałbym, że istnieje wiele podobieństw między VB i JS. Jednak nie o to mi chodzi. Nawet jeśli jesteś bardzo biegły w języku, łatwo coś przeoczyć, próbując śledzić procesy myślowe innej osoby, więc przegląd powinien dać programiście możliwość wyjaśnienia, co zrobił i dlaczego.

Przyjaciel opisał to kiedyś jako „Teorię woźnych”: wyjaśniając szczegóły komuś, każdemu, nawet dozorcy, programista ujawnia swoje słabości w kodzie, co jest oczywiście ostatecznym celem przeglądu proces. Wymaga to jednak dokładnego i jawnego wyjaśnienia kodu (recenzje nie działają, gdy programiści są defensywni).

fishywiki
źródło
4
+1 Dla teorii woźnego - co zwykle nazywam „sondą”, każdy, kto może słuchać i zadawać pytania, jest dobry, nawet jeśli tylko tam stoi, to pomaga.
Orbling
1
Kluczem jest utrzymywanie wszystkich w rozmowie i współpracy. Nie wystawiaj swojego zespołu na defensywę - nic nie opóźni wydajności szybciej niż wszyscy pracujący dla siebie.
IAbstract
7

Krótka wersja

  1. Pamiętaj, że recenzje kodu są szansą zarówno dla recenzenta, jak i recenzenta na naukę.
  2. Informacja zwrotna jako pytanie.
  3. Nie pozwól, aby brak wiedzy powstrzymał cię przed przekazywaniem opinii (o ile robisz # 2).
  4. Unikaj „recenzji preferencji” lub przynajmniej wyjaśnij, że są to twoje osobiste preferencje i niekoniecznie muszą się zgadzać.
  5. Spróbuj przesłać poprawki zamiast być „recenzentem kodu fotela”.

Dłuższa wersja

Przede wszystkim pamiętaj, że recenzja kodu to nie tylko okazja do sprawdzenia. Jest to również okazja dla recenzenta do nauki. W rzeczywistości słyszałem o kilku organizacjach, w których nowi programiści rozpoczynają przegląd kodu, aby mogli go poznać.

Mając to na uwadze, istnieje jedna porada dotycząca przeglądu kodu, którą zawsze uważałem za przydatną ogólnie, ale szczególnie istotną dla twojej pozycji. Prześlij swoją opinię w formie pytania, a nie oświadczenia. Innymi słowy, zamiast mówić „Ten kod jest do bani!”, Możesz powiedzieć „Dlaczego napisałeś kod w ten sposób zamiast robić ...” To sprawia, że ​​proces sprawdzania kodu jest przyjemniejszy i pozwala się także uczyć.

Kolejną radą, jaką mam dla was, jest to, aby nie pozwalać, by brak wiedzy sprawił, że się wycofali. Jeśli zobaczysz coś, co uważasz za niewłaściwe, i otrzymasz od osoby przeglądającej falistą odpowiedź, nie wycofuj się (przynajmniej nie z powodu braku wiedzy). Pamiętaj, że to, co czyni dobry kod w jednym języku, rzadko różni się od tego, co czyni dobry kod w innym języku. Tak, niektóre języki mają różne idiomy, które pomogą Ci napisać dobry kod. Ale ważne jest, aby zdać sobie sprawę, że te idiomy są narzędziami, a nie celami same w sobie.

Przede wszystkim staraj się unikać „recenzji preferencji”. Jest to coś, nad czym muszę (i wielu innych) bardzo świadomie się starać. Innymi słowy, staraj się unikać robienia recenzji zgodnych z „Zrobiłeś x , ale wolę y ”. Nie ma nic złego w określaniu preferencji, ale powinieneś wyraźnie oznaczyć je jako takie i zaznaczyć, że druga strona może się nie zgodzić. Jest to ważne, ponieważ większość rzeczy różniących się między językami należy do tej kategorii.

Wreszcie, czy korzystacie z rozproszonego systemu kontroli wersji? Jedną z rzeczy, które mogą pomóc, jest to, że zamiast po prostu zauważyć, co jest nie tak z kodem, możesz przepisać kod tak, jak go napisałeś, przetestować, a następnie przesłać łatkę. Pomaga to pokazać, że naprawdę jesteś zainteresowany ulepszeniem ich kodu, a nie tylko „recenzentem kodu do fotela” i daje szansę na lepszą naukę języka. Ponadto zwykle łatwiej jest nie zgodzić się z „Myślę, że powinieneś to zrobić” niż w „Oto, jak bym to zrobił, a tutaj jest łatka, jeśli się zgadzasz”. Przypuszczam, że niekoniecznie potrzebujesz do tego DVCS, ale z pewnością to pomaga.

Jason Baker
źródło
O „preferencjach”: Wyobraź sobie, że napisałem kod, przejrzałeś go i musiałem go zmienić z powodu twoich preferencji. Teraz dokonujesz drobnej zmiany, ja ją przeglądam i sprawiam, że wszystko zmieniasz z powrotem z powodu moich preferencji. Powinno być oczywiste, że jest to skrajny nonsens.
gnasher729
7

Straciłeś koncentrację na problemie i znalazłeś słabe rozwiązanie. Masz za zadanie usprawnienie rozwoju, a Twoim rozwiązaniem jest powierzenie osobie odpowiedzialnej za sprawdzenie kodu (siebie), która nie rozumie języka. Kto sprawdza Twój kod? Dlaczego nie mogą się nawzajem recenzować, dopóki nie nauczysz się języka?

Musi istnieć inny obszar problemu, który można by wybrać, aby uzyskać natychmiastową poprawę. W ten sposób po prostu dmuchają w ciebie dymem i nic się nie poprawia.

Skierowanie nowego rozwoju na język, którego nikt z was nie rozumie (C #), zajmie dużo czasu, zwłaszcza jeśli wszyscy przyniesiemy ze sobą złe nawyki.

Skoncentruj się na projektowaniu (zostało to wspomniane). Jeśli mają problemy z utrzymaniem bieżącego kodu, sprawdź niektóre narzędzia refaktoryzacji dla VB. Wiele podstawowych praktyk jest takich samych.

JeffO
źródło
5

Możesz „ sprawdzić ” rzeczy, których tak naprawdę nie znasz, ale nie możesz odpowiednio ich przejrzeć . Jestem bardzo kompetentny w C, dość dobrze znam C ++, ale nie marzyłbym o recenzowaniu czegoś w C #.

Nie sądzę, że musisz posunąć się do konsultanta, ponieważ niektóre firmy specjalizują się w prowadzeniu twojego kodu przez mnóstwo testów i mówieniu ci, co może być z nim nie tak.

Nadal to do indywidualnego programisty, który zna język, aby zinterpretować wynik. Na przykład, jeśli recenzent kodu odrzuciłby mnie za to printf(), że nie użyłem wartości zwracanej przez , spojrzałbym na nich dziwnie i zakwestionowałbym ich trzeźwość, a następnie zapytałbym: „Ok, świetnie, co mogę zrobić, gdy nie można wydrukować na konsoli niczego, co by być pomocnym?"

To, co możesz rozważyć, to rozmawianie z szefami o konfigurowaniu działów i kierowników zespołów, abyś był skuteczny w swojej domenie, podczas gdy ktoś inny jest skuteczny w ich domenie.

Mimo to myślę, że możesz być w stanie skorzystać z usług strony trzeciej do przeprowadzania audytu. Większość programistów wartych soli zwróci uwagę na uzasadnione obawy, nawet jeśli odrzucą w połowie fałszywe (na przykład w moim printf()przykładzie).

Tim Post
źródło
4

Zapewnienie wskazówek na temat czegoś, czego nie rozumiesz, przypomina ślepego prowadzącego niewidomego, o czym dobrze wiesz.

Jednym z podejść byłoby użycie narzędzi takich jak FxCop i StyleCop, które zajmą się analizą statyczną podstawy kodu. Zapewni to punkt wyjścia do debaty na temat raportów generowanych z narzędzi.

Innym podejściem byłoby przekształcenie recenzji kodu w recenzje projektu. Recenzje projektów częściej niż nie odkrywają problemów na długo przed napisaniem kodu. Jeśli programista ma konstrukcję, może z niego pracować, jest ogólnie znacznie bardziej wydajny w swoim podejściu i z tego powodu zmniejsza się liczba błędów. Gdy projekt nie istnieje, staje się doraźny w podejściu, a kod cierpi wraz ze wzrostem liczby błędów. Złap problemy w przeglądzie projektu, zanim pojawią się w przeglądzie kodu, upewniając się, że każdy z was ma konkretny projekt do wdrożenia; UML jest tu twoim przyjacielem, a narzędzia takie jak umlet są szybkie i szybkie w użyciu.

Aaron McIver
źródło
4

Zła wiadomość jest taka, że ​​aby skutecznie uczestniczyć w przeglądach kodu, musisz nauczyć się VB. Pomocne będzie również użycie VB w jakimś projekcie (niekoniecznie do produkcji).

Dobrą wiadomością jest to, że gdy to zrobisz, część tego, czego się nauczyłeś, nadal będzie przydatna, gdy przejdziesz do C #.

Larry Coleman
źródło
9
Czytanie VB to nie to samo, co Know VB. Czytam VB wystarczająco dobrze, aby przepisać stary kod VB na Javę. Nie (i nie mogę) pisać VB. Myślę, że istnieje podstawa, aby nauczyć się wystarczająco dużo VB.
S.Lott,
1
@ S.Lott - dobrze wyartykułowany i całkiem odpowiedni do dwóch dowolnych języków.
Tim Post
2
@ S.Lott: Jeśli można przeczytać VB na tyle dobrze, aby przerobić go w Javie, to nie wiem, VB i można ją napisać. Być może będziesz musiał szukać rzeczy na bieżąco, ale to potrwa tylko kilka tygodni.
Larry Coleman,
@Larry Coleman: Chyba dobrze znasz VB. Nie mogłem tego napisać. Naprawdę. Jestem programistą Python / Java, a ograniczenia i dziwność VB mnie dezorientują. Dużo. Nie szukałbym tylko składni. Byłbym całkiem niezdolny do pisania odpowiednich programów, ponieważ wydaje mi się, że tak nie myślę.
S.Lott,
@ S.Lott: Znam VB całkiem dobrze, pomimo moich najlepszych starań, aby zapomnieć. Jeśli dziwność / ograniczenia VB są dla ciebie mylące, czy nie spowodowałoby to również problemów przy przenoszeniu kodu na inny język?
Larry Coleman,
3

Myślą, którą powinieneś zachować przez cały czas podczas dokonywania wzajemnej oceny, jest:

„JESTEM NASTĘPNYM, ABY UTRZYMAĆ TEN KODEKS!”

Musisz zrozumieć to wystarczająco dobrze, aby móc to zrobić w ramach przygotowań do recenzji, a Twoim zadaniem jest uświadomienie oryginalnemu programistowi wszelkich braków, które sprawiły, że było to bardziej kłopotliwe niż konieczne, aby zrozumieć kod wystarczająco dobrze, aby go utrzymać .

Jeśli nie możesz programować w VB, nie możesz zachować kodu i nie masz uprawnień do bycia recenzentem.


źródło
1

Nie powinieneś przeglądać kodu, którego nie rozumiesz, to tylko zirytuje programistów, którzy muszą wyjaśnić każdą dziwnie wyglądającą rzecz, którą zrobili.

Co możesz zrobić, wybierz / zdefiniuj wytyczne kodowania i sprawdź kod pod kątem tych wytycznych. Jeśli coś jest niezgodne z wytycznymi, możesz poprosić programistę o wyjaśnienie.

Zacznę od wyboru istniejących wytycznych (nie znam żadnych standardów kodowania VB.net, ale Google dał mi:

Użyj narzędzi typu stylecop dla VB .net

Analizuj źródła za pomocą NDepend (ma reguły dotyczące cykliczności złożoności, długości, głębokości itp.)

Gdy to zrobisz, możesz powiedzieć, że kod jest zgodny z wybranymi standardami, nie mówi nic o poprawności funkcjonalności ani o kodzie używającym odpowiednich zasad OOP. Ale przynajmniej to jest coś.

KeesDijk
źródło
1

Dobry przegląd kodu dotyczy rzeczy, które wymagają znajomości języka - właściwego użycia języka, interfejsów API i bibliotek, stylu, nazw zmiennych itp. - oraz tego, jak dobrze kod rozwiązuje problem - dobre komentarze, odpowiednia architektura, odpowiedni projekt wzorce, uwzględnia wszystkie przypadki błędów itp. Kiedy zaczynasz przeglądać kod, zwykle koncentrujesz się na tym pierwszym. Są łatwiejsze do zobaczenia i łatwiejsze do wybrania. (np. nie lubię twoich nazw zmiennych. Powinieneś używać nazw stylów XXXX.)

Przegląd kodu staje się bardziej wartościowy, gdy większy nacisk kładziony jest na to, jak dobrze kod rozwiązuje problemy. Ponieważ nie możesz teraz zapewnić tak dużej wartości w pierwszym obszarze, skoncentruj się na zadawaniu pytań i udzielaniu porad na temat rozwiązania problemu, a nie na tym, jak to się robi.

Oczywiście nakładają się one na siebie. Znajomość VB.NET pozwoli ci doradzić, dlaczego dany wzorzec projektowy nie jest dobrym wyborem, na przykład w konkretnej sytuacji.

Przede wszystkim bądźcie pokorni na tym etapie. Proces zmiany jest trudny. Nawet jeśli jesteś guru VB.NET, zmiana prawdopodobnie nie będzie łatwa. Osobom, które nie korzystały z recenzji kodu, na początku się to nie podoba. Posiadanie innych osób na twoim kodzie to trudne doświadczenie. Potrzeba czasu, aby zobaczyć wartość i cierpliwość dookoła. To świetny proces, gdy otrzymasz wpisowe, ale zajmie to trochę czasu.

Wayne Johnston
źródło
0

Czy mógłbyś skupić się bardziej na testach niż na bezpośrednim spojrzeniu na kod? Nie mówię, że porzuć recenzje kodu, ale początkowo bardziej sensowne może być, aby te wewnętrzne aplikacje miały wystarczającą liczbę testów, które mogą pomóc w zdekodowaniu części tego, co się dzieje. Chodzi o to, że testy mogą również pomóc ci lepiej zapoznać się z niektórymi funkcjami. Po prostu postrzegam to jako inną drogę. Pomysł polega na tym, że recenzje powracają później i mogą być wykonane w kilku częściach, ponieważ warto mieć sesję przeglądową / wstępną, a potem trochę przerwy. Przerwa ta trwa do następnego dnia lub dwóch, aby każdy miał wystarczająco dużo czasu na zastanowienie się nad kodem lub czymś podobnym przed powrotem z pytaniami i dyskusją.

Oczywiście, jeśli masz już testy, nie ma to niestety znaczenia. Inną myślą jest podanie przykładu, w którym twierdzą, że w VB.Net odbywa się to w szczególny sposób, ponieważ może to pomóc w wyjaśnieniu tego pytania w sposób, w jaki mogę sobie wyobrazić, że różni się od małych standardów kodu do części sedno tego, w jaki sposób VB.Net został zbudowany w pewnym sensie.

JB King
źródło
0

Nawet jeśli nauczysz się podstaw VB, wykonanie przeglądu kodu bez znajomości wszystkich funkcji języka nie pozwoli ci wykryć użycia niepewnych funkcji w języku.

Załóżmy, że nie byłeś świadomy tego, że funkcja input () w Pythonie 2 faktycznie oceniała dane wejściowe przed ich zwróceniem, aby ułatwić parsowanie nie wejściowych typów wejściowych. Wtedy kod byłby podatny na Arbitrary Code Execution, pozwalając użytkownikowi wprowadzić coś takiego jak __import__('os').execl('/bin/sh', '/bin/sh')w systemie Linux, aby zmienić proces Pythona w powłokę. Zamiast tego należy użyć raw_input (), aby uzyskać nieprzetworzone dane wejściowe.

Próba wykonania przeglądu kodu bez znajomości wszystkich funkcji języka może nie tylko uniemożliwić znalezienie lepszego sposobu wykonania określonej procedury w języku; może również prowadzić do szkodliwych wad bezpieczeństwa.

Arcanum
źródło