8. srpna 2009

Kterak David, král Internetu, přemohl vzpurné agnostiky

Část I - Vzestup pana Davida z Railsů

Bylo nebylo, v jedné malé IT firmě, přemýšlel jednoho dne programátor David H. nad svou prací. Měl toho hodně na todo listu a nešlo mu to příliš od ruky.
Jazyky, jimiž popisoval své webové dílo, byly příliš upovídané, neohrabané a navíc hustě nejednotné: Javascriptové motlitbičky, kratičké to prohlížečové otčenáše, se stále opakovaly a proplétaly v HTML křoví, databáze na druhém konci se nechala oslovovat pouze "YOUR HIGHNESS, PLEASE SELECT SOME DATA FROM YOUR TABLE TREASURE, ORDER IT AND SEND IT VERY QUICKLY BACK TO ME THROUGH MY TCPIP INTERFACE, NOW(), YES, FROM ALL AVAILABLE ENCODINGS USE THAT OF UNICODE, NO ANOTHER PROCESSING IS REQUIRED, THANK YOU VERY MUCH INDEED". S každým datovým typem byla spousta práce a nějaké knihovny nebo užitečné abstrakce -- pokud vůbec byly k mání -- byly příliš nepružné.

Takhle to nejde, řekl si David. Pořád se musím opakovat v tom, co chci napsat, a na to důležité, co odlišuje mou aplikaci od ostatních, se pak vůbec nesoustředím. Prohledávám mnoho různých referenčních manuálů od různých jazyků. Esence mého webu je příliš rozpuštěna v banalitách nižších úrovní kódu. Nešlo by to nějak stručněji? Abych stále nemusel vymýšlet ty samé identifikátory -- vždyť Customer je stále Customer a je to vlastně pořád jen řádek v tabulce customers. A má stále svůj jedinečný id, tak jako jakýkoliv jiný objekt webu. Vždyť stále konfiguruju databáze stejným způsobem, ať už píšu jakoukoliv aplikaci. Vždyť tu svoji Ajaxovou vychytávku kopíruju do všech stránek, ba co víc -- každou novou stánku mohu dokonce vytvořit automaticky skriptem -- tak jsou si podobné -- a pak ji teprve rozrůznit individuálním kódem.

Nepotřebuji stále činit ty samé volby, nemusím, když začínám psát aplikaci, dělat stále ta samá rozhodnutí, uvědomil si David. Chtělo by to to, co se opakuje, nějak jednoduše generovat. A chtělo by to celé slepit nějakým děsně pružným jazykem... Hm...
I vzal jazyk Ruby, do té doby nepříliš známou kuriózní japonskou napodobeninu Pythonu, a shledal jej krásným. "It is fun to code again!", zaradoval se. A ta skvělá komunita Ruby pohodářů!
Posílen na duchu, jal se David na serveru obalovat databázi abstrakcí, která každou relaci namapuje do Ruby objektu. Podobně obalil v prohlížeči javascriptovou knihovnu Prototype (dost dobrou pro každého), aby se nemusel trápit s Ajaxem. Aplikační logiku soustředil na jediné místo, do Řadiče, kde byla snadno pod Controllou, předvod URL adres do Řadičových metod pak svěřil univerzálnímu Výhybkáři. Na tvorbu nových HTML šablon zapojil mohutné Generátory a Lešenáře.

Po nějaké době radostného prgání vzhlédl David na své dílo. Je to jednotné, elegantní a vyjadřuje to můj názor na to, co je pro web dobré. Sviští to jak rychlík po kolejích. Název je dobrý, ještě logo by to chtělo. Do ERBu si dáme běloskvoucí kolej -- tak trochu připomínající šaškovskou čepici s rolničkami -- vetknutou do rubínového kamene.
Tak se zrodily Ruby on Rails.

A fungovalo to. David pak sekal rychle aplikaci jednu za druhou a vydělal spoustu peněz.
Ostatní weboví kodéři zpozorněli, nebylo možné dále přehlížet tolik (prý 37) Signálů. Jak to, že je ten David tak rychlý? Co on to používá za zázračný nástroj? Nechtěl by se o něj s námi podělit? Že Ruby? Nešlo by to celé rozjet jako open source? Prosíme... Když tak pěkně prosíme...

Weboví lidé dlouho Davida přesvědčovat nemuseli. Lichotilo mu, že se jeho tvrdohlavý ("opinionated") přístup k webovému frameworku podařil. Ano, co bylo dobré pro Davida, bylo určitě dobré pro ostatní kodéry. Rails stačilo vybalit z krabice, nahodit párkrát generátor a modelová železnice se rozjela ještě pod vánočním stromečkem. Nic nebylo třeba pracně spojovat, konfigurovat, atd. Kdysi suverénní databázový aristokrat byl uvržen do domácího vězení na hradě ActiveRecord. Dštil sice vzteky síru a chrlil lávu, nebylo mu to ale vůbec platné, jenom to trošku prosakovalo abstrakcí do hradních zdí, to ale nikomu nevadilo. A ten tajemný mág Ajax? Díky Davidovi jeho služeb teď mohl používat opravdu každý, nebylo nutné se učit nějaká kouzla.

A Davidova hvězda začala stoupat. Lidé po celém světě psali tutoriály, protože používat Rails bylo tak snadné, že napsat o tom, jak to udělat hello world, se vešlo do jednoho blogpostu. Začaly vycházet nejprve recenze, pak celé články v časopisech a nakonec knihy. Známý radar lorda Reillyho zaregistroval rychle letící objekt RoR a tak museli knihkupci ve svých obchodech brzy vyklidit novou poličku (tu mezi poličkami JavaScript a SQL), aby se tam knihy o Ruby a Rails vůbec vešly.
Rails vzkvétaly, k Davidovi přicházeli noví a noví kodéři a dobrovolníků, ochotných položit ruku k dílu, přibývalo. Zprvu tenké a pružné Rails se začaly plnit funkcionalitou a David, jenž v sobě rozpoznal náhle dar vůdce a génia, vyslyšel hlasu obchodníků a stal se králem.
Za pár let byly Rails Enterprise Ready a po drahém kameni Ruby najednou pošilhával skoro každý. A skoro každý líný hipík, jenž si na svém webu ještě donedávna vystačil jen s krabicí skriptózních Perel, chtěl najednou vyzkoušet Railsy.

Část II - Šlechta z Engine Yard

Zde bychom mohla naše pohádka končit, jenže... pak se to celé příšerně zamotalo.

Na Strojovém Dvoře se kníže Yehuda a hrabě Ezra bavili sestavováním a laděním virtuálních strojů. Byli to hračičkové, vše, co je zajímalo, byl tuning motoru v té nádherně lesklé, ale přecejen trošku pomalé káře jménem Ruby. Ladění výkonu je uživit nemohlo a tak si založili manufakturu na webové aplikace. Díky známému Davidově frameworku to šlo snadno a tak měli brzy dvůr plný urozených zákazníků.

Částečně kvůli své šťouravosti, částečně kvůli vrozenému citu pro rychlost, začali si Yehuda a Ezra brzy všímat určitých nedostatků Railsů. RoR byly, stručně řečeno, trochu pomalé a velké.
Ok, řekli si pánové, vyměníme pár součástek -- třeba objektově relační Mapovač by to chtělo nový, nebo... máme tu čím dál víc těhle RESTafariánů, co si stěžujou, že URL výhybka skřípe, co tak vyměnit ložiska? Aby nám to rychleji routovalo... Nebo tenhleten Prototype, neměli bychom to vyměnit za něco intuitivnějšího? A co když každému nevyhovuje šablonizér od ERBů? Co tak sjednocené rozhraní k různým webserverům?

A tak přátelé konstruktoři rozebrali Railsy na součástky a snažili se je poskládat jinak, lépěji. Jenže to do sebe nepasovalo, původní framework tvrdošíjně omítal nové díly tak, jako tělo nemocného odmítá transplantované orgány. Davidova Tvrdohlavá Konfigurace(TM) se vždy novému uspořádaní vzpírala. Ať už chtěli zamontovat do celku DataMapper, jQuery nebo Haml, původní staré díly byly natolik srostlé se zbytkem frameworku, že se nedaly jednoduše vyměnit.

Nu což, když to nejde zapojit do Rails, postavíme si framework nový, lepší. Bez tvrdohlavé konfigurace. Mít předvařené nastavení je fajn, každý začátečník jistě ocení, že všechno hned funguje. Co ale my, pokročilá tuningová aristokracie? Přece nechceme, aby nás David stále vodil za ruku. A co jiní šikovní web autoři na vyšší úrovni? Vždyť každému jen trochu schopnějšímu progišovi musí za chvíli lézt jediný správný Davidův názor na nervy.

Však jádro frameworku nemusí být napojeno na to ostatní. Nemusí nic dopředu vědět o relační abstrakci, o javascriptové knihovně, o technologii HTTP šablon. Náš framework může být takto krásně agnostický, co nepotřebujeme, to nepoužijeme.
No a samozřejmě, že je to pak celé jednodušší, čitelnější a rychlejší.

Naši konstruktoři si vzápětí uvědomili, v čem je podstata problému: Autoritativní přístup krále Davida je to, co pomohlo říši Railsů vybudovat a šířit její slávu, o tom žádná. Je to ale zároveň i nepřekonatelná filozoficko-teologická bariéra. Ten samý názor, co Railsy proslavil, teď brání jejich rozvoji. Co bylo dobré pro středověký venkov, není dobré pro nové renesanční město.
Chce to víc demokracie. Co takhle nabízet framework ve dvou krabicích? Jednu "opinionated", pro rychlý start, druhou pak jako stavebnici plnou dílů pro hraní. Ať si každý vybere, co mu vyhovuje.

Jak řekli, tak udělali a brzy se začalo o Merbu (tak svůj framework pojmenovali) mluvit mezi Railsovými odborníky. Uznalí kodéři oceňovali jeho rychlost, agnosticitu, čistý a elegantní návrh, jaký si může dovolit jen framework rostlý na zdravě zelené louce.
Jistě, Rails jsou náš bohatě vybavený a lety prověřený framework a Merbu bude dlouho trvat, než se stane "Enterprise Ready"... Ještě to ani není hotové a už je to tak dobré? No, počkáme na verzi 1 a zkusíme to místo Rails, honily se hlavou kacířské myšlenky nejednomu Davidově podanému.
Mem Merbu získal brzo své hlasatele a evangelizátory (zvláště pak slovutného pana Aimonettiho) a rychle se šířil všemi progišovsky zaměřenými sociálními sítěmi.

Část III - Zpětnovazební Signály

Na Davidově zámku zavládlo napětí a nervozita. Král byl poslední dobou stále zamračenější a zlostnější. "Co je to za pohůnky? Tak blbé jméno, jako je Merb, můžou vymyslet jen lidé s Java minulostí!", klel David, kudy chodil, a začal opět vysílat Signály kolem sebe: "Vám se to líbí?", ptal se svých rádců. "No jo, ta myšlenka je... přinejmenším použitelná, Vaše výsosti.", navrhovali rádci opatrně.

Dobrá, řekl po dlouhém uvažování David. Chci to taky. Chci agnosticitu, veřejná rozhraní garantovaná, tak, aby se jednotlivé části Rails do sebe daly zapojovat bez ohledu na verze. Chci rychlejší výhybky.... Nechci ale měnit svou jasnozřivou konfiguraci, která je dobrá pro mě i pro ostatní. A navěky bude.

"Vaše eminence.... ehm.... to není snadné", namítali rádci. "Do Railsů se nám nalepilo spoustu nového kódu, všechno se vším souvisí, těch vrstev, pořád chodí někdo s něčím novým, původní Vaše jasná myšlenka a geniální stavba se nám začíná pomalu hroutit pod tíhou všech těch přístavbiček a ozdůbiček na různých místech. Nepřítel má výhodnější pozici štíhlého lehkooděnce, jenž se ještě nedopustil vážnější chyby, lépe manévruje, je to miláček blogosféry. Merb má méně kódu, proto ho může pružně přizpůsobovat potřebám uživatele a nemusí stále dávat pozor na to, aby zůstával Enterprise Ready jako my."

To je pravda, musel David připustit. Léta strávená nad narůstající kódovou bází Railsů se začínala projevovat, prgání v Ruby už dávno nebylo tolik funny, dokumentace k frameworku začínala pomalu ale jistě připomínat onu nesourodou knihovnu referencí, babylon webových jazyků. To, co tak kdysi nenáviděl.
Co když... co když Merb ve své popularitě Railsy brzo úplně zastíní? Co když se má říše rozpadne a mí věrní odejdou k Merbu? Co když byznys přestane přijímat naše Signály a pokladna postupně vyschne? Co když nebudu slavný?

Ne, na zoufalství mám dosud čas. Poličku Merb vedle své poličky v knihkupectví prostě nesnesu, musím rychle zakročit, rozhodl se David.
Toho bohdá nebude, abych musel měnit Názor.

Část IV - Together we stand

I pozval David v předvečer velkého koncília celou družinu ze Strojového Dvora, jakože na pokec. Že by je jako seznámil se svým nápadem. Že respektuje všechna odlišná stanoviska. ("Pojďme nechat stranou -- jen pro teď samozřejmě -- naše rozdílné Názory a pojďme se bavit řečí, která je nám společná, tedy jazykem Ruby. Však jsme, chlapi, všichni kodeři, ne?").

A tehdy udělal Yehuda a jeho blízcí svou první -- bohužel však zásadní -- chybu: Davidovo pozvání přijal.

"Hele kluci, jste vážně dobrý speed démoni. Takhle vybudovat framework od základu není sranda, vím, o čem mluvím", začal nadšeně David. " Ta vaše agnosticita, to je vážně bomba. Vyměňovat knihovny podle libosti, o tom jsem snil dávno, to už jsem pro Railsy dávno plánoval. Jenže ty moje vladařský povinnosti. Na prgání už nemám vůbec čas, pořád nějaký interview, pořád samý konference. Ruby fun? No more. Heleďte, co byste tomu řekli, kdybychom se usmířili a kdybychom... tak nějak... ehm... spojili síly? Potřebuju šikovného ředitele vývoje, obratného ministra propagandy, pár schopných refaktorizátorů a evangelizátorů... všem bych se bohatě odměnil."

Yehudovi poklesly čelisti: "Vaše výsost promine, ale to nejde. Ceníme si vaší nabídky, ale máme své záměry spojeny s budoucností Merbu a na víc už nám příliš času nezbývá..."

"Samozřejmě víme, jak na tom jsme", náhle zvážněla králova tvář. "Signálům se celkem daří, zatímco váš Dvůr musel nedávno propouštět.... Víte, doslechlo se mi, že se objevily nějaké pochybnosti ohledně originality vašeho kódu. Já bych nechtěl -- na to si vás opravdu vážím -- abyste někde u soudu museli vysvětlovat, co to vlastně znamená, že Merb jsou vlastně Railsy udělané pořádně, jak vy s oblibou říkáte. Proč je tam tolik společných prvků, stejných názvů. Já tohle opravdu nepotřebuju, tenhle negativní marketing, myslím, že všechny zlý jazyky můžu ještě a včas snadno umlčet, pokud budete... totiž budeme spolu spolupracovat."

"Ale, to přece nejde..." hledal Yehuda jen obtížně slova. "Nemůžeme mít vedle sebe dva frameworky. A tvářit se, že spolupracujeme."

"No, já myslím, že si ještě úplně nerozumíme", pousmál se král David. "Ať jsem se se to snažil promýšlet z různých konců, pořád mi vychází, že není pod sluncem místo pro dva dobré webové frameworky psané v jednom jazyce."

Ticho bylo dlouhé a absolutní, přerušil ho až cvrkot startujícího slideshow na královském noteboku.
"Představuju si to nějak takhle: Vyhlásíme sloučení obou frameworků. To nejlepší z frameworku Merb... tedy, říkejme mu nyní pracovně Větev Merb, bude sloučeno do hlavní vývojové větve Railsů. Rails3 rovná se Rails2 plus Merb1", nastínil David vskutku jednoduchou rovnici na prvním slajdu. "Co je dobré pro Rails, je dobré pro všechny Rubyisty, a to jak pro věrné, tak i pro ty, co náhodou sešli na hříšnou stezku, svedeni vábením lákavého agnosticismu. Na konferenci budete tvrdit, že jste vlastně psali Merb s úmyslem poukázat na chyby v Railsech a já se vší pompou vyhlásím, že je mi ctí uvítat v týmu skvělé odborníky, jakými jste vy. Budete Těmi, kdo zbavili Rails hnoje. Kredit zajištěn. Nakonec je to jasný win-win pro vás i pro mě, ne?".

"No... a co komunita?" vzmohl se schlíplý Aimonetti na jakýsi odpor. "Nemůžeme přeci tvrdit , že Raisy jsou super, když ještě včera jsme říkali, že nejsou. Lidi budou naštvaný a přestanou nám věřit."
"Podívej, kámo... můžu ti říkat šéfevangelizátor?", zeptal se král, aniž by očekával nějakou odpověď. "Lidi budou brblat a nakonec si stáhnou nový Railsy, znám je. Vždycky to tak bylo, nakonec si stáhli poslední verzi, přestali žvanit a zvykli si.... A co se týče nějaké změny názorů... jsem připraven dokonce připustit, že jsem se -- jen v něčem, samozřejmě -- mýlil. No představte si to, takovou oběť z mý strany... Tím vytvoříme prostor pro Amonioniho, zdatného to nového ministra propagandy, jenž připraví názorovou platformu pro nastávající velký Merge. Nikdo z nás nemusí ztratit svou čest... a když, tak jen kapku. V budoucnosti plné zářivě lesklých Railsů si na to stejně nikdo nevzpomene."

Yehuda vydechl: "Rozmyslíme si to, králi, musíme se teď poradit."
Králův rubínový mobil se náhle rozezněl. "Eh, tyhlety právníci, to jsem mu říkal, ať teď nevolá", umlčel David telefon. "Dobrá, kluci, já myslím, že se rozhodnete správně... jak říkám, ten váš agnosticismus, to bylo fakt dobrý... Jo, ještě jsem se chtěl zeptat, kdo z vás napíše naše společné komuniké?"

Část V - Ve starých dobrých Kolejích

Měsíce již uplynuly od chvíle, kdy David zachránil svoji říši.
Geniální galejník Yehuda už plně fixuje bugy v přechodové verzi Rails2 a když si potřebuje trochu odpočinout, refaktorizuje Rails2 do podoby Rails3.
Schopný politruk Aimonetti evangelizuje, až se mu z blogu práší, a připomíná nám, co všichni dobře víme: cílem není glorifikovat své jméno, ale vyvinout nejlepší řešení. A pokud zánik Merbu pomůže, aby se Railsy staly opravdu nejlepším frameworkem pod sluncem, je to win-win pro všechny.

Slíbený Merb 1.1 (jakési spasení pro hrstku poražených agnostiků pomocí cesty k Rails3) je v nedohlednu, připravované knihy o Merbu mění názvy. A Merb komunita? Ona tu nějaká byla?
Král David, mistrný státník s pevnou rukou, měl tedy nakonec pravdu. Ještě trochu brbláme, ale už se všichni těšíme, až zase budeme "Enterprise Ready".