Pokorný programátor

(Podle článku E. W. Dijkstry)

Radek Ježowicz, 1999

Slovník současných uživatelů počítačů a programátorů se skládá ze slov jako třeba strukturované programování, návěští, nebo display. Málokdo však tuší, že velký vliv na vznik těchto slov měl Edsger W. Dijkstra. Jeho vliv v informatice je mnohem větší a rozšířenější, než si asi dokážeme představit. Jeho ohromné nadání potvrzuje i "Turingova cena", kterou získal za svůj přístup k programování jako k intelektuální výzvě, za důraz, který klade na praktické demonstrace, kterými ukazuje, že programy mohou být psány a vytvářeny korektně, a ne teprve dolaďovány do korektních. Vytvořil na tucet dokumentů, které jsou psány technicky, ale také přemýšlivě. Nedávno se jako uhlazená monografie umění kompozice programů vynořila série dopisů E.W.Dijkstry. Musíme ocenit dobré programy stejně jako oceňujeme dobrou literaturu. Příkladem může být i následující článek E.W.Dijkstry "Pokorný programátor", který vyšel již v srpnu roku 1972 na výroční konferenci ACM v Bostonu.

E.W.Dijkstra se dostal k programátorské profesi díky souhře časových náhod a to již v roce 1952 a stal se tak prvním Holanďanem, který se touto profesí zabýval. Avšak pomalost, s jakou se tato profese objevovala, byla ohromující a dnes je to téměř neuvěřitelné. Za to, že se začal věnoval informatice, může zřejmě diskuse, kterou vedl s van Wijngaardenem. Dijkstra předpokládal, že bude současně studovat teoretickou fyziku na Univerzitě v Leidenu, ale zjišťoval, že tyto dvě aktivity se dají kombinovat velice těžce. A musel se rozhodnout, zda se skončit s programováním a stát se seriózním teoretickým fyzikem, nebo formálně ukončit studium fyziky s minimálním úsilím a stát se …čím vlastně? Programátorem? Byla to však solidní profese? V ostatních oborech mohli jeho kolegové ukázat výsledky práce, ale v informatice stál člověk s holýma rukama. A právě van Wijngaarden dal Dijkstrovy do rukou argumenty, kvůli nimž se rozhodl stát se programátorem. Ukázal mu, že právě teď je doba, aby se z programování vytvořila respektovaná disciplína. To byl rozhodující bod v životě E.W.Dijkstry, jak uvedl ve svém článku. V roce 1957 se E.W.Dijkstra oženil a musel nahlásit své povolání. Nahlásil: programátor, ale úředníci mu oznámili, že takové povolání neexistuje a musel si tedy nahlásit: teoretický fyzik. Podívejme se nyní na situaci těchto dní trošku podrobněji. Je to dobré pro pochopení nynější situace v informatice. Zatímco nyní směřujeme k analýzám, můžeme vidět, že různá běžná nedorozumění jsou dnes daleká minulost. První automatické elektronické počítače byly unikáty, které se vyskytovaly v jedinečné kopii a každý z nich měl punc té experimentální laboratoře, ve které byl vytvořen. Nemůžeme popřít kuráž pracovních týmů, které se rozhodly vytvořit a vymyslet další a nové součásti, ze kterých postupně dávaly počítače dohromady. I přesto, že počítače v té době fungovaly všeho všudy občas a udržet počítač ve stavu, ve kterém mohl pracovat delší dobu, byl nepřekonatelný problém. Programátoři to v té době měli ohromně těžké. Počítače byly velice objemné a nebylo možné je přemisťovat a kromě toho údržba byla velice drahá a proto bylo téměř samozřejmostí, že místo, kde se lidé pokoušeli počítač používat, bylo to samé místo, kde byl vytvořen. A navíc téměř neviditelná práce programátorů neměla veliké kouzlo, vždyť návštěvníkům laboratoře mohli ukázat velice málo. Programátoři museli mít velice skromný pohled na svou práci, která měla smysl pouze na počítači. Každý počítač byl však unikát a programátor věděl, že programy budou sloužit právě na tom jediném počítači, který má pouze určitou životnost. Programátor tedy věděl, že většina jeho práce ztratí později svou hodnotu. A ještě jedna věc, která programátorům výrazně ztěžovala život bylo to, že počítače byly velice pomalé a paměti bylo velice málo.

Na konci devadesátých let je však situace jiná a pro programátory mnohem lepší. Počítače získaly určitou tvář a programátoři se tedy nemusí bát, že jejich práce nepřežije životnost počítače. Mnohem se také zlepšila stabilita počítačů a není takový problém udržet je v chodu delší dobu, a i hradwarové vybavení a mobilita počítačů se diametrálné odlišuje od vybavení počítačů před dvaceti lety. A právě tyto okolnosti ulehčují programátorům v mnohém jejich práci, i když zase na druhou stranu je nutno říci, že čím lepší je vybavení počítačů, tím vyšší jsou požadavky na programátory a ti musí řešit stále nové a nové problémy, které by na pomalých počítačích ani nemohly vzniknout.

V té době byly na programování dva názory. Jeden z nich říká, že opravdu schopný programátor je zanícený a musí mít trpělivost ve skládání chytrých triků do celku programů. Druhý názor říká, že programování není nic jiného, než optimalizování efektivity operačního procesu jedním, nebo druhým směrem. Další názor byl výsledkem opakovaných okolností, totiž dostupné zařízení bylo opravdu velice pomalé. V této době se střetávala s realitou naivní naděje, že jednou budou k dispozici silnější stroje a programování tedy nebude takový problém. Ale v dalším desetiletí se stalo něco úplně jiného: silnější počítače se staly dostupnými. Ale místo toho, aby se tím vyřešily problémy programování, dostalo se programování do krize. Jak je to možné? Vedlejším důvodem bylo to, že modernější počítače byly mnohem těžší na ovládání. Za prvé, existovala tam vstup-výstupní přerušení, což byla v porovnání se staršími počítači, které byly plně deterministické, dramatická změna a pro mnohé programátory byl obrovský problém fakt, že nemohli jasné mluvit o problémech, vytvářených zařízením. Hlavním problémem však bylo to, že počítače byly o několik řádů silnější. Dokud totiž nebyly počítače, programování nebylo problémem. Jestliže měli několik slabých počítačů bylo programování malým problémem. Když však programátoři získali počítače na svou dobu ohromné síly, stalo se také programování ohromným problémem. A elektronický průmysl neřešil jednotlivé problémy, pouze je vytvářel. Jak vzrostla síla počítačů vzrostly i nároky společnosti na jejich využití a v této době mohla spousta programátorů najít svou práci. Vylepšení hardwaru a také dramatické zvýšení spolehlivosti dávalo programátorům nové problémy o kterých se jim dříve ani nesnilo. Nemůže tedy být s podivem, že se programování dostalo do krize.

V polovině šedesátých let se stala další věc. A sice počítače takzvané třetí generace byly vyráběny v určitém provedení. Oficiální literatura ukazovala, že cenu ovlivňoval nejvíce právě návrh. A peníze se tedy neplatily jen za hardware, ale velkou částí rozpočtu při koupi počítače se zaplatilo také za vlastní návrh počítače, se kterým se programování stávalo obtížnější. A buď programátor, nebo počítač se dostali do situace, která se stala neřešitelná. Jakmile byly tyto stroje ohlášeny a jejich specifikace se stala známou, spousta programátorů se stala nešťastnými. Dalo se předpokládat, že takové počítače zaplaví celou počítačovou komunitu, a bylo přece spousta důležitějších věcí než to, jaký dojem bude dělat provedení. Podle E.W.Dijkstry se tak informatika dostala o několik let zpět. Popisuje to jako černý týden ve svém profesionálním životě. Stalo se zvykem, že odborné časopisy z oblasti informatiky se dívaly na nově ohlášené počítače vědeckým pohledem: považovaly to za nejméně důležité. Nyní o dvacet pět let později se počítačová scéna dramaticky změnila, ale základní pojmy z programování jsou stále s námi a pojem uzavřených podprogramů je stále jeden z klíčových pojmů v programování. Uzavřené podprogramy musíme uznat jako jednu z největších softwarových idejí: Přežily tři generace počítačů a přežijí i nadále, protože obstarávají implementaci jednoho ze základních modelů abstrakce. Bohužel, jejich význam je ve třetí generaci počítačů, která obsahuje samozřejmě velké množství explicitně nazvaných registrů s aritmetickými jednotkami, nedoceněný. Ale nikdo nemůže zničit myšlenku podprogramů a můžeme jen doufat, že se tato mutace neukáže být dědičnou.

Druhý velký mezník vývoje na softwarové scéně bylo vytvoření Fortranu. Byl to velice smělý projekt a lidé odpovědní za vznik tohoto jazyka se zaslouží velký obdiv. Bylo by nefér obviňovat je z nedostatků, které se objevily až za desetiletí, nebo z tak rozsáhlého využití. Musíme ocenit Fortran jako úspěšnou kódovací techniku, ale s velmi málo efektivními pomůckami k pochopení jeho vlastního, s pomůckami, které jsou nyní nezbytné, i když časem Fortran zastaral. Dříve jsme mohli zapomenout, že Fortran vůbec existoval, lepší bylo množství myšlenek, ale to už nestačí: ničí to naši mozkovou sílu a je to příliš riskantní a tedy i "příliš drahé" k užití. "Smrtí" Fortranu bylo jeho široké uplatnění, které chytilo myšlení tisíců programátorů do jejich vlastních chyb.

Třetí projekt, který bych tady chtěl zmínit je LISP. Fascinující podnik úplně jiné povahy. S několika základními principy vykazoval obdivuhodnou stabilitu. Kromě toho přinášel LISP značné množství důmyslných aplikací. A i LISP umožnil programátorům nové věci, které byly dříve nemožné.

Dalším projektem byl Algol 60. Zatímco do této doby (do doby než se objevil Algol 60) se programátoři ve Fortranu snažili rozumět programovacím jazykům v termech specifické implementace, se kterými pracovali - od této doby převažovaly osmičkové a hexadecimální haldy. I když definice LISPu je stále kuriozní směsí toho, co jazyk znamená a co dělá, proslulý Report on the Algorithmic Language ALGOL 60 je to pravé ovoce snahy dovést abstrakci silnými kroky dále a definovat programovací jazyk implementací samostatné cesty. A nakonec, je třeba ještě vzpomenout PL/1 - programovací jazyk, jehož dokumentace je děsivě velká a komplexní. Užívání PL/1 musí být něco jako řízení letadla se 7 000 různými tlačítky, páčkami a přepínači. Je nemožné udržet pevně rostoucí programy v PL/1- je to "barokní" programovací jazyk se spoustou kudrlinek v podobě malých funkcí a příkazů. Je pravda, že je to díky tomu velice silný nástroj, ale jen pro toho, komu se podaří do něj proniknout velice hluboko. Každý si v něm mohl dělat ještě další vylepšení a díky tomu se tento jazyk stával ještě méně přehledným, což byla jeho hlavní nevýhoda. A jestliže Fortran nazveme dětsky nachlazeným pro svou neuspořádanost, potom PL/1 musíme nazvat smrtelně nemocným. Chyby tu jsou však proto, abychom se z nich mohli učit.

Nyní bych chtěl ukázat, jak se E.W.Dijkstra v roce 1972 představoval blízkou budoucnost. Jeho vize byla taková: Do konce sedmdesátých let musíme být schopni navrhovat a implementovat takové systémy, které dnes (v roce 1972) příliš zatěžují programování, a na které budou výdaje jen malými procenty toho, kolik člověkoroků stojí dnes. A kromě toho, tyto virtuální systémy už budou bez chyb. Tato zlepšení jdou spolu ruku v ruce. Software se bude lišit od jiných produktů tím, že jako ukazatelem vyšší kvality bude vyšší cena. Ti, kdo budou chtít dělat opravdu dobrý software, se budou již od začátku muset vyhnout chybám, a výsledkem toho bude programování, jako proces, levnější. Kvalitní programátoři nebudou trávit svůj čas odstraňováním vlastních chyb. Tak drastická změna v tak krátké době může být revolucí. A lidé na základě svých předpokladů do budoucnosti a vzhledem k nedávné minulosti apelují na nepsané zákony sociální a kulturní nečinnosti - šance na tak velikou změnu musí vypadat bezvýznamně. Ale všichni víme, že se občas revoluce opravdu konají. Jaké jsou šance pro tuto? Musí být splněny tři podmínky. Svět musí uznat potřebu změn, za druhé, ekonomika musí být dostatečně silná a nakonec za třetí, změna musí být proveditelná. Co to znamená, že změna má být proveditelná: Na objasnění předložím šest požadavků:

1. Programátor může brát v úvahu pouze ovladatelné programy.

2. Jakmile se pro nějaký rozhodne, vyřeší tím jednou provždy otázku uvažovaného prostoru.

3. Musí se konstruktivně přistupovat k odstraňování chyb.

4. Je potřeba usilovat o vytváření přehledných a ne příliš dlouhých programů.

5. Zajištění vhodných nástrojů k realizaci vlastních myšlenkových pochodů.

6. Větší použitelnost pěkně zprostředkovaných řešení.

 

A ještě něco: programování nebude problémem, i když zůstane stále velice obtížné, člověk bude muset vyjít z rozvleklé nešikovnosti a najít sám sebe a svou programovací kapacitu pro řešení problémů.

Nemusíte souhlasit s těmito argumenty, které zde Dijkstra uvedl, není totiž snadné shromáždit důkazy na jejich podporu. Zatím jsem nezmínil slovo "hierarchie", ale myslím, že je správné říci, že to je klíčový pojem pro všechny systémy, které pěkně zprostředkují řešení. Mohl bych jít o krok dále a napsat článek o důvěře v hierarchii. Ale v části, kde bylo zmíněno to, že jedině problémy, jež lze opravdu vyřešit přijatelným způsobem, jsou ty, které nakonec zprostředkují pěkné řešení. Tento pohled na omezení, která mají lidé, může překvapit, jako depresivní pohled na naše tvrzení. Nutno ale říci, že E.W.Dijkstra to tak necítil. Naopak, nejlepší cestu naučit se žít s omezenými možnostmi viděl v poznání těch omezení. Jakmile programátoři zkoušeli pouze zprostředkovávat řešení, museli dělat nejnemožnější věci proto, aby se vyhnuli všem vztahům, které zhoršovaly schopnost dělat systémy způsobem prospěšným pro všechny. A nedá se očekávat, že to bude opětovně vést objevy tak, že zpočátku neprůhledný problém bude nakonec vyřešen. Ten, kdo ví, jak je podstata problémů spojených s překladem, tzv. generování kódu, složitá, může vysledovat vlastnosti kódu.

Bohužel ne všechny předpovědi E. W. Dijkstry se potvrdily. Nedá se říci, že ukazatelem vyšší kvality je vyšší cena. I v této oblasti jako všude jinde závisí cena na nabídce a poptávce, a tedy i na marketingové strategii firem produkujících software. A nutno říci, že programátořů, kteří nedělají v programech chyby a nemusí se tak starat o jejich odlaďování, je nedostatek. A vzhledem k hardwarovým možnostem nelze říci, že programy jsou vytvářenz vždy přehledně a také jejich velikost může být různá podle přístupu programátora. Tím se samozřejmě stále zvyšují nároky na hardwarové vybavení a dá se říci, že nikdy nebudou počítače natolik silné, aby postačovaly poptávce.

E.W.Dijkstra napsal, že jako každá opravdová revoluce i toto bude provokovat mocnou opozici, a každý se může zeptat sebe, co zkusí konzervativní síly proti takovému vývoji. Nečekám je hlavně ve velkém obchodu, ale ve vzdělávacích institucích, které pečují o výuku, a ve kterých konzervativní skupiny uživatelů počítačů shledají staré programy dostatečné a nebudou se snažit vylepšovat je. V tomto kontextu je smutné pozorovat, jak je na půdě mnoha univerzit výběr počítačových prostředků omezen několika zavedenými, ale drahými aplikacemi a je přehlížena otázka, kolik tisíc "malých uživatelů", kteří budou psát vlastní programy, trpí touto volbou. Mohou tu být také politické překážky: I když víme, jak vzdělávat budoucí profesionální programátory, není jisté, že společnost, ve které žijeme, nám to dovolí. První efekt vyučování metodologie je zvětšování kapacity už schopných, tudíž zvětšování rozdílů v inteligenci. Ve společnosti, ve které je vzdělávací systém užíván jako nástroj ustavení stejnorodé kultury, ve které výkvět nemůže vyjít na vrchol, může být vzdělávání schopných programátorů politicky nežádoucí.

Takže nakonec, počítače jsou tu s námi již čtvrt století (článek E.W.Dijkstry vyšel v roce 1972). Velice zasáhly do společnosti díky možnostem jejich nástrojů, ale možnosti jejich vlivu, které počítače mají díky své kapacitě, která je precedentem v celé kulturní historii lidstva. Rozumíme poměru mezi zdí a cihlou, cihlou a křišťálem, křišťálem a molekulou, atd. Výsledkem počtu úrovní, které mohou být velice významné v hierarchických systémech je poměr mezi nejmenší a největší úrovní, a proto, pokud je tento poměr velký, nemůžeme očekávat málo úrovní. V programování mají naše základní stavební jednotky přiřazeny čas povahy mikrosekund, ale programy mohou vzít hodiny počítačového času. Důraz bych však chtěl klást na následující řádky. Můžeme programování vylepšit za předpokladu, že si uvědomíme ohromnou obtížnost, za předpokladu, že budeme lpět na skromných a elegantních programovacích jazycích, za předpokladu, že budeme respektovat spletitost omezení lidské mysli a za předpokladu, že se úkolu zhostíme jako opravdu pokorní programátoři.