úterý, července 31, 2007

Stream.cz má svých 15 minut...

FSJ je ve formě, jako vždy: A challenge to Czech youth. (Svědčí o něčem to, že počet imbecilů v komentářích je vyšší než obvykle?)

Trvalky

Chtěl jsem něco chytrého napsat o tom, jak se nový Harry Potter objevil na Internetu a dokonce ho snad i někdo překládá do češtiny a tak dále.

Protože však psát něco chytrého je vyčerpávající, dám vám, milí čtenáři, šanci oslnit se vlastní bystrostí a řeknu jen tolik, že si myslím, že knihy se za těch pár set let opravdu osvědčily jako jedno z nejtrvalejších medií, a že prodeje tento únik vůbec neovlivní.

PS: Opravdu mě nezajímá, jak to dopadlo, ani kdo zemřel, ani nic podobného. Počkám si až bude příští rok hotový Medkův překlad, na který jsem zvyklý, a který jsem se naučil mít rád.

Potopa!

Takže jsem po týdnu spustil Bloglines a čekalo tam na mě přes 800 nových zpráv. 800. Trvalo mi hodinu, než jsem proletěl titulky těch pár zdrojů, které považuji za důležité, a naklikal je do pár desítek tabů ve Firefoxu. Pak jsem to všechno celý zbytek večera četl. Ano, jsem nemocný.

Problém, který řeším je tento: co přesně je a co není důležité? Třeba: zajímají mě tryskové motory, protože mě prostě zajímají tryskové motory. Takže na Wikipedii naklikám něco o tryskových motorech a už to jede: turbojets, turbofans, rockets, ramjets, pulse jets, pump-jets. A to jsme ještě ani nezačali. Pro úvodní seznámení je potřeba nastudovat: Air intakes, Compressors, Combustors, Turbines, Turbopumps, Afterburners, Nozzles, Thrust reversers, Cooling systems, Fuel system, Fuel pump, Engine starting system, Ignition, Lubrication system. Každá část odkazuje na desítky dalších textů, které je možná dobré znát, než se pustím do dalšího studia, ale možná důležité nejsou a můžu je s klidným srdcem přeskočit, pokud se v budoucnu nehodnám stát konstruktérem tryskových motorů (což nehodlám, i když tryskové motory jsou... prostě krásné).

Celé to pak vede k ADD (Attention Deficit Disorder), kdy v ideálním případě budu přeskakovat od odkazu k odkazu, nikdy se nic nedovím, ale budu šťastný, že mám information on my fingertips.

Nejhorší je, jak je tohle surfování, přes všechnu svou povrchnost a marnost, uspokojující. Rozumem chápu, že sledování desítek zpráv denně je nejen zbytečné a pošetilé, ale i vyčerpávající a od skutečné práce (nebo i zábavy) odvádějící, ale moje iracionální zvědavost mě prostě nutí celé to martyrium podstupovat znova a znova. Dokonce občas cítím senzorickou deprivaci, když se nic nového neděje (čti: žádný magor hodinu nic nenapsal). V dobách, kdy jsem ještě nebyl připojen permanentním připojením k Internetu jsem dokázal něco po večerech opravdu udělat. Ale ten poslední skoro-rok je opravdovým utrpením.

Přemýšlím, jestli tohle je Web2.0: neschopnost zdržet se u jedné věci déle než pár minut. Web1.0 řídily vyhledávače a portály. Ty dneska nikdo nebere vážně a každý má tuhle dvanulózní RSS čtečku (nebo podobné udělátko), do které přidává další a další zajímavosti, až nedělá nic jiného, než že čte pitomé zprávy od zhusta pitomých lidí. Když je dneska web o tolik chytřejší než byl loni, nebo předloni, kde je nějaký nástroj, který by člověku umožnit ten příval informací nějak důstojně zvládnout?

Takže tak nějak.

A hloupý vtip na závěr: co jsem to vlastně chtěl?

pondělí, července 30, 2007

i-no-GO

Byli jsme teď na dovolené v Krkonoších. Protože jsem špatný řidič a ještě horší navigátor, rozhodl jsem se zapůjčit si GPS modulem vybavené PDA s navigačním programem iGO 2006.

Popravdě: Je to dost děs.

Nerozumějte mi špatně: Ve skutečnosti je navigace docela užitečná věc, která člověku nejednou ušetří nervy když někde mine odbočku, nebo zahlásí ten správný sjezd z dálnice, ale celkově konkrétně iGO trpí několika velmi zásadními problémy, které místy činí celý program prakticky nepoužitělným.

Abych to vzal nějak postupně: elektronické navigace (ať už jednoúčelové, nebo jako software pro PDA) trpí tím, čím všechny elektronické serepetičky: totiž displejem. I když PDA, které jsem měl půjčené, mělo rozlišení 640x480, displej je maličký a ve srovnání s papírovou mapou má zanedbatelné rozlišení. A konkrétně u map zatraceně záleží na tom, abyste toho najednou viděli co nejvíce s co největšími detaily. Na mrňavém displeji navigace vidíte buď zazoomovaný detail, nebo velký orientační přehled.

iGO si je tohoto omezení vědomo, takže se snaží implementovat jakési inteligentní zoomování, které před křižovatkou najede na detail a na rovině se vzdálí do přehledového módu (to celé doplněné o tenhle 2.5D, nebo 3D režim, kdy se software nějakou pochybnou perspektivou snaží simulovat výhled oknem z auta, což trochu pomáhá řešit problém s velikostí displeje, ale vůbec si nejsem jistý, jestli mapová data obsahují informace o nadmořské výšce, takže nejspíš je to jen taková obezlička). Potíž je v tom, že na komplikovaných křižovatkách potřebujete jak detail na odbočku kterou máte jet, tak přehled o tom, co budete dělat až urazíte těch pár aktuálních metrů. iGO se neumí podívat dál než za jednu zatáčku/odbočku, a tak vám nějakou nechutnou křižovatku nazoomuje tak, že nevidíte nic než jeden velký ohyb, pak se jakoby trochu vzdálí, zase nazoomuje na další odbočku a tak podobně (to celé pěkně plynule a animovaně a poooomaaaaluuuu). Mně to trvalo asi dvě liberecké křižovatky, než jsem nastavil úroveň zoomu ručně tak, abych viděl co bylo potřeba.

Dalším zcela zásadním problémem je aktuálnost mapových dat. Když jedete podle ukazatelů nebo podle mapy, koukáte kde se oproti mapě co změnilo. Při použití navigace (a to mi potvrdil i další majitel podobného zařízení), člověk přejde do režimu slepého následování pokynů navigace a třeba křižovatka změněná na kruhový objezd (což se dneska děje poměrně často) se stane místem plným stresu a zmatků. Ještě horší jsou ovšem objížďky. iGO je vytrvalý software a (tuším v Jilemnici) se nás vytrvale snažil směrovat na silnici která byla uzavřena. Prý snad existují nějaká data o podobných kalamitách vysílaná v RDS. Musím říct, že bez nich se navigační software stává v situacích, kdy by měl největší využití, prakticky nepoužitelným.

A největší rána mé důvěře v navigace na závěr: přišlo mi, že lidé, kteří programovali vyhledávání cesty k tomuto problému přistoupili jako k algoritmicko-inženýrskému problému. Přitom navigace je mnohem vice psychologická záležitost. Co jsem tak vypozoroval, lidé se raději drží větších, pohodlnějších, méně členitých cest. Důvodů je určitě mnoho, zcela jistě existuje několik desítek studií na toto téma, ale já vidím jako hlavní důvod to pohodlí na široké cestě, po které se dá jet většinu času opravu těch povolených devadesát, než se kodrcat po okreskách, kde sice teoreticky můžete jet stejně rychle, ale každá zatáčka vás zbrzdí, nehledě na to, že pořád jezdíte z kopce do kopce a tak dále. Nevím jak tohle bere do úvahy konkrétně iGO, ale přišlo mi, že vůbec. Jak by se jinak mohlo stát, že nás navigace z hlavní cesty svedla na nějaké pochybné okresky (v dezolátním stavu, jak jinak) stoupající nejprve strmě do kopce (takže se dalo jet v lepším případě tak 50km/h) a pak zase strmě z kopce?

Celkově si sice pořád myslím, že navigace jsou užitečná záležitost, ale možná, že spíše než na všechny ty grafické vypečenosti by se měli autoři soustředit spíše na důkladné poznání toho, jak lidé opravdu jezdí, jak plánují trasy podle map a jak probíhá navigace podle mapy s živým navigátorem.

PS: Znova opakuji, že mluvím o iGO 2006, a nevím, jestli jiné navigační programy/systémy nejsou v tomhle lepší. I když možná kromě TomTom jsem dost skeptický...

sobota, července 21, 2007

Fake Steve Jobs...

...je prostě skvělý. Je vtipný, dělá ze skutečného Steva Jobse idiota (nejpikantnější jsou ovšem pitomci, kteří FSJ v komentářích upozorňují, že Angola neleží ve východní Evropě, nebo že enfant terrible není latinsky), ale přitom to, co píše, je zatracená pravda. Třeba tenhle text o nahrávacích společnostech, nebo o TAFKAP -ovi, nebo teď o Googlu.

Po dlouhé době blog, který můžu doporučit.

pátek, července 13, 2007

Bábel

Jak jsem tu už zmiňoval, drželi jsme s BVerem řeč na letošním Festivalu Fantazie (matně si vybavuji nějaké rčení o tom, že čím méně něčemu rozumíte, tím spíše o tom budete druhé poučovat...). V rámci přípravy jsem si napsal tyhle guidelines, kterých jsem se nakonec ani moc nedržel, protože tak už to na takových neformálních přednáškách chodí. Nicméně myslím, že publikum jsme pobavili (zejména jazyk WhiteSpace sklidil velký úspěch), nadhodili několik vcelku podmětných poznámek o DSL (ty zmatené obličeje, když jsem ukázal na pár odstavců anglicky psaného textu a řekl, že tohle je kód Inform7 stály za to) a tak dále a tak podobně.

Občas bylo potřeba trochu tlačit na pilu, aby mezi mnou a BVerem při přednášce vznikly nějaké třecí plochy, které pobaví posluchače, takže pokud se vám některé pasáže budou zdát příliš... erm... no prostě na několika místech jsem schválně přeháněl, protože to zkrátka bylo potřeba. Text asi obsahuje nějaké překlepy a tak podobně, ale vzhledem k jeho délce nemám sílu to znova celé číst a korigovat.

Jak já to vidím, přístup k programovacím jazykům se v posledních, řekněme destíti letech, tedy s nástupem Internetu, podstatně změnil.

Dříve se člověk seznámil s více programovacími jazyky maximálně tak na univerzitě, kde z didaktických důvodů přičichl ke Smalltalku, a tak trochu k Lispu, a samozřejmě k Pascalu, který, ze mně ne zcela zřejmých důvodů, bývá považován za vhodný jazyk k výuce programování. Když programátoři dospěli, skončili jaksi samozřejmě u C++, nebo ti progresivnější u Javy. (Nemluvíme tu o BASICu a assembleru, protože to jsou záležitosti pro nás staré dědky.)

Dnes je situace naprosto jiná. Mladí programátoři se začínají učit programovat v Javě nebo PHP (to je snad ještě děsivější než začínat s Pascalem), pak do sebe nacucnou celou škálu skriptovacích jazyků jako je Perl, Python nebo Ruby, pak se třeba podívají na Lisp a vrkají si spolu o tom, jak skvělý je typový systém v Haskellu, a že kdo to myslí s paralelizací vážně, nemůže než použít Erlang, k tomu nějaký ten C# pro nás Microsoftí poskoky, nebo, pokud máte silná zápěstí, třeba VisualBasic (s i bez Option strict, což je nastavení, které udělá z VisualBasicu úplně jiný jazyk se stejnými klíčovými slovy), a základem je určitě i SQL, a tak dále a tak podobně.

Prostě: tam, kde dříve programátoři konvergovali k jedinému jazyku (kterým bylo C nebo C++) a s tím vystačili na větší část své kariéry, se dnes mladí vlčáci naučí pět až šest diametrálně odlišných jazyků ještě než jim naskáčou na čele uhry.

Čím to je? Domnívám se, že rozdíl je v té šíři aplikací, pro které se dnes počítače používají. Jak již řekl můj fundovanější kolega, programovací jazyk vybíráme podle aplikační domény, tedy podle toho co se chystáme dělat. Jistě nemá smysl programovat webové aplikace v C++, a na druhou stranu, je zřejmé, že i když napsat kompilátor PHP do nativního kódu by asi nebyl takový problém, nikdo to neudělá jen proto, aby mohl pro své PDA vyvíjet ve stejném jazyce jaký používá 90% programátorů s klamnými představami o svých schopnostech.

Tedy: jak se rozšiřuje množství aplikací, rozšiřuje se i počet jazyků, kterými tyto aplikace píšeme. Na programování klademe v různých oblastech různé nároky (třeba: náročnost na zdroje, ověřitelnost správnosti, rychlost, přehlednost, rychlost implementace atd.), a tomu se uzpůsobují i jazyky, které používáme.

Problém s programovacími jazyky je tento: programovací jazyky, stejně jako Olomoucké tvarůžky, potřebují čas, aby dozrály. Už nějaký čas sleduji vývoj jednoho programovacího jazyka, na kterém pracuje řekněme deset dvacet lidí tak čtyři roky. Je to skvělý jazyk? Ó, to nepochybně. Boo je jeden z nejvíce sexy jazyků na které jsem narazil (jakožto milovník staticky typovaných jazyků se příliš nevzhlížím v Ruby nebo Pythonu). Použil bych ho pro psaní nějaké aplikace, u níž předpokládám vývoj delší než řekněme dva měsíce? To nikdy.

Programovací jazyky jsou založeny na kompilátorech a interpreterech. A kompilátory a interpretery jsou software jako každý jiný. A software obsahuje chyby. A dovedete si představit něco více frustrujícího než používat programovací jazyk, jehož kompilátor (nebo interpreter) je plný chyb?

Můj volnomyšlenkářský kolega tu prezentoval svou antipatii k jazykům vlastněným firmám. Vážený příteli, velké firmy jsou jediné instituce, které dokáží uřídit vývoj něčeho tak delikátního jako je programovací jazyk s dostatečnou kvalitou. Skutečnost, že stovky tisíc open-source dobrovolníků dokázaly vyvinout za více než dvacet let existence open-source hnutí tři použitelné skriptovací jazyky (Perl, Python a Ruby), mluví samo za sebe. Všechny ostatní jazyky "vlastní" buď nějaká soukromá společnost, nebo univerzita, nebo se brzy po svém vzniku rozštěpily do tolika větví a jsou tak nespolehlivé, že je nikdo seriózně nepoužívá (viz třeba Lisp, který má asi tři sta dvacet sedm vzájemně nekompatibilních dialektů a nepoužitelné knihovny). To, že vlastníci těchto jazyků maskují za licenci GPL vůbec nic neznamená.

Tím jsem se dostal k další záležitosti, kterou tady pan doktor nakousl: knihovny. Knihovny jsou dneska stejně důležité, ne-li důležitejší, než samotný jazyk. Bez knihoven, na úrovni abstrakce, na které se musíte dneska pohybovat, abyste v konečném čase stvořili něco smysluplného, bez pořádného balíku knihoven, nejlépe celého frameworku, nesvedete nic. Potřebujete knihovny na práci s unicode řetězci (což je oblast, jejíž složitost si většina jedinců ani nedokáže představit), s implementací TCP/IP socketů, nějaké to šifrování, zobrazování, XML, formátování výstupu a zpracování vstupů v závislosti na národním nastavení, prostředky pro komunikaci a synchronizaci u vícevláknových aplikací, přístup na disky se všemi těmi zabezpečovacími serepetičkami, izolovaná úložiště dat, a tak dále a tak podobně. A to jsme ještě nezabrousili do oblastí řízení bezpečnosti aplikací a přidělování oprávnění k přístupu k různým částem operačního systému.

Chci říct: napsat programovací jazyk je jedna věc, ale učinit ho užitečným je věc úplně jiná. A sílu učinit jazyk užitečným mají podle mého jen společnosti, které jsou dost bohaté a schopné na to, aby vývoj tohole všeho zvládly v čase kratším než geologickém.

Aha, vidím nespokojenost na tváři tady mého veleváženého kolegy. Inu, má pravdu. Existuje způsob jak vyvinout dobrý jazyk a dobrými knihovnami a nestrávit tím celý život: použijete existující framework s virtuálním strojem, a pro ten svůj skvělý jazyk napíšete. Dnes máme na výběr ze dvou variant: jednak je tu Java Virtual Machine od Sun Microsystems, na kterém běží Java, dvak Common Language Runtime od Microsoftu, který využívá široká paleta .NET jazyků. Samozřejmě, že přítomné zrdojanarchisty nemůže uklidnit to, že je jejich jazyk plně open-source, když běží na virtuálním stroji soukromé společnosti, ale výhody pro nás ostatní jsou zřejmé: zaprvé od úplného začátku existuje celý balík velmi dobrých knihoven, které lze použít, a zadruhé: všechny tyhle optimalizační a portační kejkle za vás udělá někdo jiný. Vy si jen poklidně kompilujete do nějakého toho bytekódu, který pak virtuální stroj překládá do instrukcí procesoru který právě používáte.

Proto: pokud dneska opravdu chcete napsat programovací jazyk, piště jej pro některý z těchto virtuálních strojů. Jinak se sice naučíte spoustu zajímavých věcí o kompilátorech a procesorech a všech ostatních cool věcech, kterými neuděláte dojem na slečny dole u baru, ale bude to práce, kterou nikdo neocení.

Existuje ještě jedna skupina jazyků, o kterých jsme se tu ani já, ani můj vzdělanější kolega nezmínili. Jde o tzv. DSL, neboli domain specific languages, tedy jazyků určených pro jednu konkrétní aplikační doménu. Tento druh jazyků se dneska většinou píše v programovacích jazycích které vládnou syntaktickými makry, tedy takovou vypečenou věcičkou, která vám umožní do jakési meta-funkce předat jako parametr kus kódu, který se pak při kompilaci (nebo interpretaci) přeloží do skutečného kódu toho kterého jazyka. Příhodnou ukázkou může být třeba generování XML (nebo HTML), kdy místo používání ordinérních prostředků pro zapisování tagů použijete virtuálně vytvořená klíčová slova vašeho DSL, čímž celou věc krásně zpřehledníte a zjednodušíte.

DSL je dneska progresivní oblast programovacích jazyků (asi jako začátkem devadesátých let OOP), která pomocí dostatečně mocných obecných jazyků umožňuje napsat speciální jazyk pro každou aplikaci tak, že z kódu je hned zřejmé nejen jak věci děláte, ale také co děláte a leckdy i proč.

Nejzářnějším příkladem DSL je Inform7, tedy programovací jazyk určený k vývoji interaktivních fikcí (tedy textových adventur), který se snaží předstírat, že programujete v angličtině. V I7 napíšete něco jako "Miska s vodou stojí na stole v kuchyni," a překladač z toho sám odvodí, že miska je kontejner, stůl je objekt, na kterém mohou ležet jiné objekty a že kuchyň je místnost ve hře. Problém je v tom, že a) to funguje jen v angličtině, b) když se dostanete za hranice takto jednoduchých vztahů, musíte tvořit další pravidla pomocí syntaxe, která není ani zdaleka tak přehledná. Nehledě na to, že v takovémto jazyce se prakticky nedá ladit.

Nicméně si myslím, že podobně formované DSL budou v nejbližší budoucnosti poměrně populární, a že otevřou programování mnohem šiřší skupině než lidí, než by starému von Neumanovi bylo milé (ten dokonce považoval i assembler za zatemňování smyslu programu; ale co byste čekali od člověka, který sčítal nekonečné řady z hlavy).

Takže: i když, jak tu můj esotericky zaměřený kolega prezentoval, lze napsat programovací jazyk o jediné instrukci a přesto bude Turing-kompletní, volba správného programovacího jazyka je a bude zatraceně důležitá. Správný programovací jazyk vás zbaví potřeby znát polovinu návrhových vzorů z té provařené knihy gangu 4 (z hlavy si vzpomenu třeba na iterator, strategii a visitor), ty správné (funkcionální) jazyky budou potřeba pro rozvoj opravdu paralelního programování, příhodné jazykové konstrukce vás dokáží zbavit potřeby šmudlit složité SQL dotazy, nebo opakovat jeden skoro stejný kód dvacetkrát.

Zkrátka: pokud jste se rozhodli následovat osud dinosaurů, držte se svého jazyka a o nic dalšího se nezajímejte. Vy ostatní: vítejte v Babylonu!

A abych nezapomněl: stav je zdrojem všeho zla!