AI w code review - okładka

Code review z wykorzystaniem asystentów AI

Opublikowano Kategorie AI, Git, Praca w ITCzas czytania 8min

LLM-y mogą nie tylko tworzyć kod, ale również go sprawdzać. W ostatnim czasie miałem okazję przetestować kilka narzędzi pozwalających na przeprowadzenie code review z wykorzystaniem AI. W tym artykule opowiem o nich nieco więcej, podzielę się moimi wrażeniami, oraz opinią na ich temat.

Wszystkie omówione w tym artykule asystenty AI wykorzystywałem w formie integracji z GitHubem. Kolejność omówionych rozwiązań jest nieprzypadkowa. Uporządkowałem je w moim subiektywnym rankingu od tego, z którym pracuje mi się najgorzej, do tego, z którym pracuje mi się najlepiej.

CodeRabbit

Na etapie konfiguracji można skonfigurować, co CodeRabbit ma przygotować w ramach przeprowadzanego review, ton wypowiedzi czy poziom szczegółowości. Narzędzie może przygotować np. ogólny opis zmian czy diagram sekwencji. O ile opis często dobrze odzwierciedla zakres zmian, to diagramy niestety moim zdaniem zwykle nie wnoszą żadnej wartości. Często wyglądają na zrobione na siłę lub opisują zależności widoczne na pierwszy rzut oka. Z narzędziem można również się komunikować i wysyłać zapytania w postaci komend lub czatu w komentarzach pod pull requestem.

CodeRabbit reklamowany jest hasłem “Cut Code Review Time & Bugs in Half”. Jeżeli nasze code review sprowadza się do wyłapywania literówek w nazwach zmiennych, mikrooptymalizacji czy łapana oczywistych błędów to faktycznie może to być prawda. W przeciwnym razie uważam to stwierdzenie za dość mocno przesadzone.

Na moment publikacji review przeprowadzane przez CodeRabbit są na poziomie dociekliwego junior developera. Zdarza się, że zgłosi jakiś istotny problem, czy sensowne propozycje usprawnień. Jednak dość często zostawiane komentarze są mało istotne, odnoszące się do tych mniej ważnych aspektów kodu, nawet w trybie mniej szczegółowego review. Jednocześnie rzadko zdarzało mu się znajdować istotne błędy czy nieścisłości. Zdarzało mu się również zostawiać ewidentnie błędne sugestie.

O przydatności sugestii Code Rabbita może świadczyć to, że po ustawieniu jego konfiguracji, by aktywował się tylko po zawołaniu go komendą, w ciągu kilku miesięcy skorzystałem z niego dosłownie raz.

GitHub Copilot

Podobnie jak w przypadku CodeRabbita, code review zrobione przez GitHub Copilota zawiera ogólny opis zmian. Tu również nie mam większych uwag. Zwykle opis jest poprawny i dobrze przedstawia proponowane zmiany. Dla niektórych plików przygotowuje również osobne podsumowanie.

W przypadku analizy kodu narzędzie radzi sobie co najwyżej średnio. Dość mocno widać, że mamy tu do czynienia z szukaniem podobieństw w kodzie i bazowaniu na wzorcach. Dobrym przykładem takiego zachowania była rozbudowa pliku z deklaracją zdarzenia. W systemie zdarzenie jest zaimplementowane jako klasa oraz opisane w dokumentacji schemą w pliku .yaml. Do klasy zdarzenia dodałem dwie nowe właściwości, które mogły być typu string lub null. Copilot słusznie zauważył, że brakuje zmian w schemie i zasugerował poprawkę. Sugestia zawierała uwzględnienie typu null, jednak podał dwie różne propozycje zdefiniowania go… i obie były niepoprawne. Copilot „wie, że dzwoni, ale nie wiadomo, w którym kościele”. Brakuje mu moim zdaniem analizy logiki kodu, zależności między komponentami w kodzie i konsekwencjami zmian.

Niektóre z komentarzy Copilota są bezsensowne. Przy początkowym użyciu zdarzało mu się zostawiać sugestie np. komentowania oczywistych fragmentów kodu typu proste operacje matematyczne. Jednak po zostawieniu feedbacku Copilot przestał zwracać takie sugestie. Nie jestem jednak w stanie stwierdzić czy faktycznie wynikało to z negatywnej oceny sugestii, czy z przeanalizowania większej części codebase bądź kolejnych pull requestów.

Copilotowi zdarza się również halucynować. Kilkukrotnie zgłosił nieistniejący błąd w istniejącym kodzie. Zdarzyło mu się również zgłosić sugestię poprawki komentarza w konkretnym pliku i konkretnej linii. Jednak takiego komentarza we wskazanym miejscu nie było. Ba, taki komentarz nie istniał w całym codebase projektu.

W moim odczuciu GitHub Copilot robi lepsze review niż CodeRabbit. Jest to dobre narzędzie do łapania drobnych błędów czy nieścisłości. Nadal jednak jest to na tyle niski poziom i powierzchowna analiza kodu, że nie uważam, by wnosił on przełomową wartość do procesu. Zdarza mu się znaleźć istotne błędy w kodzie. Dzieje się to jednak rzadziej niż w przypadku kolejnego narzędzia. Pozostawiam również pytanie, czy w czasie analizy zasadności pozostawionych komentarzy sami nie zrobilibyśmy bardziej wartościowego review.

Cursor Bugbot

Bugbot wypadł zdecydowanie najlepiej z całego zestawienia. W przeciwieństwie do dwóch poprzednich rozwiązań Bugbot skupia się wyłącznie na detekcji błędów. Z jednej strony to dobrze, bo robi to zdecydowanie lepiej niż konkurencja. Być może specjalizacja w jednym aspekcie review wyszła mu na dobre. Z drugiej strony szkoda. Jeśli oferowałby podobną jakość np. w sugestiach refaktoryzacji, to byłaby to całkiem sensowna alternatywa dla review przeprowadzanego przez człowieka.

Bugbot z łatwością wyłapuje proste i oczywiste błędy czy niespójności. Poniżej opisałem kilka przykładów, które napotkałem:

  • zła metoda czy klasa wykorzystana testach;
  • niepoprawnie napisane testy. Wyłapuje nie tylko te, które failują, ale jest w stanie znajdować też false-positives;
  • różnice między dokumentacją zwracanego obiektu a faktycznie zwracaną odpowiedzią;
  • niespójna walidacja tej samej wartości na różnych warstwach aplikacji;
  • przypadkowe usunięcie z codebase istotnego fragmentu kodu np. przy refaktoryzacji.

Jest również wyczulony na potencjalnie niebezpieczne zmiany w kodzie. Przykładowo, gdy świadomie zaimplementowałem breaking change w strukturze danych w bazie danych, Bugbot zgłosił to jako błąd. Mimo tego, że zrobiłem to świadomie to bardzo dobrze, że zareagował. Chciałbym, by poinformował mnie również, gdyby to zrobił nieświadomie. Co istotne, korzystałem z własnego mechanizmu do migracji bazy danych, a nie popularnych rozwiązań. Według moich obserwacji Bugbot „rozumie” znacznie więecj niż konkurencyjne rozwiązania i robi coś więcej niż tylko szukanie podobieństw w kodzie. Narzędzie nie radzi sobie z bardziej złożonymi błędami, wynikającymi np. z architektury systemu. Jednak z tym nawet człowiek może niekiedy mieć problem.

Małym udogodnieniem jet również integracja z Cursorem. Jednym kliknięciem możemy przenieść treść komentarza do czatu w Cursorze wraz z zaznaczonym miejscem, do którego się odnosi. Jeśli nie wiesz, czym jest Cursor, to na blogu znajdziesz dedykowany mu artykuł.

Bugbot nie jest niestety narzędziem idealnym. Zdarza mu się również zgłaszać nieistniejące błędy. Jednak odsetek błędnych sugestii jest nieco niższy niż w przypadku pozostałych rozwiązań. Pojawił się tu jednak inny problem, którego nie doświadczyłem w innych asystentach. W przypadku, gdy zostanie zrobiony resolve na komentarzu z błędną sugestią, z dużym prawdopodobieństwem zgłosi go ponownie za jakiś czas. Dodatkowo często opisuje ten sam błąd innymi słowami, przez co czasami marnujemy czas na ponowną analizę odrzuconej sugestii.

Mimo tych niedogodności Bugbot pozostaje najlepszym narzędziem AI wspomagającym code review z jakim miałem do czynienia na moment publikacji tego artykułu.

Podsumowanie

W omówieniu zabrakło najprostszego wykorzystania LLM-ów w code review — konwersacji z modelami. Czasami po prostu wystarczy podać w wiadomości fragment kodu i zadać nurtujące nas pytanie. Niekiedy to wystarczy. Jednak zwykle nie będzie to tak efektywne, jak wykorzystanie omówionych asystentów. Choćby z uwagi na brak szerszego kontekstu zmian czy dostępu do całości kodu repozytorium.

Moja opinia dotycząca asystentów AI w code review pokrywa się z opinią z jednego z artykułów, który miałem ostatnio okazję przeczytać:

AI reviewers can confirm that the syntax is tidy and the patterns are familiar, but they can’t guarantee the business logic or overall architecture hasn’t secretly gone bananas.

Zachęcam też do podzielenia się w komentarzu swoimi wrażeniami, jeśli miałeś/miałaś okazję korzystać z narzędzi do code review wykorzystujących AI. Szczególnie jestem ciekaw wrażeń pracy z innymi asystentami niż te przedstawione.

Materiały dodatkowe i źródła

Dominik Szczepaniak

Zawodowo Senior Software Engineer w CKSource. Prywatnie bloger, fan włoskiej kuchni, dobrej kawy i miłośnik jazdy na rowerze.

Inne wpisy, które mogą Cię zainteresować

Przygotuj się lepiej do rozmowy o pracę!

Odbierz darmowy egzemplarz e-booka 106 Pytań Rekrutacyjnych Junior JavaScript Developer i realnie zwiększ swoje szanse na rozmowie rekrutacyjnej! Będziesz też otrzymywać wartościowe treści i powiadomienia o nowych wpisach na skrzynkę e-mail.

Dlaczego warto?

  • 👉 Ponad 1000 pobrań e-booka!
  • 👉 60 stron pełnych pytań i zadań praktycznych. Pytania i zadania pochodzą z faktycznych procesów rekrutacyjnych.

E-booka odbierzesz korzystając z formularza poniżej 👇

Okładka e-booka - Kolejna książka o Gicie

Subskrybuj
Powiadom o
guest

2 komentarzy
Najwięcej głosów
Najnowsze Najstarsze
Opinie w linii
Zobacz wszystkie komentarze
BIG
12 godziny temu

W przypadku Github Copilot ogromną różnicę potrafi zrobić dobrze napisany plik z instrukcjami.
(.github/copilot-instructions.md) bez tego to on działa jak junior dev 🙂