čtvrtek 13. října 2011

Strážci stylu


Anglicky mluvící studenti se pravidelně setkávají s doporučením, aby ve svých textech nepoužívali slovesa v trpném rodě. Původ tohoto doporučení sahá přinejmenším do první poloviny dvacátého století. Z této doby pochází pamflet Elements of Style, sepsaný v roce 1918 a v dnešní podobě poprvé vydaný v roce 1959, který je aspoň v USA pro mnoho lidí hlavní autoritou v otázkách gramatiky a stylu. Jeho autoři, W.Strunk a E.B.White, píší

Činný rod je zpravidla přímější a ráznější než trpný.

a v dalším doporučují se trpných konstrukcí vyvarovat. K tažení proti trpnému rodu se přidal i George Orwell ve svém eseji Politics and the English Language. O Orwellovi je známo, že kvalitu jazyka považoval za jeden z podstatných faktorů formujících politické zřízení, a nepřekvapuje tak, že byl kritický k úrovni jazyka v médiích. O trpném rodě píše

Nikdy neužívejte trpný rod, můžete-li užít činný.

Strunk a White byli ve své kritice trpného rodu relativně umírnění a zmínili i situace, kde je jeho užití vhodnější. Orwell, a s ním většina pozdějších autorů jazykových doporučení, je již ve svém doporučení přímější a ráznější: nikdy neužívejte... Stalo se standardem stylistických příruček o trpném rodu říkat, že prozrazuje zbabělost a nerozhodnost autora, přispívá k politické nezodpovědnosti tím, že zamlčuje činitele dějů, zatemňuje význam sdělení, těžko se čte a vůbec je lepší se jeho použití vyvarovat, kdykoli to je jenom možné.

Jsou ovšem odsudky proti trpnému rodu smyslupné? Samozřejmě, většina z uvedených charakteristik (méně přímý a rázný, zbabělý, nerozhodný, těžko čitelný) jsou subjektivní hodnocení, jejichž pravdivost je zatěžko ověřovat. Jiné (vede k nezodpovědnosti, zatemňuje smysl sdělení) by se asi nějak ověřit daly, ale určitě ne jednoduše. Zajímavé světlo na věc ovšem vrhá skutečnost, že kritikové trpného rodu jej neužívají o nic méně často, než zbytek populace; někdy dokonce častěji. Hned první věta diskutovaného Orwellova eseje koneckonců obsahuje trpnou konstrukci „it is generally assumed“.

Neméně ironická je skutečnost, že tažení proti trpnému rodu se účastní ve velkém počtu i lidé, kteří nejsou schopni trpný rod rozpoznat. Týká se to koneckonců i Strunka a Whitea, kteří uvádějí čtyři ilustrace nevhodného užití trpného rodu, z nichž pouze jedna trpný rod skutečně obsahuje (pěkná obecná kritika jejich Základů stylu je zde). Řada potíračů trpného rodu považuje za trpnou každou konstrukci využívající pomocného slovesa, díky čemuž vznikají skvosty jako je příklad uvedený v tomto článku, kdy universitní vyučující označí ve studentském textu jako (z důvodu trpnosti) nevhodné deset frází, znichž jsou skutečně trpné pouze tři. Podobná praxe ovšem tvoří dobré odůvodnění pro některé radikálnější stylistické normotvůrce, kteří jdou dokonce tak daleko, že navrhují vykázat nejen trpný rod, ale všechny konstrukce využívající pomocného slovesa to be. Tak lze bezpečně vymýtit většinu trpných tvarů, aniž by člověk byl nucen je umět identifikovat.

Vybral jsem příklad z cizího jazyka, poněvadž jsme my Češi tažení proti trpnému rodu z velké části ušetřeni. Hlavní autorita přes český jazyk, ÚJČ, naštěstí jazykový preskriptivismus již delší dobu neprosazuje. Možná ale naše štěstí nebude dlouho trvat. Kritika trpného rodu se objevuje i v populárních doporučeních týkajících se českého jazyka.

Proč ale o tom vůbec píši: zajímavá otázka je, jak je možné, že se po generace udržuje při životě doporučení zapovídající užití zcela běžného mluvnického jevu; doporučení, které přitom nedodržují ani ti, kdo ho halasně šíří? Spor praxe a teorie na straně šiřitelů zde přitom nemíním jako klasické ad hominem, ve smyslu „kdo vám dává právo mi cokoli nařizovat, pokrytci?“. Jde spíš o to, že kritikové trpného rodu byli často velmi dobrými spisovateli — přinejmenším u Orwella je asi zbytečné tuto skutečnost dále dokládat. To, že sami trpný rod užívají, dokládá, že v obecnosti čtivost ani srozumitelnost textu nepoškozuje. Nekonsistence vlastní praxe a projevených názorů pak pouze ukazuje, že když člověk něco umí, neznamená to nutně, že je schopen správně rozpoznat, v čem jeho umění spočívá.

Dobrým spisovatelem se člověk nestává studiem normativních příruček. Stylistická obratnost vzniká dlouhodobým psaním a čtením, stává se intuitivním procesem, který se neobrací na explicitně formulovaná pravidla [*]. Člověk umí snáze posoudit, zda určitá formulace je elegantní, než proč je nebo není elegantní. Pokud si otázku proč položí, odpověď může být s realitou naprosto nesvázána. Například, ve výše odkazovaném článku kritizujícím používání trpného rodu v češtině je citována tato pasáž:

„Po dobu deseti let byl zkoumán přínos měření věku, krevního tlaku, váhy, kouření, tělesného cvičení a cholesterolu v krvi pro predikci úmrtí a kardiovaskulárních onemocnění. Bylo zkoumáno 16 skupin čítajících 12 763 mužů ve věku 40-59 let (na začátku studie) ze sedmi zemí (Jugoslávie, Finsko, Itálie, Nizozemí, Řecko, USA a Japonsko). Bylo zjištěno, že nejrizikovějšími faktory jsou věk, systolický krevní tlak a koncentrace cholesterolu v krvi (vzhledem k nasyceným mastným kyselinám ve stravě). Nebylo prokázáno, že by rozdíly v incidenci byly svázány s charakteristikami kohort, co se týče relativní tělesné hmotnosti, kouření nebo tělesného cvičení. Způsob zpracování dat je zvlášť přínosný pro epidemiology.“

Autor článku tuto pasáž kritizuje jako „napsan[ou] strašným stylem“, který „prozrazuj[e] mechanistickou filozofii, která před dlouhou dobou ovládla medicínu“. „Snadno se dá představit, že by takto mluvil robot“, dodává autor. (Formulace jakoby zkopírované z Orwellova eseje, chce se dodat mně.) Příčinou je údajně to, že „[v] tomto odstavci používá každá věta trpný rod“ (což není pravda — poslední věta je v rodě činném, dá-li se vůbec rodová klasifikace vztáhnout na jmenný přísudek se sponou) a autor doporučuje, aby lékaři používali „více sloves“ (což je nesmysl, trpné příčestí je slovesný tvar jako každý jiný, přechodem k činnému rodu sloves v žádném případě nepřibude). Byl by text srozumitelnější, kdyby první věta začínala „po dobu deseti let jsme zkoumali přínos ...“? Pochybuji. Hlavním důvodem relativní nesrozumitelnosti textu, mnohem spíš než trpný rod, jsou dlouhé věty, odborné termíny a specializované téma. Máme tu ale příklad relativně komplikovaného textu který užívá trpný rod, a to stačí při nepříliš pečlivém posouzení k vyvození názoru, že trpný rod přispívá k nesrozumitelnosti.

Jakmile jednou zaujmeme názor, že trpný rod je špatně, je velice snadné se v tomto názoru utvrzovat. Mozek zpracovává jazykové podněty automaticky, aniž by analyzoval gramatické kategorie. Nepěkné formulace nás ovšem trknou, pozastavíme se nad nimi, a pokud obsahují trpný rod, potvrdíme si svůj negativní názor. K tomu může dojít bez ohledu na to, zda trpný rod je příčinou nepěknosti (jako třeba ve větě „slepice byla vykuchána mnou“) nebo není (jako ve výše uvedeném příkladě). Může to skončit až naším obrácením k protitrpnému aktivismu, který dále vede k dalšímu šíření jazykových předsudků.

Jiným efektem, jehož působení nelze zanedbat, je móda. Asi každý rozpoznává, že módní trendy jsou bezdůvodné normy měnící se každých pár let, a přesto tyto normy většina lidí do značné míry respektuje. Nemluvím teď pouze o módních fanaticích, kteří musejí být in a mění tak šatník s tříměsíční periodou. To jsou extrémy; móda ale ovlivňuje většinu z nás: nepotkáte běžně na ulici člověka oděného do tógy nebo nosícího cylindr, i když ve své době to byly zcela konvenční způsoby odívání. Rok výroby automobilu zpravidla odhadnete s desetiletou přesností podle designu; aniž by existoval funkční důvod pro rozdíl ve tvaru světlometů vozů z roku 1990 a vozů dnešních, vizuálně je dvacetiletý rozdíl velmi dobře patrný.

Ačkoli jsou módní normy v podstatě libovolné, lidé je racionalizují odkazy na estetiku nebo funkční nadřazenost, často s užitím vágních frází a silných slov. Pro příklad si stačí najít nějakou debatu o tom, zda nová Octavia je hezčí než stará („dynamický vzhled“) nebo jestli je přípustné nosit ponožky do sandálů („je to prostě hnus“). Není rozumné předpokládat, že účastníci těchto debat lžou. Pokud ale nelžou, musíme přijmout fakt, že módní trendy ovlivňují naše estetické vnímání; že pokud přijmeme normativní stanovisko, že ponožky do sandálů nepatří, za nějakou dobu si začneme myslet, že ponožky v sandálech jsou odporné. Je to způsob, jak přijmout bezdůvodné normy za své, aniž bychom ztratili sami před sebou tvář.

Jazyk podléhá módním vlivům stejně, jako odívání nebo karosérie automobilů. Pokud se nám nějaký jazykový prostředek zdá být nepěkný, neelegantní, těžkopádný, špatně čitelný nebo jinak esteticky neuspokojující, a pokud tento názor veřejně projevuje řada dalších lidí, je dost dobře možné, že naše estetické cítění je dodatečnou racionalizací existující společenské normy. Netýká se to pochopitelně pouze jazyka, a je dobré mít tuto skutečnost na paměti, když se chystáme napsat nějaký estetický odsudek.

Bezprostřední motiv pro napsání tohoto postesknutí souvisí také s jazykem, v tomto případě programovacím. Potřeboval jsem upravit bashový skript obsahující cyklus s řadou instrukcí, něco jako

while :
do
instrukce 1
instrukce 2
...
instrukce n
done

Každá z instrukcí mohla selhat, a v případě selhání bylo potřeba začít běh cyklu znovu od první instrukce. Jednoduchá metoda, jak to zařídit, je otestovat v každém kroku selhání, a pokud k němu dojde, skočit jednoduše na začátek. Moje představa byla zhruba

while :
do
zacatek
instrukce 1
if selhalo then
goto zacatek
fi
instrukce 2
if selhalo then
goto zacatek
fi
...
instrukce n
done

Nebyl jsem si ovšem jist syntaxí, a tak jsem zkusil vyhledat, jak přesně funguje bashový příkaz goto. Samozřejmě nejsem první, koho tato otázka zajímala, a tak Google vyhodil odkaz na fórum ... kde hned první odpověď byla velmi přínosná: „To není dobrý nápad užívat GOTO v BASHi. Zkus místo toho příkaz while, nebo použij funkce.“ Nechci spekulovat o motivaci těch, kdo na žádost o vysvětlení nějakého tématu odpovědí, že to tazatel vlastně vůbec znát nepotřebuje; nicméně je téměř jisté, že tato odpověď souvisí s předsudkem rozšířeným mezi programátory: používat příkaz goto je nesprávné.

Původ odporu k příkazu goto lze vystopovat k Dijkstrově článku z roku 1968, a Dijkstra v něm tvrdí, že kritika je ještě starší. Staví vcelku abstraktní argument založený na tom, že přítomnost skoků uvnitř programu je v konfliktu se schopností programátora mít přehled nad tím, co program dělá. Kritika je pravděpodobně založena na negativních zkušenostech s programy, které díky přítomnosti velkého množství skoků postrádají přehlednou strukturu. Naneštěstí Dijkstra formuloval své doporučení velmi rezolutně: „došel jsem k přesvědčení, že trpný rod příkaz goto by měl být zrušen ve všech vysokoúrovňových programovacích jazycích (tj. všech kromě, možná, prostého strojového kódu)“. Dijkstra byl programátorská těžká váha, není tak divu, že odmítání gota se stalo součástí „dobrého vychování“. Doporučení, že bychom jej nikdy neměli používat (kromě vzácných výjimek, jak bývá pro zachování dekora dodáno) si přečteme téměř v každé učebnici programování. Dá-li člověk do svého kódu goto, může si vsadit na to, že se najde stylistický purista, který to označí za prasárnu. Používat tento příkaz je přece nepřehledné, nebezpečné a vůbec proti dobrým mravům.

Je samozřejmě pravda, že nadužívání skoků uvnitř programu může vést k nepřehlednému kódu. A je pravda, že zpravidla jsou řídící struktury typu while nebo for přehlednější. To ale neospravedlňuje plošné tažení proti tomuto příkazu, hlava nehlava, přehlednost nepřehlednost. Jistě, popsaný problém s návratem na začátek cyklu lze řešit například takto

while :
do
instrukce 1
if dosud neselhalo then
instrukce 2
fi
if dosud neselhalo then
instrukce 3
fi
...

if dosud neselhalo then
instrukce n
fi
done

nebo takto

while :
do
instrukce 1
if dosud neselhalo then
instrukce 2
if dosud neselhalo then
instrukce 3
...

if dosud neselhalo then
instrukce n
fi
fi
...
fi
done

nebo takto

while :
do
while :
do
instrukce 1
if selhalo then
break
fi
instrukce 2
if selhalo then
break
fi
...
instrukce n
done
done

První varianta zbytečně opakovaně testuje tutéž věc, druhá je zakončená podivnou sekvencí n příkazů fi (když člověk jeden omylem umaže, snadno si toho nevšimne), třetí zavádí dva vnořené cykly, což není zrovna ideální způsob, jak učinit fungování kódu zřejmým. Nezdá se mi, že by byla jakákoli z těchto variant přehlednější než ta původní užívající goto.

A pointa? V bashi příkaz goto implementovaný není. Tvůrce se zjevně rozhodl, že příkaz, který slušný programátor nepotřebuje, by měl být vynechán.

9 komentářů:

  1. Naprosto souhlasím.

    Myslím, že příkaz goto není implementován ani v sh ani v ksh (csh neznám) a pokud v shellu řeším něco podobného, používám poslední zmíněnou variantu, neboť je nejpřehlednější.

    Goto je velice užitečný příkaz, ale musí se používat s rozumem. Ostatně jako všechny ostatní příkazy. Všechny ty elegantní cykly stejně končí někde dole jako sprosté goto, že ...

    OdpovědětSmazat
  2. Z této doby pochází pamflet Elements of Style, sepsaný v roce 1919 a vydaný v roce 1959
    To je podivná nepřesnost. První vydání je z roku 1918.

    OdpovědětSmazat
  3. používání trpného rodu je otázka jeho vhodnosti a osobních preferencí. to, že existuje a používá se, je zajímavým jazykovým faktem samo o sobě ;) text s činným rodem je živější a bližší vyprávění, trpný rod zase umožňuje neutrální (ale i vyhýbavé) formulace. i když i to odvisí jazyk od jazyka. např. vysoce formální spisovné jazyky používají trpný rod často (třeba sanskrt).

    OdpovědětSmazat
  4. V tom cykle môžete použiť prikazy break (čo je vlastne goto tesne za koniec cyklu), a trebárs to celé vnoriť do iného cyklu, ktorý bude bežať, kým všetky "inštrukcie" nezbehli.

    OdpovědětSmazat
  5. @GP: Wikipedia píše, že Strunk knihu napsal v roce 1918 a vydal soukromě v roce 1919. White byl Strunkův student, který knihu později editoval, a v dnešní podobě vyšla již se dvěma autory v roce 1959. Aspoň tak jsem to pochopil, nejsem ovšem expert na historii zrovna téhle publikace. Formulaci jsem upravil.

    @Anonym 11:48: Myslím, že přesně tohle dělá ten poslední uvedený příklad.

    OdpovědětSmazat
  6. ad datace. Tohle je lepší. Nicméně nejlepší by byla informace, že Strunk v roce 1918 (podle některých údajů v roce 1919) vydal skriptum. Jeho žák White ho po jeho smrti přepracoval a v roce 1959 vydal jako příručku pro obecné publikum.

    OdpovědětSmazat
  7. Ještě trochu lepší mi příjde:

    > while true; do
    > instrukce 1 || continue
    > instrukce 2 || continue
    > [...]
    > done

    což je goto přepsané za continue, zajímavější je odhalit vzor:

    > try () { for cmd in "${@}"; do eval "${cmd}" || break; done; }
    >
    > cmds="
    > 'instrukce 1'
    > 'instrukce 2'
    > [...]"
    >
    > while true; do
    > try ${cmds}
    > done

    while je stále trnem v oku:

    > forever () { while true; do eval "${@}"; done; }
    >
    > forever try ${cmds}

    Význam zůstal stejný; preferován snad bude poslední, jelikož znovupoužitelně obaluje nejvíce řídících struktur a člověk se pak nemusí bát, co na něj vyskočí.

    Když se dostaneme do situace, kde je goto jednoznačně nejlepší volbou, bez váhaní ho tam střelíme. (třeba zanořené smyčky)
    V jazyce bez goto ale musíme zvolit jiný přístup a Dijkstra doufal, že to povede k lidštějším/jasnějším programům.
    (čímž neodhadl programátory a z jeho výroku se stal fun-fact)

    U přirozeného jazyka však mají věty v činném a trpném rodě jiný význam, takže obecná poučka ani nemá smysl.
    Upravit filmový skript jste ale nechtěl a post končí:) (O přirozeném jazyce navíc nerad přemýšlím)

    OdpovědětSmazat
  8. Po diplomantech i doktorandech se ve vědeckých pracech trpný rod vysloveně chce. Chce to tak i řada vědeckých časopisů v zasílaných příspěvcích.

    K tomu goto: Může to pocházet ještě od dob BASICu na 8 bitových počítačích, u nichž byl cyklus for a kde nebyla známa předem délka cyklu, tam se to řešilo pomocí goto (včetně předčasných ukončení cyklu, ošetření chyb apod.). Dal se snadno vytvořit kód, v němž se po pár týdnech nevyznal už ani tvůrce.
    Na druhé straně obcházení absence goto v jazycích, které ho neobsahují (např. uzavřením částí kódu do nekonečných cyklů s break - např. metapost) vede v důsledku ke kódům nepřehledným možná ještě víc (a navíc na úrovni strojového kódu tam stejně nějaké goto je, mnohdy vygenerované strojově a ještě blběji, než by to udělal alespoň trochu příčetný programátor.

    OdpovědětSmazat
  9. Jdu trochu s křížkem po funuse a nejsem žádný shellový mág, ale co použít něco takového:

    > while true; do
    > command1 &&
    > command2 &&
    > command3
    > if [ $? -eq 0 ];
    > then
    > break
    > fi
    >done

    OdpovědětSmazat