GitHub Co-pilot jest opartym na sztucznej inteligencji asystentem kodowania. Znacząco upraszcza on proces tworzenia oprogramowania poprzez automatyczne sugestie dotyczące kodu, analizę składni oraz podpowiedzi kontekstowe. Oczywiście za Co-pilotem stoi LLM od OpenAI czyli OpenAICodex lub GPT-4. Głównymi funkcjonalnościami są:
- Q&A – czat, który odpowie na nasze pytania
- Language Support – tłumaczenie
- Code Suggestions – tworzenie kodu na postawie komentarza opisującego co dany blok powinien robić
- Explain it – tłumaczy na język naturalny co dany blok kodu robi
- Fix it – naprawa błędów w kodzie
- Terminal Fix it Function – propozycja naprawy kodu na podstawie błędu z konsoli
- AI Commit Messages – automatyczne tworzenie opisu commita
- Workspace Agent – odpowiedzi asystenta jest oparta o model oraz cały kod i zestaw plików znajdujący się w “workspace”
- VSCode Agent – podpowiedzi dotyczące komend VSC
Oczywiście GitHub Co-pilot może zostać podłączony do dowolnego IDE. Nie jest to również jedyne narzędzie tego typu dostępne na rynku. Wśród konkurencyjnych rozwiązań można wymienić Tabnine, Bard, CodiumAI. Sam Chat GPT może także służyć jako pomocne narzędzie przy pisaniu kodu. Brakuje mu jednak kontekstu o szerszej strukturze kodu. Ze względu na brak bezpośredniej integracji z IDE wymaga kopiowania bloków kodu, podczas gdy inne narzędzia mogą być używane jako łatwe do zainstalowania wtyczki.
Zalety
Zwiększenie wydajności
Pozwala zautomatyzować powtarzalne czynności podczas pisania kodu, dzięki czemu zwiększamy produktywność oraz zmniejszamy monotypię pracy. W końcu często fragmenty kodu, które pisze programista, wpisuje się w niezbyt skomplikowane mikroschematy, które nie wymagają wiele zastanowienia. Zaoszczędzony w ten sposób czas oraz zwiększone skupienie zespołów można poświęcić na bardziej złożonych, głębszych czy kreatywnych aspektach projektu. Przyspieszenie w ten sposób procesu implementacji pozwala również na tworzenie większej ilości prototypów oraz testowaniu nowych możliwości.
Jakość kodu
Poprzez sugestie dotyczące najlepszych praktyk i standardów kodowania możemy poprawić spójność kodu w ramach projektu oraz zmniejszyć prawdopodobieństwo pomyłek. GitHub Co-pilot całkiem nieźle radzi sobie z pisaniem “Unit” testów, refaktoryzacją kodu, automatycznym typowaniem oraz opisywaniem funkcjonalności (komentarze, docstringi oraz dokumentacja). Może w ten sposób zastąpić narzędzia takie jak PyLint, Black i tym podobne, które oparte są na systemie regułowym, ujednolicającym strukturę kodu.
Szybsza nauka
Tego typu narzędzia mogą być traktowane jako merytoryczne wsparcie dla nowicjuszy i może przyczynić się do szybszego rozwinięcia umiejętności. Oczywiście jeśli chodzi o podstawy, dobre praktyki i analizę gotowych modułów działa to bardzo dobrze. Niestety trzeba być świadomym, że LLMy, w przeciwieństwie do swoich ludzkich odpowiedników, zwykle nie przyznają się do błędu, a potencjalne wykrycie go może być trudne dla nowicjuszy.
Obniżenie progu wejścia
Asystenci i jemu podobne modele są w stanie przy odpowiednim nakierowaniu napisać prostą grę. Wiedza, w jaki sposób to zrobić jest na wyciągnięcie ręki. Wystarczy zapytać samego asystenta o wsparcie w analizie. Zwiększa to dostępność kodowania i pozwala mniej zaawansowanym osobom tworzyć, uczyć się oraz zmniejszyć początkową frustrację.
Zagrożenia
Powielanie błędów
Pojawia się ryzyko związane z błędnym lub też nieoptymalnym rozwiązaniem. Nadmierne poleganie na wygenerowanym kodzie może prowadzić do poważnych problemów w działaniu tworzonych aplikacji. Mniej doświadczeni programiści mogą nie wyłapać niuansów powodujących błędy lub aplikacji zaprojektowanych niezgodnie z przyjętymi wzorcami projektowymi. Dodatkowo generowany kod może zawierać luki bezpieczeństwa, co może wpłynąć na podatność na ataki tworzonych systemów.
Brak głębszego zrozumienia kodu
Asystenci, mimo możliwości operowania na kodzie znajdującym się w “workspace” przy dużej wielkości lub skomplikowaniu kodu mogą generować błędy. Pojedyncze bloki wygenerowanego kodu mogą działać poprawne, ale zależności między nimi mogą skutkować nieprzewidywalnymi zachowaniami. Należy pamiętać, że mamy ostatecznie do czynienia z modelami językowymi, które operują na statystycznych zależnościach słów w języku i nie posiadają jeszcze głębokiego, ludzkiego zrozumienia podawanych im treści.
Utrata samodzielności i krytycznego myślenia
Nieodpowiedzialne użytkowanie może prowadzić do ograniczenia umiejętności programistycznych i upośledzenia umiejętności samodzielnego rozwiązywania problemów. Użytkownicy CoPilota mogą potencjalnie przestać sprawdzać na bieżąco kod proponowany przez model, zakładając jego poprawność a priori. W skrajnym przypadku programiści mogą nie rozumieć wystarczająco systemów, które tworzą, co może powodować problemy przy debugowaniu i dalszym rozwoju.
Kwestie bezpieczeństwa
Podczas korzystania asystent ma dostęp do kodu realizowanego projektu/systemu co przy rozwiązaniach chmurowych może powodować udostępnianie poufnych danych zewnętrznej firmie. Nawet przy założeniu, że firma asystenta przechowuje je w odpowiedzialny sposób, może stać się ona celem ataków cybernetycznych. Dlatego kluczowe dla firm jest ustalenie odpowiedzialnego korzystania z asystentów generowania kodu, oraz zapewnienie bezpieczeństwa wykorzystywanych danych użytkowników.
Kwestie etyczne i prawne
W przypadku obrazów bardzo często poruszane jest naruszanie przez AI praw autorskich. Podobnie jest w przypadku generowania kodu. Modele językowe, uczą się na podstawie gotowych repozytoriów oraz z forów. Firma asystenta generującego kod może także chcieć ulepszać swój system na podstawie kodu, który generują użytkownicy, szczególnie jeśli kod napisany przez asystenta nie różni się znacząco od kodu napisanego przez programistę (a należy pamiętać, że w dłuższej perspektywie czasowej do tego właśnie dąży asystent AI). Przy nieodpowiedniej autoryzacji może to powodować nadużycia lub też wycieki np. kopiowanie kodu bez podania źródła, licencji itp. W przypadku błędów i problemów może występować rozmycie odpowiedzialności między programistą i modelem generującym kod.
Zmniejszona kreatywność i innowacyjność
Asystenci generujący kod mogą wpływać na homogenizacje kodu, co może ograniczać różnorodność i innowacyjność rozwiązań. Zamiast rozwiązań najlepszych (np. najszybszej implementacji) asystent może sugerować rozwiązania najpopularniejsze. Powielania standardowych rozwiązań może powodować zmniejszenie innowacyjności podejść oraz poszukiwania nowych rozwiązań, nie mówiąc już o przypadkowym powielaniu błędnych rozwiązań.
Integracja
Generowany kod może nie spełniać specyficznych wymagań biznesowych lub funkcjonalnych. Zmuszenie modelu językowego do poprawy niektórych zachowań może być bardzo trudne, a przerobienie systemu może powodować duży nakład dodatkowej pracy.
Edukacja
Łatwość uzyskania działającego kodu może także zmniejszyć motywację do nauki i samodzielnego eksperymentowania. Zdobyte umiejętności mogą ograniczać się do powierzchownego rozumienia tematu, a brak pogłębionej wiedzy może prowadzić do problemów z rozwiązywaniem bardziej złożonych problemów.
Wpływ na IT
Modele językowe rozwijają się w zastraszającym tempie, dlatego ciężko jest przewidzieć, jak to wpłynie na branżę. Możemy jednak puścić wodzę fantazji i zaproponować kilka potencjalnych konsekwencji popularyzacji asystentów programowania.
Ewolucja ról programistycznych
Środek ciężkości roli programistów przesunie się z ręcznego pisania kodu na nadzór oraz korektę automatycznie generowanego oraz całościowe projektowanie systemów. Spowoduje to skupienie na wyższym poziomie abstrakcji: projektowanie architektury, podejmowanie kluczowych decyzji i sposobie rozwiązywania złożonych problemów. Łatwość pisania kodu spowoduje większą różnorodność charakterów programistów oraz rozwój umiejętności miękkich jak komunikacja czy praca zespołowa. Ciekawy pogłąd prezentuje przedstawiona poniżej infografika, pokazująca możliwy podział czasu w pracy programisty w 2023 oraz w 2033 roku. Proponuje ona, że pisanie kodu przestanie być priorytetowym zajęciem programisty. Jego rola zamieni się bardziej w rolę architekta systemowego.
Zmiany w edukacji
Zwiększenie dostępności umiejętności programowania może spowodować zmiany w nauczaniu. Podobnie jak internet zmienił “zdobycie informacji” na “weryfikację informacji” asystenci generujący kod mogą zmienić umiejętność implementacji systemów na analizę, ocenę i zapewnienie ich bezpieczeństwa.
Programowanie w języku naturalnym!
Przy eksponencjalnym rozwoju modeli językowych możemy przewidywać, że zamiast wysokopoziomowych języków programowania będziemy używać języka naturalnego do opisu abstrakcyjnych obiektów, które chcemy stworzyć. Podobny trend można zaobserwować już od jakiegoś czasu w tworzeniu stron internetowych, gdzie rozwiązania takie, jak WebFlow, oferują możliwość automatycznego wygenerowania kodu HTML na podstawie graficznego projektu strony internetowej. Oczywiście między naszym wyobrażeniem a wypowiadanymi słowami także występuje pewna kompresja wiedzy, dlatego programista może zmienić nazwę na “Code Supervisor”, “Code Prompt Architect”.
Zmniejszenie liczby miejsc pracy
Z jednej strony, obniżenie progu wejścia do umiejętności może prowadzić do napływu nowych osób do branży programistycznej, co z kolei może zwiększyć konkurencję. Może to oznaczać, że młodzi programiści będą musieli wykazać się większą kreatywnością, innowacyjnością i specjalizacją, aby wyróżnić się na tle konkurencji. Z drugiej strony, dostępność asystentów generujących kod może postawić przed młodymi programistami nowe wyzwania. Automatyzacja niektórych zadań może sprawić, że ich praca stanie się tańsza i łatwiejsza do zastąpienia. To może zmusić ich do rozwijania bardziej zaawansowanych umiejętności, takich jak rozwiązywanie problemów, analityczne myślenie i umiejętności komunikacyjne, aby pozostać konkurencyjnymi na rynku pracy.
Pogłębienie nierówności
Koncentracja tak szybkiego rozwoju napędzanego AI może stworzyć globalny podział cyfrowy. Nieodpowiedzialny rozwój tego typu technologii lub uzależnienie się od dostawców może prowadzić do wprowadzenia płatnego dostępu, co może spowodować pogłębienie nierówności w społecznych. Ważne jest, aby ograniczyć szkodliwy wpływ nierówności dostępowych przez odpowiednie regulacje prawne i inicjatywy na poziomie państw, regionów, firm.
Podsumowanie
Asystenci programowania to potężne narzędzia, które mogą pomóc programistom w zwiększeniu produktywności, poprawie jakości kodu i ułatwieniu uczenia się. Obiecują one perspektywę przyszłej pracy, która pozbawiona jest nudnych i powtarzalnych czynności, pozwalając się skupić na bardziej interesujących aspektach programowania. Należy jednak pamiętać, że nie są one w stanie zastąpić ludzkiej kreatywności i umiejętności rozwiązywania problemów. Programiści powinni nadal rozwijać swoje umiejętności kodowania ręcznego i wykorzystywać asystentów programowania jako narzędzia wspomagające, a nie jako zamienniki. Ponadto, podobnie jak w innych obszarach rozwoju generatywnej sztucznej inteligencji, należy brać pod uwagę zagrożenia płynące z nieograniczonego i nieprzemyślanego rozwoju i stosowania jej.
Bibliografia
Is GitHub Copilot Worth It? An In-Depth Review with Examples – DEV Community
Microsoft to Ship an On-Device Phi-Silica AI Model With All Copilot+ PCs
Świetny artykuł! Bardzo dokładnie opisuje zarówno szanse, jak i wyzwania związane z wprowadzeniem kryptowalut, NFT i technologii blockchain do współczesnej…