lauantaina, maaliskuuta 29, 2008

Softaprojekti lähtee helposti käsistä

Uteliaisuus pakotti käväisemään Sampo-Pankin sivulla. Pidin Javan poiskytkettynä kuten se on ollut jo yli vuoden.

Kirjautumissivulle päästyäni alkoi läppärin tuuletin suhista täysillä. Koneeni prosessori oli siis pantu tekemään paljon töitä.

Firebug kertoi että pelkälle kirjautumissivulle mentäessä oli koneeseeni ladattu puoli megaa koodia, josta valtaosa näyttää olevan kävijän laitteiston tunnistamiseen tähtäävää JavaScriptiä. Kyseinen koodi oli syönyt muistiani lähes kaksisataa megaa. Entä jos olisin Sampo-Pankin asiakas ja pääsisin sisälle?

Kukaan ei jaksa käydä noin isoa koodia läpi pelkästä uteliaisuudesta mutta löysin vahingossa virheen jo ensimmäiseltä sivulliselta. Ensin määritellään funktio ClientSniffer(). (JavaScriptin kielioppitavoissa funktiot muuten alkavat aina pienellä kirjaimella.) Ja heti sen jälkeen:
window.is = new ClientSniffer();
Ei varmaankaan ole tarkoitus luoda kaksoiskappaletta juuri luodusta funktiosta. Mitä vikaa vanhaan ehti jo tulla? Ajatus on jokin muu, mutta näin saadaan muistia palamaan ja koodille pituutta. Kun kyseinen rivi ei tuonutkaan haluttua lopputulosta, on se paikattu myöhemmin koodissa jollain uudella vastaavalla. Koodin kommentointi vaikuttaa tanskankieliseltä.

Diagnoosina matkin hammaslääkäriäni muutaman vuoden takaa: 'Tätä ei voi enää korjata, tämä pitää poistaa.'

Kyseisessä katastrofiprojektissa on jotain hyvääkin. Se pani pohtimaan mikseivät kaikki softaprojektit johda kaaokseen.

Motivaatiosta on kysymys. Itsekin ramppaisin jatkuvasti tupakalla jos joutuisin nappulaksi kyseisenlaiseen projektiin.

M.O.T. (mitä opimme tästä)

Fuusaukset (mashupit) ovat tyypillisesti kooltaan yhden ihmisen tai pienen ryhmän projekteja. Tylsän datankeruun ja kurinalaisen apien kirjoittamisen ovat jo tehneet jotkut muut. Fuusauksen kirjoittajalle jää se magein, eli luova työ.

Lisäys pari tuntia myöhemmin: Sampo-Pankin sivu oli jäänyt välilehdelle auki. 'Back'-painikkeen painaminen kiihdyttää vain tuuletinta; ei päästä pois sivulta. WTF.

5 Comments:

At 15:30, Blogger Teppo Jalava said...

Kommentoin nyt, vaikka kirjoituksesta on aikaa..

Sammon sivuilla määritellään Javascript-luokka nimeltä ClientSniffer, josta heti seuraavalla rivillä alustetaan Javascript-olio (new-operaattorilla). Eli siinä ei luoda mitään kaksoiskappaletta vaan olion instanssi, perus-olio-ohjelmoinnin tyyliin. Javascriptissä vain harhaanjohtavasti kaikki luokat ovat funktioita (ja funktiot taas luokkia) ja niiden käyttötavasta riippuu milloin ne tulkitaan olioiksi ja milloin normaaleiksi funktioiksi.

Jos Javascriptissä noudatetaan Javan kielioppitapoja (en tiedä, en ole koskaan nähnyt mitään määritelmää tästä), niin luokkien nimet kirjoitetaan isolla alkukirjaimella, funktiot ja muuttujat pienellä. Eli Sammon javascriptissä ei tuolta osin ole mitään vikaa, syntaksisesti tai ohjelmallisesti. Mutta älyllisesti kyllä varmasti paljonkin..

Ja kuten arvata saattaa, en ole millään tavalla tekemisissä Sampo-pankin kanssa, edes asiakkaana (onneksi)

 
At 21:44, Blogger Esa said...

Instanssia luodessa annetaan yleensä jotain parametreja.

 
At 16:44, Blogger Teppo Jalava said...

"Instanssia luodessa annetaan yleensä jotain parametreja."

Öh, sehän nyt taas on täysin luokan ja sen konstruktorin määrittelyistä kiinni, annetaanko sille parametrejä vai ei.. Esimerkkinä tämä Sampopankin ClientSniffer-luokka, joka ei määrittele mitään parametreja. Silloin instanssia luodessa niitä ei sille tarvitse antaa. (Javassa ei edes voisi..)

Suosittelen tutustumaan tarkemmin Javascriptin olio-ominaisuuksiin (esim. täällä: http://mckoss.com/jscript/object.htm), niiden avulla ainakin itselläni Javascriptin koodaus muuttui kertaheitolla ärsyttävästä mielenkiintoiseksi.

Javascriptissä kaikki on olioita..

 
At 20:53, Blogger Esa said...

Teppo. Olen samaa mieltä.
Oliopohjainen ohjelmointi on hauskinta mitä ihminen voi tehdä housut jalassa.

Palautan kuitenkin alkuperäiseen aiheeseen.

Jokainen 'new'-alkuinen rivi luo resurssien (muistin) kannalta kasoiskappaleen (instanssin) alkuperäisestä objektista (JavaScriptissä ei ole luokkia).

Mielestäni on suurta typeryyttä luoda käyttäjäntunnistuksesta luokka. Voiko käyttäjä vaihtua kesken session?

Sampopankin koodista löytyy ihan oikeita virheitäkin mutta otin esiin moisen resurssien haaskaamisen, jota pidän pelkkänä typeryytenä.

Pitää muistaa, että kysymyksessä on webbisivu.

Internetin historiassa ei ole montaakaan sivua joka kylmästi ilmoittaisi: 'Olet köyhä, hommaa sellainen tietokone, joka miellyttää meitä.'

Asenne näkyy koodissa. Kyseinen tarpeeton 'new' kertoo, että jätkät ovat tottuneet tuhlaamaan isokonesalin muistia. Nyt on kyse asiakkaan muistista.

 
At 12:51, Blogger Teppo Jalava said...

En tiedä, onko tätä nyt järkevää enää inttää, mutta vielä kerran: ei, se new-operaattorin käyttö tässä kontekstissa ei ole turhaa tai hölmöä, eikä mikään ohjelmointivirhe.

Jos katsot tarkemmin sitä ClientSniffer-luokkaa, huomaat, että siellä viitataan toistuvasti olioon 'this'. Tämä on viittaus olioon itseensä, eli juuri siihen instanssiin, joka sillä new-operaattorilla luodaan. Ja tämä tarkoittaa myös sitä, että ClientSniffer-luokkaa ei voi käyttää normaalina Javascript-funktiona, koska ilman instanssia 'this'-oliota ei ole olemassa ja koodi ei toimi.

Eli, koodin ohjelmoijat käyttävät tietoisesti Javascriptin tarjoamia olio-ohjelmointirakenteita, ihan niinkuin niitä on tarkoituskin käyttää, eivätkä luo mitään "kaksoiskappaleita" funktioista.

Ja, jos tarkastellaan muistinkäyttöä verrattuna perinteiseen, funktionaaliseen ohjelmointiin, eroja ei käytännössä löydy. Luokan prototyyppi, eli sen määrittely tallennetaan muistiin vain kerran, siitä ei tehdä kopioita instanssien luonnin yhteydessä. Instanssia luodessa varataan muistia vain sen verran kuin tarvitaan luokan paikallisten muuttujien tallentamiseen. Myös perinteisellä tavalla koodatessa näille muuttujille pitää varata tilaa, olio-ohjelmointi ei eroa tässä suhteessa siitä mitenkään.

Eli mun pointti on se, että jos kritisoidaan jotain sivustoa ja sen lähdekoodia, kannattaa kohdistaa se kritiikki oikeisiin ongelmiin eikä taistella tuulimyllyjä vastaan. Esimerkiksi tätä pahamaineista ClientSniffer-luokkaa ei ilmeisesti käytetä alustuksensa jälkeen missään; window-objektilla ei ole dokumentoitua propertya nimeltä 'is' eikä tuohon propertyyn viitata missään päin koodia uudestaan. Ja toinen, suuri WTF on se, että tämä, varsin yksinkertainen sivu vaatii toimiakseen noin puoli megaa javascript-koodia. Eikä sivu edes toimi oikein, FF/Linux-yhdistelmällä ei java-pluginia tunnisteta ja FF/Mac-yhdistelmällä sivu näyttää pelkästään tyhjää.

 

Lähetä kommentti

<< Home