Programování inteligentních agentů a distribuovaných systémů je divné. Různé konceptuální frameworky oboru zavádějí plejádu termínů jako “goal”, “belief” nebo “intention”, jejichž zakódování v běžných programovacích jazycích je těžkopádné a nepřirozené. Jako vždy, když vlastní abstrakce nesplývají elegantně s prostředím použitého jazyka, je to red flag špatného designu, který se vyplatí revidovat a dobře pochopit, co nás k němu vedlo a jestli je to skutečně nevyhnutelné.
Na začátek je potřeba přiznat, že interakce s nevyzpytatelnou realitou je opravdu těžká a základem jejího algoritmického řešení bude vždy hlavně matematická práce s pravděpodobností. Zůstává ale otázka, proč to vypadá tak ošklivě, když pravděpodobnost je z hlediska programování početní matematika jako každá jiná.
Klíč ke všemu jsem našel, když jsem si uvědomil, že datové struktury s “cíly” našich agentů mají tak nějak samovolně vždy deklarativní programovací styl, zatímco struktury popisující “exekuční plány” mají přirozeně vždy imperativní programovací styl. Jak to souvisí s pravděpodobností?
V programování jsme zvyklí, že reálná exekuce deklarativně napsaného programu nemusí být jednoznačná. Například konkrétní kroky vyhodnocení nějaké SQL query jsou určeny v planneru na základě komplexních vztahů požadovaných dat, indexů, úložiště atd. a mohou být divoce rozdílné i pro zdánlivě velmi podobné nebo dokonce stejné query na různých prostředích.1
Naopak to však v programování neplatí. Imperativní zápis programu vždy jednoznačně determinuje výsledek, ke kterému každá jednotlivá instrukce i jejich sekvence vedou2. A to je právě to, co je v interakci s realitou jinak. V ní je i tento vztah nejednoznačný a založený na pravděpodobnosti. Ať se snažíme sebevíc, v realitě si nikdy nemůžeme být absolutně jistí, že naše akce povedou k zamýšlenému výsledku, jak si všímá třeba lidová moudrost, že cesta do pekel je dlážděna dobrými úmysly.
Realita není stroj a proto v ní na rozdíl od programování výsledek, kterého chceme dosáhnout a kroky, které k tomu podnikáme, nejsou pouze různé pohledy na stejnou věc a souvisí pouze nepřímo. Pokud chceme, aby k sobě konvergovali, musíme si je zapsat oba dva a neustále je srovnávat. Pokud by to mělo být reflektováno už na úrovni jazyka, musel by být nejen multiparadigmatický, abychom mohli přirozeně popsat jak náš deklarovaný cíl, tak imperativní plán instrukcí k jeho dosažení, ale musel by umět mezi těmito komunikačními módy plynule přecházet oběma směry.
Takový jazyk si nedokážu ani představit a tak nezbývá, než vybrat si paradigma jedno (přirozeně asi to imperativní, bližší pohledu stroje) a zbytek do něj nějak propašovat. To je esence oné divnosti, která mě tak dlouho dráždí. Tahle úvaha, že to je z podstaty nevyhnutelné, mi pomohla se s tím trochu smířit. Jako bonus k tomu mnohem lépe rozumím debatám typu zda účel světí prostředky (spravedlnost prostředků vs spravedlnost výsledku) a toho, proč jsou v nich programátoři silně náchylní k jedné ze stran.
-
Ačkoli je vyhodnocení planneru deterministické, je to na základě detailů, které v kontextu deklarativního zápisu chybí a z jeho pohledu tedy exekuce jednoznačná není. ↩
-
Požadavek na jednoznačnost a konečnost je v samotné definici algoritmu a stojí na tom třeba i přesvědčení o nepodřebnosti komentářů, protože kód by měl být “samodokumentující”. ↩