GitHub Copilot – moje wrażenia

O Copilocie pierwszy raz usłyszałem rok temu, na fali popularności ChataGPT. Przejrzałem pobieżnie informacje o nim na oficjalnej stronie, ale nie miałbym zastosowania prywatnie, więc nie chciałem na to wydawać pieniędzy.

Bodajże w czerwcu w pracy pojawiła się możliwość dołączenia do pilotażowych testów Copilota (a później także Google Gemini). Od razu się zgłosiłem, zwłaszcza, że liczba licencji była ograniczona. Ostatecznie okazało się jednak, że oprócz mnie w moim zespole zainteresowanie nie było duże, co mnie mocno zaskoczyło. Do całego programu testowego dołączyło ostatecznie kilkunastu developerów.

Po instalacji dodatku do Visual Studio i Visual Studio Code oraz konfiguracji (która ze względu na trochę słabe przygotowanie do tych testów od strony infrastruktury sprawiała trochę problemów), zacząłem używać Copilota.

Pierwszych kilka godzin nie robiło na mnie wrażenia. Gdy wpisałem w kodzie komentarz, to przeważnie chcąc zrobić jakąś operacje na strukturach danych, dostawałem sugestie wprawdzie poprawne, ale jakby zupełnie oderwane od kontekstu. Dla jakiekolwiek zadania, które wymagałoby sięgnięcia do kontekstu kodu, który przecież Copilot na bieżaco wysyła, nie dostawałem sugestii. Byłem nieco rozczarowany, bo oglądałem fancy prezentacje na stronie, a tu w zasadzie dostawałem podpowiedzi jakby z góry stack overflow, które oszczędzały mi kilka sekund na wbicie tematu do Google. Jeżeli to ma tak wyglądać, to słabo, bo niewiele mi to daje, a wepchałem się w testy, do których trzeba będzie wypełniać ankiety, uczestniczyć w spotkaniach, itd.

Kolejnego dnia, gdzieś po łącznie 4 godzinach pracy z Copilotem, okazało się, że widocznie na początku zbierał więcej danych z pracy ze mną. W pewnym momencie, pracując nad regularnym taskiem, Copilot nagle zaczął zaskakiwać. Zadanie nie było skomplikowane, rutynowe dodanie nowej kolumny do tabeli, a więc odwzorowanie jej w modelach, użycie w kilku klasach, zareagowanie na jej wartość. Dodałem ją więc do pierwszego modelu i w kolejnych już nie musiałem nic pisać, Copilot od razu sugerował gotową linię do potwierdzania tabem. Nie była to jednak sucha sugestia – kilka modeli ze względu na swoją właściwość miało nieco przeredagowane nazwy pól w zależności od pochodzenia. Copilot ogarnął to i dostosował się do konwencji obowiązujących w bieżących plikach. To wywołało już moje zainteresowanie, bo odbiegało od tego, co znałem dotychczas z sugestii np. IntellisSense.

Dalej było już coraz ciekawiej. Od dawna pracuję w ten sposób, że po analizie tematu dodaję sobie w kodzie komentarze z atomicznymi rzeczami do wykonania, opatrzonymi adnotacją todo. Potem już przeważnie tylko oprogramowuję te komentarze. Copilot bardzo taki przebieg pracy lubi, bo od razu wie, co będzie potrzebne. Po dodaniu tego typu komentarzy, przechodząc pod każdy z nich przeważnie miałem gotową sugestię. I były to sugestie zarówno do wtórnych, powtarzalnych operacji na strukturach danych (np. operacje na listach), jak i zadań, które wymagają już posiadania wiedzy o kontekście (np. wywołanie istniejącego CQRS query z odpowiednimi parametrami i obsłużenie zwrotki).

Z czasem zrobiło się sympatycznie – gdy analizowałem kolejne tematy i dodawałem komentarze do oprogramowania w kodzie, dostawałem sugestie… treści komentarzy po polsku pisanych moim stylem językowym. I nie było to wtórne użycie czegoś, co już wcześniej napisałem – były to nowe słowa, nieużywane wcześniej w kodzie tych projektów, odpowiednio odmienione, w szyku zdania specyficznym dla mnie. To był początek efektu wow, jaki zacząłem odczuwać.

Następnie przeszedłem do rozwijania frontendu. Tu było już grubo. Pisząc w TS z użyciem Angulara+NgRx+RxJS dostawałem sugestię całych, gotowych efektów NgRx, w których nie musiałem poprawić ani jednego znaku. Tak – efekt dla konkretnej akcji, odpowiednio przefiltrowany, dispatchujący inne akcje i wykonujący dodatkową logikę. To wszystko na podstawie kodu zawartego w kontekście i kilku komentarzy. W tym momencie zakochałem się w Copilocie i już wiedziałem, że w najbliższym czasie będę fanatykiem tego narzędzia.

Praca z Copilotem to coś świetnego. Wspomaganie rozwoju oprogramowania na poziomie, którego dotąd nie znałem w kilkunastoletniej karierze zawodowej i ponad 20 latach programowania ogółem. Pomaga na wielu różnych polach. Chcę coś zrobić z kolekcją, czego nie wykonuje się zbyt często? Do tej pory po prostu wbijałem temat w Google, żeby sobie go odświeżyć, trafiałem na stackoverflow, odwzorowywałem odpowiedź w kodzie. Teraz nie muszę, dostaję gotową sugestię. Chcę zrobić coś więcej na danych, czego nigdy wcześniej nie robiłem? Piszę szczegółowy komentarz i dostaję sugestię. Chcę zrefaktoryzować kod? Zmieniam w kilku miejscach i dostaję kilkanaście gotowych sugestii dalszych zmian. Chcę wyciągnąć coś z innego miejsca kodu projektu? Dostaję podpowiedź. Nawet, gdy nie oszczędzały one jakoś znacząco czasu, to ograniczały konieczność ręcznego wklepywania nużących operacji. A to już wpływa widocznie na motywację i efektywność pracy.

Początkowo nie korzystałem praktycznie wcale z chata Copilota. Ot, wpisałem kilka pytań, promptów, ale nie wciągnęło mnie to. Sugestie dostarczały mi wystarczającej liczby wrażeń. To zmieniło się niedawno, gdy próbowałem znaleźć w Google rozwiązanie problemu i wciąż dostawałem nieadekwatne do frazy pytania. Google pod tym kątem jest od co najmniej kilku miesięcy frustrujące. Przykład? Potrzebuję rozwiązania jakiegoś problemu w TypeScripcie. Wpisuję frazę zawierającą typescript i dostaję na pierwszej stronie wyniki dotyczące JavaScriptu z odpowiedziami na stackoverflow sprzed 10 lat, czego właśnie chciałem uniknąć. Wpisuję typescript w cudzysłowie – dalej to samo. Z jakiegoś powodu algorytm zamienia sobie typescript na jego zdaniem synonim i takie wyniki mi sugeruje. Copilot nie miał z tym problemu, dostarczył w kilka sekund rozwiązanie w TS, które opisywało dokładnie to, czego chciałem. Ale znowu na wyższym poziomie: oprócz samego kodu okraszonego linkami do źródeł, dostaję wyjaśnienie linia po linii otrzymanego kodu, a na końcu propozycję integracji go z moim kodem, który mam właśnie otwarty. Jeżeli jest poprawny, wystarczy zaakceptować rozwiązanie i Copilot sam wciśnie zasugerowany kod do pliku, na którym pracuję. Jeżeli odpowiedź mi się nie podoba, mogę napisać to na chacie i odpowiedź zostanie zmieniona tak, aby odpowiadać moim wymaganiom.

Chata używam też do lepszego zrozumienia zastanego kodu. Czasem, gdy trafiam na coś nowego, po prostu zaznaczam to i proszę Copilota na chacie o wyjaśnienie, i dostaję takowe razem z przykładami i odnośnikami do materiałów, które mogą mi się przydać. Mogę też poprosić o znalezienie słabych punktów kodu, który napisałem, zlecić refaktoryzację albo stworzenie testów jednostkowych.

Chat pomaga też w rozwiązywaniu problemów. Kod wpisany z pamięci jest błędny? Pytam o przyczynę na chacie, dostaję mój kod, ale poprawiony. Aplikacja wysypuje się na określonej klasie z jakimś błędem? Podaję ten błąd na chacie wskazując, że występuje w bieżącej klasie. Dostaję odpowiedź, na co mam zwracać uwagę.

No dobra, a co z wadami? Zauważyłem dwie, które mają dla mnie znaczenie. Pierwsza to typowa cecha dla AI – halucynacje. Czasem Copilot zbyt mocno chce przekazać sugestię nawet, gdy ma za mało danych lub z jakiegoś powodu nie potrafi tych danych prawidłowo przetworzyć. Zdarza się więc, że np.

  • tworzę jakąś klasę, powiedzmy CreateBook,
  • używam jej w innym miejscu kodu wraz z przekazaniem odpowiednich danych i obsłużeniem zwrotki,
  • następnie tworzę klasę w stylu ChangeBook,
  • tak samo, jak poprzednio, chcę jej użyć, przekazując wybrane dane i zrobić coś ze zwrotką,
  • Copilot sugeruje poprawny kod z wyjątkiem jednego błędu: w nazwie klasy używa nieistniejącej w projekcie nazwy EditBook zamiast istniejącej ChangeBook.

Widać więc, że mimo, że Copilot posiada w kontekście wymaganą klasę, to nazwę podpowiada raczej na podstawie analizy leksykalnej niż stanu faktycznego w projekcie. Zdarza się to dość rzadko i jest łatwe do wyłapania, ale przypomina, że kodu sugestii trzeba pilnować. Nie wiadomo przecież, czy w przyszłości nie zasugeruje czegoś, co będzie poprawne pod kątem składni, ale spowoduje błąd dopiero w fazie uruchomienia aplikacji.

Drugą wadą jest knowledge cutoff. W przypadku wersji, z której korzystam, przypada on na październik 2023. Przeważnie nie jest to problem, ale staje się nim, gdy potrzebuję rozwiązać problem z dynamicznie zmieniającymi się bibliotekami. I tak na przykład ostatnio pytając o znaczenie składni bloku z Angulara dostałem odpowiedź, że nie jest to prawidłowy kod Angulara i że to na pewno pochodzi z innej technologii. Gdy wskazywałem działający kontekst nadal twierdził swoje i ostatecznie wpadłem na pomysł, że może nie znać tej wersji biblioteki. Tak faktycznie było – gdy spytałem o to wprost, Copilot na chacie podał swoją datę knowledgle cutoff, a dyskutowana składnia została wprowadzona w Angularze 17, który wyszedł kilka miesięcy po tej dacie.

Wadą może wydawać się też negatywny wpływ takiej pracy na programistę. Bo przecież gdy sporo kodu dostajemy w sugestiach, może to rozleniwiać i powodować, że rzeczy, które Copilot regularnie sugeruje, będziemy wypierać z pamięci. Jest takie ryzyko, jednak trzeba pamiętać, że otrzymany kod powinniśmy każdorazowo weryfikować, co powinno nas uchronić przed amnezją w tej kwestii. Przyszło mi do głowy ostatnio, że podobne wątpliwości pojawiały się wraz z rozwojem IDE. Kilkanaście lat temu trafiałem na poważne zarzuty, że rozwój technik wspomagania pracy z kodem jak np. początkowo sugerowanie typów, metod, funkcji, itd., a później IntelliSense, prowadzi do ogłupienia i pogorszenia pamięci, bo przestajemy zapamiętywać argumenty często używanych metod i ich kolejność… Czy dzisiaj jest ktoś, kto z tego nie korzysta? Wydaje mi się, że podobnie będzie za kilka lat (lub nawet kilkanaście miesięcy) ze wspomagaczami AI.

Podsumowując – Copilota mocno polecam. Jeżeli masz możliwość otrzymania licencji w pracy, to nie zastanawiaj się i bierz, zmieni to trwale Twój sposób pracy na plus. Jeżeli masz przestrzeń na jego użycie w prywatnych projektach, to przynajmniej przetestuj. Sądzę, że nie ma od tego odwrotu i niedługo stanie się nieodłącznym elementem otoczenia developerów.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Time limit is exhausted. Please reload CAPTCHA.