Collector en Android-app för att samla saker Kim Grönqvist (kg222dk) 2013-06-10 Slutrapport
Abstrakt Jag har gjort en Android-app för att samla saker, Collector. Med den kan man upprätta att göra-listor över saker som man vill göra, till skillnad från sådant som man måste göra. Mest lyckosamt med projektet var att jag använde MongoDb med Mongolab som backend, att jag nyttjade bibliotek för att undvika att återuppfinna hjulet, samt att jag använde goda mjukvarutvecklingsmetoder för att strukturera arbetet. Störst problem har jag haft med att uppskatta hur lång tid det tar att arbeta med en ny teknik. En annan svårighet har varit att arbeta testdrivet i ett system som jag inte till hundra procent är bekväm med.
Innehåll Abstrakt...2 Bakgrund...4 Vad som gick bra...5 Vad som gick mindre bra...6 Slutsatser...7
Bakgrund Webbverktyg för att komma ihåg saker som man måste göra finns det gott om. Det som saknas är en samlingsplats för att allt som man vill göra. Till exempel se en film, läsa en bok, spela ett visst datorspel eller lyssna på en särskild skiva. Visst, det går utmärkt att använda redan existerande tjänster för att upprätta listor över några böcker som man bara måste läsa. Men dessa tjänster saknar i regel stöd för att på ett meningsfullt och effektivt sätt visa och kategorisera kulturella verk. Att visa filmer är ofta både roligare och mer lättöverskådligt med bilder på skådespelare och filmomslag. Och en digital skivsamling kan komma till liv om användaren kan bläddra igenom den i ett så kallat cover flow, som emulerar hur man bläddrar genom sin fysiska skivsamling. Denna typ av funktionalitet finns redan idag i mediaspelare och på nischsidor. Nackdelen med mediaspelare är att de hör ihop med verk som du redan har tillgång till. Deras användningsområde för att lagra det som du vill skaffa dig eller återvända till senare är alltså begränsat. Nischsidorna är typiskt sett inriktade på en enda kulturform, med en grund i topplistor och aggregation av användarbetyg. Det jag skulle vilja ha är en plats där jag kan samla kulturella verk. Verk som jag är intresserad av men inte hunnit eller kunnat skaffa med detsamma. I uppgiftsbeskrivningen för denna kurs står det att visionen ska vara omfångsrik, och det var alltså med den ovan redogjorda för, mycket ambitiösa idén i bakhuvudet som jag påbörjade mitt mjukvaruutvecklingsprojekt. Jag har gjort mitt system som en Android app. Motivationen bakom detta var framför allt att lära sig ett mobilt operativsystem. För att lagra data har jag valt MongoDb, en databas som jag var intresserad av sedan tidigare. Initialt har jag använt Eclipse som utvecklingsmiljö, men detta övergav jag efter en stund (jag återkommer till detta i Vad som gick mindre bra -avsnittet). Istället har jag huvudsakligen förlitat mig på en textredigerare och en kommandoprompt. För att testa systemet har jag använt en emulator.
Vad som gick bra När det gäller det jag har gjort i inledningsfasen av projektet, tycker jag det är mycket värdefullt att identifiera och samla systemet funktionalitet i en lista. Detta medför dels att man tänker igenom vad applikationen ska göra ordentligt innan man sätter igång och kodar, dels känns projektet inte lika hopplöst stort och ogenomförbart när man bryter ned det i mindre, hanterbera pusselbitar. Att visualera detta som en use case-karta tycker jag är suveränt för att snabbt få en överblick över vad som ska göras härnäst, samt identifiera vilken användare man ska i åtanke när man implementerar funktionen. MongoDb har varit väldigt befriande att arbeta med. En begränsning med relationsdatabaser är att de kan vara besvärliga som del i iterativt utvecklingsarbete, eftersom modellen kan ändras under utvecklingens gång. MongoDb är en NoSQL-databas och lagrar databasposter i dokument, utan vetskap om posterna eller tabellernas inbördes samband och relationer. Jag har ändrat min modell ofta medan jag arbetat med projektet, och det har aldrig varit krångligare än att ändra i ett JSONobjekt. Tyvärr saknar Android stöd för MongoDb, så för att komma runt den bristen har jag använt Mongolab en webbtjänst som hostar ens MongoDb-databas. Åtkomst sker via ett API med vanliga http-anrop. Att implementera http-anrop i Android är tämligen omständigt. För att underlätta har jag använt ett bibliotek som går under namnet Android Asynchrous Http Client. Det erbjuder http-anrop på en mer abstrakt nivå, så att man inte behöver lösa alla lågnivåproblem själv. När Anroid anropar Mongolab får operativsystemet ett JSON-svar tillbaka. För att läsa in detta har jag tagit hjälp av GSON, ett bibliotek för att läsa JSON till Java-klasser. Att sammanföra MongoDb med GSON har dock inte varit trivialt, eftersom det krävdes extra arbete för att lära GSON ObjectId-typer, MongoDb:s speciella id-räknare. Jag är mycket nöjd med att jag valde att använda dessa bibliotek i mitt projekt. Man skulle kunna argumentera för att man som ny utvecklare borde göra allt själv, att det är genom att knåda koddegen på så basal nivå som möjligt som man lär sig plattformen och de bakomliggande teknikerna. Det är inte en orimlig invändning. Men jag tycker att det finns roligare saker att lära sig, och om jag behöver förstå hur något fungerar på detaljnivå finns det källkod att tillgå. Att arbeta mot bibliotek ger dessutom en känsla för hur man på bästa sätt arbetar i ett system.
Vad som gick mindre bra Gemensamt för de element av arbetet som gick mindre bra, är att de handlar om en missräkning från min sida. Jag har i samtliga fall underskattat hur svår eller tidskrävande en viss teknik har varit att arbeta med. Att gå igenom alla de svårigheter jag har stött på är nog inte så meningsfullt, så jag nöjer mig med en översiktlig genomgång. Låt oss börja med Eclipse, som jag nämnde i inledningen av föreliggande slutrapport. Eclipse är ett hyfsat IDE om man arbetar med Java, men till Android lämnar det en del att önska. Intellij IDEA var ett bättre alternativ för att arbeta med projekthantering och design. Android Studio, ett kommande IDE, verkar lovande men är än så länge bara i testfas och inte användbart för mer seriöst utvecklingsarbete. För mer avancerad projekthantering, och för att kunna köra enhetstest från kommandoprompten, har jag använt Ant. Enligt många är Maven ett bättre val, men det var inget jag hann jämföra. Att göra layout för Android är svårt, inget man bör underskatta och dessvärre inget som Eclipse är särskilt bra på att underlätta. Hade jag gjort om det här projektet hade jag tillbringat mer tid med Android-dokumentationen och försökt använda de inbyggda komponenterna så långt som möjligt. Det gäller att bryta sig loss från sitt webbtänk och tänka mer som en applikationsutvecklare. Ett annat område där jag har fått problem är testerna. Jag ville pröva på att arbeta testdrivet. Dels för att lära mig, dels eftersom det går väldigt långsamt att göra manuella tester i emulatorn. Dock stödjer Android inte vanliga javatester eftersom Androids VM inte innehåller fullständiga klasspecifikationer. Robolectric är ett ramverk som försöker lösa det här problemet. Det var lite av ett äventyr att installera detta ramverk för Ant (det ska vara lättare med IDEA och Maven). Och när jag väl kommit igång tog det väldigt lång tid att skriva ett test. Poängen med enhetstester är inte bara att de ska gå snabbt att köra, de ska gå någorlunda snabbt att skriva också. Att arbeta testdrivet för ett system man inte känner till ordentligt tror jag väldigt få programmerare klarar. Själva konceptet med testdriven utveckling är dock inget jag tänker ge upp på. De tester jag hann skriva underlättade oerhört, och det var en stor befrielse att kunna säkerställa att kod fungerade som den skulle utan att gå omvägen via emulatorn.
Slutsatser Jag har alltså gjort en Android-app för att samla saker, Collector. Med den kan man upprätta att göra-listor över saker som man vill göra, till skillnad från sådant som man måste göra. Mest lyckosamt med projektet var att jag använde MongoDb med Mongolab som backend, att jag nyttjade bibliotek för att undvika att återuppfinna hjulet, samt att jag använde goda mjukvarutvecklingsmetoder för att strukturera arbetet. Störst problem har jag haft med att uppskatta hur lång tid det tar att arbeta med en ny teknik. En annan svårighet har varit att arbeta testdrivet i ett system som jag inte till hundra procent är bekväm med. Framöver tänker jag fortsätta utveckla systemet. Dock är jag osäker på om jag tänker göra det som en app för Android. Samtidigt som jag har genomfört mitt mjukvaruutecklingsprojekt arbetade jag skarpt med javascript-ramverket Angularjs. På samma tid som det har tagit mig att implementera en funktion i Android var jag klar med minst fem i Angular. Jag skulle dock inte vilja utesluta mer specialiserat stöd för mobila enheter. Phonegap är ett intressant projekt som skulle kunna hjälpa med just den biten.