Archive for May, 2009

Mirage på riktigt?

Igår skrev jag om antimönstret Mirage, som handlar om att implementera egna O/R mappers istället för att använda entity beans eller liknande. Om detta är Mirage, vad är då detta???

call xxx_update(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)

Har bytt ut xxx för att skydda produktionskod och den skyldige.

xxx_update är alltså en PL/SQL-procedur, som tar några argument, bor i en DAO-klass och uppdaterar adressinformation, och lite till, av antalet fria parametrar att döma…

Hur som helst, så är den där proceduren en riktig wtf!

No Comments

Gamla J2EE-åsikter om JDBC och persistens

I min nya outtömliga källa till visdom, J2EE AntiPatterns, har jag hittar ytterligare guldkorn som på ett närgånget sätt kan relateras till mitt dagliga arbete. De har dessutom så fina namn att de förtjänar att nämnas bara för det: Mirage och Exodus! Nästan lika bra som DataVision!

Mirage är ett anti-pattern som är otroligt enkelt att förklara: man struntar i att det finns en massa färdiga verktyg för att mappa Java-objekt mot databaser (boken nämner främst CMP, men det finns ju miljoner O/R-mappers), och implementerar sitt eget ramverk i JDBC.

I några enstaka fall måste man kanske göra det, för att man vill hämta saker från flera tabeller, men här finns ju hönan- eller ägget-problematiken: Hämtar man saker från flera tabeller med handhackad JDBC för att det O/R-mappern är för dålig, eller gör man det för att man har gjort det hittills.

Nu är inte saker i verkligheten så enkla och svartvita (för mycket PL/SQL), men det är värt att komma ihåg att någon har tyckt hela förfarandet är ett anti-pattern.

Exodus(en refactoring) är mer jordnära och delvis relaterad till Mirage. Historisk evidens har visat att det är otrligt enkelt att hamna i situationer där man av en eller annan anledning tillverkar egna DTO:s (som t ex är resultatet av en JOIN) i tid och otid. Själv är jag skyldig till detta och kallar mig “agil”. Detta får dock konsekvensen att man inte direkt kan avgöra var dessa mini-väldigt-super-specifika DTO:s ska skapas. Enligt principen “Är det fult, så är det fel“, blir det väldigt smärtsamt att lägga till skapandet av dessa i en mera generell DAO, som ansvarar för ett koncept eller en tabell.

Exodus identifierar detta problem och kommer med lösningen: Allt sådant smuts ska brytas ut till en factory som använder generella DAO:s och får skapa hur dåliga och specifika DTO:s som helst. Det är inte riktigt så boken beskriver mönstret, men det är andemeningen. Jag har länge letat efter en lösning på detta problem…

No Comments

En “Typesafe Getter” som stör på något sätt

När jag programmerade mot Spring Batchs klass JobParameters och anropade getString fick jag ett fett NPE. Javadocen för metoden var inte särskilt hjälpsam, så jag kollade i källkoden och hittade detta:

/**
* Typesafe Getter for the String represented by the provided key.
*
* @param key The key to get a value for
* @return The <code>String</code> value
*/
public String getString(String key){
    return parameters.get(key).toString();
}

/**
* Typesafe Getter for the String represented by the provided key. If the
* key does not exist, the default value will be returned.
*
* @param key to return the value for
* @param defaultValue to return if the value doesn't exist
* @return the parameter represented by the provided key, defaultValue
* otherwise.
*/
public String getString(String key, String defaultValue){
    if(parameters.containsKey(key)){
       return getString(key);
    }
    else{
        return defaultValue;
    }
}

Det är någonting som stör mig i den här konstruktionen. Vad är dock inte säkert. Till exempel skulle det vara helt fel att implemetera getString(key) som den är gjord nu, om den andra varianten inte fanns.

Givet att vi accepterar att vi behöver två metoder, så är det fortfarande fel att införa denna koppling. Vet inte ens något fancy name för denna typ av koppling.

Om vi nu ignorerar detta och accepterar att man måste veta namnet på sin nyckel, annars får man ett NPE (varför inte ett IllegalArgument eller IllegalState om metoden är så strikt?), så blir det fortfarande konstigt, eftersom det inte fungerar som i typ 99% av de andra fallen, och framför allt i Javas egna API.

Eller så är författarna av Spring Batch så briljanta att de vågar vägra null och det som stör är att man är då gammalmodig. Någonting stör i alla fall.

No Comments

Arkitekten och de agila metoderna

Jag har läst några böcker om agila utvecklingsmetoder (tyvärr inte tillräckligt många), och hört en eller annan presentation av t ex Scrum. Det som har slagit mig i ett tidigt skede är att de agila metoderna inte problematiserar kring arktitektrollen särskilt mycket, och när det inträffar så hör man att arkitekten inte ska sitta i sitt “Ivory tower”, utan vara med i teamet. Innan jag läste på lite på bloggar och i forum, så ville jag själv problematisera kring tre områden som blir lidande när arkitektrollen försvinner:

Kodpolisen: någon måste ansvara för coding conventions, dokumentstandarder och informaitonsinfrastruktur.

Konceptuell integritet: detta är ett ord som sällan nämns i den agila världen, eller i alla fall av dem som vill sälja in agil utveckling. Mina erfarenheter är att konceptuell integritet är extremt svår att upprätthålla som team. Kostnaden för att lyckas är otroligt mycket kommunikation.

Icke-funktionella krav: dessa ska vara lösta inom scope för varje story… På pappret.

Sedan läste jag som sagt på lite och hittade lite fakta kring den agila arkitekten. En agil arkitekt är inte bara en stenhård utvecklare, han är också testare, försvarare av den konceptuella integriteten, mentor, balanskonstnär av affärsnytta/kvalitet/fungerande lösning, men framför allt en extrem team player och superb kommunikatör.

Allt detta låter vettigt, men pitchar man agila metoder måste man hitta praktiska former för hur allt detta ska ske. Hur jobbar akritekten? Har han egna tasks/stories, inte så förenligt med det jag vet om t ex XP och Scrum. Jobbar han istället med alla andra och försöker “få in” arkitekturen i de andras tasks? Har han mandat att köra över enskilda teammedlemmars designval? Hur ser hans dagliga rapport ut?

Dessutom, om rollen blir en duktig allt-i-allo. Är det lätt att motivera när man bildar nya team som ska jobba med “affärsnytta”. En Ivory tower-akritekt låter tungt i alla fall…

Som i en tonårings dagbok… Bara frågor, inte svar.

En kul grej att läsa kan vara “Who needs an Architect” av Martin Fowler. Handlar inte riktigt om detta problem, men kort och tänkvärd läsning.

1 Comment

IPMA-D

Försöker att hålla bloggen kanske opersonlig, men måste kommentera lite kring ett test jag skrev idag: IPMA-D. Det är nämligen detta som gjort att bloggen har varit lidande.

För att göra en lång historia kort, så blir resultatet spännande. Det som gör provet pikant är antalet fleralternativsfrågor, där ett alternativ är rätt, men två är helt plausibla. Visst är det svårt att skapa ett-kryss-två-frågor kring ett så komplicerat ämne som projektledning, men ibland kändes det lite väl hårfint, speciellt när formuleringar som “Vilket är det bästa … ?”

a) Tripp
b) Trapp
c) Trull
d) a + b
dök upp, och Tripp och Trapp kändes tämligen likvärdiga.

Eller så var det bara jag som var dålig :P.

Jaja. Svenskt Projektforum behöver i alla fall en månad på sig att rätta provet. Så allt är lugnt.

No Comments

Kandidatuppsats om EasyMock och jMock

Jocke, min kollega på uppdraget, rekommenderade denna kandidatuppsats:“Utvärdering av Mock Objekt Bibliotek: ur ett interaktionsbaserat perspektiv”, skriven 2007. Eftersom det alltid är kul att se vad det akademiska kan prestera, tog jag mig tid och läste den.

Om man plockar fram det viktigaste, så kan man säga att uppsatsen verkligen handlar om en syntaktisk jämförelse mellan EasyMock och jMock. Författaren hittar och diskuterar relevanta skillnader, och kommer stundtals med ganska insiktsfulla analyser, som förutsätter att man kan programmera. JMock får sig en känga för den krångliga syntaxen, och EasyMock för att det lätt leder till överspecificerade tester. Sant. Andra mockramverk nämns, men lämnas sedan därhän. Till och från framlyfter författaren att man kan betrakta mockobjekt ur ett tillstånds- och ett interaktionsperspektiv, där det senare tydligen ska vara en designteknik. Detta ska tydligen vara uppsatsens selling point, men den swishar förbi mig. Efter att ha läst uppsatsen vet man vad författaren vill ha sagt, men jag är inte säker på om jag håller med.

Uppsatsen är välskriven och hänvisar till relavant och känd litteratur inom ämnet, utan att ta med för mycket. Som en C-uppsats är den jättebra!

Har man arbetat lite med mocktestning lär man sig inget nytt, men är man ny eller behöver en komparativ studie, så är denna uppsats som klippt och skuren.

Oops. Det märks att jag recenserar saker.

No Comments

Bloggen lider

Har inte haft tid att posta klokheter på bloggen, eftersom all min tid går åt till förberedelser inför en IPMA-D-certifiering. Man måste lära sig innehållet i en bok, som kusligt mycket påminner om gymnasielittertur: många irrelevanta bilder och anekdoter samt punktlistor, samt utvärdera sig själv genom den s k “KIP:en” – Kompetens i Projektledning.

KIP:en tar en massa tid, men är faktiskt väldigt bra. Man får i lugn och ro fundera på vad man har koll på och inte. Trodde att det skulle vara rätt B, men så var inte fallet. Kan rekommendera dem som har tid att kika lite på certifieringen, men jag varnar för att KIP:en tar lååång tid :(

No Comments

Datavision

Nu är det bevisat! Läser man tillräckligt många böcker kommer man att hitta sitt favoritpattern, eftersom alla vill göra en claim for fame. Själv har jag hittat antimönstretDataVision i boken J2EE AntiPatterns.

Antimönstret gör sig synligt när databasen får bestämma designen av applikationen och visar sig via följande symptom:

Överflöd av pseudokomponenter: geggiga komponenter som bara bär en massa data.

Dysfunktionell komponentobjektmodell: överkomplicerad och svårunderhållen modell.

Ökade underhållskonstnader: det är svårt att implementera ny funktionalitet.

Fram tills jag hittade detta antimönster var mitt förtreoende för boken sådär. Nu när jag ser att det stämmer in till 200% på ett visst system jag arbetar med, så blir boken så mycket roligare att läsa.

Så glöm Singleton och kom ihåg DataVision!

No Comments