Back to site
Since 2004, our University project has become the Internet's most widespread web hosting directory. Here we like to talk a lot about web servers, web development, networking and security services. It is, after all, our expertise. To make things better we've launched this science section with the free access to educational resources and important scientific material translated to different languages.

Ponovno pisanje Reddit-a

Ponovno pisanje Reddit-a

2012 napomena: Ovaj članak je prvi put objavljen 2005. Po njegovom objavljivanju, Django je pokrenuo RemovingTheMagic projekat kako bi odgovorio na deo mojih kritika (iako lično i dalje smatram da se ne može koristiti), web.py je inspirisao FriendFeed-ov tornado.web i Google-ov gae.webapp i druge (mada ja i dalje preferiram web.py), i ovaj članak je doveo do konstantnog porasta Reddit-ovog prometa koji, zapravo, i dalje nije prestao da raste.

reddit mascot

Na reddit.com, mi smo ponovo napisali sajt od Lisp-a do Python-a tokom prethodne nedelje. Sve je manje više bilo gotovo za jedan vikend (Informacija: Koristili smo moju web.py biblioteku.) Ostali su poznavali Lisp (napisali su ceo svoj sajt u njemu) i poznavali su Python (ponovo su napisali ceo svoj sajt u njemu), a ipak su odlučili da im se Python više dopada za ovaj projekat. Python verzija je imala manje kodova koji su brže radili i bila je mnogo lakša za čitanje i održavanje.

Ideja da postoji nešto bolje od Lisp-a je očigledno nezamisliva za neke, sudeći po komentarima na reddit blog-u. Lisperci su se umesto toga okrenuli traženju stvarnih razloga koji su iza promene.

Neko je pretpostavio da to mora da je bila božanska intervencija, s obzirom “da izgleda da nema drugog razloga za promenu na inferiorniji jezik.” Neko drugi je pomislio da mora da se dešava nešto drugo: “Može li ovo biti... laž? Da se zavara konkurencija? Nije da Paul Graham nije već nagovestio tu taktiku u svojim esejima...” Neko je dodao: “Odlučio sam da je ovo šala.” Drugi je sugerisao da su autori jednostavno želeli više “prečica, hakovanja i lažne umešnosti.”

Ovo su, naravno, bili ekstremni slučajevi. Ostali su pretpostavili da mora da je bilo spoljnih pritisaka. “Ili biblioteke ili angažovanje novih programera, pretpostavljam.” Još jedan zaključak: “neki menadžerčić u odelu želi proizvod koji može održavati svaki laički programer. Nadam se da vam plaća milione.”

Lisp news grupa, comp.lang.lisp, je bila uzrujana promenom tako da trenutno planiraju da napišu konkurenta za reddit u Lisp-u, da bi pokazali koliko su u pravu ili nešto slično.

Oni malo razumniji su imali argumente u stilu da je vrednost Lisp-a u njegovoj mogućnosti da stvara nove jezičke konstrukcije i da za nešto kao što je jednostavna web aplikacija, to nije neophodno, s obzirom da su konstrukcije već napravljene. Ali čak ni ovo nije tačno. web.py je napravljen od nule i koristi razne vrste “novih jezičkih konstrukcija” i - još bolje - te konstrukcije imaju sintakse koje se slažu sa njima i čine ih razumno čitljivim. Naravno, Python nije Perl 6, tako da ne možete dodati proizvoljne sintakse, ali često možete naći pametan način da završite posao.


Python, sa druge strane, ima i sopstvene probleme. Najveći je da ima desetine okvira za web aplikacije, ali nijedan nije ni malo dobar. Pythonisti su veoma svesni prvog dela, ali očigledno ne i drugog, s obzirom da kad im ja kažem da koristim svoju sopstvenu biblioteku, univerzalni odgovor je “Mislim da Python-u ne treba drugi okvir za web aplikacije”. Da, Python-u treba manji broj okvira za web aplikacije. Ali mu, takođe, treba i neki koji nije toliko loš.

Okvir koji izgleda ima najviše potencijala je Django i, zaista, mi smo na početku pokušali da ponovo napišemo reddit u njemu. Kao najiskusniji Python programer, dao sam sve od sebe da pomognem ostalima.

Django je izgledao odlično spolja: web sajt dobrog izgleda, inteligentni i talentovani razvijači, i, naizgled, obilje dobrih funkcija. Razvijači (developers) i zajednica su ekstremno uslužni i odgovaraju na patch-ove i sugestije. I svi pravi ciljevi su utkani u njihove filozofske dokumente i FAQ-ove (Frequently asked questions - Često postavljana pitanja, prim. prev). Nažalost, ipak, čini se da su potpuno nesposobni da ih prate.

Dok Django tvrdi da je “labavo spojen”, njegovo korišćenje svakako zahteva da uskladite vaš kod u Django-v opšti okvir. Django insistira da sam sprovodi vaš kod, kako kroz svoju funkciju komandne linije, tako i preko specijalizovanog upravljačkog servera sa odgovarajućim varijabilama okoline i Python stazom. Kada započnete projekat, automatski, Django kreira foldere smeštene četiri nivoa duboko za vaš kod i, iako možete da pomerate neke fajlove, imao sam problem da shvatim koje i kako.

Django filozofija kaže “Eksplicitno je bolje od implicitnog”, ali Django ima razne vrste magije. Modeli baza podataka koje ste kreirali u jednom fajlu, magično se pojavljuju na drugom mestu duboko u Django modulu sa drugim imenom. Kada je funkcija vašeg modela pokrenuta, nove stvari su dodate u njegov variabilni prostor, a neke stare su nestale. (Mada, rečeno mi je da oni trenutno rade na ispravljanju obe ove stvari.)

Još jedan Django cilj je “manje kodova”, bar za vas. Ali Django je jednostavno pun kodova. Unutar django modula nalazi se 10 različitih foldera, i u svakom od njih ih ima još nekoliko. Dok zaista izgradite sajt u Django tutorijalu, uvezli ste django.core.meta, django.models.polls, django.conf.urls.defaults.*, django.utils.httpwrappers.HttpResponse, i django.core.extensions.render_to_response. Nije jasno kako bi iko trebalo da zapamti sve to, posebno s obzirom da izgleda da ne postoje principi uputstva za šta ide gde ili kako se naziva. Tri od ovih se insertuju automatski od strane start script-ova, ali i dalje treba da zapamtite ta imena za svaku drugu funkciju koju želite da koristite.

Ipak, najvažniji problem Django-a je da njegovi razvijači izgleda nisu sposobni da dizajniraju pristojan API. Očigledno je da su oni sposobni Python programeri - njihovi kodovi koriste razne vrste bizarnih trikova. I jasno je da su sposobni da napišu kod koji radi - imaju razne vrste interesantnih funkcija. Ali izgleda da ne uspevaju da oblikuju taj kod u nešto što drugi ljudi mogu da koriste.

Njihovi API-ji su ružni i redovno im nedostaju ključne funkcije: baza podataka API prepoznaje upite brojeći promašaje, ali nema posebnu sintaksu za JOIN-ove, template sistem zahteva četiri kovrdžava spoja oko svake varijabile i ne može da sprovede nikakvo obračunavanje, forma API-ja zahteva 15 linija da obradi formular i nije u stanju da automatski generiše template.

Dao sam sve od sebe da popravim stvari - i Django zajednica je bila veoma predusretljiva - ali zadatak je samo učinio da zakržljam. Jednostavno nisam mogao to mentalno da uradim, a kamoli uz vremenska ograničenja da treba da sagradim sopstvenu aplikaciju za moj startup.


I tako, Lisp i Django su razočarali, ostali smo sa web.py. Voleo bih da kažem da je web.py učio iz ovih grešaka i da je dizajniran da ih izbegne, ali istina je da je web.py napisan mnogo pre svega ovoga, a uspeo je ipak da ih izbegne.

Način na koji sam napisao web.py je jednostavan: Zamislio sam kako bi stvari trebalo da rade i onda sam to i realizovao. Ponekad, realizacija zahteva mnogo kodova. Ponekad je potrebno samo malo. Ali, u svakom slučaju, ta činjenica je skrivena od korisnika - oni samo dobijaju idealan API.

Dakle, kako bi stvari trebalo da rade? Prvi princip je da kod mora biti jasan i jednostavan. Ukoliko želite da output-ujete neki tekst, nazivate web.output. Ukoliko želite da dobijete input formu, nazivate web.input. Nema ničega što je posebno teško za pamćenje.

Drugi princip je da web.py treba da se uklopi sa vašim kodom, a ne suprotno. Svaka funkcija u web.py je potpuno nezavisna, možete koristiti koje god želite. Možete staviti svoje fajlove gde god želite, i web.py će to srećno pratiti. Ukoliko želite da deo koda radi kao web aplikacija, nazivate web.run, ne stavljate svoj kod na magično mesto tako da web.py može da upravlja vama.

Treći princip je da bi web.py trebalo, automatski da radi pravu stvar na Web-u. To znači praviti razliku između GET i POST na pravi način. Ovo jednostavno znači, kanonisani URL-ovi na koje sinonimi preusmeravaju. To znači čitljiv HTML sa odgovarajućim HTTP zaglavljima.

I to su, što se mene tiče, skoro svi principi koji su vam potrebni. Meni izgledaju prilično jednostavno i očigledno i čak sam spreman da izvrdam na nekima od njih, ali ni jedan drugi Python okvir za web aplikacije im nije ni blizu. (Ukoliko znate za neki, recite mi i ja ću biti srećan da se povučem. Ne želim da budem u ovom biznisu.) Do tada, izgleda da sam prinuđen da radim tu užasnu stvar koju radije ne bih: da pustim još jedan Python okvir za web aplikacije u svet.

Pratite me na twitter-u ovde.

6. Decembar 2005.

Published (Last edited): 19-11-2012 , source: http://www.aaronsw.com/weblog/rewritingreddit