Vanhoja postauksia: turhautuminen skriptikieliin

Ensimmäinen lomapäivä on tullut aloitettua lukemalla rästissä olleita mielenkiintoisia artikkeleita blogeista ja bookmarkseista. Pitkästä aikaa oli taas kiva lukea muutamia nuts & bolts-tasolle meneviä artikkeleita, erityisesti Javan garbage collectionista kuin myös concurrency-ohjelmoinnista.

Java on ollut jo jonkun ollut minulle aikaa se valittu kieli tehdä ohjelmia – ja kehityksen kulku kohti Java Mustangia ( JDK 6 ) vain vahvistaa sitä uskoa että Java-infrastruktuurin päälle kannattaa edelleen rakentaa ja pelata. Tämä siitäkin huolimatta että monet nimekkäätkin hahmot aina Bruce Tatesta lähtien toitottavat jo Rubyn – ja ennen kaikkea Ruby on railsin puolesta. Kuinka siis tällainen tavallinen kuolevainen kehtaa kulkea vastoin hypeä ja suitsutusta siitä kuinka Ruby on Teh kieli – ja kuinka Rails on Teh Framework web-sovelluksien tekemiseen?

Tietyssä mielessä tunnen rakkautta tiettyjä skriptikieliä kohtaan. Onhan PHP hyvä RAD-kehityskieli, jolla saa nopeasti tehtyä hyviä prototyyppejä applikaatioista — ja kukapa ei tykkäisi Pythonin kirjoittamisesta. Onhan se kaunis ja helppo skriptikieli, jossa on mukana yllättävän hyvät ja kätevät peruskirjastot.

Ongelma skriptikielien kanssa tulee minulla vastaan siinä kohtaan kun aletaan tekemään monimutkaisempia ja isompia sovelluksia – tai ryhdytään OikeisiinTöihin. Kun on kerran onnistunut polttamaan näppinsä isossa projektissa törmäten teknologian rajoihin, haluaa tulevaisuudessa tehdä realitycheckit ennen kuin juoksee seinään… liian kovaa.

Skriptikielien yksi selkeä ongelma on niiden soveltuvuus rankempiin ympäristöihin – ja skaalautuvuus läpi koko pinon, puhumattakaan sitten erilaisten kirjastojen ja moduulien laadusta. Pythonin kohdalla tuli esimerkiksi hienoja kohtauksia, kun huomasimme että käyttämämme Oracle-driver oli harvinaisen perseestä skipaten mm. kokonaan Unicode-tuen. Tai että LDAP-kirjastot lukitsivat threadin ldap-bindingin ajaksi… vetäen sovelluksen kaikki threadit nopeati juntturaan, jos LDAP ei vastannutkaan välittömästi. Tai kuinka moniprosessorista koneista ei olekaan mitään hyötyä Pythonia tai Rubya käytettäessä, koska kumpikaan ei osaa hyödyntää useita prosessoreita threadien avulla kunnolla. Rubyssa ei ole oikeita threadeja olemassakaan – ja Pythonin rasitteena taas on global interpreter lock – eli GIL.

Lisätään joukkoon vielä skriptikielten heikko tyypitys ja siitä seuraavat ongelmat koodissa kun mahdolliset virheet laukeavat naamalle vasta ajoaikana, kun jostain palaakiin vääränlaisia objekteja suhteessa siihen mitä odotettiin. Tai kuinka sovelluksen rakenteesta voi olla mahdotonta saada mitään selvää ilman koko koodin lukemista ajatuksella läpi — kiitos nerokkaiden häkkien ja objektien ja luokkien lennossa muokkaamisen.

Kyseisessä projektissa päädyimme lopulta heittämään ko. Python sovelluspalvelimen, valmissovelluksen ja meidän sen päälle rakentaman sovelluksen jorpakkoon – vaihtamaan sovellusframeworkiksi Spring Frameworkin ja Hibernaten – ja kirjoittamaan koko roskan uusiksi kesän aikana. Pythonin haasteiden jälkeen oli mukavaa nähdä tilanteita, joissa joskus asiat Vain Toimivat.

Skriptikielille on toki olemassa omat tehtävänsä ja paikkansa, mutta niiden kanssa on syytä tietää tarkkaan mitä tekee ja varoa One Size fits all -syndroomaa. Komponentit ja kirjastot pitää testata omatoimisesti kunnolla ja varmistua siitä että moduulin / kirjaston impelementaatio tai wrapperi on oikeasti hyvä, eikä mikään puoliperseelleen tehty liimatukkaratkaisu, joka hajoaakin satunnaisissa ympäristöissä täydenkuun aikaan. Skriptikielien kanssa saattaa olo olla myös hyvin yksinäinen siirryttäessä tekemään jotain highend / highavailability-ratkaisua, kun kauppaan ei voikaan kävellä ostamaan klusterointiratkaisua tai jaettua cachea.

Mutta ei siinä mitään. Loistavia työkaluja tiettyihin haasteisiin.

Se mikä skriptikielissä ja niiden yhteisöissä kuitenkin eniten oikeasti nyppii, on niiden suhtautuminen siihen mitä esimerkiksi J2EE on ja Javassa tapahtuvan kehityksen unohtaminen. Siinä missä skriptikielet ovat viimeaikoina lisänneet uusia mielenkiintoisia ominaisuuksia jotka saavat akateemiset koodihurjastelijat kastelemaan housunsa ja ihastelemaan ilmaisuvoimaa (Pythonin decoratorit jne. , metaohjelmointi), on Javan puolella hyvän kivijalan päälle saatu rakennettua monia asioita jotka selkeyttävät, lyhentävät ja kaunistavat koodia — sen sijaan että lisäisivät kompleksisuutta.

Toisinsanoen elämme parhaillaan aikaa, jolloin Java karistaa tiettyjä menneisyyden kahleita ja samalla lisää itseensä ominaisuuksia jotka on esimerkiksi skriptikielien puolella havaittu hyviksi ja tehokkaiksi ominaisuuksiksi. Ja samalla vanhaa kivijalkaa tuunataan koko ajan parempaan kuntoon ja iskukykyyn. Ottamalla käyttöön Java-platformin ja oikeat frameworkit, saa ohjelmoija käyttöönsä hillittömän hyvän pinon joka sisältää mm. aivan älyttömän hyvän garbage collectionin. Jopa niin hyvän että se pesee monissa tilanteissa raa’an C-koodin kirjoittamisen ja omatoimisen muistin varaamisen / vapauttamisen. JVM ja JIT ovat hyviä asioita.

Tietenkään Java-koodi ei ole lähellekään niin ilmaisuvoimaista ja monipuolista kuin Ruby tai Python tällä hetkellä, ja hyvä niin. Ruby, Python ja Perl sisältävät iahant työkalut ja mahdollisuudet monimutkaisen, kryptisen ja henkisesti masturboivan koodin kirjoittamiseen. Kielen ilmaisuvoima ja ominaisuudet ruokkivat erilaisia tapoja tehdä asioita — ja yhtenäisiä tapoja tehdä asia X ei ole. Toisinsanoen et voi ottaa random jamppaa ja istuttaa häntä koodin eteen luottaen että hän pärjää – kunhan hänelle on tuttuja sekä Sun Coding Style, patternit, J2EE ja J2SE.

Hittoon eleganttius ja ilmaisuvoima, jos se tekee asioiden ymmärtämisestä ja ideoiden kommunikoimisesta vaikeampaa. Joskus on vaarallista päästää liian fiksuja ihmisiä kirjoittamaan koodia, varsinkin jos he eivät ole vielä sisäistäneet yksinkertaisuuden periaatteita. Vähemmän on enemmän ja yksinkertaisuus on valttia. ( http://presentationzen.blogs.com/presentationzen/2006/07/a_jogging_remin.html ).

Suuressa osassa tapauksia et ole työskentelemässä yksin – saati vastaa ohjelmiston koko elinkaaresta, vaan joku muu parka jatkaa sinun jälkeesi saman ohjelman kanssa, poimimaan aivoituksesi ja viemään niitä eteenpäin. Koodin siisteys, rakenne ja yhteisten patternien käyttäminen tekee koodista eleganttia. Ruby ja Python antavat ohjelmoijalle aivan mahtavat työkalut koodin kirjoittamiseen, mutta ympäriltä puuttuu Javaan verrattuna selkeyttä tuova rakenne ja säännöt.

PHP:llä tai Pythonilla on mukava rakentaa omia näppäriä sovelluksia, joissa tekee itse kaiken ja tietää mitä missäkin on — ja kaiken voi todellakin pitää itse omassa päässään. Mikään ei kuitenkaan voita sitä että isoa systeemiä saa koodata Eclipsessä, Javadocit ovat nappia painamalla näkyvissä ja ohjelmiston osat ovat selkeästi erillään, sillä koodi paikassa X ei pysty monkeypatchaamaan tai sotkemaan objekteja tai luokkia paikoissa A, B ja C. Tuohon kun vielä lisätään esimerkiksi sovelluksen konfiguroiminen Spring Frameworkin tyyliin xml-tiedostoilla hyödyntäen Inversion Of Controlia – ja Aspect oriented Programmingia interceptoreiden avulla — aletaan puhutaan Oikeiden Töiden tekemisestä.

http://debasishg.blogspot.com/2006/07/inside-new-concurrentmap-in-mustang.html

http://debasishg.blogspot.com/2006/07/from-java-to-ruby-now-naah.html

http://www-128.ibm.com/developerworks/java/library/j-jtp04186/

http://www-128.ibm.com/developerworks/java/library/j-jtp09275.html

Python ja Concurrency:

http://www.oreillynet.com/onlamp/blog/2005/10/does_python_have_a_concurrency.html

http://www.pyzine.com/Issue001/Section_Articles/article_ThreadingGlobalInterpreter.html

http://sciruby.codeforpeople.com/sr.cgi/RubyRamblings/Ramblings_0

Tim Bray kastelemassa housunsa Rubyn puolesta:
http://www.tbray.org/ongoing/When/200x/2006/07/24/Ruby

This entry was posted in java, programming, technology. Bookmark the permalink.

Vastaa

Täytä tietosi alle tai klikkaa kuvaketta kirjautuaksesi sisään:

WordPress.com-logo

Olet kommentoimassa WordPress.com -tilin nimissä. Log Out / Muuta )

Twitter-kuva

Olet kommentoimassa Twitter -tilin nimissä. Log Out / Muuta )

Facebook-kuva

Olet kommentoimassa Facebook -tilin nimissä. Log Out / Muuta )

Google+ photo

Olet kommentoimassa Google+ -tilin nimissä. Log Out / Muuta )

Muodostetaan yhteyttä palveluun %s