Zobrazují se příspěvky se štítkemProgramování. Zobrazit všechny příspěvky
Zobrazují se příspěvky se štítkemProgramování. Zobrazit všechny příspěvky

20. září 2013 ↴

Konec dobrých časů

Úprava: Přidávám video ze své krátké prezentace na WebExpu 2013, kde mluvím o obsahu tohoto článku (v angličtině). Můžete si tak vybrat, jestli chcete video, text, nebo oboje.

Filip Hráček - Openning Keynote at WebExpoPrague 2013 Conference from webexpo on Vimeo.


Několikrát ročně sedím v místnosti se svými kolegy z různých zemí, a mám tak možnost si trochu udělat obrázek o vývojářských komunitách a o technologickém bzukotu po celém světě. Součástí popisu práce každého z nás je (snažit se) rozumět lokálnímu technologickému trhu a jeho vztahu s trhem globálním. Hned vedle mě sedávají lidé z USA, Německa a Izraele, ale i Indie, Číny nebo Brazílie.

Tahle sezení vždycky byla extrémně zajímavá a inspirativní, ale poslední dobou si z nich odnáším ještě něco navíc – úzkost.

Než to slovo odsoudíte jako příliš dramatické a/nebo bulvární, dočtěte prosím do konce. Tohle možná bude trochu delší článek (přes veškerá zjednoduššení, kterých se dopustím), ale budu se snažit, aby stál za to.

Image of a grumpy Czech person
Foto: OndraSoukup (CC licence)

Izrael a Indie

Podívejme se na dva státy zastupující z určitého pohledu dva protipóly – Izrael jako zástupce vyspělého, hi-tech “Západu”, a Indie jako zástupce rychle se rozvíjejícího, relativně low-tech “Východu”. V Izraeli žije 7 miliónů lidí, v Indii 1,2 miliardy lidí. Průměr HDP na hlavu (PPP) je v Izraeli zhruba 10x vyšší než v Indii. V technologickém světě, kde se pohybuji, je Izrael rozhodně větší hráč než Indie – i přes 170x menší populaci.[1]

Kdybyste měli umístit Českou republiku (potažmo Slovensko) na pomyslnou úsečku mezi Izrealem a Indií, ke které z těchto zemí byste ji dali blíž?

V naprosté většině os, které si můžeme pro takové cvičení vymyslet, je ČR/SR samozřejmě blíže Izraeli. Velikostí, počtem obyvatel, HDP na hlavu, úrovní vzdělávání, životním stylem, kulturou. Ne, že bychom o ČR/SR mohli jen tak od boku říct, že jsou to státy “podobné Izraeli”, ale rozhodně jsou více podobné Izraeli než Indii.

Ale přesto jsme v alespoň v jedné věci dost tragicky podobnější Indii než Izraeli – a to technologickou úrovní. Nemyslím technologickou úrovní produktů a služeb, které si kupujeme (většinou ze zahraničí) a konzumujeme, ale technologickou úrovní většiny naší vlastní produkce. (Co přesně tím myslím ještě rozeberu níže.)

V době, kdy se velká část veškerého ekonomického dění (produkce, transakce, spotřeba, ...) přesouvá do sféry softwaru[2], a tedy technologická úroveň je v podstatě nejsilnější měřítko ekonomického zdraví státu[3], je tohle docela závažná diagnóza. V podstatě to znamená, že ať děláme cokoliv v ostatních sférách a s ostatními problémy, které tu máme, nehneme se z místa. Sami se stavíme do funkce technologických lopat, a nejsme si toho vědomi, protože jsme před důsledky našeho vlastního počínání zatím stíněni.

Vlastní píseček

Následující platilo před pěti lety a platí z velké části i dnes, ale ne nutně bude platit za dalších pět let: český a slovenský trh je malý a relativně chráněný. Softwarová firma (ale například i samostatný webdesigner) prodávající řešení českému klientovi se příliš nemusí bát konkurence ze zbytku Evropské unie, natož třeba z Indie. Důvodů je několik: jazyková bariéra, “specifika” trhu, konzervativnost současné generace vedení v podnicích, cena (český vývojář je pořád ještě levnější než anglický), relativní kvalita.

Všechny tyhle důvody se pomalu rozpadají nebo přestávají existovat.

Pokud ty bariéry padnou pod určitou úroveň, začne najednou český/slovenský softwarový projekt soupeřit s indickým. Ne, nebude soupeřit s Izraelem, protože tamní technologická úroveň je někde úplně jinde než tady nebo v Indii – a stejně tam má málokdo zájem programovat PHP weby. Zato indická vývojářská firma je přesně na té správné technologické úrovni – a český trh je pro ni bohatý.

Ale nejde jen o Indii a levnější pracovní sílu. Jde taky o automatizaci. Když se budeme držet těch webů – pokud někdo dělá projekty na stejné úrovni, jako 99% českých studií, musí počítat s tím, že ho zanedlouho nahradí automat. Nezapomeňme, že tomu není tak dávno, co si lidé relativně draze platili statické webovky u profesionálů. Tenhle segment už je v podstatě zcela nahrazen “automaty” (Webnode, Google Sites, Facebook Pages, …). Pokud myslíte, že eshop nebo informační systém nebo webovou “databázi věcí” nelze dodat bez zásahu programátora, asi jste ještě neviděli například toto video[4], nebo nemáte dostatečnou fantazii.

 

Srovnání podle technologií

Vraťme se tedy k tomu, co myslím “technologickou úrovní naší softwarové produkce”. (Na chvíli teď vlétnu naplno do sféry startupů, ale jen proto, že na těch se mi to lépe vysvětluje.)

Do následující tabulky jsem náhodně zpřeházel úspěšné české technologické firmy (5ks) a ty nejúspěšnější zahraniční technologické firmy (také 5ks, vzniklé za posledních 5 let). Ke každé z nich jsem připojil nejobecnější možný popis jejich technologického řešení.[5]

Klik pro větší. Slovem "databáze" nemyslím databázi typu např. SQL, ale databázi jako například katalog. Názvy českých startupů jsem začernil, aby to nikdo nebral zbytečně osobně. Ale opravdu to byl náhodný výběr, a opravdu jsem se nemusel nijak snažit, aby to vyšlo takto jednostranně.

Kdybychom k tomu přidali programovací jazyky, na kterých běží jejich servery, bude pak tabulka vypadat takto.

Hmm....

“Ale na technologii přece nezáleží! Hlavní je řešit existující problém!” — kecy. Ano, je potřeba řešit existující problém, ale pokud k tomu zvolíte architekturu, která napadne průměrného “foundera” jako první (á la: “pojďme udělat webový katalog!”), můžete si být jistí, že v dané vertikále nejste (nebo dlouho nebudete) sami. Opravdu zajímavé technologické projekty vznikají ve chvíli, kdy máte a) vhled do problému, a zároveň b) vhled do technologie, kterou ten problém budete řešit.

Google by bez technologického vhledu neexistoval.[6] Uber by byl jen další taxi aplikací v řadě. SoundCloud by byl jen další sociální sítí pro muzikanty.

Stejně tak by bez technologického vhledu neexistovalo AVG nebo Avast nebo ESET. Respektive by ty firmy možná existovaly, ale na lokální úrovni, jako výrobci podřadných antivirů. Místo toho jsou v globálním TOP 10 jak z hlediska kvality, tak z hlediska počtu uživatelů.

“Don’t work harder, work smarter”

Tohle není další článek o tom, že ve střední Evropě máme malé ambice a málo pracujeme. Pokud začnete něco řešit dostatečně pokročilými technologiemi, obvykle pak nemusíte vkládat tolik energie do toho ostatního.

Příklady jsou výše, ale jeden z nich zkusím vysvětlit podrobněji. Hodně amerických společností a startupů se snaží “vyřešit taxislužbu”, některé do toho investují obrovské prostředky a přicházejí do hry s důležitými kontakty, a všichni makají na 100% – ale nikdo se v současnosti nevyrovná Uberu. Ten nejenže začal brzy, už v roce 2010 (což je samo o sobě technologický vhled), ale možná ještě důležitější je, že používá pokročilé prediktivní algoritmy, které mu umožňují poslat auto do vaší blízkosti ještě dřív, než vůbec víte, že chcete taxi. Tím pádem je Uber o řád užitečnější než jeho konkurenti. Tím pádem se nemusí tolik snažit. Lidé si o něm poví sami.

Kdyby vznikl Uber v ČR, určitě by to měl těžší s expanzí, než to teď má v Americe – ale pevně věřím tomu, že by si jej i tak v zahraničí všimli. Rozhodně by to měl jednodušší než 99% dnešních technologických projektů v ČR a SR.

Na co to svedeme?

Jenže Uber v ČR nevznikl. Stejně tak v ČR nevznikl například žádný z nejposlednějších izraelských startupů. Ani nic podobného. Místo toho tady vznikají projekty, které jsou už jenom o krůček napřed před Indií. Proč?

  • Chybí nám ambice?
    • Možná, ale nemyslím si, že je to tak horké. (Už jenom vzhledem k tomu, že o tom tak často sami mluvíme.) Vezměte si příklad českých a slovenských antivirových společností: jejich počátky také nebyly zrovna ukázkami obchodní dravosti. A koukněte, kde jsou teď.
  • Podráží nám nohy úřednický šiml?
    • Ano, ale zeptejte se kohokoliv, kdo v Česku nebo na Slovensku nějakou dobu úspěšně podniká — zatím jsem vždy slyšel, že je to sice opruz, ale rozhodně to samo o sobě není bariéra. Stačí mít, jak to popsal jeden úspěšný podnikatel, “železnou prdel”.
  • Chybí nám vzdělání?
    • Rozhodně ne. V porovnání například s Indií máme naprosto úžasný vzdělávací systém, navíc zdarma.[8] Čeští vývojáři se učí (nebo mají možnost se učit) pokročilé technologie (programovací jazyky, systémy, algoritmy) — a pak jdou programovat PHP weby.

Jeden velký problém tkví podle mě v tom, že se čeští a slovenští podnikatelé ještě nenaučili respektovat inteligenci lidí “pod nimi”. Vymyslí si projekt (včetně technologického řešení), a pak najmou co nejlevnější vývojáře, aby jim to “nakódovali”.

Z toho vychází mrtě dalších problémů. Český a slovenský pracovní trh si žádá hlavně levné vývojáře, kteří umí prototypovací jazyky typu PHP nebo JavaScript. Jazyky jako Java, C, Python nebo Ruby, ve kterých se dělá na lepších školách, a na kterých – jak jsme viděli výše – stojí naprostá většina současných technologických společností ve světě (včetně Googlu, Amazonu, nebo Applu, mimochodem), jsou považovány za příliš těžké a “drahé na deployment”.[7] Tím pádem se většina vývojářů učí PHP a má pocit, že jiné programovací jazyky a pokročilé vědomosti (např. umělá inteligence, HCI, systémové inženýrství), které se učí (nebo mohou učit) ve škole, jim k ničemu nebudou. Tím pádem jsou lidi s pokročilými vědomostmi neproporčně vzácní a drazí. Tím pádem si je firmy nemohou dovolit. Tím pádem volí za svůj tech stack raději to PHP. A tak dokola.

Ještě jsme v klidu

Jak jsem psal výše, zatím jsme před důsledky téhle spirály průměrnosti ochráněni tím, že hrajeme na vlastním písečku. Jenže naše pískoviště se stává stále otevřenější, a naše průměrné projekty a produkty začínají soupeřit s podobnými z rozvojových zemích.

Jen tak pro ilustraci: možná znáte úspěšný akcelerátor 500startups. To jméno – 500 startupů – má vyvolat údiv, nebo alespoň nějaké to nadzvednuté obočí. 500 startupů je hodně, ne?

Jo. A zatímco Američanům se zdá 500 startupů hodně, a nám se zdá hodně pár desítek, tohle se děje v Indii:

10.000 startups. Občas slyším, jak se někdo posmívá úrovni průměrného indického vývojáře. Ha ha. Smutné je, že zatímco jejich úroveň se rapidně zlepšuje, u nás spíš stagnuje, takže nebude trvat dlouho, a českým vývojářům zmrzne úsměv na rtech. Kvalitativně budeme na stejné nebo horší úrovni, a kvantitativně s Indií (a se zbytkem světa samozřejmě – Indie je jen příklad) soupeřit nemůžeme.

Co s tím?

Ono stačí docela málo: využít inteligence a vzdělání, které tady v ČR a SR (stále ještě) je. Nebát se těžkých technologických problémů (když kouknete trochu pod pokličku toho Uber algoritmu – zas taková magie to není).

A učit se nové věci. Nespoléhat se jen na české vysoké školství (které je ale pořád ještě o dost lepší než to indické, mimochodem). Jsem toho názoru, že každý vývojář by měl dobře znát alespoň dva (dostatečně rozdílné!) programovací jazyky. Stejně tak by měl každý programátor získat (a obnovovat) expertní znalost o svém oboru. To znamená: vědět o pokročilých algoritmech, o nejnovějších systémových technologiích, vědět, co je to MapReduce, jak se implementuje CMA-ES, atd. Ne nutně všechno zároveň, ale aspoň něco.

Každý designer by měl vědět nejen úplně vše o designu a User Experience, ale měl by mít velmi slušné povědomí i o věcech jako je HCI, analytika a byznys. Bez toho nemůže klientovi/šéfovi/vývojáři vysvětlit, čeho chce dosáhnout, a jak.

Každý člověk z byznysu (šéf, “Founder”, atd.) by měl vědět alespoň základy o věcech jako je vývoj, UX, ale také základy prediktivní analýzy nebo HCI. Ale hlavně by měl vědět, že základy nestačí, a že potřebuje spolupracovat s experty z oboru, a nechat jim prostor pro to, aby na technické/designové řešení přišli sami. Nerozumím například tomu, proč lidé z technologického byznysu nechodí častěji na univerzity a nesnaží se zuby nehty spolupracovat s výzkumnými centry (typu Data Science Lab na ČVUT).

Moje úzkost vyplývá z toho, že se ČR a SR pomalu ale jistě stávají irelevantní. Pokud se nebudeme zabývat těmi nejpokročilejšími technologiemi, a budeme řešit stejný typ technologických problémů jako průměrný indický startup, stává se z nás jenom předměstí Dílí. Navíc předměstí, ve kterém se ty samé věci dělají mnohem dráž a s menší vervou…

Jediná cesta ven je vytvářet produkty (webové stránky, aplikace, hardware) na světové úrovni. Brát si větší příklad z Izraele než z Indie.


[1] Bavím se o státech. Indie je samozřejmě díky svým talentům pracujícím v zahraničí už delší dobu obrovský pojem. Ale v samotné Indii se toho zatím z komerčně-technologického hlediska moc neděje.

[2] Viz například: The Software Economy: Why Software Jobs Are Taking Over nebo The Rise of Developeronomics.

[3] K tomu přispívá i to, že zatímco například slabý design můžete přebít technologií relativně snadno, naopak se to dělá hůř. “This week, Tesla made news when its Model S sedan outsold Porsche, Jaguar, Volvo, Land Rover, Lincoln, Fiat, and Mitsubishi in California. It managed that feat without any advertising or marketing. Tesla doesn’t even have a Chief Marketing Officer.” https://plus.google.com/112747417479881824801/posts/DjxY2B2gfEc 

[4] Jedno z mnoha. První eshopy tohoto typu lze lehce dohledat do roku 2010, i dříve.

[5] Srovnání je to samozřejmě dost neúplné a rozhodně nevědecké, ale myslím, že rozdíl je natolik patrný, že čtenář pochopí, o co mi jde. Samozřejmě uvítám, pokud někdo bude chtít udělat na toto téma regulérní studii.

[6] Problém vyhledávání na internetu už dávno před příchodem Googlu řešili jiní. Ale byl to právě technologický vhled do problematiky, který dal (přinejmenším v počátcích) Googlu navrch.

[7] Což mě fascinuje. PHP je jednodušší a levnější “na deployment” jenom v prototypovací fázi. Copak když někdo dělá firmu, která by měla (doufejme) existovat mnoho let, opravdu je pro něj tak důležité, že udělá “deployment” přes “eftýpko” za pět minut a že to může běžet na webhostingu za stovku měsíčně? Nemělo by jej spíš zajímat, co bude dělat za šest měsíců nebo za rok, až bude na projektu pracovat deset lidí a bude potřeba refaktorovat na denním pořádku?

[8] V Indii se určitě najde spousta škol špičkové úrovně, ale ty jsou pouze pro zanedbatelnou část populace – na rozdíl od našich škol. Ať si o našem školství myslíte cokoliv, vedle Indie je to Ivy League.

2. listopadu 2011 ↴

Nehostinný vesmír README.TXT

Nehostinný vesmír je minimalistický prototyp HTML5 3D hry. Zahrát si jej můžete zde. UPDATE: Ke hře si můžete pustit skladbu Angry Universe od Ondřeje Václavíka, která vznikla za tímto účelem.

Naprogramování Nehostinného vesmíru mělo jediný cíl: ukázat, že za 3 večery jde vytvořit prototyp HTML5 hry, který už je aspoň minimálně hratelný. Jak jsem psal na Google Blogu:

HTML5 je právě teď možná jediná platforma, na které lze vysloveně za jeden den vytvořit něco originálního, ale přitom potenciálně masově využívaného. […] Shodou okolností je HTML5 také platforma s obrovskou uživatelskou bází, která bude v nejbližších letech jenom růst.

V současném stavu Nehostinný vesmír skoro nic neumí. Hráč se snaží kometou strefit planetu Zemi. Kometa se chová podle fyzikálních zákonů (setrvačnost, zrychlení, gravitace). Score se navyšuje za zajímavé průlety. Zcela chybí persistence, tím pádem i high scores apod. Grafika (jestli se tomu tak dá říkat) je škaredá a splácaná horkou jehlou. A tak dále.

Jako PC hra by Nehostinný vesmír byl naprosto zoufalý. Vtip je v tom, že jako HTML5 hru si jej můžete zahrát bez instalace, okamžitě, bez přihlašování, a s jakýmkoliv moderním prohlížečem (s podporou WebGL). Už z toho důvodu toho člověk takové aplikaci také hodně odpustí. To jsou v tuto chvíli dvě hlavní výhody HTML5: skoro nulová bariéra vstupu a nízká očekávání.

Jak Nehostinný vesmír vznikl:

  • Nápad trochu vychází z jedné staré edukativní PC hry, kde jste mj. měli za úkol “řídit” raketoplán orbitující Zemi. Název si bohužel nevzpomenu.
  • Při programování WebGL jsem vyšel z tohoto Three.js dema od Mr Dooba.
  • Nejvíce času mi zabralo:
    • dostat se do Three.js (tahle úžasná WebGL knihovna bohužel není úplně svědomitě dokumentovaná)
      • ale tohle se bude hodit … :)
    • vzpomenout si na různá úskalí a specifika JavaScriptu
      • od TMZNS jsem na JS nesáhl — a TMZNS jsem navíc dělal v Closure
    • odladit fyzikální model, aby byl přiměřeně hratelný a přiměřeně realistický
      • nejvíc mi dal zabrat jeden idiotský bug, který jsem si na sebe sám ušil
  • Programování mě hodně bavilo (až na ten bug, teda), což přičítám hlavně extrémně rychlé iteraci
  • Prototyp bych měl hotový o dost dřív, kdybych nebyl tak důsledný a nebral ohled na (možný) budoucí vývoj:
    • Snažil jsem se vyhnout prasárnám jako globální proměnné apod. všude, kde to šlo.
    • Přestože se hra v podstatě odehrává ve 2D (plochá sluneční soustava), kód by fungoval i v plném 3D
      • zkuste při hře dát do adresního řádku toto a stisknout Enter:
        javascript:g_game.match.level.reset();g_game.match.level.shoot();g_game.match.level.playerControlledBody.velocity.set(0,100,0);
    • Není problém jakkoliv změnit sluneční soustavu
      • Orbitujících vesmírných těles může být kolik chcete, a můžou orbitovat kolem sebe navzájem (takže například zemský měsíc by klidně mohl mít svůj vlastní malý měsíc nebo by v prostřed soustavy mohly orbitovat dvě slunce kolem společného těžiště)
      • Přidat další planetu je záležitost nalezení textury a přídání příslušného elementu do JSONu na začátku html souboru
    • V kódu se počítá s levely, s více kometami (které se navzájem ovlivňují gravitačním polem), s různě rychle plynoucím časem
    • Krokový fyzikální model si dává pozor na příliš prudké změny. Pokud je těleso v silném gravitačním poli, na pozadí se až 16x zpomalí čas.
    • A tak dále..

Moc rád bych, kdyby tenhle můj experiment někoho povzbudil k tomu také si něco vytvořit v HTML5. V českém Googlu jsme nedávno spustili soutěž Mám padla, která má podobný cíl: povzbudit lidi k napsání minimalistických HTML5 aplikací. (S tím, že uděláme “galerii” přihlášených aplikací, kterou mediálně podpoříme!) Znáte tu analogii o naskakování na ujíždějící vlak? Mám pocit, že v tuto chvíli HTML5 vlak ještě ani nevystartoval (ale už zazněla píšťalka průvodčího) .. :)

Kód Nehostinného vesmíru je k dispozici open-source zde. Nevylučuji, že se k němu už nevrátím. Budu proto moc rád, pokud kdokoliv z vás kód jakkoliv využije. Buď z toho udělá regulérní hru, nebo třeba pomůcku pro výuku fyziky.

PS: Jestlipak uhádnete, která populární hra mě inspirovala k pracovnímu názvu “Angry Universe”. :)

28. července 2011 ↴

Vyplatí se loterie?


Občas mám problémy vysvětlit někomu, jaká nebetyčná blbost je sázení v loterii. Lidé stejně nakonec řeknou něco ve smyslu "ale co kdyby to náhodou vyšlo!" Co na to má po několika minutách vysvětlování člověk říct?

"Loterie je daň za blbost", říkají někteří. Nesouhlasím. Chápu, že matematika není pro každého, a některé věci prostě nejsou intuitivní. Dal jsem si proto takové duševní cvičení: jak hloupost loterie vysvětlit co nejjednodušeji a nejvíce pochopitelně. Tady je výsledek:

Jana a Honza se oba chtějí dobrat sumy 20 miliónů Kč (tedy jackpotu Šťastných 10). Jana šetří každý den 10 Kč. Honza si každý den kupuje loterijní lístek Šťastných 10, také za 10 Kč.

Pro našetření této částky bude Jana potřebovat 2 milióny vkladů, tedy 5479 let.

Nicméně: Ve chvíli, kdy má Jana našetřeno (tedy má 20 melounů v kapse), Honza s velkou pravděpodobností (79.9%) ještě nic nevyhrál. Skóre 20 miliónů ku nule.

Aby měl Honza alespoň 50:50 šanci, že vyhraje, potřeboval by sázet 6,177,782krát, tj. až do roku 18,936 n.l. To znamená, že sázení Šťastných deset je trochu jako čekání 17 tisíc let a pak hod mincí. :)

Kdyby chtěl mít Honza skoro jistotu (99% — protože úplnou jistotu nebude mít nikdy), nezbývá mu než sázet 112 tisíc let.

Pro představu, stejný počet let uplnynul od doby neandrtálců po dnes. Za 100 tisíc let bude mnoho dnešních souhvězdí k nepoznání kvůli pohybu hvězd v Galaxii.

Poznámky pro pozorné:
  1. Jana by měla 20 miliónů samozřejmě mnohem dřív — díky úrokům.
  2. Do úlohy na druhou stranu vůbec nepočítám fakt, že Honza může vyhrát i něco menšího než jackpot.
  3. I tak by byl ale výsledek stále o mnoho příznivější pro Janu.

Příklad jsem napsal co nejprimitivněji v Pythonu, abych měl možnost měnit parametry a případné zájemce provést celou logikou. Pravděpodobnost výhry ve hře Šťastných 10 jsem vzal z bakalářské práce Ondřeje Staňka "Loterie". Samozřejmě uvítám jakékoliv opravy či připomínky.


#!/usr/bin/env python
# encoding: utf-8

import datetime
import math

jackpot = 20000000
cena_listku = 10
pravdepodobnost_vyhry = 1.122e-07 # viz http://is.muni.cz/th/78265/prif_b/Loterie.pdf, str. 14

print(u"Jana a Honza se oba chtějí dobrat sumy {jackpot:n} Kč (tedy jackpotu Šťastných 10). Jana šetří každý den {suma} Kč. Honza si každý den kupuje loterijní lístek Šťastných 10, také za {suma} Kč.\n".format(jackpot=jackpot, suma=cena_listku))

pocet_nutnych_vkladu = jackpot / cena_listku
pocet_let_jana = pocet_nutnych_vkladu / 365.0
rok_jana = int(datetime.datetime.now().year + pocet_let_jana)

print(u"Pro našetření této částky bude Jana potřebovat {pocet:d} vkladů, tedy {pocet_let:n} let.\n".format(pocet = pocet_nutnych_vkladu, pocet_let = pocet_let_jana))

pravdepodobnost_prohry = 1 - pravdepodobnost_vyhry

pocet_sazek = pocet_nutnych_vkladu
kumulativni_pravdepodobnost_prohry = pravdepodobnost_prohry ** pocet_sazek
kumulativni_pravdepodobnost_vyhry = 1 - kumulativni_pravdepodobnost_prohry

print(u"Nicméně: Ve chvíli, kdy má Jana našetřeno (tedy v roce {rok} n.l.), Honza s pravděpodobností {p:.1%} ještě stále nevyhrál!\n".format(rok=rok_jana, p=kumulativni_pravdepodobnost_prohry))

fifty_pravdepodobnost = 0.5
pocet_nutnych_sazek_fifty = math.log(fifty_pravdepodobnost, pravdepodobnost_prohry)
pocet_let_honza_fifty = pocet_nutnych_sazek_fifty / 365.0
rok_honza_fifty = int(datetime.datetime.now().year + pocet_let_honza_fifty)

urcite_pravdepodobnost = 0.01
pocet_nutnych_sazek_urcite = math.log(urcite_pravdepodobnost, pravdepodobnost_prohry)
pocet_let_honza_urcite = pocet_nutnych_sazek_urcite / 365.0
rok_honza_urcite = int(datetime.datetime.now().year + pocet_let_honza_urcite)

print(u"Aby měl Honza alespoň 50:50 šanci, že vyhraje, potřeboval by sázet {pocetf:d}krát, tj. až do roku {rokf} n.l. Kdyby chtěl mít skoro jistotu (tj. 99%, úplnou jistotu nebude mít nikdy), nezbývá mu než sázet {let} let.\n".format(pocetf=int(pocet_nutnych_sazek_fifty), rokf=rok_honza_fifty, let=int(pocet_let_honza_urcite)))


Ještě krátká varianta jako "matematický příklad":

Člověk sází 10 Kč denně na Šťastných 10. Jak dlouho musí sázet, aby měl šanci 50:50 (hod mincí), že vyhraje jackpot? Odpověď: 17 tisíc let.


3. června 2011 ↴

Jak jsem naprogramoval TMZNS

Často přepočítávám časy v různých časových zónách. Někdy je to kvůli plánování dálkových konferencí, telefonátů, apod. — v tom pomáhá Google Calendar, který vše přepočítává automaticky. Častěji jde ale o mnohem primitivnější záležitosti:

  • Když mí kolegové v New Yorku něco vypustí v 9 ráno, kolik bude u nás?
  • Má teď cenu volat (nebo spěchat s emailem) do Indie? Do Japonska?
  • Když bude živý přenos z konference v Austrálii, kolik budou mít tou dobou v San Franciscu? A u nás?

Tady je Google Calendar krátký — nebo lépe řečeno “dlouhý”, protože byť v něm takové věci můžu zjistit, je to poměrně na dlouho. Jaké jsou další možnosti? Když hledáte v Googlu třeba time in tokyo, distanete odpověď, ale pouze o aktuálním času. Nejblíž k tomu, co potřebuji, je timeanddate.com, ale tam mě neskutečně nasírá jejich uživatelské rozhraní. Za drop-down menu s tři sta šedesáti šesti (!!!) položkami bych střílel. (Později jsem našel ještě mnohem použitelnější WorldtimeBuddy a EasyClock, ale i tady bych se dostával k požadované informaci zbytečně složitě a úplně nestandardním rozhraním.)

Osobně věřím, že pro textový vstup je pořád ještě nejlepší volbou — světe div se — klávesnice. Ideálně s auto-complete. Chtěl jsem rozhraní, kde bych mohl zadat: “9” → tab → “h” → enter → tab tab → “new y” → enter — a měl bych hotovo. 10 vteřin max. Místo toho jsem dostával samé klik → scroll scroll scroll scroll → klik → klik → scroll scroll → klik … a teď zadáme čas … klik → klik … oops, vedle … klik … → klik. Hotovo uff! Teď už jen kliknout na Convert time a počkat až se načte stránka. Co když chci změnit zadání? No přece zmáčknout link “Make changes to the current search” a klikat a klikat… Co když nedej bože potřebuji upravit druhý čas a zjistit, jak se to projeví na prvním? Vše znova.

Uznávám, že můj přístup je možná trochu specifický. Spousta lidí raději kliká. Ale napadlo mě, že by snad nebylo tak těžké něco takového naprogramovat a uveřejnit to na internetu. Krom toho jsem měl zrovna absťák z programování a hořel jsem touhou vyzkoušet Traceur. A taky Chrome Web Store.

A tak po večerech vznikl TMZNS. Začal jsem cestou na Google IO (7. květen) a první verzi “uveřejnil” 1. června.

Bylo to (samozřejmě!) víc práce, než jsem čekal. (Klasický příklad uvažování typu “tohle by přece mělo být jednoduché!”) V časových zónách je nicméně bordel: rozhodně nejsou jen po hodinách, nejsou rozloženy lineárně, ani po státech, každý si přehazuje letní čas, kdy chce, někteří víc než dvakrát ročně, atd. atp. Více info na Wikipedii.

Tvorba web aplikace mi trvala déle mj. proto, že jsem si toho chtěl co nejvíc vyzkoušet. Slibný Traceur jsem po chvíli vzdal, ještě v něm totiž není implementována žádná UI knihovna. Programování v Pythonu na AppEnginu jsem začal, ale velmi brzy jsem se vydal cestou “vše u klienta” — tedy JavaScript. AppEngine využívám, ale funguje jako bezplatný, velmi rychlý a nezničitelný webhosting (s tím, že je tam prostor na nějaké jednoduché API nebo aspoň statické URL typu tmzns.com/london/newyork do budoucna).

Následoval výběr JavaScriptové knihovny. Nejprve jsem automaticky sáhnul po jQuery, ale pak jsem se zamiloval do Closure Library. O výhodách i úskalích Closure a kompilovaného JavaScriptu se chci rozepsat na českém Google Blogu, takže si tady nechci vystřílet střelivo.

Po tom, co stránka začala jakž takž fungovat, jsem nasadil stylovací nástroj CSSEdit. Podle mě nejlepší způsob, jak “malovat” stránku v CSS. (CSSEdit jsem použil i při designu tohoto blogu.)

Protože je TMZNS open source projekt (zdrojáky tady), seznámil jsem se také blíže s Google Project Hosting a s Mercurialem (rozhodně doporučuji nad SVN, alespoň pro projekt tohoto typu).

TMZNS je web aplikace (která navíc využívá CSS3 a nejlépe vypadá v moderních prohlížečích), dávalo proto velký smysl ji dát na Chrome Web Store jako “aplikaci”. S nástrojem AppMator od kolegy Paula Kinlana to byla záležitost pár minut — i když to znamená, že v tuto chvíli “aplikace” není nic jiného, než bookmark k www.tmzns.com. Aplikace i s daty má totiž přes 7MB — a takové monstrum s tak jednoduchou funkcionalitou se fakt zdráhám někomu nahrávat na harddisk. Třeba se jednou dostanu k tomu tu velikost radikálně sesekat (“mělo by to být jednoduché”).

Aplikace mi už zdárně slouží a zdá se, že se líbí i ostatním. Na Project Hostingu už jsem (doufám zdárně) uzavřel svůj první, byť kosmetický issue. (Mimochodem, je neuvěřitelné, jak rozdílné je zobrazování barev na různých monitorech — původní “subtle” zvýraznění na některých monitorech vůbec nebylo vidět.).

Mám radost z vlastní tvorby i z naučených technologií. Takové projektíky si budu dávat častěji.