Robert Važan

Jazykové modely pretvárajú zdrojový kód

Programovanie s jazykovými modelmi (LLM) je ako používať vo veľkosklade vysokozdvižný vozík. Umožní vám robiť veci vo veľkom, ale musíte tomu prispôsobiť prostredie. Ak chcete používať vysokozdvižný vozík, musíte všetko naskladať na palety, odstrániť prekážky, udržiavať čisté podlahy a nechať medzi regálmi široké uličky. Jazykové modely znesú istú mieru neporiadku, lebo sú inteligentné, ale aj tak výrazne ťažia z organizácie kódu, ktorá im ide v ústrety.

V svojom kóde pozorujem nasledovné zmeny. Ospravedlňujem sa za dlhý zoznam, ale nepodarilo sa mi nájsť zmysluplné rozdelenie do skupín. Aspoň som body zoradil podľa toho, aký veľký vplyv majú na kód.

Štandardizácia

Špičkové jazykové modely sú veľké a vedia veľa, no aj tak podávajú lepší výkon pri populárnych jazykoch a knižniciach. Menej rozšírené knižnice a interné utilitky je najlepšie používať len tam, kde sú naozaj nevyhnutné.

Malé projekty

Projekt sa nemusí zmestiť do kontextového okna a väčšina projektov sa ani nezmestí. Výkon modelu však s rastúcou veľkosťou projektu klesá. Čím menší projekt udržíte, tým lepšie budú jazykové modely fungovať. Ak projekt narastie natoľko, že sa modely trápia, lebo naraz vidia iba malý zlomok z projektu, môže byť produktívnejšie presunúť časť kódu do samostatnej knižnice.

Modulárny kód

Ani malý projekt sa celý do kontextu naraz nezmestí. V danom okamihu bude načítaná iba časť z neho. Úspešnosť modelu potom závisí od toho, koľko informácií mu chýba. Ak je načítaná časť projektu dostatočne samostatná, model odvedie dobrú prácu aj s čiastočným kontextom. Modularita sa oplatí aj za cenu istej duplikácie.

Duplikácia

Živí vývojári sú tvorivo leniví. Píšeme utilitky na všetko. Dôsledkom je kód, ktorý vzbudzuje dojem, že prešiel fraktálovou kompresiou. Je krátky, ale zložitý a husto poprepájaný. Jazykové modely naopak preferujú jednoduchý, plytký a izolovaný kód aj za cenu duplikácie. Kódu takto pribudne, no každá jeho časť je potom jednoduchšia.

Testy

Testy sú s pomocou jazykových modelov veľmi lacné. Veľa dôvodov nechať kód neotestovaný už nezostáva. Testy zvyšujú dôveru voči kvalite projektu a slúžia ako záchranná sieť pre chyby modelu.

Dokumentácia

Jazykové modely nemajú kontext ani empatiu na písanie dokumentácie pre koncových používateľov, ale zvládnu slušnú internú dokumentáciu a prvý nástrel používateľskej dokumentácie. Dokumentácia je dnes tak lacná, že je rozumné očakávať ju všade. Áno, dokumentácia v kóde riedi kontext, ale lepšie pochopenie kódu modelom za to stojí. Dokumentácia umožní modelu zistiť, čo dané interné API robí, aj bez toho, aby model videl všetky funkcie v jeho grafe volaní, čo znižuje potrebu mať všetko v kontexte.

Prehľady

Mám osvedčenú techniku, ako sa vysporiadať s limitovanou veľkosťou kontextu. Model dostane inštrukcie, aby vo všetkých adresároch vytváral a udržiaval prehľadové súbory, ktoré zhrnú, čo je v súboroch a podadresároch aktuálneho adresára. V koreňovom adresári projektu sú potom prehľadové súbory projektu, ktoré sumarizujú projekt z viacerých uhlov. Prehľady pomáhajú modelu pochopiť časti projektu, ktoré práve nevidí. Hoci by sa dali generovať dynamicky agentickými nástrojmi, v praxi sa mi osvedčilo commitnúť ich ako súčasť zdrojového kódu.

Čistý kód

Všimli ste si, aké čisté sú moderné fabriky? Čím viac automatizácie, tým čistejšie. Neporiadok je totiž drahý: spomaľuje, spôsobuje úrazy, ničí vybavenie a kontaminuje produkty. Podobne je to v kóde. Bordel vedie modely k chybám, zvyšuje náklady na API, spomaľuje a mätie premýšľanie a povzbudzuje model, aby neporiadok reprodukoval v novom kóde. V čistom kóde pracujú modely lepšie. Našťastie aj spravia väčšinu upratovania.

Nižšia hustota kódu

Toto je trochu kontroverzné. Hutného kódu môžete natlačiť viac do kontextu. Redší kód sa však ľahšie píše aj chápe, má čistejší diff a ľahšie sa kontroluje. Ľahšia kontrola a vyššia spoľahlivosť modelu sú dnes pre produktivitu dôležitejšie, takže vyhráva redší štýl. Vždy môžete pomocou nejakého nástroja vygenerovať stručnú mapu symbolov či mapu zdrojového kódu a tú vložiť do kontextu.

Konvencie

Halucinácie sa v modeloch berú ako chyba, ale dá sa z nich urobiť výhoda. Ak je váš kód vysoko predvídateľný, modely vedia vyprodukovať správny kód aj vtedy, keď nevidia volaný kód. Majú tiež tendenciu napodobňovať existujúci štýl. Jasné konvencie zvyšujú šancu, že model vygeneruje čistý, správny a pre vás prijateľný kód.

Krátke súbory

Kontextové okno má obmedzenú kapacitu. Nechcete ho míňať na načítanie obrovského súboru, z ktorého je relevantná len malá časť. Nechcete ani RAG, ktorý rozseká súbory na nezrozumiteľné útržky, ani podobne deštruktívne agentické načítavanie rozsahu riadkov. Ideálne je, keď model vidí celý súbor ako logickú jednotku informácií. Preto sa snažím udržať súbory krátke, ideálne okolo 100 riadkov (približne 1 000 tokenov). Samozrejme, niektoré budú mať 10 riadkov a tie najväčšie presiahnu 500, ale pokiaľ medián smeruje k 100 riadkom, model projekt zvládne.

Rozhrania (interfejsy)

Čoraz častejšie zavádzam rozhrania aj vtedy, keď majú len jednu implementáciu. Nie sú vhodné všade, ale tam, kde sa hodia, pekne oddelia koncepty od implementácií. Modelu potom stačí, aby sa pozrel na súbor s rozhraním, a vie rozumne pracovať s touto časťou projektu.

Konkrétne importy

Hoci importy s hviezdičkou (wildcard) sú pohodlné, pre model je potom ťažké uhádnuť, z ktorého súboru daný symbol pochádza. Konkrétne importy zaberú viac miesta v kontexte, ale umožnia modelu odvodiť plne kvalifikované názvy symbolov aj bez toho, aby videl celý projekt.

Nejde len o rýchlosť

Tieto zmeny zlepšujú celkovú kvalitu projektu. Mnohé sú v skutočnosti staré dobré zásady softvérového inžinierstva. Jazykové modely vás naozaj tlačia k tomu, aby ste kód dotiahli do publikovateľnej kvality.