Månadsarkiv: februari 2014

APIer och null

På jobbet har det varit mycket diskussioner kring APIer på sistone och eftersom jag i och med det har ämnet på läppen tänkte jag lobba lite för en grej som jag tycker är fräck. Även om implementationen av det jag tänker på är i Java så borde konceptet vara applicerbart i vilket objektorienterat språk som helst. Here goes.

Föreställ dig att du som utvecklare arbetar mot ett API – låt oss kalla APIet för AnimalRepository – där metoden nedan är definierad:

Animal findAnimal(int id);

Föga förvånande syftar metoden till att slå upp ett visst objekt av typen Animal. Men vad händer om det inte finns något objekt som matchar det id man skickar in? Det står klart att det inte går att utläsa genom att bara titta på metodsignaturen. Som utvecklare får man då helt enkelt jaga fatt i dokumentationen och/eller gräva runt i källkoden för att förstå denna hantering, eftersom den kan se ut på lite olika sätt från API till API.

En vanlig förekommande design är att metoden helt enkelt returnerar null om det inte finns något resultat. Men null är problematiskt på så många sätt – det har skrivits spaltmeter om eländet och första bästa resultat när jag googlade kan man titta på här. En annan lösning som jag själv inte har testat men läst en del om är Null Object pattern. Grejen här är att man knackar ihop en implementation av typen som inte har något beteende. Men hur skulle det te sig? Ska man då kolla om objektet är tomt? Att metoden kan returnera tomma objekt framgår i vilket fall inte av dess signatur. En tredje möjlighet (som känns ganska knäpp) vore att kasta ett exception. Men en enkel fråga borde man väl ändå få ställa utan att världen går under? Exceptions är ju mer ”woop woop, hördu det brinner här borta”.

Nej det här blev omständigt. Vore det inte bättre om metodsignaturen helt enkelt kunde kommunicera hur man hanterar ett icke-resultat? Kan designern av APIet göra något här? Såklart han kan, varför skulle jag annars bemöda mig med att problematisera så pass? 🙂 Säg hej till Google Guava!

Man kan tycka vad man vill om Google men de har gjort en hel del bra grejer och Guava är en av dem. Guava är en samling utilities för Javautvecklare som hjälper oss i vår vardag. Här finns massor av matnyttigt (som det finns anledning att återvända till i ett framtida inlägg) men det jag vill lyfta fram i detta nu är något som kallas för Optional. Och varför inte börja med ett exempel? Vi tar samma metodsignatur som ovan fast med en ny twist:

Optional<Animal> findAnimal(int id);

Optional kan ses som en wrapper för saker som kan vara null. Och bara genom att använda det i metodsignaturen klargör vi för den som ska använda APIet att här kan det minsann returneras något som inte är något alls. Här har vi alltså ett enkelt och kraftfullt koncept som gör att koden nu kommunicerar bättre än tidigare. Men hur använder man sig av returvärdet? Det är ett ganska snyggt upplägg om jag får tycka till:

Optional<Animal> result = animalRepository.findAnimal(123);
if (result.isPresent()) {
  // we have a result
  Animal animal = result.get();
  ...
}

Kod som kommunicerar är fina grejer! 🙂 Det var allt för denna gången. Trevlig helg!

Prata spel

Idag när jag kom till jobbet var jag som vanligt förste man på min avdelning. Eftersom barnen är uppe med tuppen brukar jag se till att vara på plats vid halv åtta, en tid som jag verkar vara ganska ensam om att sikta på. Men idag behövde jag inte vara ensam särskilt länge för efter ett par minuter dök en kollega upp som jobbar på avdelningen bedvid.

Vi började småprata lite och det blev ett kort samtal om brädspel eftersom han hade sett på min blogg att vi delar det intresset. Jag fick då bland annat nys om att några på jobbet nyligen har tagit initiativ till att anordna spelkvällar. Så fort barnen blir lite mer självgående ska jag försöka hitta tid till att haka på där! Vi kom även som hastigast in på rollspel och en reflektion över hur brädspel fick mer plats när rollspelandet ebbade ut.

Samtalet fick mig att fundera på rollspel och hur mycket jag kan sakna det. Kanske (eller förmodligen) romantiserar jag över hur det var? Jag blir i vilket fall riktigt skönt nostalgisk när jag tänker tillbaka på kvällarna i replokalen där vi som sockerstinna pojkar rollspelade tills det ljusnade utomhus. Men vi blev äldre. Godis, läsk och chips byttes ut mot öl och fulsprit och vi insåg ganska snabbt att kombinationen rollspel och alkohol funkar ganska dåligt. Dessutom började valet mellan rollspel och fest ganska snart väga över åt det senare. Lite trist, i synnerhet som jag har ett rollspel här hemma med stor potential.

Jag vill minnas att jag köpte det när det precis var nysläppt. I boken står det 1998, vilket betyder att jag då var 19 år gammal. Under den tiden befann jag mig någonstans i ingenmansland mellan rollspel och fest, den där perioden när man inte riktigt visste vart man hörde hemma. Men jag köpte spelet ändå och vad jag minns förblev det i stort sett ospelat.  Det fick i vilket fall aldrig den chans det förtjänade.

Gemini.
Gemini.

Spelet heter Gemini och är ett traditionellt ”pen and paper”-rollspel som vad jag förstår är svenskdesignat. Det jag tycker utmärker spelet är temat och stämningen – regelboken förmedlar en extremt mörk och eländig medeltidsaktig värld. Som under vår medeltid har kyrkan i spelet stor makt och agerar bokstavstroget och hänsynslöst. Det finns dessutom en osynlig kraft – Mörkret – som genomsyrar världen. Den är lite som ”the force” i Star Wars, fast i en mer ond tappning. Det är ju bara för coolt. Med rätt spelledare och spelargrupp skulle Gemini kunna bli hur grymt som helst.

Mörka texter.
Mörka texter – på ett uppslag förekommer bland annat rubrikerna ”Inkvisitionen”, ”Häxjakterna”, ”Kättarkammaren” och ”Exorcism”.

Sorgligt nog tror jag att regelboken kommer att stå där i bokhyllan och samla damm i fortsättningen också. Men vem vet – när barnen börjar bli mer självgående kanske fler än jag skulle kunna tänka sig att undvara spriten en fredagskväll till förmån för godis, läsk och rollspel. Inte för att jag egentligen tror att det går att återskapa den där magin man kände som tonåring.

Men jag är beredd att försöka.

Äga vs. abonnera

I torsdags kväll när jag låg i soffan och vältrade mig i min dunderförkylning blev jag sugen på att spela lite TV-spel. Problemet var bara att jag inte hade något vettigt spel hemma att sätta tänderna i. Inte för att jag har kört igenom alla spel som ligger här hemma och skräpar, men jag är en ganska flyktig gamer och tröttnar snabbt när spelen börjar bli repetetiva. Under förra året klarade jag bara två spel: The Last of Us på grund av den episka storyn och XCOM: Enemy Unknown på grund av spelmekaniken (som redan var bra i originalet). Men jag har aldrig varit känd för att spela om spel så de fick ligga och samla damm ännu en kväll.

Då kom jag av någon anledning att tänka på en tjänst som en kompis pratat varmt om ett tag nu men som jag tidigare inte funderat särskilt mycket på. Tjänsten heter Playstation Plus och som abonnent får man bland annat tanka hem utvalda spel till sitt PS3 for free. Man skulle då kunna tänka sig att det handlar om skräpspel som ingen köper men så är verkligen inte fallet. Eller vad sägs om Bioshock Infinite och Uncharted 3? Priset är heller inte farligt. Om man väljer att betala för ett helt år kostar det inte mer än 480 kr. För den summan skulle man möjligen (men förmodligen inte) komma över de två tidigare nämnda spelen om man köpte dem begagnat. Dessutom släpps det fler spel varje månad som man kan slanga hem och de tidigare spelen man redan har tankat hem får man fortsätta att spela så länge som man är abonnent.

Men det här med ”så länge som man är abonnent” fick mig att tänka på relationen mellan äga och abonnera och hur jag har ändrat min inställning till det. Innan fenomenet World of Warcraft var jag väldigt främmande till allt vad månadsavgift hette och ansåg att man alltid borde att spara ihop till vad-det-nu-är-som-ska-köpas. För mig var ägandeskapet i sig viktigt, det vill säga vetskapen om att jag har minsann stretat ihop pengar för att kunna glädjas åt vad-det-nu-var-jag-köpte. Och att det är mitt. Men så var det inte med World of Warcraft. Hur många månader jag än betalade för spelet skulle det aldrig bli mitt, vilket är ganska drastiskt annorlunda mot när jag som fjortonåring köpte Cannon Fodder till Amiga (grymt spel btw).

Jag minns att jag skakade av mig den ovana känslan och betalade månadsavgiften till World of Warcraft. Efter ett tag förlikade jag mig till och med vid tanken. Och när jag i torsdags funderade över att gå med i Playstation Plus slog det mig att det inte kändes konstigt alls, vilket är långt ifrån känslan jag hade för ungefär tio år sedan när jag satt och knappade in mina kontokortsuppgifter på Blizzards hemsida.

Det kanske beror på att jag har vevat med kontokortet i många andra sammanhang – jag abonnerar bland annat på Netflix, Spotify och GitHub – men jag tänker också att det där med att ”äga” inte är lika viktigt hos mig längre. Eller kanske det gäller de flesta av oss? För vem har egentligen tid och ork att titta på den där fina DVD-boxen man fick i julklapp ännu en gång när man har en hel katalog av serier på Netflix? Och för att återknyta till det där med TV-spel finns det så mycket mer bra spel nuförtiden än vad det fanns när jag var yngre. Om man som jag har svårt att dedikera all sin energi åt ett fåtal spel blir det dyrt.

Men nu, som nybliven abonnent, behöver det i vilket fall inte bli dyrare än 480 kr per år.

”T” som i trött

Idag är jag hemma från jobbet. Det har varit alldeles för mycket på senaste tiden och igår hände ett par saker som fick luften att gå ur mig. Stackars katt.

Om vi backar bandet ett par veckor började allt med att barnen fick vattkoppor. De två stora blev sjuka mer eller mindre samtidigt vilket gjorde att det blev lite sömn för oss alla under någon vecka. Lillgrabben verkade mirakulöst ha klarat sig men lagom till när de stora var friska blev även han sjuk. På nätet och på jobbet sa folk att vattkoppor brukar vara lindriga på små barn. Vår lille son visade sig dock vara ett undantag från regeln och i närmre en vecka fick vi gå med honom i skift på nätterna och sova i omgångar i soffan när han väl däckade. Stackars barn.

Vi lyckades på något sätt hålla näsan över vattenytan här hemma. Vi sa till varandra att ”det är sjukt jobbigt just nu men vi kommer snart vara igenom skiten”. Och visst kom vi ut på andra sidan. Vi hade bränt mycket av den energi vi samlat på oss under julledigheten men vi var igenom. Väl tillbaka på jobb och i vardag började livet gå tillbaka till det normala. Det märktes att vi var tröttare på kvällarna än tidigare och vi började falla tillbaka på att unna oss lite fika på kvällarna. För att få snabb energi och ha det lugnt och skönt en stund. Inte för att det var särskilt lugnt för H – lillgrabben har för vana att vakna minst varje timme och det kan ta upp till tjugo minuter för honom att sövas om. Stackars H.

Det är fredag och vi ser alla fram emot en lugn helg. Ja, stora flickan ska på kalas på söndagen och så har hon sin gympa, men utöver det ska vi bara städa här hemma och samla på oss lite energi.

Det gick ju jävligt bra.

Fredagen börjar med att H och barnen hämtar upp mig vid jobbet efter en dag i simhallen med mormor och morfar. Dagen verkar ha varit sjukt arbetsam och vi stressar hem för att peta i dem mat. Den jobbiga dagen påverkar deras sömn på kvällen och det blir en stökig afton. Vi vuxna kastar in handduken vid tio-halv elva.

Vaknar upp på lördag morgon vid klockan sex av att barnen vill stiga upp. Förhalar det hela en halvtimme. Går upp och bestämmer mig för att försöka röja upp eftersom det ser ut som kriget här hemma. Mellanpojken hänger på mitt ben och gråter för han vill ingenting. Han är i den åldern nu. Försöker plocka ur diskmaskinen utan att han tar sönder glas och tallrikar. Inser att det inte går särskilt bra, väcker H och stressar fram frukosten med mellanpojken på armen. Vi äter under konstant larm från de små och går vidare med påklädningsfasen. Efter det ska H och dottern åka in till stan för att handla present. Jag tar hand om de två små – en roll jag inte är jättevan vid – och fokuserar mest på att få dem nöjda och i säng när det ska sovas lunch.

H kommer hem framåt eftermiddagen. Jag är stressad över att det ser ut som en krigszon här hemma och gör det enda rätta – jag åker och slänger återvinning. Två fulla lass och allt är ändå inte slängt. Skyndar hem och lagar lasagne åt familjen, petar barnen i säng. Tar ett par öl och däckar vid TVn.

Upp igen med tuppen. Mellanpojken vill inte kolla bompa och hänger på min höft när jag plockar ur diskmaskinen. Väcker H, fixar frukost, äter, tar på barnen kläder och gör dottern kalasfin. Äter tidig lunch och åker till Leos lekland för kalas. Det är barn överallt och ett jävla stök. Kalaset är slut vid halv två, åker hem för att käka mellis. Tar på Elvira gympakläder och går till gympan. Skyndar hem för att laga mat. Det ser ut som kriget hemma. Pepprar sönder maten och får slänga ett helt lass med currygryta, byter strategi och steker pannkakor. Det blir en sen middag och barnen är trötta och griniga. Får dem i säng sent. Inser att vi inte har någon mat hemma för veckan så jag åker till affären för att veckohandla. Är i stort sett ensam i affären, de flesta har väl tagit kväll nu. Åker hem, tittar på OS utan att reflektera över vad det handlar om. Krashlandar i säng vid tio.

Vaknar sjukt trött på måndagsmorgonen med sedvanlig värk i skuldran. Har väl burit för mycket på barnen igen. Vår gamle katt fick för en tid sedan en skada på hornhinnan som H behandlat med ögondroppar. Idag ska han opereras och jag styr kosan mot djursjukhuset. Lämnar in honom och tar mig till jobbet. Får på förmiddagsfikat reda på att min närmsta chef sagt upp sig. Får ingen vidare förklaring till varför. En stund senare ringer de från djursjukhuset. Kattens njurar är helt slut och sköterskan menar att det är dags att låta honom somna in. Stackars katt. Och stackars oss. Och där någonstans tar orken slut.

Jag jobbar klart dagen igår utan att få något vettigt gjort. Eftermiddagen och kvällen består mest i att prata och älta om katten. Går det att gräva i marken nu? Hur bokar man tid för avlivning? Helt absurda och tunga ämnen att tala om.

Vaknar upp idag, brottas vid diskmaskinen med stora pojken som vanligt men hjärnan och benen hänger inte med. Jag packar träningsväskan – vi joggar på lunchen på tisdagar – men när jag ska gå nerför trappan känner jag hur makalöst trött jag är. Benen värker, hela kroppen värker. Jag sätter mig på en stol och säger till H nåt i stil med att jag inte orkar mer. Hon tittar på mig och säger ”jag ser det på dig, gå och lägg dig en stund”. Jag meddelar jobbet och tokdäckar i sängen.

Jag förstår att många har det kämpigt som vi, som kämpar att få vardagen att gå ihop och att inte bli galna på kuppen. Jag vet också att det finns de som har det betydligt värre än oss. Jag vet inte heller varför jag skriver det här. Men känslor är subjektiva och just nu är det sjukt jävla jobbigt.

Hur får man vardagen att fungera med tre små barn? Hur överlever man med tre små barn? Är det sommar och semester snart?

Koden ska kommunicera bra

”Det viktigaste är att koden kommunicerar bra. Om den inte gör det har man inte gjort ett särskilt bra jobb”. Något i den stilen kläckte jag ur mig under mitt utvecklingssamtal som jag hade under förra veckan. Man kan med all rätt tycka att uttalandet inte var särskilt sensationellt eftersom hela grejen med högnivåspråk är att koden ska vara lätt för människor att förstå. Det skrivs hela kapitel i facklitteratur om hur vi bör benämna och strukturera saker och ting för att göra kodbasen begriplig. Vi har begåvats med en rejäl hög design patterns – ett slags blue print över hur man kan lösa problem – som bidrar med en rik begreppsvärld som kan användas i våra lösningar. Ändå stöter jag gång på gång på kod som kommunicerar riktigt, riktigt dåligt.

Oavsett om det är någon annan eller jag själv som har haft en dålig dag på jobbet är det solklart att det tåls att upprepas – det viktigaste uppdraget vi som utvecklare har är att skriva kod som kommunicerar bra. Man kan då fråga sig varför det ser ut som det gör därute. Som ni säkert förstår har jag en teori och för att förmedla den ska jag damma av en gammal klassisk jämförelse.

Många tycker att programmering ska ses som ett hantverk. Här använder hantverkaren (det vill säga programmeraren) sina verktyg (främst sitt IDE) till att förändra befintlig eller lägga till ny funktionalitet i det system han eller hon bearbetar. I denna analogi kan man se kod som hantverkarens material, en formbar massa vars skepnad i högsta grad påverkas av personen bakom tangenterna. Denna massa ska formas så att den både a) kan tolkas maskinellt på korrekt sätt och b) bli enkel och tydlig för andra hantverkare att förstå.

Det grundläggande problemet är att det bara är a som behövs för att systemet ska fungera, och på kort sikt levererar man faktiskt det man ska även om man fullkomligt skiter i b. Man bör skämmas i sin roll som hantverkare men så länge som man har gjort a är funktionaliteten ändå på plats. Den verkliga konsekvensen av ett risigt hantverk ser man först på lite längre sikt – förr eller senare ska någon stackare ge sig in i just den sektionen av kodbasen och försöka förstå vad som faktiskt händer. Då kan enkla ändringar som borde ta några timmar att genomföra förvandlas till flera dagars arbete. Att gräva i en stadig balja med spagettikod är dessutom stressigt och ganska arbetsamt. Det händer att befintlig kod är så pass komplex att det helt enkelt inte går att förutse alla konsekvenser av de ändringar man gör. Och då är man inte så tuff.

Min teori är alltså följande: så länge det går att komma undan med snabba ”fullösningar” kommer vi inte att bli av med dem. Detta är förmodligen sant oavsett om det handlar om snickeri eller programmering. Men nu ska vi inte deppa ihop, vi kan i vilket fall arbeta aktivt och medvetet för att minimera  eländet. Med verktyg som till exempel parprogrammering och code review kan vi lära av och pusha varandra till att forma kodmassan till något fint. Och som mantra borde vi ha att koden ska kommunicera bra.