AI namierila KUŠOU na PROGRAMÁTOROV (a stlačila spúšť)

Keď počúvame o povolaniach, ktoré môžu definitívne nahradiť počítače, zväčša si predstavujeme úbohých kamiónistov alebo manuálne pracujúcich. AI si však medzi tým nakročila na výrazne nahradenie aj softwarových inžinierov, jedno z najžiadanejších a najlepšie platených zamestnaní vôbec. Kedy teda hŕba programátorov skončí na ulici?

Pred 2019 Vianocami som mal tu česť byť hosťom slovenského podcastu KLIK na tému Či nás umelá inteligencia pripraví o prácu. V šťavnatej diskusii (ktorú vám mimochodom odporúčam si vypočuť) som v istom momente zaskočil moderátorov poznámkou, že považujem programátorov za jedno z najohrozenejších povolaní, čo sa týka nahradením umelou inteligenciou. Hoci som uviedol argumenty, Ondrej s Dávidom sa na mňa súcitne usmiali a v duchu si možno mysleli: „To  si asi trochu prestrelil, chlapec“. Za posledný týždeň však zrejme došlo na moje slová. Veď posúďte sami.

Koľko jazykov vieš, toľko krát si … ITčkár

Kvalifikácia (a často aj odmeňovanie) programátora sa odvíja od toho, koľko projektov má už za sebou, ale aj toho ako univerzálny je pre tvorbu softvéru. Pomyselným čiernym opaskom softwarového inžiniera je byť full-stack developer, teda vedieť vyvíjať ľubovoľnú časť riešenia. To so sebou prináša nutnosť poznať veľa programovacích, či skriptovacích, jazykov. V IT teda platí rovnako ako v bežnom živote: Koľko (programovacích) jazykov vieš, toľko krát si človekom. Teda, ehm, programátorom, ak ich náhodou považujete za marťanov z inej planéty.

Podobne ako v ľudskej reči, aj v tej programovacej „mluve“ má každý jazyk svoju špecifickú skladbu, syntaktické pravidlá a zásobu kľúčových slov. Naučiť sa nový programovací jazyk (a získať v ňom plynulosť pri písaní počítačového kódu) si teda vyžaduje značnú časovú investíciu. Tak ako pilot sa môže stať kapitánom lietadla až po tisícoch nalietaných hodín.

Je to však práve krížová znalosť programovacích jazykov, ktorá sa dostala pod výrazne ohrozenie zo strany umelej inteligencie (AI). Minulý týždeň totiž team výskumníkov z Facebook inštitútu pre výskum AI zverejnil popis Transkóderu ako nástroja, ktorý sa dokázal naučiť prekladať z jedného programovacieho jazyka do iného programovacieho jazyka bez akéhokoľvek zásahu ľudskej posádky. V praxi to znamená, že stroj už dokázal napísať zdrojový kód, opraviť v tom existujúcom chyby alebo pri revízií navrhnúť efektívnejšiu verziu pôvodného kódu. Na tom by nebolo nič čudné, keby sa jednalo o nejaký jeden konkrétny programovací jazyk (koniec koncov nástroje na revíziu existujúceho kódu pre konkrétne programovacie jazyky už existujú roky). Pointou celého projektu však bolo, že dokázal pretransformovať daný kód do ľubovoľného jazyku (z ponúknutej množiny 3 najrozšírenejších programovacích jazykov). Teda „full stack“ programátor, ktorý nepotrebuje spánok ani výplatu. Ak si myslíte: “Počkaj, veď on len prekladal existujúci kód“, tak čítajte ďalej.

Jazyk ako jazyk

Na to, že stroje prekladajú naše, ľudské, slová a vety do cudzích jazykov na počkanie sme si akosi už navykli. Hádam medzi nami ani nie je taký človek, ktorý by niekedy už nepoužil Google Translate, či obdobnú službu. Tak prečo nie prekladač aj zdrojového kódu do iného jazyka?

AI_transkoder_dictionaryNuž možno ste si to nikdy neuvedomili, ale naprogramovať robota na prekladanie softvérového kódu z jedného programovacieho jazyka do iného je omnoho ťažšie. Text v ľudskej reči používa len slová, ktoré nájdete v slovníku. Navyše dvojjazyčné prekladové slovníky sú tu s nami „od jakživa“, prvé zdokumentované slovníky pochádzajú z roku 2300 pred Kristom, teda viac ako 4000 rokov dozadu. V programovacom kóde však môžete premenné (alebo funkcie) nazvať akýmkoľvek neexistujúcim zhlukom písmen (napr. NumNatID pre číslo OP), ktoré v žiadnom slovníku nenájdete a prekladač stále musí pochopiť, že ide o názov premennej. Rovnako pre trénovanie prekladacích softwarov existujú veľké korpusy bilingválnych kníh a textov (napr. zápisnice z rokovania Kanadského parlamentu, ktoré musia byť vždy vo francúzštine aj angličtine súčasne, alebo dokumenty EU, ktoré musia byť často preložené do všetky členských jazykov.) Ten istý počítačový kód sa však takmer nikdy nepíše vo viac ako jednom programovacom jazyku súčasne. Preto prístupy, ktoré v minulosti používali tzv. supervised učenie (páry kódov v rozličných jazykoch riešiace ten istý výpočet) boli veľmi nepresné, a aj po doplnením ľuďmi naformulovaných dodatočných pravidiel, dosahovali úspešnosť „prekladu“ len na úrovni do 40%. Svet preto spozornel, keď vyššie menovaní výskumníci predstavili metódu, ktorá dosahuje pre niektoré páry programovacích jazykov viac ako 90% úspešnosť prepisu fungujúceho softvéru do iného jazyka pri zachovaní plnej funkčnosti daného kódu.

Ako to tá mašinka robí?

Ernest, jeden z mojich kolegov, pri našej teamovej diskusii okomentoval tento prielom slovami „Aspoň je vidno, že programovací jazyk je skutočne jazykom.“ Musím sa priznať, že som sa na to takto nikdy nepozeral, pretože práve „preklady kódu“ z jazyka do jazyka sú v programovaní veľmi zriedkavé (sám to za svoju kariéru robil tiež iba pár krát, hoci ovládam aspoň 4 rôzne kódovacie jazyky). Ale práve použité prístupy potvrdzujú, že k riešeniu sa naozaj postupuje podobne ako pri viacjazyčných prekladov bežných textov.

Radového čitateľa by detailný výpis technických aspektov asi omrzel už po pár vetách. Preto mi k technickej stránke veci dovoľte povedať len jednou vetou, že daný výskumný team použil seq2seq model so 6-vrstvovým enkóderom + dekóderom s pozornosťou (pre väčší detail pozri tu). Čo môže byť však zaujímavé aj pre laika je, ako sa teamu podarilo „obicyklovať“ nedostatok podkladových dvojíc kódov pre trénovanie modelu.

GIThub_logoTým prvým dôležitým aspektom, prečo to ide dnes a nešlo by to pred 15 rokmi, je fakt, že vďaka GitHubu (a podobným službám) je na webe viac ako 2.8 milióna repozitárov funkčného, voľného dostupného kódu. Ironicky tak práve open-source hnutie, ktoré stálo za masívnym rozšírením programovania, je teraz súčasťou riešenia, ktoré pod programátormi píli vetvu. Skolektovať tak veľkú sadu trénovacích vstupov by bolo ešte dekádu dozadu nemysliteľné.

Nedostatok vzájomných porovnávacích kódov naprieč programovacími jazykmi sa podarilo preklenúť zaujímavou metódou učenia, keď v reálnych kódoch boli úmyselne zamaskované niektoré časti daného kódu a Transkóder sa učil uhádnuť dané chýbajúce čriepky. Takto sa napríklad bez akého vstupu od človeka sám naučil, že počítadlo v riadení cyklu je zvyčajne celočíselného typu alebo rozpoznal, že niektoré kľúčové slovo je funkciou, keďže má za sebou vždy zátvorku a vstupné parametre pre výpočet.

Aby bol preložený kód aj skutočne funkčný, musel sa Transkóder naučiť detegovať chyby a preklepy v kóde. Využili na to Odšumovací autoenkóder, ktorý napríklad odkukal, že výraz 1+ nie je platným kódom, lebo matematický operátov “plus” musí mať vždy dve vstupné hodnoty. Jedinou nevýhodou tohto postupu je, že sa musí zopakovať pre každý nový programovací jazyk pridávaný do Transkódera, lebo syntaktické chyby sú pre každý programovací jazyk osobité.

AI_transcoder_training

V neposlednom rade bolo dôležité pre zdar projektu aj využitie spätných prekladov. Ak sa natrénoval model na konverziu z nejakého jazyka A do B, potom vygenerované preklady v B jazyku zároveň slúžili ako vstupy pre opačné učenie prekladania z B do A. Tým sa výrazne znížili náklady a trvanie vývoja, lebo úspešne naučené zistenia boli zároveň vstupmi pre ďalšie učenia.

Čo to naozaj znamená pre programátorov

Rozšírenie Transkóderov určite bude výrazným úderom pod pás pre teamy programátorov, ktorí sa zameriavali na konvertovanie starých rutín do nových. Že ide o veľmi zaujímavý segment podnikania svedčí aj príklad Bank of Australia (Národna Banka Austrálie), ktorú stálo prepísanie svojich zdrojových kódov z COBOLu do Javy viac ako 700 miliónov dolárov. (mimochodom projekt trval až 5 rokov).

Okrem „prevádzačov kódu“ by si však nechty mali hrýzť aj bežní programátori. Spomínaný výskumný projekt preukázal, že vytvoriť funkčný počítačový kód by bolo poľahky možné aj z pseudo programovacieho jazyka, teda akéhosi „receptu na varenie“ napísaného bežným, IT neznalým človekom. Programovať aplikáciu by teda na základe jednoduchého popisu (a s využitím vyskúmanej metódy) dokázala aj Siri, či iný hlasový asistent z mobilu. A to už začína prihárať aj radovým programátorom.

Ako som spomínal vo svojom príspevku na SOFTECON 2019 konferencii, najbližšia ekonomická kríza by mohla byť navyše katalyzátorom takéhoto nahradzovania povolaní. (ak vás zaujíma prečo, pozrite si príspevok) A ajhľa ho, ani nie do roka a do dňa tu máme ekonomickú krízu. Takže zostáva tento trend pozorne sledovať. Ale ak sa kód tvoriace nástroje vypiplú na 90%+ úspešnosť pre dostatočne širokú bázu jazykov, dopyt po ľudskej sile v radoch programátorov. Šíp z kuše AI pre programátora teda zatiaľ nebol smrteľným zranením. Ale ak ste programátorom, určite nie je vhodnou radou zostať na mieste čakať, kým príde ten ďalší … S veľkou pravdepodobnosťou posledný.


Publikované dňa 12. 6. 2020.