Malá JavaScriptová úloha - řešení

Řešení

Řešení včerejší JavaScriptové úlohy se pro někoho možná překvapivě vejde na jeden jediný řádek (když nepočítám hlavičku funkce a koncovou složenou závorku):

function ping(url) {
  (new Image).src = url;
}

Princip řešení je jednoduchý – vytvoří se nový objekt typu Image a vlastnost src se mu nastaví na cílové URL. To způsobí, že prohlížeč metodou GET toto URL stáhne. (Pak se výsledek pokusí interpretovat jako obrázek a nejspíš se mu to nepovede, ale to už nás nezajímá.)

Na toto řešení přišel hned první a jediný komentující, kukulich.

Já sám jsem tento trik poprvé viděl před pár dny ve zdrojovém kódu stránek Y Combinator Startup News, kde je použit místo složitějšího XMLHttpRequestu na implementaci mechanismu hlasování (kliknutí na malé šipce u příspěvku).

Proč?

Proč o tomto triku píšu na svém zápsiníku? Protože je to ryzí hack. Krásný, krystalicky čistý příklad toho, jak je webové programování v mnoha věcech nesystematické a lecos je možné (a někdy nutné) dělat prostředky určenými na něco úplně jiného.

Vůbec se nedivím některým svým spolužákům, kteří nad webovým programováním ohrnují nos. Pokud přišli třeba z přehledného a uhlazeného světa Delphi nebo .NETu, musí jim web připadat jako chaotická džungle.

Pro mě osobně má webové programování své kouzlo v něčem jiném, než v programování samotném. Především má extrémně rychlý vývojový cyklus – od naprogramování funkce k jejímu zpřístupnění všem uživatelům mnohdy uplynou jen desítky sekund. To je ideální pro mou netrpělivou povahu a snahu o maximální bezstavovost (tj. nemít nic dlouho rozdělaného a nedokončeného). Další přitažlivý prvek je pak interaktivita celého webu, přímý kontakt se čtenáři/uživateli. Tyto dvě věci dohromady přebijí programátorské nepohodlí. Věřím, že nejsem sám, kdo to takto vnímá.

Vadí nedokonalost?

Ale zpět k mé úloze a použítí skriptu na Y Combinator Startup News. Pečlivější čtenáři si možná všimli, že použití GETu pro implementaci hlasování není vhodné. Měl by být použit POST, protože na serveru proběhne zápis do databáze. Dalším nedostatkem je absence ošetření chyb.

Otázka je: Opravdu tyto nedostatky zrovna u téhle malé funkce vadí? Paul Buchheit, který skript na hlasování na výše zmiňovaném webu napsal, je přesvědčen, že nikoliv:

If you're writing missile guidance software or something then, please, please, please do things the right way — it's better safe than sorry, right?

However, if you're writing little web apps, then there's a good chance that you can bend a lot of the rules and produce a better product sooner. I'd rather have something imperfect but useful and popular than something "perfect" but unfinished and unused. Sometimes, it's better sorry than safe.

Co myslíte, má pravdu?