GitHub Copilot:
Evoluce nebo úpadek programátorů?

Martin Trnečka,

Tento článek je souhrn mého pohledu programátora a vysokoškolského pedagoga na použití GitHub Copilot (dále jen Copilot) a dalších podobných technologií využívajících velké jazykové modely (LLM) v programátorské praxi a ve výuce programování.

Až do nedávna jsem jako programátor Copilota aktivně nevyužíval. Samozřejmě jsem jej ze zájmu vyzkoušel, ale ne natolik, abych si na něj vytvořil ucelený názor. Jako pedagog jsem se s ním, respektive s jeho výstupem, stejně jako téměř všichni mí kolegové, kteří učí programovací předměty v běžných programovacích jazycích, setkával často. V době psaní tohoto článku mi jeden kolega řekl, že 90 % úkolů odevzdaných v jeho předmětu je realizováno za pomocí Copilota nebo podobné technologie. To samozřejmě není možné generalizovat na všechny předměty, ale obecně můžeme říct, že počet studenty odevzdaných úkolů realizovaných pomocí Copilota postupně roste.

Před nějakou dobou se mi naskytla příležitost Copilota intenzivně otestovat na několika projektech různého rozsahu. V průběhu jejich řešení jsem diskutoval střípky čerstvě získaných zkušeností s mnoha kolegy a studenty. Přestože jsem své zkušenosti nepovažoval za příliš zajímavé, jejich zpětná vazba mě přesvědčila o opaku. V té době se zrodily první myšlenky na vytvoření tohoto článku. Zlomovým bodem byla nenápadná změna v myšlení, kterou jsem zaznamenal při používání Copilota, která mě finálně motivovala tento článek sepsat.

Článek shrnuje mé subjektivní zkušenosti s Copilotem a nelze jej chápat jako kritku Copilota a Copilotu podobných technologií, přestože to tak někdy bude vyznívat. Článek jsem psal v souladu s Kranzbergovým 1. zákonem technologií: „Technologie nejsou dobré, špatné ani neurální.“ [1]. Koncipoval jsem jej pro studenty informatiky a přál bych si, aby sloužil k zamyšlení. Udělat si vlastní názor a nalézt odpovědi na některé otázky v článku položené je už na vás.

Kdo neumí učí

Než začneme, měl bych říct, kdo vlastně jsem. Pracuji jako odborný asistent na Katedře informatiky Univerzity Palackého v Olomouci. To znamená, že moji primární prací je: výzkum, konkrétně se zabývám úzkým odvětvím machine learningu; výuka; a mnoho byrokracie. Učím zejména technologicky zaměřené předměty a předměty zaměřené na programování.

Možná si říkáte, že kdo neumí, učí. Vlastně na tom něco bude. Ale mojí filozofií vždy bylo, že pokud chci učit programovat, sám musím programovat. Programování mě baví a potřebuji jej, byť v malé míře, i ke svému výzkumu.

Troufnu si ale říct, že v jedné oblasti programování mám poměrně dobré zkušenosti. Tato oblast by se dala nepřesně vymezit jako tvorba webových aplikací, které se věnuji již 25 let. Několik let jsem se jí i živil a v současnosti se mi párkrát do roka naskytne příležitost pracovat na nějakém projektu.

Experiment

Vždy, když se mi taková příležitost naskytne, přestože je to časově náročné, snažím se z ní vytěžit maximum. Rád zkouším nové technologie, architektury a celkově k realizaci přistupuji tak, abych se něco nového naučil a to mohl přenést do výuky. Věřím, že výuka, kde nepředáváte zkušenosti, nemá smysl.

Ke konci roku 2024 jsem byl osloven, zda bych nevytvořil tři různé webové aplikace. První aplikace byla webová stránka pro konferenci. Jednalo se spíše o prezentační web s rozsáhlejším registrační formulářem a jednoduchou administrací. Druhá stránka byla podobného zaměření, ale měla již rozsáhlejší administrační rozhraní a větší funkcionalitu na frontendu. Poslední aplikace byla nejrozsáhlejší a byla plnohodnotnou webovou aplikací s důrazem na administrační rozhraní. Kromě těchto tří projektů jsem v té době ještě pracoval na frontendu aplikace pro analýzu dat.

Moje první reakce byla projekty odmítnout, protože konec roku je časově nejnáročnější období v roce. Ostatní na tom nejsou o moc lépe, ale konec roku je zkrátka náročný. Tato možnost ale nepřipadala v úvahu. Rozhodl jsem se tedy, že zkusím použít Copilota, který měl podle proklamovaných informací programování usnadnit. Jak jsem již psal, neměl jsem s jeho aktivním využíváním prakticky žádné zkušenosti. Zaplatil jsem si jej a pustil do práce.

Nový kamarád

S Copilotem jsem se velmi brzy sžil. Přeci jen naučit se používat klávesu tab nevyžaduje moc mentální kapacity. Moje produktivita psaní kódu se výrazně zvýšila. Například napsat dva vnořené cykly: napíšeme for, zmáčkneme tab a hotovo. Super! Připadal jsem si, jako bych měl k ruce několik dalších programátorů, kterým zadávám práci. To, co by mi normálně zabralo týden práce, bylo za pár hodin hotovo. Byl jsem plný optimismu, a přestože jsem si z počátku nemyslel, že je možné projekty v tak krátkém čase zvládnout, najednou se zdálo, že to možné je. Jenže doposud to byla jen programátorská rutina. Takové ty nudné věci, které nevyžadují moc přemýšlení.

V rámci jednoho projektu jsem se rozhodl vytvořit vlastní Object Relation Maping (ORM) systém. To už není úplná programátorská rutina. Vlastně je to poměrně náročné, jelikož to vyžaduje rozmyslet a rozhodnout mnoho často vylučujících se aspektů. Myslel jsem si, že mi Copilot opět práci usnadní, jenže neusnadnil.

Brzy jsem si všimnul, že mě jeho nápovědy rozptylují. Při psaní kódu jsem se zatavil, abych si promyslel, co dál, ale místo toho jsem začal číst často nesmyslné doporučení. Pravdou je, že ne vždy byly úplně nesmyslné, ale nikdy úplně nezapadaly do mého celkového řešení. Odhalit to, ale bylo mnohdy velmi náročné a vyžadovalo značné množství času. Objektivně to není možné porovnat, ale subjektivně si myslím, že psaním této části kódu jsem strávil výrazně více času, než kdybych jej vytvářel bez Copilota. S odstupem vidím, že mě připravil o možnost hluboké práce [2], která je při programování zcela zásadní.

Lenost

Často se říká, že dobrý programátor je líný. Přestože se toto interpretuje různě, znamená to, že dobrý programátor napřed myslí, poté píše kód. Jenže myšlení bolí. Hodně. Copilot je nenápadný lék na tuto bolest. Místo bolestivého myšlení nabízí zdánlivě kognitivně méně náročnou alternativu: zkontrolovat hotový kód. Ve skutečnosti je kontrola cizího kódu náročnější než psaní vlastního, protože jej musíme pochopit. To lze ale snadno vyřešit. Kontrolu odbudeme. Kód, který nám Copilot vygeneruje, je přece správný. Nebo není?

V době, kdy jsem začal studovat vysokou školu, neexistovalo Stack Overflow (Stack Overflow byl založeno v roce 2008). Měli jsme ale knihovny plné knih. Ty jsou dnes také, ale nikdo je nepoužívá. Problém knih je v tom, že v nich nejsou instantní odpovědi. Pokud odpověď chceme, musíme si na ni přijít sami pomocí syntézy znalostí v knize obsažených. Náročné, ale jiná alternativa nebyla. Pak přišel Stack Overflow a začal nabízet odpovědi. Nejprve je třeba formulovat dotaz, vyhodnotit, zda je daná odpověď pro nás správná, pochopit odpověď do té míry, abychom ji mohli přenést do našeho řešení. To je dramatické zjednodušení. Bez hlubší znalosti dané problematiky můžeme získat řešení. Copilot toto posouvá ještě dál. Netřeba formulovat dotaz, netřeba odpověď upravovat na naše podmínky, vše je již hotovo. Postupně skokově klesá kognitivní náročnost programování.

Nicholas Carr ve své fenomenální knize Nebezpečná mělčina – Jak Internet mění náš mozek [3] popisuje, jak změna média mění lidské myšlení. Hlavní poselství knihy ale spočívá v tom, že technologie mají tendence měnit způsob lidského myšlení. Každý může provést jednoduchý experiment. Stačí půl hodiny číst na Internetu a pro srovnání půl hodiny číst klasickou tištěnou knihu. Způsoby soustřední a zpracování informací budou v obou případech zcela odlišné. Stejně tak tomu je při programování s Copilotem a bez něj.

Jenže, zatímco ulevovat je snadné, jít obráceně už tak snadné není. Postupem času jsem si všimnul, že můj mozek leniví. Zlomovým bodem byl okamžik, kdy jsem psal relativně jednoduchý kód. Napsal jsem řádek, zmáčknul enter a nastalo pár sekund, kdy jsem koukal na obrazovku a nic se nedělo. Pokusím se popsat, co se mi během těch pár sekund honilo v hlavě:

Proč nic nenapovídá?

Pořád nic?

Zkusím dát znovu enter, někdy to pomůže.

Zase nic?

Napíšu komentář popisující, co chci napsat.

To jako vážně?!

Na místo abych se zamyslel a napsal kód, jsem čekal a zkoušel popostrčit Copilota, aby myslel za mě. Vstal jsem od počítače. Byl jsem naštvaný a styděl jsem se. Takhle dopadnu? To, co je na programování nejlepší, tedy ty chvíle, kdy se člověk hluboce soustředí, a odměnou mu je dobře použitelný, elegantně vypadající a fungující kód, dělá někdo za mě. Nestává se ze mě kopilot?

Je to pouze kopilot.
Nenechte jej pilotovat letadlo za vás.

Co jsem si odnesl?

Tenhle moment pro mě byl zlomový. Po pár týdnech používání Copilota se sice zvýšila produktivita psaní kódu, ale snížila moje schopnost a chuť přemýšlet. To je cesta, kterou se nechci vydat. Chci být produktivní, ale zároveň chci, aby mě to bavilo, tedy, aby tam byly ty výše zmíněné bolestivé chvíle vykoupené odměnou. Naučil jsem se Copilota vypínat. Na rutinní záležitosti jej používám, ale když dojde na zajímavou či důležitou část, nemilosrdně jej vypnu. A funguje to. Nebudu ale lhát. Úplně snadné to nebylo. Z počátku to byl divný pocit a často jsem měl sklony jej zapnout. S trochou nadsázky jsem měl abstinenční příznaky.

Odbočka

Před delší dobou jsem v rámci svého výzkumu programoval poměrně rozsáhlý skript, který využíval OpenAI API. OpenAI API je programové rozhraní, které umožňuje vykonávat parametrizované prompty nad zvoleným GPT modelem. Ve své podstatě je to velmi podobné jako psát prompty do ChatGPT. ChatGPT je vystavěný na GPT modelu, ale obsahuje něco navíc a je inicializován takzvaným počátečním promptem. Zásadní rozdíly mezi promptem v OpenAI API a promptem v ChatGPT jsou v možnosti nastavit různé parametry promptu a zpoplatnění každého promptu. Přesněji řečeno se platí za každý zpracovaný token ať už načtený nebo vygenerovaný.

Když jsem spustil část skriptu, abych ji otestoval, chyba, kterou jsem v ní udělal mě stála 2 dolary. Přestože je to malá částka, najednou jsem k programování začal přistupovat zcela odlišně. Mnohem víc jsem se soustředil. Pečlivě jsem promýšlel každý řádek kódu, a to i ty jednoduché. S kódem jsem si víc hrál, aby byl lépe čitelný a snadněji pochopitelný.

Předtím jsem běžně napsal kód, spustil jej a čekal, co se stane. Určitě to znáte. Něco nefunguje. Tady je chyba, opravím, znovu spustím a další chyba. Tak znovu.

Tento přístup najednou nefungoval, respektive fungoval, ale stál peníze. Programování tohoto skriptu bylo zcela odlišné od programování pomocí Copilota. Je zajímavé, jak prosté zpoplatnění spuštění kódu změní přístup. Vidím v tom moderní analogii programování na děrné štítky. Celý víkend píšeme program, pak jej odneseme na výpočetní středisko, tam jej spustí a za týden máme výstup programu, na kterém je napsáno: chyba. Programátor je vystaven nepohodlí a jediná věc, která jej může zmírnit je myšlení.

Z pohledu pedagoga

Jak se vlastně člověk stane programátorem? To je možná až příliš filozofická otázka. Dle mého názoru se člověk učí programovat celý život. V poslední době se ale často objevují opačné názory, že stačí absolvovat 4týdenní rekvalifikační kurz a staneme se programátory. To je nesmysl. Ano, po 4 týdnech zvládneme základy algoritmizace a syntaxe vybraného programovacího jazyka. Určitě také budeme schopni řešit jednoduché úkoly a těch je více než těch skutečně náročných. Počkat. Ale ty zvládne Copilot. Takže po pár týdnech učení se programování budeme stejně dobří jako Copilot? Ne! Copilot bude o dost lepší.

Jenže, aby programátor dokázal řešit ty skutečně náročné úkoly musí začít s těmi triviálními. A nejen, že je musí zvládnout, musí pochopit podstatu jejich řešení až tak, že se pro něj stane zcela intuitivní.

Uveďme si jednouchý příklad. Uvažme následující zadání, které jsem si vypůjčil z kurzu Operační systémy 1. V jazyce C implementujte funkci void my_memcpy(void *dest, void *src, size_t size), která se chová jako funkce memcpy a přenese po jednotlivých bytech obsah paměti z jednoho místa na druhé, předpokládejte, že úseky paměti se nepřekrývají. Jak bude vypadat řešení z pedagogických důvodů neprozradím. Copilot ale tento triviální úkol zvládne vyřešit bez sebemenších potíží. Jenže on triviální vůbec není.

Alespoň pro studenta, který s programováním začíná. Zadání musí pochopit, algoritmicky vyřešit a zapsat v jazyce C. Při řešení tohoto úkolu si upevní práci s pointry a použití cyklů. Tedy něco si odnese. Takto můžeme pokračovat dále. Například klasická úloha, implementace třídícího algoritmu QuickSort. Při této úloze opět nejde o samotné řešení, to bude vždy horší než optimalizované implementace v existujících knihovnách, ale jde o ty drobné věci, které se student naučí. V programování zkrátka platí, že cesta je cíl.

Mnozí studenti argumentují, že to přece nemusí umět, když mají po ruce Copilota, který to zvládne. Stejně tak by se dalo argumentovat, že nemusí umět počítat, když mají kalkulačku.

To že máme kalkulačky přece neznamená,
že přestaneme učit základní počty.

Co když se tedy student na cestu nevydá? Co když prostě odevzdá řešení, které vygeneroval Copilot? Nic se nenaučí. Když se ale nenaučí základy, jak může v budoucnu řešit složitější úkoly?

Nabízí se otázka, co by měl nyní dělat vyučující. Můžeme předpokládat, že studenti na vysoké škole jsou dospělí, jsou zde dobrovolně a studují studijní program, který je baví. Pokud tomu tak není, tak mohou kdykoliv odejít. Vyučující v některých případech pozná, že student použil Copilota. Vlastně se to dá poznat poměrně často, jelikož Copilot má tendence používat pokročilejší techniky – je lepší programátor než běžný student.

Jenže, jak vysvětlit, že je třeba jít obtížnější cestou? Jak motivovat studenty, aby řešením jednoduchých úkolů trávili několik hodin na místo pár sekund? Jak jim ukázat, že Copilot jim může pomoci, pouze pokud budou alespoň tak dobří jako on? To jsou otázky, na které je těžké najít odpověď. A ani ChatGPT nepomůže.

Proč?

Často si kladu otázku, co vede studenta k odevzdání vygenerovaného řešení. Úkoly studentům zadáváme, aby se při jejich řešení něco naučili. Úkoly kontrolujeme proto, abychom jim dali zpětnou vazbu, tedy, aby se opět něco naučili. Navíc pokud problém vyřeší, získají odměnu v podobě dobrého pocitu. Doteď si pamatuji, že právě tento dobrý pocit byl pro mě jakožto studenta hnacím motorem. Nedovedu si představit, že bych bez něj informatiku vystudoval.

Věřím, že každý student ví, že odevzdáním vygenerovaného řešení se nic nenaučí. Navíc pokud na takové řešení dostane zpětnou vazbu, nic si z ní neodnese, případně ji zadá do promptu a odevzdá upravené řešení.

To je ale krátkozraké. Co bude motivovat firmy takového absolventa zaměstnat? Copilot vyjde levněji a odvede tu samou práci.

K čemu může být dobrý?

Na druhou stranu Copilot může být dobrým pomocníkem při výuce programování. Už jen fakt, že se jej můžeme zeptat, z něj dělá velmi užitečný nástroj. Záleží ale na co se ho ptáme. Může nám vysvětlil kód nebo poradit, jak jej vylepšit. Dostupný je pořád, takže když se o půlnoci na něčem zasekneme, Copilot může nabídnout pomoc. Problém je, kde je ona hranice, kdy nám pomáhá a kdy naopak škodí. Tu podle mě nezkušený programátor nedokáže určit. Možná je lepší jít spát a nesnažit se vše vyřešit hned. Některé věci zkrátka vyžadují čas a pokud jim ten čas neobětujeme, nikdy se v nich neposuneme.

Závěr

Co říct závěrem. Nemyslím si, že Copilot dokáže plnohodnotně nahradit programátora. Může mu pomoct odvést větší množství rutinní práce. Na druhou stranu jej poměrně snadno může připravit o skutečně hlubokou práci. Nejvíce může uškodit studentům, kteří kvůli němu přeskočí základy. Zbývá zodpovědět poslední otázku. Je používání Copilota evoluce nebo úpadek programátorů? Co myslíte vy?

Reference

  1. https://en.wikipedia.org/wiki/Melvin_Kranzberg
  2. Cal Newport, Hluboká práce, Jan Melvil publishing, 2016
  3. Nicholas Carr, Nebezpečná mělčina – Jak Internet mění náš mozek, Dauphin, 2017