GA dzisiaj
Dzisiaj, 21 czerwca 2022, GitHub Copilot przestaje być technical preview. Ogłoszenie preview jest z 29 czerwca 2021, więc bramka w postaci listy oczekujących utrzymała się prawie równo rok. Od dzisiaj nie ma listy. Jest cennik.
Changelog GitHuba mówi krótko: dostęp indywidualny kosztuje 10 USD miesięcznie albo 100 USD rocznie. Do tego jest 60 dni bezpłatnego trialu. Zweryfikowani studenci i osoby utrzymujące popularne projekty open source mają Copilota za darmo. Kto siedział w technical preview, ma darmowy dostęp jeszcze do 22 sierpnia 2022, a potem albo wchodzi w subskrypcję, albo mu się rozszerzenie wyłącza.
Widziałem dzisiaj w sieci relacje, w których ludzie z preview od razu dostają w edytorze prompt o triallu, i widziałem takie, w których nic się nie zmienia. Nie zamierzam rozstrzygać zrzutów ekranu. Trzymam się tego, co jest napisane w Changelogu: darmowy dostęp dla preview-owców trwa do 22 sierpnia, trial to 60 dni, cena to 10 albo 100 dolarów. Reszta to szczegół wdrożeniowy, który sam się wyprostuje w ciągu tygodnia.
Piszę ten wpis, bo mam wrażenie, że w tekstach o dzisiejszej premierze gubi się jedna rzecz. Dla mnie, jako użytkownika preview od kilku miesięcy, dzisiaj zmienia się bramka dostępu i billing. Nie zmienia się sposób pracy. To dalej jest szary tekst w edytorze, dalej Tab i Esc, dalej brak jakiegokolwiek miejsca, w którym można by o coś zapytać. Jeżeli ktoś czekał, aż wyjście z preview dorzuci nową kategorię funkcji, to dzisiaj jej nie dostał.
Przy okazji GitHub powtarza w notce swoją metrykę: w plikach z włączonym Copilotem około 40 procent kodu ma być napisane przez model, przy czym mowa o popularnych językach. To jest twierdzenie GitHuba z dnia premiery, nie mój pomiar. U siebie liczyłem coś zupełnie innego i węższego, o czym pisałem przy szkieletach testów: oszczędność w okolicach jednej trzeciej naciśnięć klawiszy i zero procent decyzji. Te dwie liczby nie są tą samą liczbą i nie należy ich zestawiać.
Co kupuję, a czego nie
Kupuję subskrypcję indywidualną. To jest wszystko, co dzisiaj jest do kupienia, i warto to powiedzieć wprost, bo widzę już pytania w stylu “ile to kosztuje dla zespołu piętnastu osób”.
Planu firmowego dzisiaj nie ma. GitHub pisze w ogłoszeniu, że wersja dla firm pojawi się później w tym roku. To jest zapowiedź, a nie pozycja w cenniku, więc nie da się jej dzisiaj wpisać do budżetu i nie da się jej dzisiaj kupić. Nie ma też licencji przypisywanej do organizacji ani centralnego zarządzania miejscami. Jeżeli w zespole ma być pięć osób z Copilotem, to dzisiaj oznacza to pięć osobnych subskrypcji indywidualnych na pięciu prywatnych kontach.
Dla mnie, przy pracy na kontraktach B2B, ma to konkretną konsekwencję. Subskrypcja jest przypięta do mojego konta GitHub, a nie do organizacji, w której akurat pracuję. Płacę więc sam i traktuję to jak każde inne narzędzie w moim warsztacie, dokładnie tak samo jak licencję na edytor czy hosting. To upraszcza jedną rzecz i komplikuje drugą. Upraszcza rozliczenie, bo nie muszę nikogo prosić o zgodę na wydatek. Komplikuje decyzję o tym, gdzie tę wtyczkę włączam, bo posiadanie subskrypcji nie jest tym samym co zgoda na wysyłanie fragmentów cudzego repozytorium do zewnętrznej usługi. Ta zasada nie zmienia się dzisiaj ani o milimetr: Copilota mam włączonego tam, gdzie mam na to jasną zgodę, i wyłączonego wszędzie indziej. Zmiana statusu produktu z preview na GA nie jest zgodą właściciela kodu.
Trial 60 dni traktuję jako to, czym jest: okno na policzenie, czy 10 dolarów miesięcznie to dobra cena za to konkretne narzędzie w moim konkretnym stacku. Odpowiedź znam z grubsza, bo używam preview od miesięcy, ale mam luty i marzec spisane, więc porównanie mam z czego zrobić.
IDE w dniu GA
Środowisko na dzisiaj wygląda tak samo jak wczoraj, tylko bez waitlisty.
Codziennie pracuję w VS Code. Aktualna linia to 1.68, konkretnie 1.68.1 z 14 czerwca, i to jest wersja, w której to wszystko sprawdzam. Rozszerzenie to nadal GitHub.copilot, instalowane tak samo jak w lutym, z tą jedną różnicą, że po zalogowaniu nie ma już komunikatu o braku dostępu do preview, tylko ścieżka do subskrypcji.
Poza VS Code jest kilka innych opcji i wszystkie są sprzed dzisiaj. Rozszerzenie do Visual Studio 2022 wyszło 29 marca, więc kto siedzi w dużym IDE od Microsoftu, ma je od wiosny. Jest plugin do Neovima i jest rodzina JetBrains. Wybór edytora nie jest tu żadną decyzją strategiczną, bo produkt w każdym z nich robi to samo.
I najważniejsze zdanie tej sekcji, bo widzę, że przy okazji GA wraca oczekiwanie czegoś większego: to nadal jest rozszerzenie do uzupełniania kodu, a nie panel do rozmowy. Nie ma okna czatu. Nie ma pola, w które wpisuję pytanie i dostaję odpowiedź w akapitach. Nie ma “wyjaśnij mi tę klasę” i nie ma “napisz testy do tego pliku” jako polecenia wydanego narzędziu. Jest kursor, jest kontekst pliku i jest szary tekst przed kursorem.
Dzień z ghost textem
Skoro sposób pracy się nie zmienia, to sensowniej niż opisywać instalację jest opisać, jak wygląda ten dzień naprawdę. Mam do tego dwa klawisze i dość jasny podział.
Tab wciskam wtedy, gdy podpowiedź jest powtórzeniem czegoś, co już jest w projekcie. Konkretnie: konstruktor przypisujący pola, mapowanie DTO na model, kolejny przypadek parametryzowany różniący się jedną wartością, zestaw using na górze pliku, szkielet metody, której sygnaturę napisałem sam. Wspólny mianownik jest zawsze ten sam. Podpowiedź jest dobra dokładnie wtedy, kiedy wzorzec jest już widoczny w pliku albo w sąsiedniej zakładce. Copilot nie wymyśla mi lepszej konwencji. Odtwarza tę, którą widzi. Jeżeli jej nie widzi, odtwarza konwencję internetu, a ta w kodzie testowym oznacza Thread.Sleep, absolutne ścieżki XPath i asercje typu “coś tam jest”.
Esc wciskam bez czytania do końca w czterech przypadkach i ta lista nie zmieniła się od marca.
- Asercja. To jest jedyne miejsce w teście, które faktycznie coś stwierdza, i model nie ma skąd wiedzieć, co ma stwierdzać. Podpowiedź w stylu “lista komunikatów nie jest pusta” jest prawdopodobna i bezwartościowa, bo przechodzi także wtedy, gdy aplikacja wypisze zupełnie inny komunikat.
- Lokator. Selektor wygenerowany z pamięci wygląda wiarygodnie i pochodzi z cudzego drzewa DOM. To najgorsza kategoria, bo przechodzi review wzrokiem i wywala się dopiero na przebiegu. Zasady, które ustaliłem przy refaktorze page objectów, obowiązują tak samo, gdy kod napisał się sam.
- Wszystko, co wygląda na sekret albo na prawdziwe dane osobowe. Adres e-mail w domenie popularnego dostawcy poczty, numer telefonu, cokolwiek, co przy audycie ktoś weźmie za dane użytkownika.
- Kod, którego nie rozumiem. Jeżeli muszę się zastanowić dłużej niż chwilę, co ta podpowiedź właściwie robi, to szybciej jest napisać ją samemu niż ją odcyfrować.
Zmiana, jaką przyniósł ostatni kwartał, nie jest w narzędziu, tylko w moim tempie. Piszę kod szybciej i to znaczy, że wcześniej dochodzę do miejsca, w którym trzeba podjąć decyzję. Recenzja diffu przed commitem zostaje w całości moja i staje się przez to ważniejsza, a nie mniej ważna. Nie commituję testu, którego nie uruchomiłem, i robię drugi przebieg, w którym sprawdzam, czy test w ogóle potrafi być czerwony. To jest ta sama zasada, którą trzymam od lat, tylko wykonywana częściej.
Filtr i recytacja
Jedna rzecz w produkcie zmienia się dzisiaj poza cenami i warto ją odnotować, bo dotyczy tego, co ląduje w repozytorium.
Od czerwca w ustawieniach jest opcjonalny filtr, który blokuje sugestie pokrywające się z publicznym kodem w blokach mniej więcej stu pięćdziesięciu znaków lub dłuższych. To jest przełącznik, nie narzędzie do sprawdzania pochodzenia kodu. Nie pokazuje, z jakiego repozytorium coś pochodzi, i nie pokazuje licencji. Blokuje albo nie blokuje.
Kontekst dla tej opcji jest z zeszłego roku. GitHub opublikował 30 czerwca 2021 własne badanie recytacji: jak często model wypluwa fragment powtarzający istniejący kod dosłownie. Wyszło im rzędu 0,1 procent przypadków, przy czym rozkład nie jest równomierny i recytacja zdarza się częściej wtedy, gdy plik jest pusty i model nie ma się czego złapać. W tamtym badaniu wykrywanie takich powtórzeń nie było jeszcze wpięte w produkt. Dzisiaj przełącznik jest, i to jest realna różnica względem lutego.
Nie zmienia to natomiast mojego procesu. Filtr działa na długich blokach, a ja mam do czynienia głównie z krótkimi podpowiedziami, których żaden próg znakowy nie złapie. Czytam diff tak samo jak wcześniej, bo to jedyny mechanizm, który działa na całej powierzchni problemu.
Nadal nie Completions i nie czat
Rok temu, w czerwcu 2021, opisywałem eksperyment z generowaniem danych testowych przez API Completions. Widzę, że przy okazji dzisiejszej premiery obie rzeczy znowu lądują w jednym worku pod hasłem “modele językowe”, więc rozdzielę je jeszcze raz, bo GA niczego tu nie scaliło.
Tamto było wywołaniem HTTP. Endpoint z davinci w adresie, prompt few-shot budowany ręcznie, temperature, max_tokens, stop, odpowiedź w tekście, walidacja schematem i dopiero wtedy plik w repozytorium. Pełna kontrola nad wejściem, pełna odpowiedzialność za sklejenie wyniku z projektem, efektem są dane.
Copilot jest po drugiej stronie. Promptem jest mój otwarty plik i komentarz, który w nim napiszę. Nie ma parametrów, nie ma klucza w zmiennej środowiskowej, nie ma odpowiedzi, którą mogę zwalidować, bo odpowiedź od razu jest w edytorze. Efektem nie jest artefakt, tylko sposób, w jaki powstał mój kod, i po zaakceptowaniu nie da się go odróżnić od tego, co wpisałem palcami.
Dzisiejsze ogłoszenie nie dodaje do Copilota okna rozmowy. Nadal nie ma miejsca, w którym zapytam narzędzie, dlaczego zaproponowało akurat to. Cały kanał wejściowy to plik, a cała weryfikacja to czytanie kodu.
Ryzyko, które zostaje
Lista rzeczy, o których trzeba pamiętać, jest dzisiaj dokładnie ta sama co wczoraj. Zapłacenie za produkt niczego z niej nie zdejmuje.
Telemetria i wysyłka kontekstu. Żeby dostać podpowiedź, fragment mojego pliku wychodzi do usługi. Usługa zapisuje też, co akceptuję, a co odrzucam. Nie ma trybu offline. To jest wciąż główny powód, dla którego decyzja “gdzie to włączam” jest poważniejsza niż decyzja “czy to kupuję”.
Bezpieczeństwo sugestii. W sierpniu 2021 badacze z NYU przepuścili wygenerowany kod przez zestaw scenariuszy zbudowanych wokół typowych klas podatności i sporo programów miało lukę: brak walidacji wejścia, złe potraktowanie danych z zewnątrz, słabe użycie kryptografii. To nie jest zarzut, tylko opis mechanizmu. Model proponuje kod podobny do tego, który widział, a kod, który widział, bywa dziurawy. Warto tę pracę trzymać osobno od metryki GitHuba z dzisiaj; obie mówią o czterdziestu procentach, ale liczą zupełnie inne rzeczy.
Przestarzałe API. Podpowiedzi z wzorcami, których w .NET 6 się już nie używa, albo z wywołaniami synchronicznymi na ścieżce, która u mnie jest asynchroniczna. To się kompiluje, więc łapie się tylko okiem.
Dane wyglądające jak prawdziwe. Przy generowaniu przykładowych rekordów potrafią wypaść adresy i numery, które wyglądają na czyjeś. W fixtures trzymam się domen dokumentacyjnych.
Warstwa poniżej kodu. Copilot nie wie, jaki obraz mam w rejestrze, ile pamięci ma agent na CI i czy port jest wolny. Kiedy piszę test integracyjny w miejscu, gdzie bazę stawiam Testcontainers, ghost text bardzo płynnie proponuje konfigurację kontenera z API niezgodnym z przypiętą wersją pakietu. Podobnie z izolacją przy równoległym uruchamianiu testów na CI: szybsze pisanie testu nie załatwia ani jednego problemu ze współdzielonym stanem. Infrastruktura zostaje moja w stu procentach.
Odpowiedzialność. GitHub mówi to od początku i powtarza dzisiaj: kod napisany z pomocą Copilota należy do mnie i ja za niego odpowiadam. Zapłacona faktura nie przenosi tej odpowiedzialności na dostawcę.
Podsumowanie
Dzisiaj wypada podjąć jedną decyzję: płacę 10 dolarów miesięcznie albo kończę na trialu. Do 22 sierpnia jeszcze nic nie muszę, bo dostęp z preview działa. Ja zostaję, i to nie dlatego, że narzędzie robi coś nowego, tylko dlatego, że od kilku miesięcy oszczędza mi realną, nudną część klepania, a ja mam wypracowany nawyk odrzucania tego, czego odrzucać trzeba.
Nawyk jest tu ważniejszy niż cena. Trzy zasady z preview zostają bez zmian: napisz konwencję zanim poprosisz o kod, czytaj asercję i lokator znak po znaku, uruchom test lokalnie i sprawdź, czy potrafi być czerwony. Wyjście z technical preview nie zmienia charakteru narzędzia. To dalej jest przewidywanie kolejnej linii na podstawie tego, co widać w pliku.
Dla zespołów odpowiedź na dzisiaj brzmi: jeszcze nie teraz. Plan dla firm to słowa GitHuba o “później w tym roku”, więc dzisiaj można kupić wyłącznie subskrypcje indywidualne i trzeba żyć z tym, że są przypięte do prywatnych kont. Kiedy pojawi się oferta dla organizacji, wróci osobne pytanie o zgody, o zarządzanie miejscami i o to, w których repozytoriach to w ogóle wolno włączyć.
I rzecz, którą powtarzam za każdym razem, kiedy w warsztacie pojawia się szybsze narzędzie. Tempo pisania kodu urosło, a to nie jest to samo co poprawa jakości. Miejsce, w którym decyduje się, czy zestaw testów cokolwiek znaczy, nadal leży w procesie, a nie w edytorze. Rok temu zamykałem podsumowanie 2021 stwierdzeniem, że modele językowe siedzą u mnie w kategorii “eksperyment przy biurku”. Po dzisiejszym dniu przenoszę je do kategorii “narzędzie, za które płacę”. To jest przesunięcie o jedną półkę, nie zmiana zawodu.

