jQuery, Rails i renesansa web developmenta

Kako je jedan Danac i jedan tinejdžer vratili zabavu u pisanje weba, dok je Java i dalje pisala XML duži od romana.

poglavlje 10/2420 min čitanja2001 – 2010

Godina je 2006. Sjediš pred monitorom u dva sata ujutro i pišeš isti if-else blok koji si pisao i sinoć: ako je Internet Explorer, radi ovo; ako je Firefox, radi ono; ako je nešto treće, pomoli se. Preglednički rat — ona duga svađa devedesetih i ranih dvijetisućitih u kojoj su se Netscape i Microsoftov Internet Explorer natjecali tko će nametnuti svoja pravila internetu — službeno je završen. Netscape je mrtav, Microsoft je pobijedio, ali kao i u svakom pravom ratu, pobjeda je ostavila ruševine, a ti čistiš krhotine koda za 30 dolara na sat. JavaScript nije jezik koji pišeš. JavaScript je jezik koji pregovaraš, s tri strane odjednom, i sve tri strane su nepredvidive.

Dvadeset metara dalje, metaforički, sjedi tvoj kolega koji radi na Ozbiljnoj Enterprise Aplikaciji. On nema JavaScript problem. On ima drugi problem: da bi ispisao „Hello World” na ekranu (tradicionalno prvi program koji se piše kad učiš novi jezik — ispiše se ta poruka i to je to), prvo mora definirati Fabriku koja proizvodi Graditelje koji sastavljaju Rukovatelje. Ne pitaj što točno rade — u praksi, uglavnom ništa, samo međusobno dodaju sloj i predaju posao dalje, kao birokratski lanac potpisivanja koji na kraju ipak treba jedan potpis. XML datoteka (još jedan format za zapisivanje podataka, sličan HTML-u, samo dosadniji) koja opisuje tu arhitekturu duža je od stvarnog koda koji nešto radi. Kad ga pitaš zašto, kaže ti nešto o skalabilnosti, o enterprise obrascima, o tome da se ovako radi u pravim firmama. Vjeruješ mu. Mora vjerovati — inače bi morao priznati da je protratio popodne.

To je 2005., 2006., 2007. Web development plaća račune, ali ne veseli nikoga. Postao je posao za odrasle ljude koji se sjećaju kad je pisanje koda bilo — čekaj, je li ikad bilo zabavno? Možda jest, jednom, prije nego što je stigao Internet Explorer 6 i prije nego što je zajednica oko Enterprise Jave odlučila da je patnja dokaz profesionalizma.

Jedan od njih je Danac koji je upravo završio web-aplikaciju za upravljanje projektima za svoju firmu i primijetio da je ono što mu je preostalo — kad je izbacio sav suvišni ceremonijal — zapravo prekrasan mali kostur koji bi mogao poslužiti baš svakome. Drugi je dvadesetdvogodišnjak, umoran od toga da svaki put iznova rješava isti problem s biranjem elemenata na stranici (onaj dio koda koji kaže „nađi mi to dugme” ili „obojaj sve naslove plavo”), pa odluči napisati funkciju koju će zvati dolarom — jer zašto ne.

Nijedan od njih u tom trenutku nije imao pojma da će za dvije godine njihova imena postati sinonim za tektonski pomak u tome kako se piše web. Oboje su samo željeli da im ponedjeljak ujutro bude malo manje bolan.

David Heinemeier Hansson nije jednog dana sjeo i rekao si: napravit ću framework koji će promijeniti web (framework je, pojednostavljeno, gotov kostur softvera na koji programer samo nadograđuje svoje specifičnosti, umjesto da svaki put iznova gradi temelje od nule). Radio je nešto puno prizemnije — pravio je Basecamp, alat za upravljanje projektima za tvrtku 37signals — i, kao svaki normalan programer koji piše isti kod po treći put u istom tjednu, počeo je taj kod izvlačiti van. Ne zato što je sanjao o slavi, nego zato što ga je mrzilo pisati istu stvar iznova. Rezultat te lijenosti — plemenite, produktivne lijenosti — zvao se Ruby on Rails.

A da bi Rails uopće mogao postojati u obliku u kojem je nastao, netko je prvo morao napraviti Ruby — programski jezik kojeg je Yukihiro Matsumoto, poznatiji kao Matz, dizajnirao s jednim ciljem: da programeri budu sretni. Ne brži, ne produktivniji u tablicama za investitore, nego sretni. Godinama je to zvučalo kao simpatična, ali marginalna ideja iz Japana — jezik za entuzijaste koji nikad nije imao svoj veliki, prljavi, komercijalni trenutak. DHH mu je taj trenutak donio. Matz je htio sreću; DHH je htio Basecamp gotov do petka. Ispalo je da je to, u suštini, isti projekt.

Ono što je Rails zapravo tvrdio, ispod sve buke, bila je jedna heretička rečenica: ne treba ti odluka za svaku sitnicu. Java-svijet tog vremena, konkretno njegova korporativna inačica zvana J2EE, tjerao te da eksplicitno, pismeno, u XML-u (to je jedan od onih formata gdje se sve piše u ukošenim zagradama, tipa <ime>Pero</ime>, a služi da programi razmjenjuju podatke i podešavanja) objasniš serveru gdje ti je koji fajl, kako se zove koja klasa, koji je interface za koju implementaciju — kao da radiš ugovor s bankom, a ne aplikaciju. Rails je rekao: ako se tvoj model zove Post, tablica se zove posts, i gotovo, kreni dalje. To je ta slavna »convention over configuration« — konvencija umjesto konfiguracije. Ne moraš odlučivati o stotinu sitnica jer je netko već odlučio za tebe, i ta odluka je, iznenađujuće često, ona ispravna.

Ali ono najhrabrije u cijeloj priči nije bila brzina — brzinu je imao svatko koji je pisao prečice. Najhrabrije je bilo to što je Rails imao mišljenje. I nije se toga sramio. Većina alata tog vremena htjela je biti sve za svakoga: fleksibilna, neutralna, prilagodljiva bilo kojoj arhitekturi koju zamisliš. Rails je rekao — ne. Ovako se radi kod nas. Ne sviđa ti se? Idi negdje drugdje. Framework koji te odbija pustiti da radiš sve na svoj način, jer je zaključio da tvoj način vjerojatno ipak nije bio dobar — tada je to bila gotovo skandalozna pozicija.

I upravo je to mišljenje, ta odbojnost prema beskonačnom biranju, postala Railsov najveći adut. Manje odluka znači manje umora. Manje umora znači da stigneš do ideje prije nego što izgoriš na konfiguraciji. A 2005. je bila godina kad je cijela jedna generacija programera prvi put osjetila da web development ne mora biti kazna.

Kultura oko Railsa
§ 02

Kultura oko Railsa

Sad, kad ti dvadesetčetverogodišnjak ekstrahira framework iz svog projekta i objavi ga, to samo po sebi ne mora značiti ništa — frameworkove je objavljivao svatko. Ali DHH nije samo objavio kod, objavio je i mišljenje, glasno i uporno, i to je bila prava novost. Rails nije stigao tih i skroman; stigao je s pratećom filozofijom koja se zvala »opinionated software«, što bi se u prijevodu dalo reći: ovaj alat zna bolje od tebe kako treba raditi stvari, i ako se ne slažeš, idi koristi nešto drugo. Zvuči arogantno? Jest. Ali nakon godina u kojima si prije prvog reda koda morao sam donijeti tristo odluka — koja arhitektura, koji XML, koji design pattern — netko koji kaže „radi ovako, vjeruj mi” djeluje kao oslobođenje, a ne kao diktatura.

Ta filozofija je dobila i svoju bibliju. 37signals — firma iz koje je Rails i nastao — 2006. objavljuje „Getting Real”, besplatnu knjigu koja je zapravo manifest protiv svega što je korporativni svijet propovijedao. Nema poslovnih planova od pedeset stranica. Nema tima od dvadeset ljudi da napravi ono što troje mogu za vikend. Nema sastanaka o sastancima. Prava rečenica iz te knjige — parafraziram, ali duh je isti — glasi da je manje zapravo više, da su ograničenja tvoj prijatelj i da bi trebao graditi pola proizvoda, a ne proizvod na pola. Zvuči kao nešto što bi danas pisalo na posteru u startup uredu s betonskim zidovima i stolom za stolni tenis, i — pogodi — upravo je to i postalo. „Getting Real” je bio manifest za generaciju umornu od korporativnog folklora, i konačno je netko to napisao naglas.

A onda su ljudi počeli to i raditi. Ne teoretizirati, raditi. Rails postaje kičma prve velike generacije startupova Web 2.0 doba — logično, jer je obećavao upravo ono što je ta generacija tražila: brzinu od ideje do proizvoda. Twitter je krenuo na Railsu i, da, o tome ćeš čuti više u poglavlju 8, uključno s onim slavnim kitom koji leti u zrak dok mu ribe pomažu da ostane iznad valova — »fail whale«, simbol aplikacije koja je rasla brže nego što ju je njezin framework mogao pratiti. To nije bila mana Railsa. To je bio danak uspjeha: alat koji te pusti da nešto sagradiš brzo ne obećava da će isto to i podnijeti kad te otkrije cijeli internet. GitHub, o kojem opet više u poglavlju 13, isto na Railsu. Shopify, isto. Cijela flota startupova koje danas doživljavaš kao institucije internetske ekonomije, u temeljima ima taj isti »opinionated« framework.

Ono što je bitno zapamtiti iz ovog poglavlja kulture jest da Rails nije bio samo tehnički izbor. Bio je izjava stava. Birati Rails 2006. značilo je birati stranu u ratu — stranu koja je vjerovala da programiranje smije biti brzo, zabavno i s mišljenjem, a ne birokratska procedura s formularom za svaku odluku.

jQuery: flaster preko rana browsera
§ 03

jQuery: flaster preko rana browsera

Dok je DHH u Kopenhagenu ekstrahirao Rails iz Basecampa i pripremao petnaestominutni atentat na Javu, jedan dvadesetdvogodišnjak u Americi imao je mnogo skromniji problem. John Resig je radio na projektu koji je trebao raditi u svim preglednicima, a preglednici su se, kao što smo već vidjeli, međusobno mrzili s takvim žarom da su gradili paralelne svemire umjesto zajedničkih standarda. On nije htio spasiti web. Htio je da mu `document.getElementById` prestane biti dvanaest redaka koda, ovisno o tome je li korisnik u Internet Exploreru, Firefoxu ili nekom trećem pregledniku koji je odlučio protumačiti HTML po vlastitom nahođenju.

U siječnju 2006. na konferenciji BarCamp NYC, Resig je pokazao malenu biblioteku pod imenom jQuery. Ideja je bila uvredljivo jednostavna: umjesto da ti, programeru, pišeš zaobilaznice za svaki preglednik posebno, jQuery to radi za tebe, jednom, i onda ti daje jedan poziv koji radi svugdje. Taj poziv je „$()” — dolar, zagrada, i unutra staviš što god trebaš (id elementa, klasu, css selektor) i gotovo, imaš objekt kojim možeš raditi što hoćeš. Htio si sakriti element? „$("#dugme").hide()”. Htio si mu zakvačiti klik? „$("#dugme").click(funkcija)”. Nema grananja po tome koji je preglednik, nema „if (browser == "IE")” sramote koju smo prošli u petom poglavlju ovog dijela. Jedan API, jedna sintaksa, i ispod haube neka nepregledna gomila provjera koje su NEKOME već riješile taj problem — tebi ne treba.

I tu je zapravo cijela poanta, pa je vrijedi reći glasno: jQuery nije riješio problem nekompatibilnih preglednika. Taj problem je i dalje postojao, jednako ružan kao prije. jQuery ga je samo preselio — iz tvog koda u svoj kod, jednom, za sve. To je, ako želiš, poslovni model u jednoj rečenici: uzmi bol koju svi osjećaju pojedinačno i pretvori je u proizvod koji tu bol osjeti umjesto njih, jednom, temeljito, i onda naplati (u ovom slučaju besplatno, ali naplati u pažnji i ovisnosti) svima koji tu bol više ne moraju osjećati. Nije slučajno da su najuspješnije biblioteke u povijesti softvera baš te koje su nekome uzele mučenje i vratile mu ga kao dugme.

Slogan koji je Resig lijepio uz projekt — write less, do more (u prijevodu: piši manje, radi više) — zvuči kao floskula s korice priručnika za produktivnost, ali u ovom slučaju bio je literalno točan, mjerljiv, u redovima koda. Ono što je prije bilo dvadesetak redaka provjera i grananja postalo je jedan lanac metoda koji se čita kao rečenica: uzmi ovo, sakrij, dodaj klasu, animiraj, gotovo. Programeri koji su cijelu 2005. proveli boreći se s preglednicima kao s nepredvidljivim rođacima na obiteljskom ručku sad su dobili alat koji se ponaša isto — svugdje, uvijek, dosadno predvidljivo. Dosadno predvidljivo je, u web developmentu, najveći kompliment koji nešto može dobiti.

Rast je bio takav da ga je teško objasniti riječima bez brojke, pa evo brojke: u svom vrhuncu, sredinom 2010-ih, jQuery se nalazio na više od polovice svih web stranica na svijetu. Ne polovica stranica koje su htjele biti moderne, ne polovica stranica velikih tvrtki — polovica svega, uključujući stranicu tvog lokalnog vodoinstalatera koji nema pojma da mu je stranica ikad učitala nešto što se zove JavaScript. To je količina koda koja se, u jednom trenutku, vjerojatnije nalazila u tvom pregledniku nego što se ne nalazila. Malo je softvera u povijesti ikad dotaklo takav postotak ljudske populacije s pristupom internetu, a jQuery je to radio šutke, u pozadini, bez logotipa koji bi ikad vidio.

Sad, pošteno pitanje koje bi laik trebao postaviti, i koje si vjerojatno već postavio: zašto uopće treba biblioteka za nešto što bi, logično, trebalo biti dio samog jezika? Zašto JavaScript, ili preglednici, nisu jednostavno standardizirali ovo umjesto da čekaju da netko izda flaster? Odgovor je onaj isti koji smo vidjeli već nekoliko puta u ovoj knjizi: standardi su spori, demokratski, moraju ih usuglasiti konkurenti koji se međusobno gledaju popreko — a bol postoji SADA, u ponedjeljak ujutro, kad ti šef treba funkcionalnu formu do petka. Uzmi, na primjer, ono što se zvalo »ajax poziv« — sposobnost stranice da u pozadini pita server za novi podatak i ubaci ga na ekran bez da se cijela stranica ponovno učita, kao kad konobar dotrči do stola s novom narudžbom umjesto da cijeli restoran zatvori i ponovno otvori za svaki dodatni pomfrit. Prije jQueryja to je značilo desetke redaka koda različitih za svaki preglednik; s njim, jedan poziv, i gotovo. Standardizacijsko tijelo neće ti spasiti petak. jQuery hoće. Pa ljudi, sasvim razumno, uzmu ono što radi u petak, a standard neka dozrijeva u svom tempu, u konferencijskim dvoranama, godinama.

To je isti obrazac koji ćeš prepoznati kroz cijelu ovu knjigu — privremeno rješenje koje pokrpa rupu dok se čeka da institucije stignu, a onda se to privremeno rješenje ukorijeni tako duboko da ga institucije moraju uzeti u obzir kad konačno stignu. jQuery nije čekao dopuštenje nikoga. Napravio je svijet u kojem su proizvođači preglednika i W3C (organizacija koja službeno piše pravila za to kako web uopće funkcionira, samo malo sporije od stvarnog života) morali gledati što programeri stvarno rade s tom bibliotekom, i onda su, godinama kasnije, počeli ugrađivati baš te ideje u sam jezik. Ali to je priča za kraj ove sekcije, a ne za sad — sad je 2006., 2007., 2008., i jQuery jednostavno pobjeđuje, tiho, jedan `<script>` tag po jedan `<script>` tag.

Ono što je Resig zapravo napravio nije bilo tehnički revolucionarno u smislu da je izmislio nešto nezamislivo — svako od tih rješenja postojalo je i prije, razbacano po forumima i blogovima kao domaći recepti. Ono što JE bilo revolucionarno je odluka da se sve to skupi, testira na svim preglednicima koji su tada postojali, upakira u jednu datoteku koju možeš uključiti u tri sekunde i onda distribuira besplatno, pod licencom koja ne traži ništa zauzvrat. Demokratizacija boli jednako je vrijedna kao demokratizacija moći — a jQuery je upravo to i bio: alat koji je svakom developeru, bez obzira koliko iskusnom, dao pristup rješenju koje su prije imali samo oni spremni satima čitati izvještaje o greškama vezanima za kompatibilnost preglednika.

Renesansa kao raspoloženje
§ 04

Renesansa kao raspoloženje

I onda se, negdje između 2006. i 2008., dogodi nešto što se u ovom poslu ne događa često: ljudima postane zabavno. Ne zabavno kao „hakiram sustav i osjećam se moćan”, nego zabavno kao „idem doma napraviti neku glupost za vikend, samo da vidim hoće li raditi”. Rails i jQuery nisu bili razlog te promjene raspoloženja — bili su alat kroz koji se ta promjena konačno mogla dogoditi. Razlika je bitna. Alat ne mijenja ljude, alat samo skida prepreku koja je ljude do sad sprječavala da budu ono što su htjeli biti od početka: lijeni, u dobrom smislu te riječi.

Pojavili su se mikroframeworci — Sinatra, kasnije Flask u svijetu Pythona — cijela vojska malih projekata čiji se marketing sveo na jednu rečenicu: „ovo je dovoljno da napišeš stranicu, ništa više”. Nema XML konfiguracijskih datoteka dužih od same aplikacije koju konfiguriraju, nema „enterprise” arhitekture za blog s pet objava. Programer je prvi put od devedesetih mogao otvoriti prazan fajl, napisati desetak redaka koda, pokrenuti server i vidjeti nešto na ekranu — u minuti, ne nakon cijelog dana slaganja strukture projekta.

Uz to je nastala i nova pedagogija, ona koju danas uzimamo zdravo za gotovo: screencast. DHH je 2005. snimio petnaestominutni video u kojem je od ničega, uživo, sastavio radnu web-aplikaciju za upravljanje blogom — i taj snimak nije bio samo demo, bio je dokaz koncepta da se programiranje može učiti gledanjem, ne čitanjem. Do tad si tehnologiju svladavao kroz debelu knjigu i strpljenje — sad si otvorio video, gledao tuđe ruke na tipkovnici i kopirao pokrete kao da uči svirati gitaru s YouTubea. Konferencijska scena je pratila taj ritam: RailsConf, jQuery konferencije, gomila malih meetupova gdje se pričalo manje o teoriji algoritama i više o tome kako ste nekom klijentu isporučili proizvod u tjedan dana. Atmosfera fensi startup partyja, ne akademske katedre.

Zanimljivo je i tko se sad našao za istim stolom. Dizajner koji je do jučer isporučivao Photoshop datoteku i molio se da je developer razumije, sad je mogao sam napisati par redaka jQueryja i pomaknuti taj gumb gdje treba, bez čekanja u redu za backend tim. Developer koji je mrzio CSS počeo je shvaćati zašto dizajneru nešto smeta. Iz te nužde rodio se pojam koji danas zvuči kao klišej na svakom CV-u — full-stack developer. Nije to bio marketinški izum HR agencija. Bio je opis stvarnog stanja: alati su se skupili toliko da je jedna osoba mogla stvarno pokriti cijelu vertikalu, od baze podataka do animacije na gumbu, bez da joj pri tome pukne i posljednji živac.

I tu se, ako malo zumiramo, zatvara krug koji smo otvorili na početku ovog dijela knjige. Web 2.0 je obećao da će svatko postati izdavač, kreator, sadržaj sam po sebi — ali obećanje bez alatnice je samo lijepa fraza na konferencijskom slajdu. Rails i jQuery su bili ta alatnica. Bez njih bi demokratizacija weba ostala teorija za pametne ljude s puno vremena i J2EE certifikatom. S njima je postala nešto što je student mogao izvesti za vikend, u pidžami, s hladnom pizzom pored monitora, i u ponedjeljak prijateljima pokazati link koji stvarno radi.

Naravno, kao i svaka renesansa, i ova je imala datum kad je počela izgledati staro. Ali dok je trajala, trajala je s pravim razlogom — netko je konačno odlučio da programiranje ne mora biti kazna da bi bilo ozbiljno.

Dugi rep i zalasci
§ 05

Dugi rep i zalasci

Evo tvista koji zaslužuje aplauz, ne tugu: jQuery nije umro jer je izgubio. Umro je jer je pobijedio tako totalno da su ga preživjeli protivnici jednostavno pojeli. Preglednici su, pod pritiskom, konačno standardizirali stvari koje je jQuery godinama krpao — `document.querySelector` umjesto `$()`, `fetch` umjesto ajax poziva, `classList` umjesto ručnog petljanja po stringovima klasa. Cijela biblioteka je, u suštini, postala specifikacija koju su preglednici naknadno prepisali u sebe. Rijetko koji alat u ovoj povijesti umre tako da mu se posljednja riječ upiše u standard koji ga je zamijenio. Nema tu poraza — ima samo trenutka kad protivnik shvati da je najpametnije ukrasti ti argument.

I danas, ako otvoriš konzolu na nekoj nasumičnoj stranici iz 2011., postoji šokantno velika šansa da će netko negdje u dnu koda šapnuti `jQuery(document).ready`. Ne zato što je to najbolje rješenje 2026., nego zato što je toliko projekata sagrađeno na njemu da ga se ne isplati vaditi — kao stari radijator koji radi, samo je ružan. Živ je. Ali živ kao spomenik, ne kao alat kojem netko svjesno posegne kad kreće nešto novo.

Rails je imao drugačiju sudbinu — manje poetičnu, više realnu. Nije ga ubio standard, ubio ga je vlastiti uspjeh u pogrešnom smjeru: rast. Twitter je, sjećaš se, na Railsu bio brz za pokrenuti startup, ali kad ti startup preko noći postane mjesto gdje cijela planeta objavljuje što je jela za doručak, ta ista »konvencija umjesto konfiguracije« koja te spasila u prvoj godini počne škripati u trećoj. Fail whale nije bio slučajnost, bio je cijena udobnosti koja nije bila dizajnirana za milijune istovremenih zahtjeva. Twitter je na kraju odselio kritične dijelove infrastrukture u Scalu, tiho, bez fanfara, kao što se seliš iz stana u koji si se zaljubio, ali više ne stane sve tvoje pokućstvo.

Ono što slijedi za Rails, i za web development uopće, ta prava JavaScript revolucija, dolazi malo kasnije i s druge strane pozornice — Node.js uzima JavaScript s klijenta (iz preglednika) i tjera ga na server, pa cijela priča o tome kako se piše backend eksplodira u novom pravcu. To je poglavlje za drugu knjigu. Ovdje samo zabilježimo: sjeme je posijano upravo u ovoj renesansi, u trenutku kad je developer prvi put od kraja devedesetih pomislio da programiranje weba može biti — kako se to kaže — zabavno.

Zato je poanta ovog poglavlja jednostavnija nego što izgleda, i ljepša nego što priznaje ijedan tehnički blog: alati koji su vratili radost promijenili su industriju dublje i trajnije od alata koji su obećavali moć. Nitko se nije zaljubio u J2EE. Nitko nije snimio petnaestominutni screencast o tome kako je AbstractFactory promijenio njegov život. Ali ljudi su se zaljubili u „$()” i u naredbu „rails generate scaffold” — koja bi ti, u jednom potezu, sama generirala gotov kod za standardne operacije dodavanja, uređivanja i brisanja podataka, kao mala čarolija te famozne „konvencije umjesto konfiguracije” — i ta ljubav je pretvorena u Twitter, GitHub, Shopify i pola startup scene sljedeće decenije.