JavaOne 2013 – keskiviikko

JavaOne seminaari ja keskiviikkoon asti ollaan päästy. Hauskasti aina meno vähän tasoittuu kun homma etenee, osa lähtee pois jo aikaisemmin, ja muutenkin tuntuu että jäljelle jääneet ovat enemmän keskittyneet sisältöön. Sitä heijastaen luvassa on enemmän keskittyneitä luentoja yleisten linjausten sijasta.

2013-09-25 09.49.19

Aamuksi buukkaamani luento Lambda Expression aiheesta oli napakymppi: Luennoija Venkat Subramamiam on täsmällisten tietojensa ohella erinomainen ja hauska luennoija. Esitys muistutti puolittain hyvää standup-showta, mutta koska kerrotut anekdootit ja metaforat liittyivät tiiviisti aiheeseen, ne ylläpitivät vain parempaa keskittymistä ja parempaa asioiden muistamista. Mahtavia lainauksia olisi riittänyt pilvin pimein aiheista. Mutta tässä tiivistelmää:

– Ohjelmoijan kannattaa opiskella useita kieliä, niin montaa kuin mahdollista. Ei vaihtaakseen vanhaa uuteen trendien mukaan, vaan koodatakseen vanhaa paremmin. Ei kannata siis odotella Java 8 versiota, vaan mars oppimaan Scalaa ja Groovya siis! 😉

– Imperatiivinen koodi ja ’mutable state’ eli muuttuva tila ovat äärimmäisen bugiherkkiä. Kun olioihin vaikutetaan ulkopuolelta koodi keskittyy tekemään kaikkea mikromanageroinnin tasolla. Se on kuin yrittäisi ulkoiluttaa vastahakoista koiraa ja joutuisi siirtämään sen jalkoja yksi kerrallaan jotta se liikkuisi. Koodin luettavuus kärsii koska koodi tekee kaikkea muuta kuin varsinaista ongelmanratkaisua. Ongelmat löytyvät testauksen kautta.

– Funktionalinen koodi kuten Scalassa ja tulevassa Java 8 versiossa on ytimekkäämpää, mutta ennen muuta luettavampaa ja ymmärrettävämpää. Edelliseen esimerkkiin liittyen se on kuin heittäisi koiralle pallon. Koira liikkuu itsestään pallon perään, se tietää mitä tehdä ja miten jalat liikkuvat parhaiten.  Funktionaalisessa mallissa on mahdollista optimoida suoritusta, ja vaihdella algoritmeja tilanteen mukaan.

– Joka johtaakin rinnakkaiseen suoritukseen. Venkat näytti demon jossa ensin haettiin Amazon web serviceistä osaketietoja ja etsittiin kalleinta alle 500 dollarin osaketta imperatiivisella logiikalla: Koodirivejä n. 25 ja suoritusaika n. 75 sekuntia. Sitten tehtiin sama homma funktionaalisesti. Koodirivejä 1 (no viitisen vaihetta mutta vain yksi puolipiste 😉 – suoritusaika n. puolet, koska asiat tehtiin lazy evaluation – tyyliin fiksusti. Lopuksi muutettiin yksi kohta: parStream(), ja saatiin rinnakkainen suoritus fiksusti automatisoiden, toimintavarmasti. Aikaa kului n. 10 sekuntia. Pääpointti on, että funktionaalista suoritusta voi optimoida, olio tietää aina itse parhaiten miten toimia (tai sen tulisi).

– Rinnakkainen käsittely on toteutettu Java 7:stä tutulla Fork&Join kehyksellä jota ei enää tarvitse koodata matalalla tasolla itse – jos haluaa ajaa kokoelmien kanssa operaatioita rinnakkain – ja kukapa haluaisi?

Lambdat tarkassa syynissä

Koodiesimerkki Venkat Subramamilta: Hae kallein alle 500 dollarin osake (käyttäen apuluokkaa joka tekee web service kutsut ja vertailut):

public static void findStockImperative(List<String> symbols) {
 List<StockInfo> stockPrices = new ArrayList<>();

 for(String ticker : symbols) {
 stockPrices.add(StockUtil.getPrice(ticker));
 }
List<StockInfo> stocksLessThan500 = new ArrayList<>();
 for(StockInfo stockInfo : stockPrices) {
 if(StockUtil.isPriceLessThan(500).test(stockInfo))
 stocksLessThan500.add(stockInfo);
 }

 StockInfo highPriced = new StockInfo("", 0.0);
 for(StockInfo stockInfo : stocksLessThan500) {
 highPriced = StockUtil.pickHigh(highPriced, stockInfo);
 }

 System.out.println(highPriced);

 }

Toinen koodiesimerkki: Sama funktionaalisesti Java SE 8 piirteillä (mapreduce):

public static void findStockDeclarative(Stream<String> tickers) {
 StockInfo highPriced = 
     tickers
         .map(StockUtil::getPrice)
         .filter(StockUtil.isPriceLessThan(500))
         .reduce(new StockInfo("", 0.0), StockUtil::pickHigh);
 System.out.println(highPriced);
 }

Ja näin päästiin suoritusajassa 70 sekunnista 10 sekunnin paikkeille. Mahtava luennoija tämä kaveri joka tapauksessa, voin lämpimästi suositella kuuntelemista jos tilaisuus tulee. Tässä muutama lainaus (eivät ole sanantarkkoja eivätkä tee oikeutta originaaleille mutta jakamisen arvoisia niille jotka eivät esitystä kuulleet):

– Mitä tarkoittaa rinnakkainen ohjelmointi Javassa? Se tarkoittaa että koodaaja koodaa samaan aikaan kaameaa möykkykoodia ja samalla päivittää CV:tään kuntoon…

– Miltä tuntuu koodata imperatiivisesti muuttuvalla tilalla? Siitä tulee likainen olo, on inhottavaa mennä työpäivän jälkeen kotiin.

– Imperatiivinen kokoelmaluokkien ohjelmointi on suunnittelumalli – nimeltään Self-inflicted wound

– Java koodaajat eivät koskaan kirjoita typerää koodia – he koodaavat kehitysympäristöjä jotka kirjoittavat typerää koodia.

– Muuttuva tila on NIIIIN 1900-lukua!

– Lazy lausutaan efficient!

Luonnollisesti, disclaimer perään: Rinnakkaisuus ja etenkin helppo ja toimintavarma sellainen on joskus mahtavan hieno ratkaisu. Toisinaan taas ei, se ei ole maaginen hopealuoti joka aina ja joka paikassa olisi oikea ratkaisu. Samoin funktionaalinen ohjelmointi, se ei ole joka paikassa aina oikea tapa toimia, vaikka usein on. Järjenkäyttö on sallittua, imperatiiviselle ja peräkkäiselle ohjelmoinnille on edelleen paikkansa. Nyt on vain vaihtoehtoja. Sekä Scalassa että Javassa on vahvasti yksi jalka oliomaailmassa, yksi jalka funktionaalisessa. Ne antavat ohjelmoijille mahtavan työkalupakin.

Muutenkin tämän otin lambda-päivän kannalta, esitykset ja labrat joihin osallistuin käsittelevät asiaa pintaa syvemmältä eri kanteilta. Osallistuin Hands-On-Lab työpajaan jossa ratkaistiin valmiita yksikkötestirunkoja Lambdoilla – käyttäen Java 8 esiversiota ja Netbeansiä jotka ovat vielä uudempia kuin tämän hetken developer preview 😉 Teknisistä ongelmista selvittyä pistettiin Lambdoille vauhtia, ja tehtiin uskomattomia asioita kokoelmila. Siinä missä itse Lambdat ovat selkeää ja peräti esteettistä koodia, täytyy sanoa että Java 8 Collection rajapinnat alkavat näyttää diabolisilta. Se on kuin kännissä koodattua Scalaa! Se siitä selkeälukuisuudesta. Silti, tehokkuusmielessä tapahtuu uskomattomia asioita, ja kun pääsee jyvälle miten asiat toimivat, Collections stream() api on aika rautaa. Vastaava koodi imperatiivisella ohjelmoinnilla voisi edelleen näyttää pahalta.

Mainokset

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