Archive for March, 2009

Javaforum

Som många andra har jag idag varit på Javaforum. Mina reflektioner kring presentationerna följer:

Test Driven Development (Joakim Holt)

Bra presentation på en halvtimme som lyckades fånga in det mesta. Joakim fick med några små exempel och fick in mycket material på kort tid.

Det jag reagerade på var att han ritade en krånglig cirkel istället för Kent Becks red->green->refactor, och att han inte alls tryckte på att det är refactoring som driver designen framåt. Han nämde inte heller behovet av att lära sig ett antal restramverk för att vara riktigt effektiv, och legacykod ansåg han vara otestbar.

Jaja. Alla har vi olika infallsvinklar, och det var mycket TDD på en halvtimme.

Expectations, what? (Mattias Karlsson)

Forumets anförare på talarstolen! Här måste jag säga “nja”. Mattias skulle prata om expectations, men lyckades inte bygga upp säljsituationen riktigt. Att expectations föds ur behovet att testa kollaboratörer framkom inte riktigt, och kodexemplen var sisådär. Det blev lite rörigt och ofullständigt helt enkelt. Sorry.

PowerMock – Test the untestable (Jan Kronquist)

En av grundarna till PowerMock talade om sin skapelse. Genom att instrumentera bytekod låter PowerMock oss testa statiska metoder, påverka static initializers, testa privata metoder, strunta i final m m.

Jan var naturligt nog påläst om de testproblem som uppkommer i ovan nämnda fall och visade ett antal case där PowerMock kunde användas för att hjälpa till. Ju svårare case, desto fulare vart testkoden, men det fungerade.

Att mock-baserade tester inför ett beroende till den testade koden är oundvikligt, men PowerMock tar det hela till en ny nivå. Detta var också vad många frågor i publiken handlade om, och det var rekordmånga sådana. Otroligt kul att höra om ytterligare ett mockramverk, men själv ska jag göra allt för att undvika PowerMock.

No Comments

Emmoths lista

För länge, länge sedan jobbade jag med en junior utvecklare, som vi kan kalla för Emmoth, och hoppas på att han förblir annonym. Liksom alla som är nybörjare på ett språk ville han demonstrera att han kunde Javas nyckelord, och skapade en del intressanta konstruktioner i ett redan intressant program.

När jag tröttnade på detta skrev jag ner ett antal ord på en liten whiteboard och sa att han inte får använda dem. Detta blev “Emmoths lista”. Det lustiga att är att den håller än idag! På listan stod:

static: Det finns många anledningar till att inte använda static. De främsta är enligt mig, att det möjliggör singleton och försvårar testning. Det är väldigt sällan vi på klassnivå behöver ha en “global” variabel. Statiska variabler ställer också till det i distribuerade applikationer, då vi måste hålla kolla på att de read only.

Undantaget är så klart static final och statiska klasser (men de senare är inte klockrena heller).

protected: Åter igen… Hur ofta behöver vi detta nyckelord? I 9/10 använder folk protected felaktigt istället för default access. Eftersom jag inte heller är en vän av arv, så kommer jag med argumentet att man för att korrekt använda protected måste bygga en avancerad klasshierarki, speciellt designad för utökning, men konstig på något vis. Brrrr….

synchronized: Hur många kan direkt förklara notify/wait/synchronized? Detta nyckelord är bekvämt, eftersom vi bara behöver slaska in det i en metodsignatur, så kommer det “att funka”. Självklart finns det en massa fel man kan göra: synkronisera i onödan, synkronisera över för mycket och dynkronisera på fel sak (överkurs :P ).

Från och med Java 5 har vid dessutom bättre sätt att synkronisera saker på.

Object: Inte lika aktuellt nu som när listan tillkom. I gamla Javan kunde man irrirera folk genom att skriva:

List myList = ...
Object o = new Object(); // För att vara säker
o = myList.get(0); // List returnerar ju Object!
MyListItem item = (MyListItem) o;

Petigt? Ja, men den som underhåller detta måste tänka ett varv till, och för att hänvisa till en nypublicerad designprincip: Är det fult så är det fel!

No Comments

Ny designprincip!

Denna princip känner vi intuitivt till, men den sammanfattades så väl av min kollega Joakim Tengstrand när vi satt med ett content management system som är användarvänligt för webbredaktörer, men hatar alla som försöker att utöka det med lite Javakod.

När vi kom på oss med att skriva in XML, som refarerar till en XSL-transformation i ett fält kallat “Description” sade Jocke: “Jag har det som princip; är det fult så är det fel”.

I detta fall var det tämligen självklart, men principen håller även för tyngre granskning. Om vi uppfattar något som fult betyder det att vi uppfattar det som onaturligt i någon mening. Det betyder att allt arbete med det onaturliga kommer att bli dyrare i termer av anpassning, underhåll och dokumentation – alltså fel.

Dessutom, har vi fått hjärnsläpp och glömt vad t ex SRP står för, så har vi i alla fall en fallbackprincip som är lätt att komma ihåg.

Är det fult så är det fel.

No Comments

Conceptual cluster

Måste bara spamma min blogg med detta fenomenala ord! Min kollega James och jag och fram till detta underbara ord när vi arbetade med en databas som inte motsvarade domänmodellen.

Ett “conceptual cluster” är en samling tabeller (och möjligtvis tillhörande operationer) som beskriver ett atomärt koncept i domänmodellen. Ett exempel kan vara klusret “kund” som innehåller tabeller för persondata, adress samt extra attribut knutna till kunden. Ett annat kluster kan vara “faktura”, som innehåller en massa tabeller som automagiskt länkas ihop till en utsrkivbar faktura samt tillhörande affärshändelser.

Definitionen är inte det viktiga. Smaka på ordet iställer. Säg det högt några gånger!

No Comments

XP, osmotisk kommunikation och hörlurar

Att sitta ihop är en av grundpelarna i XP. Tanken är att parprogrammering ska reducera antalet defekter och bidra till kunskapsöverföring. Vidare är det tänkt att det surr som uppkommer när ett antal par arbetar ihop i ett enda öppet landskap ska skapa det Shore och Warden i boken “The Art of Agile Development” kallar “osmotisk kommunikation”. De arbetande paren ska, i bakgrunden, höra saker som angår dem och eventuellt spontant ge sig in i diskussioner. Ljudnivån anses inte vara ett problem, eftersom par kommer in i flow på ett annat sätt. Detta kan jag hålla med om, MEN…

Shore och Warden berättar också att en programmerare som arbetar solo som blir störd behöver 15 minuter för att komma tillbaka. Räkneövning: Hur många minuter behöver en soloprogrammerare för att komma tillbaka under ett konstant surr och ständiga avbrott?

Vissa uppgifter är svåra att utföra i par; att skriva komplexa algoritmer eller vanliga textdokument kan vara två exempel. Vad gör soloprogrammeraren då? Shane och Ward menar att hörlurar, öronproppar eller “att flytta bort en bit” löser problemet. Vad händer om man inte är duktig på att skriva dokument med musik i öronen? Vad händer om man inte kan flytta bort p g a platsbrist, eller helt enkelt har en dag man inte vill arbeta i par? Öppna frågor allihopa…

1 Comment

Hur man lär sig att programmera

Alla som är verksamma i branschen får då och då frågan: “Hur lär man sig att programmera?”. Själv har jag ingen aning. När jag började med Basic på C64 fattade jag att POKE 53280, 3 satte bakgrundsfärgen till någonting (vad minns jag inte), och hag hade djup förståelse för GOTO-instruktionens förträfflighet. GOSUB fattade jag aldrig, men jag var någonstans kring 9-12 år gammal.

Det där är inget roligt svar, så numera säger jag så här: “Lär dig språket till 70-80%. Sen är det bara att börja med underhållsprogrammering.”

Min tes är nämligen att det är väldigt sällan som man slås av en lösnings skönhet och vill ta med den i sin verktygslåda. Istället får man genom att underhålla andras kod se den ena dåligheten efter den andra, men den största styrkan är att man sitter med facit i hand och vet hur/varför en viss lösning misslyckats. Detta visste inte den som skrev koden.

Dåligheterna kan i sin tur delas in i tre kategorier:

1) Okunnighet: den som skrev koden visste inte hur man gjorde och använde fel approach eller uppfann hjulet på nytt.

2) Någonting som var bra då är inte bra nu: dessa är lite svåra att identifiera. Lösningen tillkom baserat på premisser som inte längre är giltiga. Den var bra då, men påminner om okunnighet i dagsläget.

3) Slarv: det slarvas otroligt mycket med test, dokumentation, kodvård, refactorings och allt annat. Detta är den mest irriterande kategorin.

Alla tre kategorier har något att lära oss, men dåligheterna i vissa kategorier är mer lärorika än i andra.

No Comments

Tillbaka! Nu som en SCWCD!

Bloggen har mer eller mindre legat nere under min slutspurt inför en Java Web Developer-certifiering. Nu är det färdigt i alla fall! Med tanke på att jag har skrivit en servlet i hela mitt liv och en JSP-sida, och bägge år 2002 i kursen “Internetprogrammering”, så är jag nöjd med poängen.

Jag valde att använda två böcker för att förbereda mig, “Sen Certified Web Component Developer Study Companion” av Lyons och “Head First: Servlets & JSP” av Basham, Sierra och Bates. Böckerna var rätt olika, och jag kommer att göra en djupdykning i dem på min recensionssida snart, men sammanfattningsvis kan sägas att bägge funkar. Lyons är mer heltäckande och mycket tråkigare, Head First är roligare, men utelämnar någon enstaka detalj, som kan komma i frågorna.

Denna gång struntade jag helt i att plugga från Suns specifikationer, vilket visade sig vara en bra strategi. I ett tidigare inlägg skrev jag om Enthuwares förberedelse-kit, och kan med facit i hand rekommendera det helhjärtat. En del frågor kände man mer eller mindre igen, och stilen var väldigt lika, om än det riktiga provet använde lite mer problematiserande texter.

Självklart fanns det en del vidriga detaljfrågor om API:t och mindre frekvent förekommande element i deployment-deskriptorn. Det var sådana grejer som jag tänkte “det här kan ju inte komma på provet” om. Det går väl inte att komma ifrån…

Tips till dem som vill ta detta cert:

1. Bägge böckerna funkar; välj en eller bägge

2. Enthuwares JWebPlus underlättar

3. Plugga in stora delar av Servlet-API:t :(

No Comments

EnthuWare JWebPlus V5

Bloggen har legat nere, eftersom jag håller på att förbereda mig infor en SCWCD (CX-310-083). Historisk evidens har visat att det lönar sig att lägga 30$ på att få en uppsättning övningsfrågor. Denna gång gick jag på rekommendationer från JavaRanch och testade Enthuwares JWebPlus V5 (http://www.enthuware.com/jwebplus/index.html).

Jag blir alltid lite nervös när det kommer till online-köp från USA, och denna gång misslyckades det faktiskt. Jag kom till en kvittosida, som sade att allt hade gått bra, men jag hade inte fått något av de två mail som skulle aktivera produkten.

Det slutade med att jag fick maila Enthuwares support, som svarade inom tre timmar och fixade till mitt köp. Happy ending!

Själva produkten känns lite oseriös i början. Man laddar ner en jar-fil (om man kör Vista) och får se till att den startar. I bakgrunden ser man massa felmeddelanden om saknade registry-nycklar, och dessa återkommer varje gång man kör programmet.

Programmet, ETS-viewer, verkar arbeta på filbasis, och man kan ladda ner en gratisfil med 20 testfrågor för att utvärdera produkten, vilket jag också gjorde. När man sedan köper en skarp fil får man registrera licensen för den, vilket kräver en internetuppkoppling eller en lång nyckel. När mitt köp väl gått igenom, fungerade detta utan problem.

Utseendemässigt är GUI:t inte så supersnyggt, men det påminner ganska mycket om Suns testprogram. Frågorna är av typen single answer, multiple choice, drag’n'drop och textfält man får fylla i. Precis som Suns alltså. I paketet ingår åtta test med 69 frågor, 4 test med 30 frågor i kategorierna lätta, svåra, jättesvåra och “most missed”, samt ett antal test som testar per område. Många frågor för pengarna alltså. Spridningen på frågorna känns jättebra. I t ex test 6 kan man träffa på frågor inom områden som inte dykt upp i de första fem testerna, men som ändå finns inom exam objectives. Det finns också lite rapportfunktioner som visar hur bra man ligger till, både historiskt och inom varje grupp av objectives.

Summa summarum. Paketet känns bra, men vi får se hur relevanta och representativa frågorna faktiskt är…

No Comments

I-variabeln är ett steg från dödförklarande

I jakten på tydliga variabelnamn har den så kallade “i-variabeln” alltid retat mig. I-variabeln är den vaiabel som man använder för att iterera över ett antal element. Den kan inte missförstås, eftersom den utgör ett trivialt index. T ex:

for (int i = 0; i < 10; i++) {
    System.out.println("Hello World, and i =" + i);
}

En annan variant är iteratorn:

for (Iterator i = collection.iterator(); i.hasNext(); ) {
    Item = whatever (Item) i.next();
    ...
}

Nu är det ju så att det egentligen inte är särskilt användbart att härma skollabbar och iterera över någonting i eller j antal gånger. Oftast itererar man över en collection av någonting, och behöver man göra någonting i*j gånger finns det oftast färdiga algoritmer för detta. Det finns så klart alltid undantag, men generellt sett kommer vi väldigt långt på att ersätta i-loopar med iteratorer. Dessa kan i sin tur ersättas med Java 5:s utökade for-loopar.

Det enda användningsområde som återstår är borttagning! Av någon anledning är detta ett underskattat sätt att ta bort saker på:

for (Iterator i = collection.iterator(); i.hasNext(); ) {
    if (...) {
        i.remove();

Ofta ser man folk göra en hemmasnickrad variant av borttagning och använda olika varianter som kräver i-variabeln.

Den dag Javas loopar tillåter borttagning är i-variabelns sista fäste intaget. Fram till dess – i.remove().

No Comments

Final

Final är ett av mina favoritnyckelord i Java, och empirisk erfarenhet visar att det är ett otroligt enkelt verktyg för att skapa lite tydlighet i kladdig kod med många variabler. Givetvis är det också en förutsättning för korrekt implementation av value objects, men detta är inte dagens ämne.

Dagens ämne är final i metodsignaturer. I ett kodstycke jag arbetade med idag såg jag detta (har bytt ut lite variabelnamn för att skydda den skyldige):

public FooPK create(final BarPK barPK, final int aLongParameterName, final Integer nullableParamterOne, final Integer nullableParameterTwo) { ... }

Vad gör och vad gör inte final här?

1) Det berättar att aLongParameterName inte får ändras. Som om det gjorde någon skillnad. Java skickar ändå by value, och använder man parametar som temporära variabler, så har man större problem än ett extra final.

2) Det låter metoden bo i en annonym inre klass, vilket enligt mig är det enda korrekta användningsområdet. Så är dock inte fallet här.

3) Den säger att referenserna till de tre andra parametrarna inte kommer att ändras i metoden. Åter igen… by value.

Allt detta står i en Java-bok, och är inte lika intressant som upphovsmannens förklaring: signaturen visar tydligt att parametrarna inte kommer att ändras, alltså kommunicerar metodens avsikt, typ.

Varför är man då så småsint att man atackerar en sån liten sak? Jo, från underhållsprogrammerarens perspektiv blir koden konstig. Man måste börja fundera kring varför parametrarna är final och försöka gissa upphovsmannens intention. Det är helt omöjligt att avgöra om nyckelordet ska knytas någon extra signifikans, eller om den som skrev det hela inte var säker på hur språket hanterar parametrar. Oavsett, så stjäl det fokus från det den som underhåller koden ska göra. (Plus att metodsignaturen ser ful ut i en IDE med syntax highlight).

1 Comment