12-01-2015 Afsluttende opgave Quiz Plugin i WordPress University College Nordjylland Datamatikeruddannelsen Henrik Mikkelsen, dmaa0912 Forord Denne rapport er udgivet af Henrik Mikkelsen, elev på University College Nordjylland. Den blev skrevet i løbet af den periode hvor jeg arbejdede på min afsluttende opgave på datamatikeruddannelsen. Selveste opgaven er lavet i samarbejde med virksomheden, Cleverweb. Den har til formål at beskrive processen under hele projektperioden, og at dokumentere mit arbejde med projektet. Der skal lyde en stor tak til de to ejere af Cleverweb, Martin Hjort og Tommy Bæk Søgaard for at have givet mig opgaven, og for at have været nemme at samarbejde med under hele perioden. Der skal også lyde en stor tak til min vejleder, Christian Wahl, for at have givet mig god vejledning og altid været til rådighed når der har været behov for det. 1 1 INDHOLDSFORTEGNELSE 2 3 4 Indledning ............................................................................................................................................. 4 2.1 Opgave .......................................................................................................................................... 5 2.2 Problemformulering...................................................................................................................... 5 2.3 Afgrænsning .................................................................................................................................. 6 Metodevalg ........................................................................................................................................... 7 3.1 Boehms projekkort........................................................................................................................ 7 3.2 XP ................................................................................................................................................ 10 3.3 Scrum .......................................................................................................................................... 12 3.4 Praksis ......................................................................................................................................... 17 Teknologivalg ...................................................................................................................................... 18 4.1 WordPress ................................................................................................................................... 18 4.1.1 4.2 PHP .............................................................................................................................................. 21 4.3 JavaScript .................................................................................................................................... 22 4.3.1 jQuery.................................................................................................................................. 23 4.3.2 AJAX..................................................................................................................................... 23 4.4 5 Databasestruktur ................................................................................................................ 19 Overvejelser ................................................................................................................................ 24 4.4.1 Ingen JavaScript?................................................................................................................. 24 4.4.2 Cookies vs. local storage ..................................................................................................... 24 Processen ............................................................................................................................................ 27 5.1 Sprint 0 ........................................................................................................................................ 27 5.1.1 User Stories ......................................................................................................................... 27 5.1.2 Udviklingsmiljø .................................................................................................................... 27 5.1.3 Test ...................................................................................................................................... 28 5.1.4 Arkitekturvalg...................................................................................................................... 28 5.1.5 Domænemodel ................................................................................................................... 31 5.1.6 Risikoanalyse ....................................................................................................................... 32 5.1.7 Kodestandard ...................................................................................................................... 33 5.2 Sprint 1 ........................................................................................................................................ 33 2 5.2.1 Planlægning ......................................................................................................................... 33 5.2.2 Udførelse ............................................................................................................................. 34 5.2.3 Kodeeksempler ................................................................................................................... 37 5.2.4 Retrospective ...................................................................................................................... 39 5.3 5.3.1 Planlægning ......................................................................................................................... 40 5.3.2 Udførelse ............................................................................................................................. 40 5.3.3 Kodeeksempler ................................................................................................................... 43 5.3.4 Retrospective ...................................................................................................................... 43 5.4 Sprint 3 ........................................................................................................................................ 44 5.4.1 Planlægning ......................................................................................................................... 44 5.4.2 Udførelse ............................................................................................................................. 45 5.4.3 Kodeeksempler ................................................................................................................... 48 5.4.4 Retrospective ...................................................................................................................... 50 5.5 6 Sprint 2 ........................................................................................................................................ 40 Sprint 4 ........................................................................................................................................ 51 5.5.1 Planlægning ......................................................................................................................... 51 5.5.2 Udførelse ............................................................................................................................. 52 5.5.3 Kodeeksempler ................................................................................................................... 55 5.5.4 Retrospective ...................................................................................................................... 56 5.6 Test.............................................................................................................................................. 56 5.7 Vurdering af processen ............................................................................................................... 57 Konklusion ........................................................................................................................................... 57 6.1 Videreudvikling ........................................................................................................................... 58 7 Referencer........................................................................................................................................... 59 8 Bilag ..................................................................................................................................................... 61 3 2 INDLEDNING Under mit praktikforløb hos Cleverweb, blev vi enige om, at jeg skulle skrive min afsluttende opgave hos dem. Det betød derfor, at jeg skulle lave noget i WordPress, da firmaet altid benytter det til at lave webløsninger for deres kunder. Jeg fik muligheden for enten at lave et theme eller et plugin. Jeg fandt ret hurtig ud af at jeg ville lave et plugin, til dels fordi jeg havde fået god erfaring med at skrive plugins i min tid hos Cleverweb, men også fordi at themes kodning er meget kompliceret, og noget jeg ikke har meget erfaring med. Da jeg skulle vælge hvilken type plugin jeg ville lave faldt valget på et quiz plugin. Meningen med opgaven er at give Cleverweb reklame, og måske endda tjene penge på det. Et godt plugin, kan nemlig være med til at øge firmaets omdømme, og det ville være fint, da det er relativt nyopstartet. Cleverweb er en virksomhed i Odense, som laver webløsninger. Virksomheden består af to personer: Martin Hjort, som er programmøren og Tommy Bæk Søgaard, som er designeren. Cleverweb blev stiftet 1. april 2014. Før det blev til havde de to hver deres egen enmandsvirksomhed. Martins hedder Spicy Web, og han bruger stadig det navn, når han skal lave løsninger til kunder, hvor det ikke er nødvendigt at have Tommy med inde over. Det kan f.eks. være hvis han skal ind og rette nogle ting på en hjemmeside. Men skal en hjemmeside laves helt fra bunden er Tommy som regel altid med. På samme måde bruger Tommy stadig navnet på hans egen virksomhed, Main Media, når Martin ikke behøver være inde over. Når de laver løsninger for kunder bruger de altid WordPress, som er et Content Management System. Grunden til de bruger det, er fordi det er meget brugervenligt, og samtidig kan det også hjælpe kunderne med at vedligeholde deres sider, uden de behøver hjælp fra Martin efterfølgende. Måden de arbejder på er ofte sådan, at Martin står for alt programmeringen. Hvis kunden vil have designet noget til siden, f.eks. et logo, nogle bannere etc., så er det Tommy der gør det. Det er som regel Martin der får aftalerne på plads med kunderne. Derefter er det Tommy der, sammen med kunden snakker om hvordan løsningen skal se ud designmæssigt og kommer med 4 forslag til hvordan det vil se bedst ud. På den måde har Martin også noget at gå efter når han skal sætte siden op, hvilket gør hans arbejde meget nemmere. Jeg var i praktik hos Cleverweb i perioden 1. september 2014 – 7. november 2014. Mens jeg var i praktik lærte jeg at bruge WordPress, samt hvordan man kan udvide dens funktionalitet. Det meste af praktiktiden brugte jeg på at lave plugins, til Martins private hjemmeside. I denne rapport vil jeg beskrive hele processen vedrørende opgaven, som forløb over 9 uger (10. november 2014 – 12. januar 2015). 2.1 OPGAVE Som nævnt tidligere i afsnit 2, faldt valget på at lave et quiz plugin i WordPress. Når man downloader dette plugin, kan man oprette sine egne quizzer, som man så kan dele på sin WordPress side, så besøgende kan tage dem. Der er blevet sat følgende krav fra Cleverweb: Brugeren skal kunne oprette deres egne quizzer Den skal kunne køre på mobil og tablet Brugeren skal kunne integrere på sociale medier og dele sine resultater (f.eks. på Facebook) Dem der tager quizzerne, skal kunne tilmelde sig nyhedsbrev på siden, hvor det er sat op Det er derefter meningen at pluginnet skal lægges op på Internettet, så folk kan downloade det og bruge det på deres WordPress side. Om det skal være gratis, eller koste penge at downloade er Cleverweb stadig i tvivl om. Men uanset hvad, er det planen at det skal reklamere for firmaet. Selvom firmaet har fået en god start vil de gerne reklamere for sig selv, da god reklameværdi kan gavne dem. 2.2 PROBLEMFORMULERING På baggrund af min opgave har jeg sat mig for at undersøge følgende: Hovedspørgsmål: Hvordan kan man implementere et quiz plugin i WordPress? 5 Underspørgsmål: Hvordan gør man sådan spørgsmålene kan gemmes og redigeres? Hvordan får man den sat ind på sin side efter den er lavet? Hvordan integrerer man med sociale medier, såsom Facebook? Hvordan gør man sådan brugere kan tilmelde sig nyhedsbrev? Hvordan sikrer man sig brugere ikke kan snyde i quizzer, hvor der f.eks. er præmier på spil? Kan man tjene penge på et quiz plugin? Hvordan foregår implementeringen bedst? 2.3 AFGRÆNSNING Der vil først og fremmest lægges fokus på at få lavet et plugin med en masse forskellig funktionalitet. Hvis Cleverweb har markeret visse funktioner som meget vigtige vil de selvfølgelig få højt fokus fra start af. Men nogle af tingene vil dog blive skubbet til side. En af de mest fremhævede her er det faktum at pluginnet skal kunne køre på mobil og tablet. Det område er nærmere et designområde frem for et programmeringsområde, og jeg er ret overbevist om jeg ikke har nok erfaring med den slags, til at nå at få det implementeret – i hvert fald ikke uden at det går meget ud over min tid til de andre ting. Nogle af områderne, såsom integrering med sociale medier og nyhedsbreve er også ret nye områder for mig, men dem vil jeg dog prøve at få implementeret, da Cleverweb ønsker det meget. Men det er dog ikke sikkert det ville kunne nås inden for projekttidsrammen. Først og fremmest er det vigtigste dog at jeg har et plugin der virker efter hensigten, altså så man kan oprette quizzer og sætte dem ind på sin side, og vælge mellem en masse features til sin quiz. Derfor vil det være hovedfokus i opgaven. 6 3 METODEVALG Dette afsnit beskriver hvordan jeg nåede frem til mit metodevalg, samt hvad jeg vil bruge under mit projektforløb 3.1 BOEHMS PROJEKKORT Da jeg skulle beslutte mig for metodevalg, var jeg allerede i forvejen mest til at vælge at gøre det på den agile måde, frem for den plandrevne. Det skyldes bl.a. de erfaringer jeg har fået tidligere på uddannelsen, samt det faktum, at plandrevne metoder ofte involverer, at der skal laves meget dokumentation. Eftersom jeg kun havde 9 uger at gøre godt med, vurderede jeg, at jeg simpelthen ikke kunne nå at lave så meget dokumentation som det kræves, især når jeg var alene. Men for at argumentere for at det var bedst at arbejde agilt tog jeg udgangspunkt i Boehms projektkort. Grunden til det, er at det er en hurtig og nem måde at få et indblik i hvordan man bedst arbejder, samt jeg synes de faktorer som afgør det, er ret væsentlige. De fem faktorer er følgende1: Størrelse: Dette punkt viser antallet af personer i projektgruppen. Store grupper er skræddersyede til den plandrevne fremgangsmåde, da det kan være vanskeligt at holde den mundtlige kommunikation mellem mange folk, og derfor kan meget dokumentation være med til at hjælpe på det problem, især hvis hele holdet sjældent kan være samlet på samme sted. Derimod passer den agile fremgangsmåde perfekt til meget små hold, da mundtlig kommunikation er nemmere. Hele holdet er som regel samlet på samme sted ofte, eller hele tiden, og derfor er dokumentation mindre vigtigt, da man som regel laver aftaler mundtligt. Da jeg er alene om projektet skal jeg derfor have 1 på size-aksen. Kultur: 1 Boehm-Agility-Disciplined – Homegrounds (PDF) 7 Her afgøres det om deltagerne trives bedst under kaos eller orden. Kaos er den arbejdsgang der bygger på at man har disciplin til selv at administrere tiden og opgaverne. Hvorimod orden bygger på, at man har det bedst med at tingene er struktureret og regelsat. Ved førstnævnte vil agilt være det mest optimale, i modsætning til sidstnævnte hvor plandreven er det oplagte. Udfra de erfaringer jeg har fået på uddannelsen, er jeg ret overbevist om, at jeg trives bedst under kaos, og derfor får den 90% på culture-aksen. Kritiskhed: Dette er med til at vurdere hvor kritisk det ville være hvis systemet går ned. Hvis det f.eks. kan medføre store økonomiske tab eller endda dødsfald, er det vigtigt at visse ting bliver overholdt for at forhøje driftssikkerheden, så man undgår det går galt. Til det er plandrevne metoder det bedste at anvende, da dokumentation og kravsspecifiktation kan være med til at formindske risikoer, i modsætning til det agile hvor der kun er fokus på at lave det absolut nødvendige dokumentation. Da dette projekt er et quiz plugin, som laves med henblik på underholdning og et nedbrud derfor ikke er en katastrofe, har jeg givet det værdien ”comfort” på criticality-aksen. Dynamik: Antallet af forventede ændringer til projektet er meget vigtigt når det skal besluttes hvordan man vil arbejde. Agile metoder kan i højere grad nemmere håndtere ændringer, mens plandreven er meget imod det, da dokumentation og krav til produktet, er nøje fastsat fra starten af. Agile metoder tager, grundet sin mindre dokumentation, mere hensyn til pludselige ændringer. Jeg har givet den værdien 30 på projektkortet, da der kan komme en del ændringer. Ikke mindst fordi firmaet har givet mig relativt stor frihed, med henblik på features, så jeg forventer, der vil komme flere idéer i løbet af projektet. Erfaring: 8 Endelig er der erfaring som bygger på hvilket niveau deltagerne i projektet befinder sig på. Der er her tale om hvor stor erfaring deltagerne har i at arbejde med forskellige procesmodeller. Dem med meget erfaring har bedre evner til at tilpasse og bruge forskellige procesmodeller. Modsat, kan mindre erfarne have svært ved at tilpasse sig, og kan i værste tilfælde måske endda være imod at anvende visse modeller. Hvis holdet består af et stor antal mindre erfarne udviklere og få erfarne udviklere vil en plandreven fremgang passe bedst, mens et hold bestående af mange erfarne medlemmer kan være god til en agil fremgangsmåde. Jeg har givet det værdien 10/30 på aksen, da jeg har prøvet at arbejde med forskellige procesmodeller. Dog mangler jeg måske en del erfaring, men jeg vurderer ikke at det vil hæmme mig i dette projekt. Udfra disse faktorer har jeg nu følgende resultat på projektkortet: Figur 1 – Boehms projektkort - Kilde: Boehm-Agility-Disciplined - Homegrounds (PDF) Boehms projekkort fungerer, som det anvises, at jo tættere projektet er på indersiden af aksen jo mere taler det for at en agil fremgangsmåde er den bedste, og jo tættere det er på den ydre akse, jo mere er en plandreven fremgangsmåde den mest fornuftige. Som det kan ses er alle 9 faktorer, i mit tilfælde, meget tættere på den indre akse. Derfor kan det konkluderes at jeg er bedst tjent med at arbejde agilt under dette projekt. 3.2 XP Extreme Programming, eller XP forkortet, er en agil planlægnings- og udviklingsmetode. Meningen med den er at give bud på, hvad der skal gøres og hvordan det skal gøres. Værdierne i XP er kommunikation, forenkling, feedback og mod. Når der arbejdes med XP er det derfor vigtigt at projektets medlemmer overholder disse værdier, for at sikre en god arbejdsgang med XP. Denne metode har også et vist antal praktikker, som kan beskrives således2: Planning game: Kunden er med til at planlægge. Det fungerer således at kunden skriver user stories, som skal beskrive de forskellige krav til systemet. Når det er gjort skal udviklerne estimere hver story, så man på den måde får en fornemmelse af, hvilke der kan laves hurtigt, og hvilke der tager lang tid, og måske endda kan kræve research før de kan løses. Kunden skal derefter opdele de forskellige stories i bunker, alt efter vigtighed, og når det er gjort skal udviklerne opdele de forskellige stories i bunker, alt efter risiko. Derefter når udviklerne frem til en udviklingshastighed, og kunden bestemmer så omfanget af et sprint, dvs. hvor lang tid der skal gå før udviklerne skal have ny funktionalitet klar. Det er også kunden der bestemmer hvilke stories der skal med i hvert sprint. Når kunden har udvalgt stories, skal udviklerne så opdele hver story i tasks, og estimere dem. Kort tid mellem releases: Der vises jævnligt noget nyt funktionalitet, så man kan bevise, at der er fremgang i projektet. Metafor: 2 XP planlægnings og programerings praktikker (PP), 4. semester 10 Der skal laves metaforer til tekniske begreber, så alle forstår dem. Det er især vigtigt når man skal fremvise funktionalitet for kunder eller mennesker som måske slet ikke er inde i det tekniske. Simpelt design: Her er der fokus på at designe tingene så simpelt så muligt. Hver gang udviklerne laver funktionalitet skal de overveje om det kan gøres på en simplere måde. Definér test first: Der skrives test inden funktionaliteten kodes. Når testen så er godkendt skal koden refactoreres i så høj en grad som den kan. Hvis testen så stadig er en succes kan koden godkendes. På den måde sikrer man sig at koden er af ordentlig kvalitet med det samme, frem for at vente med det til allersidst. Refaktorering: Koden skal løbende forbedres, f.eks. ved at fjerne duplikerede kode, gøre lange metoder kortere osv. Pair Programming: To sidder ved samme computer og programmerer. Den ene laver koden, og den anden sidder ved siden af som en slags observatør. Der byttes jævnligt. Kollektivt ejerskab: Alle har adgang til alt koden og ret til at ændre den. Løbende integration: Der skal ofte kompileres ny kode. Dvs. at i stedet for at skrive meget kode på en gang og vente lang tid med at gøre det synligt for de andre, så gøres det som regel med 1 times mellemrum. 37 timers arbejdsuge: 11 Der arbejdes kun så længe hver dag, som der er aftalt. Dvs. når alle går hjem er det for at holde fri, og der laves derfor ikke mere kodning resten af dagen. Kundeinvolvering: Kunden stiller kravene til produktet og der holdes jævnligt kontakt med kunden, i tilfælde af ændringer, samt feedback. Kodestandarder: Der er fra start af enighed om hvordan koden skal skrives. Alle skal overholde standarden, for at sikre at koden bliver ensartet. 3.3 SCRUM Scrum er en anden tilgang til de agile principper. Her ligges der kun fokus på planlægning, i modsætning til XP, som både har fokus på planlægning og programmeringsværktøjer. Et Scrum hold består som regel af max. 7 personer. Der er følgende roller på holdet3: Product Owner: Denne person er en kunderepræsentant. Han sørger for at definere kravene til produktet og sørger også for at prioritere de forskellige krav, når de er på plads. Det er også Product Owner, der har det sidste ord, når funktionalitet skal godkendes. Hvis vedkommende ikke synes det er godt nok, skal det laves om. Scrum Master: Denne person er et slags mellemled mellem Product Owner og resten af holdet. Det er ham der sørger for at holdet overholder de aftalte praktikker og værdier, gennem projektet. Han beskytter også holdet fra forstyrrelser udefra. Derudover er det også ham, der er taleren for det 3 Intro-SCRUM (pp), 4. semester 12 daglige stand-up møde, og som hver dag opdaterer burndown chart. Scrum Master må IKKE forveksles med en leder, da Scrum bygger på selvstyrende hold. Team: Dette er resten af holdet. Folk under denne rolle, har intet ekstra ansvar ud over at udvikle produktet. Det er dog vigtigt at alle overholder de forskellige aftaler, som der er lagt fra start, men udover det er det op til folk selv, hvordan de føler de arbejder bedst. Rutinerne i Scrum kan beskrives meget godt udfra denne illustration: Figur 2 - Scrum begreber og proces – Kilde: Intro-SCRUM (pp), 4. semester Artefakter: Product backlog: Denne laves i samarbejde med kunden. Det er en liste over alle de ting der ønskes til produktet, i form af user stories. Rækkefølgen laves i form af prioritering, så de vigtigste ting, bliver lavet før de mindre vigtige. Product Owner sørger for at vedligeholde backloggen. 13 Sprint backlog: Det er listen over de ting der skal udføres i det pågældende sprint. De udvalgte stories brydes ned i tasks, og hver mand i teamet får tildelt opgaver fra Sprint backlog og får nye efterhånden som de bliver færdige med dem de startede ud med. Burndown diagram: Dette er en graf, som skal vise holdets fremdrift under sprints. Et eksempel på en burndown kan ses her: 14 Figur 3 - Burndown chart – Kilde: Intro-SCRUM (pp), 4. semester Den blå streg starter fra det antal timer/point, som holdet regner med at nå igennem når sprintet er slut, og slutter ved 0. Den lilla streg skal opdateres hver dag og den starter samme sted som den blå. Når en arbejdsdag er slut, trækker Scrum Master det antal timer/point som holdet har udført i løbet af dagen fra og sætter det næste punkt udfra resultatet. Man kan på den måde se om man er bagefter, eller foran tidsplanen, eller om man holder den som planlagt. På den viste tegning kan man se at holdet er en anelse bagefter tidsplanen. Hvis man enten er 15 foran eller bagefter, bør man snakke om hvad man skal gøre for at man nemmere kan følge planen fremover. Ceremonier: Sprint-planning: Dette møde holdes før starten af et nyt sprint. Her fastlægges målet for sprintet, og der vælges de stories, som skal laves. Sprint review: Her demonstrerer holdet, hvad der er gjort færdigt i løbet af sprintet. Efter reviewet skal det gerne være klart, hvad der er godt, og hvad der skal tilbage i product backlog. Stand up møde: Dette møde afholdes hver dag, på samme tidspunkt hver gang. Her snakkes der om, hvad der blev nået siden i går og hvad der skal nås i løbet af dagen. Hvis nogen er løbet ind i problemer er der også mulighed for at komme ud med dem. Retrospective: Her evalueres sprintet. Der diskuteres bl.a. hvad der var godt og hvad der kan gøres bedre til næste sprint. 16 3.4 PRAKSIS Jeg har valgt at benytte visse ting fra Scrum og XP som mine metoder. Men da jeg er alene, er det ikke muligt at anvende de to metoder til fulde, fordi visse ting enten er umulige at bruge alene, eller ikke giver mening. Jeg kan f.eks. ikke have en Product Owner eller en Scrum Master. Jeg vil lave en product backlog og bruge den under hele projektforløbet. Fordelen ved den er at jeg altid kan ændre i den løbende, hvis der kommer nye idéer til produktet. Jeg vil også anvende sprints, da jeg tror det vil være en god idé at ”presse” mig selv til at have ny funktionalitet klar efter hver sprint. Det skal også sikre, at jeg har målsætninger, så jeg altid arbejder motiveret og ikke går i stå. Planen er at hvert sprint skal foregå over en uge, minus weekender. Hvis det senere viser sig, at en uge ikke er nok, kan jeg overveje at udvide længden af mine sprints. Siden jeg anvender sprints, vil jeg også anvende sprint backlog. Det betyder, at jeg dagen før et sprint-start udvælger de stories jeg vil have med i sprintet og deler dem op i tasks, og så bliver de derefter estimeret. Da min plan er at arbejde 25 timer om ugen, altså 5 timer hver dag, bliver de forskellige tasks delt op så den sammenlagte tid bliver til 25, eller tæt på. Til at vise om mine sprints går efter planen, vil jeg benytte burndown charts. Det skal dokumentere hvordan sprintet er gået. Hvis det ikke går som planlagt, kan jeg så overveje, hvad der skal gøres anderledes næste gang. Reviews kommer jeg nok ikke til at lave efter hvert sprint, da Cleverweb ikke kan garantere de har tiden til det. Jeg vil dog benytte mig af dem, så ofte så muligt. Stand up møder vil jeg selvfølgelig heller ikke benytte fordi jeg er alene. Hver gang et sprint er slut vil jeg lave et retrospective, så det kan ses tydeligt hvad der var godt og hvad der kunne gøres bedre til næste sprint. Jeg vil også benytte nogle praktikker fra XP. Ligesom med Scrum, er der også her nogle som ikke giver meninger, så jeg vil selvfølgelig kun bruge dem som giver mening for mig. Jeg kan f.eks. ikke bruge pair programming eller kollektiv ejerskab, da det kræver at man er mere end én person i gruppen. Jeg vil heller ikke benytte test first, da jeg stort set ingen erfaring har med at skrive unit tests i WordPress. Men alle andre praktikker, end de nævnte, vil jeg forsøge at bruge 17 på en måde så jeg får mest muligt ud af forløbet. Jeg forventer dog ikke at XPs praktikker vil blive fulgt i lige så høj grad som Scrums, da jeg er alene og det derfor er nemmere at arbejde på min egen måde. Men samtidig føler jeg, at jeg alligevel bør have nogle regler, så det ikke ender i det rene kaos, og da jeg før har arbejdet med stor succes under XP, vil jeg igen benytte mig af det. 4 TEKNOLOGIVALG Dette afsnit vil beskrive de tekniske valg til projektet og hvorfor jeg har valgt dem. 4.1 WORDPRESS WordPress er et Content Management System (CMS), som er skrevet i PHP. CMS bruges til at gøre det nemmere at opbevare, udgive og ændre indholdet af dokumenter og filer. CMS er især populært når man skal lave hjemmesider, da det kan spare en for en masse tidskrævende arbejde.4 WordPress har eksisteret siden 2003 og blev oprindeligt lavet til udelukkende at blogge. I dag er WordPress’ interface stadig bygget op omkring blogging, men det har dog udviklet sig meget siden det startede. I dag bruges det af mange folk til at lave websider med, og det bruges af mere end 60 mio. websider.5 WordPress er også meget nemt at sætte op. Det eneste man skal have klar, inden man gør det er sin egen MySql database. Derefter skal man downloade WordPress som zip, og smide alle filerne op på sin websides server, via en File Transfer Protocol (FTP). Når man så første gang går ind på siden, efter man har lagt WordPress filerne ind, vil den køre en installationsguide, hvor man tilslutter sin database, og derefter får lavet en administrator bruger til sig selv.6 4 https://en.wikipedia.org/wiki/Content_management_system http://www.forbes.com/sites/jjcolao/2012/09/05/the-internets-mother-tongue/ 6 http://codex.wordpress.org/Installing_WordPress 5 18 Når man så skal sætte sin side op kan man selv kode sig et theme, men der er også et stort udvalg af forskellige themes til forskellige behov. Nogle af dem er gratis at hente, mens andre koster penge. Hvis man f.eks. vil sætte en webshop op, er der lavet forskellige themes til det. Og man kan til enhver tid, skifte over til et andet theme.7 Selvom WordPress’ funktionalitet også har begrænsninger er der mulighed for at udvide den, ved at bruge plugins. Ligesom der findes tusindvis af themes til WordPress, findes der også mange plugins. Man kan selvfølgelig også selv lave plugins, hvis man har forstand på programmering.8 WordPress benytter sig også af user roles. Det betyder, at når en ny bruger oprettes på siden, får han tildelt en rolle, som bestemmer hvor mange rettigheder han har. Typisk vil en side, hvor besøgende kan registrere sig som brugere, kun få en meget begrænsede rolle som Subscriber eller Contributor. Det betyder at de f.eks. ikke kan gå ind og ændre på indhold til websiden, men kun ændre på deres egen profil. På den måde kan man bestemme, hvem der kan ændre på websiden. En administrator kan dog til hver en tid ændre andre brugeres roller.9 Selvom der findes andre CMS har WordPress været et nemt valg for mig, da det er det som Cleverweb benytter hver gang de skal lave webløsninger til kunder. Derfor var andre CMS aldrig til overvejelse, og jeg vil derfor ikke sammenligne WordPress med andre systemer. 4.1.1 Databasestruktur Når man sætter sin WordPress hjemmeside op, opretter den selv tables i den database man har tilsluttet til siden. WordPress har en bestemt databasestruktur. Man kan sagtens selv oprette sine egne tables, men hvis det er muligt, skal man helst undgå det, og bruge de tables, som WordPress selv opretter. Følgende er et diagram af WordPress’ databasestruktur: 7 http://codex.wordpress.org/Themes http://codex.wordpress.org/Plugins 9 http://codex.wordpress.org/Roles_and_Capabilities 8 19 Figur 4 - WordPress database struktur – Kilde: WordPress codex Her er en beskrivelse af de forskellige tables10: 10 http://codex.wordpress.org/Database_Description 20 wp_users: Dette table indeholder de forskellige brugere som er tilknyttet den pågældende WordPress side. wp_usermeta: Dette table indeholder vigtige informationer om de forskellige brugere. F.eks. deres for- og efternavn, deres nickname, eller en beskrivelse af dem osv. wp_posts: Dette table er nok det allervigtigste i WordPress’ struktur. Det indeholder alle de posts og sider, som er oprettet på den pågældende WordPress side. Det er også her de forskellige quizzer, som folk opretter, kommer til at blive gemt. wp_postmeta: Dette table indeholder vigtig info tilknyttet de forskellige posts. Det er i dette table ting som spørgsmål, indstillinger og resultater til de forskellige quizzer gemmes. wp_comments: Dette table indeholder kommentarer tilknyttet de forskellige posts. Som bruger kan man komme med kommentarer til posts, hvis admin har givet tilladelse til det. wp_commentmeta: Dette table indeholder information om de forskellige kommentarer. wp_links: Dette table indeholder information om de links man har indtastet i WordPress’ link feature. Det er dog en funktion der er blevet fjernet fra de nyere versioner af WordPress, men som er mulig at genoprette, med et plugin. wp_options: Dette table indeholder de indstillinger som er valgt under ”options” inde i administration panelet. wp_terms: Dette table indeholder de kategorier som kan tildeles posts og links. wp_terms_relationships: Dette table indeholder de forskellige associationer mellem kategorier og posts/links. wp_terms_taxonomy: Dette table indeholder beskrivelser af de forskellige kategorier/links. 4.2 PHP PHP: Hypertext Preprocessor, eller ganske simpelt PHP, er et server-side programmeringssprog. Det betyder, at alt kode der er skrevet i PHP eksekveres på serveren, før det sendes over til browseren. PHP bruges mest til webprogrammering, hvor det bl.a. bruges til at generere HTML 21 med. Når folk indtaster en webside adresse i deres browser sender de en forespørgsel til websiden på den indtastede adresse. Websiden finder så sidens HTML fil og sender den hen til browseren, som så opbygger en side, ud af HTML koden i filen. Man kan beskrive forholdet mellem en browser og en webside som et client-server forhold, hvor browseren er client og websiden er serveren. Og fordi PHP kode ikke eksekveres i browseren er det derfor et serverside sprog. Det kan derfor med fordel bruges til at loade de elementer, du ved skal være der fra starten af når siden loades. Og fordelen ved at bruge PHP, frem for ren HTML er også, at man ikke skal opdatere HTML koden konstant hver gang der skal ske ændringer. Så hvis man f.eks. skal lave en webside til en kunde, der ikke har forstand på programmering, ville det være så godt som umuligt for ham at opdatere siden, uden hjælp fra en programmør. Med PHP kan man f.eks. gemme ting i en database, og hente dem ud igen, når der er brug for dem. PHP hjælper også med at undgå store mængder gentagende HTML. Hvis man f.eks. ønsker ens header og footer skal være ens, lige meget hvilken sektion af ens side, som bliver vist, så kan man bruge PHP til at lette det arbejde. Ved ren HTML ville man være nødt til at skrive alt HTML til header og footer, i hver eneste HTML dokument.11 Grunden til valget er faldt på PHP som server-side sprog i mit projekt, er at WordPress er skrevet i det sprog, og at det derfor er et naturligt valg. 4.3 JAVASCRIPT JavaScript er et dynamisk programmeringssprog. I modsætning til PHP er det et client-side sprog, som betyder at alt koden eksekveres i browseren. Det kan derfor bruges til at ændre tingene efter en side er færdigloadet, uden man behøver at lave en forespørgsel til serveren. Fordelen ved det er at det ikke behøver at reloade siden, for at ændringer kan træde i kraft, og det er derfor med til at give brugerne en bedre oplevelse.12 11 12 https://en.wikipedia.org/wiki/PHP https://en.wikipedia.org/wiki/JavaScript 22 4.3.1 jQuery En anden god ting ved JavaScript er at det har nogle libraries som gør webudvikling lettere. Et af disse libraries er jQuery, som er det mest anvendte library i JavaScript. JQuery fungerer på den måde at det anvender selectors. Hvis man ønsker at manipulere et element, kan man bruge en jQuery selector til at få fat i elementet og derefter bruge funktioner i jQuery til at ændre elementet. Det kan også bruges til at ændre elementer alt efter brugerens handling. F.eks. kan du gøre elementer usynlige/synlige, når brugeren trykker på en bestemt knap. JQuery er meget brugervenligt, og indeholder en del nyttige funktioner, som gør tingene meget nemmere i forhold til hvis du skrev ren JavaScript. Ud over det fungerer det også på alle browsere, samt mobilplatforme.13 14 JQuery er meget anvendt i mit projekt de steder, hvor visse elementer først skal dukke op eller forsvinde, når brugeren udfører bestemte handlinger. 4.3.2 AJAX Asynchronous JavaScript and XML, eller AJAX, er en samling af webteknikker, som bruges til at lave asynkronisk udveksling af data mellem client og server, så siden dermed ikke behøver at reloade. Det kan f.eks. bruges til at sende data til serveren, som så kan gemme dem, uden brugeren overhovedet har en idé om at det sker. Det kan derfor med fordel bruges til at lave mere interaktive websider. Hvis man f.eks. brugte en POST form, til at sende dataen ind i stedet, ville det betyde at siden var nødt til at reloade og sende brugeren en ny side. Det ville passe fint, til store ændringer, men til meget små ændringer, er det ikke optimalt, da det tager tid at udføre, og derfor bør man i stedet overveje AJAX til at løse opgaven.15 I mit projekt har jeg anvendt AJAX til at gemme resultater og quiz states. 13 https://en.wikipedia.org/wiki/JQuery http://www.jscripters.com/jquery-disadvantages-and-advantages/ 15 https://en.wikipedia.org/wiki/Ajax_(programming) 14 23 4.4 OVERVEJELSER Under mit forløb var der også nogle ting der blev taget til overvejelse. Dette afsnit vil beskrive dem. 4.4.1 Ingen JavaScript? I afsnit 4.3 kommer JavaScript til at fremstå som et ret uundværligt sprog til webudvikling. Og selvom meget taler for at man skal bruge det, så er der alligevel en grund til at overveje at lave sådan at ens webservice virker uden JavaScript: Alle browsers giver nemlig brugeren muligheden for at slå JavaScript fra! Hvis man så slet ikke har taget hensyn til folk der ikke har JavaScript slået til, vil det i mange tilfælde være så godt som umuligt for dem at få noget ud af ens webservice. En mulighed kunne være først at lave sådan servicen virker uden brug af JavaScript. Det vil i mange tilfælde betyde, at man skal gøre sådan siden reloades, hver gang der skal nyt indhold på. Når så man har gjort sådan, at det fungerer uden JavaScript, kan man implementere det som en slags ”bonus” til dem der har det slået til. Der er ingen tvivl om at det optimale ville være at siden skal reloades, så få gange så muligt. Derfor ville det være en dum idé helt at droppe brugen af JavaScript i hvert tilfælde. Jeg besluttede mig dog for ikke at tage hensyn til folk uden JavaScript. Den største grund til det var at jeg ikke følte det ville være et stort tab, da en undersøgelse viser at kun 1,1% af verdens befolkning ikke bruger JavaScript.16 En anden grund var, at jeg var overbevist om det ville tage længere tid, og at jeg derfor måske ikke kunne nå at lave lige så meget i projektperioden. Cleverweb mente heller ikke det var nødvendigt at tage hensyn til det. Hvis de havde ønsket det havde jeg selvfølgelig hørt efter, men da de var enige med mig, så jeg ingen grund til at overveje det yderligere. 4.4.2 Cookies vs. local storage Da en webside er det man kalder state less, altså at den glemmer alt information den har fået omkring brugeren når forbindelsen lukkes ned, var det nødvendigt at overveje brug af teknologi der kunne løse det problem. 16 https://gds.blog.gov.uk/2013/10/21/how-many-people-are-missing-out-on-javascript-enhancement/ 24 Cookies og local storage er en måde at gemme data fra brugeren. Men i stedet for at gemme sig i en database på serversiden, gemmes det på klient siden. På den måde kan den pågældende data bruges igen, næste gang brugeren besøger websiden. Da jeg skulle vælge hvilken af de to jeg ville bruge var det vigtigt at kigge på forskellen mellem dem først og fremmest. Cookies er små tekst filer der kan indeholde data fra brugeren, som gemmes på vedkommendes egen computer. Når brugeren så besøger websiden igen, kan cookien indlæses og dermed kan servicen hente data omkring brugeren og bruge det igen. Fordelen ved cookies er at de også kan læses på server siden. Det vil sige man både kan læse, og oprette cookies på server siden og klient siden. Ulempen er at cookies ikke kan rumme store mængder data af gangen. Grænsen går til 4096 KB. Derudover trækker cookies også ned i hastigheden.17 Local storage gemmer brugerens data i vedkommendes browser. Princippet i local storage er det samme som med cookies, i og med meningen er at gemme data, som så kan huskes næste gang brugeren besøger websiden. Fordelen ved local storage er at det kan rumme meget større mængder af data end cookies kan. Mængden af tilladt data i local storage styres af browseren, men som regel kan den rumme op til 5 MB. En anden fordel ved local storage er også at den ikke trækker ned i hastighed som cookies gør. Men tilgengæld kan den kun loades på klient siden, så hvis man har brug for at tjekke op på data på server siden, kan man ikke bruge local storage.18 Efter at have overvejet de to ting, og kigget på fordele og ulemper faldt mit valg på cookies. Grunden til det er, at jeg har behov for at lave et tjek på server siden. Desuden er det meget små mængder data jeg skal bruge, så derfor vil der ikke være nogen fare for at overskride grænsen. Den eneste ulempe i mit sted er at det trækker ned i hastighed, men i den her situation er det dog noget jeg må leve med. Det jeg skal bruge cookies til er at huske quizzens 17 18 http://www.w3schools.com/js/js_cookies.asp http://www.w3schools.com/html/html5_webstorage.asp 25 tilstand, på de mindre vigtige quizzer. Derudover skal cookies også bruges til at tjekke om brugere der ikke er logget ind, allerede har taget quizzen. 26 5 PROCESSEN Dette afsnit vil beskrive hvordan arbejdet med projektet gik. Da jeg havde valgt at benytte Scrum som metode, vil jeg beskrive de forskellige sprints en efter en. 5.1 SPRINT 0 Inden arbejdet kunne gå i gang skulle det planlægges ordentligt. Derfor blev der afholdt et sprint med fokus på planlægning udelukkende. 5.1.1 User Stories Tidligt i forløbet lavede jeg en aftale med ejeren af Cleverweb om et møde. Under mødet skulle vi sammen planlægge funktionaliteten til pluginnet. Der blev først og fremmest sat fokus på, at det skulle være sådan at folk kunne oprette spørgsmål og sætte dem ind på deres side. Cleverweb ønskede også at man kunne integrere med sociale medier som Facebook, og tilmelde sig nyhedsbreve, da der ville være stor reklameværdi i det. At det kunne køre på mobil var også et ønske. Derudover blev der foreslået en masse andre features, såsom statistik, mulighed for at sætte tid på quizzen, opdele de forskellige quizzer i kategorier osv. Det blev dog aftalt, at jeg også gerne selv måtte finde på nye features, hvis jeg pludselig fik idéer. Mødet skulle ikke ses som et hvor alting skulle på plads med det samme, men blot som noget der kunne hjælpe mig i gang. Derfor kom der selvfølgelig også løbende nye stories til min product backlog. 5.1.2 Udviklingsmiljø Det blev besluttet at udviklingen skulle foregå i Sublime Text 2, som er en kodeeditor. 19 Grunden til at valget faldt på den, er mine erfaringer med at bruge den. Jeg har brugt den hver gang jeg har udviklet ting til WordPress, og har kun haft gode oplevelser, så jeg så ingen grund til at skifte. 19 http://www.sublimetext.com/2 27 Til at håndtere versionsstyring har jeg valgt SubVersion (SVN)20 som værktøj og Google Code som host. Ligesom mit valg af udviklingsværktøj, har jeg også gode erfaringer med SVN, så jeg overvejede heller ikke andre værktøjer til versionsstyring. Cloud-tjenesten Dropbox er blevet anvendt til at håndtere dokumentation.21 Da jeg er alene, bruges det mest som backup, så jeg ikke risikerer at miste vigtige ting til rapporten, da der ikke er behov for vidensdeling mellem gruppemedlemmer. 5.1.3 Test For at teste mit plugin har jeg brugt værktøjet XAMPP.22 Det gør at min egen computer kan køre som server lokalt. Det betyder, at jeg kan sætte en WordPress side op på localhost. Fordelen ved det er at jeg ikke behøver betale for et live domæne. Siden det er lokalt, behøver jeg heller ikke adgang til nettet, så hvis nettet skulle være nede, vil det stadig være muligt for mig at teste. En anden fordel er også at det går hurtigere i forhold til hvis jeg testede online. XAMPP tilbyder også brugen af phpMyAdmin lokalt, så derfor er det også nemt at oprette egne MySql databaser til sine localhost sider. Ud over det er det også planen at jeg vil anvende brugertests, så andre, som ikke kender pluginnets funktionalitet, kan teste det og komme med inputs. 5.1.4 Arkitekturvalg Det tog lidt tid før jeg besluttede mig med hensyn til valg af arkitektur. Da jeg begyndte planlægningen af projektet var det i starten meningen at jeg ville bruge det populære ModelView-Controller (MVC).23 Det skyldes, at jeg gennem hele uddannelsen har været meget vant til objekt orienteret programmering, hvor tingene er opdelt i forskellige lag. Men efter nogle undersøgelser gik det op for mig at MVC arkitekturen ikke var skabt til at lave et WordPress plugin med. Eller man kan også sige det omvendt: WordPress er ikke skabt til at bruge MVC.24 Det skyldes måden WordPress er opbygget på. WordPress benytter sig af hooks, til at udføre funktionalitet. De fungerer lidt ligesom en delegate: Man kan tilføje metoder til dem, og når så 20 https://subversion.apache.org/ https://www.dropbox.com/home 22 https://www.apachefriends.org/index.html 23 https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller 24 https://tommcfarlin.com/wordpress-and-mvc/ 21 28 udløser den, udføres alle de metoder som er under den bestemte hook. I WordPress er der sat en del hooks op til forskellige situationer. Når man så koder et plugin, kan man tilføje sine egne metoder til de eksisterende hooks.25 26 27 Det er selvfølgelig også muligt selv at lave hooks, men det bruges som regel mest under themekodning. Udfra det her kan jeg derfor konstatere at WordPress er bygget op omkring en event-driven arkitektur.28 Det vil dermed sige at det fungerer på den måde at WordPress ændrer på tingene når visse events foretager sig. Den har så de forskellige hooks til at ”holde øje” med hvad brugeren foretager sig. Når en hook ”opdager” en bestemt ting brugeren foretager sig, så bliver alle de funktioner den har gemt i sig, udløst. Da WordPress derfor ikke er opbygget til MVC, synes jeg derfor det ville være spild af tid at prøve og indrette det efter det. Selvfølgelig ville det ikke være umuligt, men jeg synes ikke det er det værd, og når WordPress er bygget op omkring en bestemt måde at gøre tingene på synes jeg det ville være dumt at trodse det. Min arkitektur til mit plugin kommer derfor til at se sådan her ud: 25 http://codex.wordpress.org/Plugin_API http://codex.wordpress.org/Plugin_API/Action_Reference 27 http://codex.wordpress.org/Plugin_API/Filter_Reference 28 https://en.wikipedia.org/wiki/Event-driven_architecture 26 29 Figur 5 - Plugin arkitektur Som det kan ses på figuren betyder det, at jeg tilføjer funktioner til hooks, som så sørger for at udføre alle dens funktioner når den udløses. Hvornår de forskellige hooks udløses, kommer an på hvilken type hook det er. F.eks. er der en hook som hedder init, som udføres efter WordPress siden er færdigloadet. Det betyder, at jeg kan tilføje funktioner som jeg først ønsker udføres efter siden er loadet, til den hook. Herunder er et eksempel på hvordan hooks tilføjes: Figur 6 - Anvendelse af hooks Det første argument er navnet på den hook som metoden skal ind under, og det næste er den metode der tilføjes til den pågældende hook. 30 5.1.5 Domænemodel For at give bedre overblik over min struktur blev der også lavet en domænemodel i sprintet. Det skal dog nævnes at den flere gange blev ændret undervejs efterhånden som jeg blev klogere omkring mit projekt. Men den endelige model endte med at se sådan her ud: Figur 7 - Domænemodel I forhold til databasestrukturen (se afsnit 4.1.1) vil Quiz være det der gemmes som post. Alle de andre er så postmeta, som dermed kan knyttes til denne post, udover User, som jeg ikke håndterer i mit plugin. Jeg benytter dog userName visse steder, så derfor mente jeg den også skulle med på modellen, men selve håndteringen af User ordnes ikke af mit plugin. Result bruges til at kunne vise statistik. State bruges til at gemme quizzens tilstand, i tilfælde af at brugeren ikke gør den færdig med det samme. På den måde kan den reloade fra den tilstand brugeren forlod den i, så vedkommende ikke behøver starte quizzen forfra. 31 Setting kan måske være lidt svær at se hvordan fungerer udfra modellen. Måden det styres på er at alle de forskellige settings har deres egen value. Man kan så tjekke om indstillingen er slået til, ved at tjekke op på om dens unikke value eksisterer. Hvis den gør det er indstillingen slået til, og det er så modsatte tilfælde, hvis den ikke eksisterer. 5.1.6 Risikoanalyse Når man starter på et udviklingsprojekt kan det ikke undgås at der er forskellige ting der kan risikere at komme i vejen for at projektet forløber som planlagt. Nedenunder er vist en såkaldt risikoanalyse over de problemer som kan opstå og hvor alvorlige de er. Sandsynlighed er hvor stor risikoen er for at problemet opstår og er givet fra 1 til 10, hvor 1 betyder chancen for at det sker er nærmest ikke-eksisterende og 10 betyder at det er uundgåeligt at det vil ske. Effekt er hvor stor en katastrofe det er for projektet, hvis det sker. Den er også givet fra 1 til 10, hvor 1 betyder det nærmest er ligegyldigt hvis det sker, og 10 betyder det kan koste meget dyrt i arbejdsfremgangen. Ranking er sandsynlighed gange med effekten, og risikoerne vil blive sorteret efter den. Beskrivelse Sandsynlighed Effekt Ranking Stories bliver 9 5 45 3 9 27 2 10 20 Sygdom 2 9 18 Googles server går 1 4 4 underestimeret Forhindres i at arbejde på en sprintdag Computeren går i stykker ned Mange af disse risikoer er baseret på det faktum at jeg arbejder alene. Det betyder at det f.eks. ville være en katastrofe, hvis jeg pludselig står uden en computer, eller hvis jeg forhindres i at 32 arbejde visse dage, da der ikke er andre til at lave arbejdet. Det ville i så fald betyde arbejdet ville gå i stå. Som det kan ses vurderes de fleste af tingene dog ikke som sandsynlige, så det forventes ikke de forekommer. Det som er mest sandsynligt vil gå galt er at jeg underestimerer stories, da jeg ikke har erfaring med at arbejde agilt alene. Det er dog ikke en kæmpe katastrofe, da agilt netop taler for at man kan tillade sig at lave ændringer undervejs. Dog vil det stadig have en vis generende effekt. Jeg medtog også det faktum at Googles server kan gå ned, da det er dem der er host for min konfigurationsstyring. Skulle jeg dog være så uheldig at det skete er det i mit tilfælde dog ikke ligefrem en katastrofe, da jeg er alene, og derfor mest bruger konfigurationsstyring til at sikre mig at jeg ikke mister koden. Havde jeg samarbejdet med nogen havde det været noget andet, da vi så ikke kunne committe ændringer, og det i så fald ville sænke arbejdsfremgangen. 5.1.7 Kodestandard Jeg vil benytte mig af WordPress’ egen kodestandard.29 Ud over det vil jeg lave alt koden på engelsk, selvom mit interface bliver på dansk i første omgang. 5.2 SPRINT 1 5.2.1 Planlægning Efter sprint 0 var overstået, og forberedelserne til projektet dermed var på plads, var det tid til at starte på arbejdet. Først og fremmest valgte jeg at lave de stories som var vigtigst for at dette plugin gav mening. Det betyder man selvfølgelig skulle være i stand til at oprette en quiz, med spørgsmål og svar. Og så skulle quizzen selvfølgelig kunne smides ind på en side, så besøgende kunne tage den. Jeg udvalgte de stories jeg ville arbejde på under dette sprint og delte dem alle op i tasks, sådan at de blev mere overskuelige. Min backlog for dette sprint endte med at se sådan ud: 29 https://make.wordpress.org/core/handbook/coding-standards/ 33 Figur 8 - Sprint 1 backlog 5.2.2 Udførelse Indledningsvis gik jeg i gang med at gøre sådan man kunne oprette en quiz. Det gik fint nok i starten, men jeg løb ind i en del problemer, da jeg skulle gøre sådan at spørgsmålene kunne gemmes. Det kostede mig en del ekstra arbejde på den story. Det der gik galt var at jeg ikke kunne få den til at gemme de dynamiske ting. Altså, f.eks. spørgsmål som brugeren havde tilføjet, og svarene til dem. Det fungerede nemlig sådan at brugeren kunne trykke på en knap når han ønskede at tilføje et nyt spørgsmål, og på samme måde når der skulle tilføjes nye svar til de forskellige spørgsmål. Havde det været statiske elementer, havde det nok ikke været lige så svært. Figur 9 - Quiz i backend 34 Pga. det nåede jeg kun at lave en yderligere story, og det blev den der gjorde at man kunne lægge en quiz ind på siden. Måden det blev gjort på, var ved hjælp af en shortcode. Den fungerer sådan, at når admin har oprettet en quiz, får quizzen en shortcode genereret. Hvis admin, så laver en ny side og sætter den shortcode ind i sidens editor, så bliver quizzen lagt ind på den pågældende side. Admin behøver på den måde ikke selv lave noget kode. Figur 10 - Detaljeoversigt af quiz Herunder ses hvordan quizzen ser ud i front end: Figur 11 - Quiz i front end 35 Figur 12 - Oversigt over spørgsmål i front end Min burndown kom til at se således ud: Burndown - Sprint 1 30 25 Point 20 15 Estimeret Aktuelt 10 5 0 0 1 2 3 Dag Figur 13 - Burndown sprint 1 36 4 5 Som det kan ses, bremsede den første story mig en del, pga. de problemer jeg løb ind i. Derfor flyttes de to resterende stories over til det næste sprint. 5.2.3 5.2.3.1 Kodeeksempler Opret quiz Som nævnt i afsnit 6.1.5 skal en quiz oprettes og gemmes som en post. Når man laver sine egne post types kaldes de custom post types. WordPress har en indbygget funktion til at oprette sine egne post types. Herunder kan ses hvordan den er opbygget: Figur 14 - Implementering af quizzez post type Ved så at tilføje min funktion til en bestemt hook (i dette tilfælde init), så udløses denne metode hver gang WordPress er færdigloadet. Det betyder så, at Quizzer nu kan oprettes i WordPress’ backend. 5.2.3.2 Gem quiz For at være i stand til at gemme quizzen, gjorde jeg først sådan, at de forskellige værdier (såsom spørgsmål, svar osv.) blev gemt i JavaScript arrays, når man trykkede på ”gem” knappen. 37 Figur 15 - Tilføjelse af arrays til at gemme med Fordi alle tingene var inde i en form og ”gem” knappen fungerede som en submit knap, kunne jeg bruge $_POST til at få fat i de ting, som var blevet gemt i de forskellige arrays og dermed sende dem til databasen. Figur 16 - Implementering af en funktion til at gemme med Denne funktion udløses hver gang man bruger ”gem” knappen inde i en quizzes post type. Update_post_meta, gør enten det at den gemmer de forskellige ting i det pågældende array, i 38 databasen, eller erstatter dem, hvis den key, som de har allerede findes i forvejen. På den måde kan man altså også overskrive spørgsmål, hvis det er nødvendigt. 5.2.3.3 Indsæt quiz For at kunne få quizzen sat ind på en side skal folk, som nævnt i afsnit 5.2.2 bruge en såkaldt shortcode. Den genereres efter at man har oprettet quizzen. For at genere en shortcode har jeg brugt en function der hedder add_shortcode(), som laver en hook, man kan bruge når man skal have elementer ind på en side, på en nem måde. Det fungerer på den måde at vedkommende skal bruge den pågældende quiz’ post ID. Hvis det f.eks. er 32, kan vedkommende blot sætte det her ind i page editor: [hm-quiz id = 32], og så kommer hele quizzen automatisk ind på den pågældende side. For at gøre det muligt har jeg gjort følgende: Figur 17 - Implementering af shortcode Ved så at hente alle posts af typen quizzes ud af databasen kan man finde den post der har det ID, som er angivet i shortcoden, ved hjælp af et foreach loop. Hvis den så finder en der matcher stopper loopet og quizzen bliver gemt i en variabel, således at man har mulighed for at lave opsætningen af quizzen i front end. 5.2.4 Retrospective Første sprint gik ikke efter planen og den hovedsaglige grund til det skal findes i at jeg nok skulle have foretaget et spike inden jeg begyndte. Et spike omkring det at få den til at gemme i WordPress’ backend, havde uden tvivl gjort stor nytte. Men som nævnt tidligere i afsnit 5.2.2 39 kom det bag på mig hvor svært det egentlig var at få den til at gemme dynamiske elementer. Jeg havde uden tvivl underestimeret den story. En anden ting jeg også fremover vil prioritere er at få lavet en story færdig samme dag som jeg starter den. Selvfølgelig vil der sikkert være tilfælde, hvor jeg må erkende, at det ikke kan lade sig gøre. Men da min burndown siger at jeg skal brænde 5 point ned om dagen, vil det være det mest optimale at gå efter. Og i de tilfælde hvor det ikke kan lade sig gøre at lave en story færdig på én dag, vil jeg gå efter i hvert fald at afslutte de tasks som er påbegyndt på dagen. Hvis det ikke kan overholdes bliver burndown nemlig hurtigt svær at lave sådan den giver et korrekt billede på hvordan processen er forløbet. Det vil jeg meget gerne undgå til mine fremtidige sprints. 5.3 SPRINT 2 5.3.1 Planlægning Først og fremmest skulle de stories som ikke blev nået i forrige sprint, laves i dette sprint. Det her sprint kom primært til at gå ud på at få tilføjet flere features til mit plugin. Efter sprint 1 var færdig kunne det nu lade sig gøre at oprette en quiz og putte den ind på sin side. Men jeg ville gerne gøre sådan man kunne få vist sit resultat, efter quizzen og vælge om quizzen skulle kunne tages mere end én gang etc. Min backlog for dette sprint så sådan her ud: Figur 18 - Sprint 2 backlog 5.3.2 Udførelse Jeg fortsat hvor jeg slap fra sprint 1, og fokuserede på at gøre de to stories, som jeg ikke nåede i sprint 1, færdige. Det forløb uden problemer. Derefter ville jeg gøre sådan at quizzen kunne beregne resultatet, da jeg så det som en ret vigtig feature. Jeg vurderede nemlig, at hvis ikke 40 folk kunne se deres resultat, så ville meningen med det at tage en quiz være nytteløst på visse områder. For også at gøre det nemmere for admin at finde rundt i sine quizzer ville jeg give ham mulighed for at oprette forskellige kategorier. Når så han havde sat en quiz ind under en kategori ville han have muligheden for at få vist alle quizzer med en bestemt kategori. Jeg havde også besluttet mig for at visse features ville fungere på den måde at admin, selv kunne vælge om de skulle slås til eller fra. I dette sprint lagde jeg ud med at give muligheden for at vælge quiz opsætning, om quizzen måtte tages mere end én gang, og muligheden for at sætte tid på quizzen. De to ting blev også betragtet som vigtige faktorer i at undgå brugere kunne snyde i konkurrencer. Hvis der var tid på ville det f.eks. være sværere at nå at søge på nettet efter svar på spørgsmålene, og hvis quizzen ikke kunne gentages ville man ikke kunne forbedre sit resultat efter at have taget quizzen én gang. Figur 19 - Udvalg af indstillinger til quiz Min burndown for dette sprint endte sådan her: 41 Burndown - Sprint 2 30 25 Point 20 15 Estimeret Aktuelt 10 5 0 0 1 2 3 4 5 Dag Figur 20 - Sprint 2 burndown Som det kan ses, gik det meget bedre denne gang i forhold til forrige sprint. Jeg nåede stort set det hele, men jeg blev desværre forhindret i at arbejde den sidste dag i dette sprint, så den story som jeg ikke nåede valgte jeg at overføre til næste sprint. 42 5.3.3 5.3.3.1 Kodeeksempler Tidsmåler Tidsmåleren blev lavet ved hjælp af denne metode30: Figur 21 - Implementering af tidsmåler Metoden er skrevet i JavaScript. ClearInterval er en indbygget metode i JavaScript som sørger for at stoppe måleren, når quizzen er færdig eller tiden er gået.31 Hvis brugeren ikke når at færdiggøre quizzen inden den når 0, vil den gemme resultatet af de svar som vedkommende nåede at besvare, og resten beregnes automatisk som forkerte. 5.3.4 Retrospective At dette sprint gik bedre skal nok ses i at jeg denne gang ikke løb ind i forhindringer, som den jeg kom ud for i forrige sprint. Grunden til det er at de udvalgte stories, var korrekt estimeret denne gang. Jeg synes også idéen med at gøre stories/tasks færdige den dag de blev påbegyndt fungerede meget godt, især når jeg skulle brænde ned i mit burndown chart. Pga. det giver det nu et meget bedre billede af hvordan det er gået. Det var selvfølgelig lidt uheldigt jeg måtte aflyse den sidste dag i sprintet, og det var lidt ærgerligt, når det ellers gik så godt, men jeg er dog overbevist om, at jeg nok skal få det indhentet i næste sprint, så jeg ser det ikke som den store katastrofe. Jeg er overbevist om, at den arbejdsform jeg har indtil nu er den rigtige og jeg håber at de fremtidige sprints vil gå lige så godt. 30 31 http://stackoverflow.com/questions/3785029/jquery-countdown-timer http://www.w3schools.com/jsref/met_win_clearinterval.asp 43 5.4 SPRINT 3 5.4.1 Planlægning Et af kravene fra Cleverweb, til pluginnet var at man skulle kunne integrere med sociale medier, som Facebook, Twitter, Google+ etc. Derfor besluttede jeg mig for at kaste mig ud i at integrere med Facebook i dette sprint, da Facebook må regnes blandt nogen af de største inden for sociale medier. En anden vigtig ting for pluginnet var at det skulle kunne huske quizzens tilstand, hvis forbindelsen crashede eller brugeren kom til at refreshe siden ved et uheld. Derfor satte jeg mig også for at lave en måde at sikre sig imod det i dette sprint. Der var også blevet tænkt på statistik. I visse quizzer har det altid været underholdende at konkurrere imod hinanden, og derfor følte jeg, at det ville være ideelt hvis man kunne se rangliste, så man derfor kunne se hvem der havde klaret quizzen bedst. Og hvis quizzen skulle bruges til en konkurrence, ville det også være en fordel for admin at han havde en oversigt over hvem der havde klaret sig bedst, så en vinder nemt kunne findes. Det medførte, at der også blev tænkt på at gøre sådan at quizzen kunne beregne den tid som brugeren tog om at gennemføre quizzen. Det ville være nyttigt i tilfælde af at to brugere f.eks. svarede rigtigt på lige mange spørgsmål. På den måde ville tiden så kunne vurdere hvem der havde klaret sig bedst. Måden man kunne opsætte en quiz på var også noget der skulle ordnes. Da jeg startede på dette plugin, lavede jeg sådan at alle spørgsmål kom ud på en gang, men jeg tænkte at visse brugere måske hellere ville have et spørgsmål af gangen, så det blev også taget ind som story i dette sprint. 44 Backloggen for dette sprint så sådan ud: Figur 22 - Sprint 3 backlog 5.4.2 Udførelse Da det, som nævnt i afsnit 5.4.1 var et ønske fra Cleverweb at kunne integrere med sociale medier, startede jeg ud med at prøve og gøre sådan det var muligt at dele quizzen via Facebook. For at dette kunne lade sig gøre, skulle jeg ind og have fat i Facebooks Application programming interface (API). Til at starte med skulle jeg oprette mig som bruger derinde, og lave min egen app. Derefter kunne jeg frit, via den app, bruge Facebooks funktionalitet, som muliggør integration til siden. Jeg fik lavet sådan, at admin kunne bestemme om han ville tillade deling via Facebook. Hvis ja, så ville man få muligheden for at dele quizzen, og sit resultat, efter man har taget den. Det foregik via Facebooks egen hjemmelavede ”del” knappe, som jeg fik implementeret. Når man trykker på den, tager den linket fra den side man er på og så kan brugeren vælge at dele det på sin væg. Derefter gik jeg i gang med at gøre sådan at quizzen kunne beregne den tid det tager brugeren at gøre den færdig. Det lykkedes også, og jeg fik lavet sådan at brugeren kan se i toppen hvor lang tid han har brugt, og så gemmer den tiden, sammen med antal rigtige svar efter quizzen er afsluttet. 45 Figur 23 - Tidsberegner i quizzen Så fik jeg også lavet sådan at admin nu kan bestemme om han ønsker alle spørgsmål skal komme ud på en gang, eller om han foretrækker at spørgsmålene vises en af gangen, og brugeren så kan trykke på ”næste” når han vil videre til næste spørgsmål. Jeg fik også lavet sådan at admin i backend nu kan se statistik på alle de brugere som har taget quizzen. Jeg lavede et table der sorterer efter antal rigtige svar, og hvis visse brugere har samme antal rigtige svar, så sorterer den udfra hvem har været hurtigst igennem quizzen i stedet. Figur 24 - Statistikoversigt i backend At lave sådan at quizzen kunne huske hvor den var nået til, hvis forbindelsen gik ned, var noget der var lidt vanskeligere end forventet. Efter snak med vejlederen fik jeg et tip: Jeg kunne gøre sådan at quizzen gemte dens state hver gang brugeren svarede på et spørgsmål. For at det 46 kunne lade sig gøre skulle jeg lave et AJAX kald, hver gang brugeren markerede et svar. Det betyder så, at jeg kunne få quizzens state over i serveren, og ved hjælp af PHP, gemme den i databasen. Hvis så forbindelsen crasher, er det så muligt at tjekke op på om den pågældende bruger har et state gemt i databasen, og så kan man tilbyde ham at fortsætte hvor han slap, eller opgive quizzen. Hvis han så opgiver quizzen beregner den det antal svar, han fik svaret på og resten beregnes så automatisk som forkerte. Figur 25 - Fortsættelse af quiz i front end Mit burndown for dette sprint endte med at se sådan her ud: 47 Burndown - Sprint 3 30 25 Point 20 15 Estimeret Aktuelt 10 5 0 0 1 2 3 4 5 Dag Figur 26 - Sprint 3 burndown Som det kan ses gik sprintet meget godt. Dog nåede jeg ikke den sidste story, fordi den med at gemme quizzens state, var lidt vanskeligere end beregnet, men ud over det må dette sprint betragtes som en stor succes. 5.4.3 5.4.3.1 Kodeeksempler Facebook-deling For at jeg kunne få implementeret Facebook-deling, skulle jeg først forbinde mit plugin til den Facebook app, som jeg havde oprettet inde på Facebook Developers. Det blev gjort via JavaScript på følgende måde: 48 Figur 27 - Implementering af Facebook SDK Ved at give den mit unikke app ID, som man får efter man har oprettet en app, ved den hvilken app den skal forbinde til og på den måde kan jeg gøre brug af Facebooks’ development bibliotek. Ved så at give et div element klassen ”fb-share-button”, bliver der automatisk lavet en Facebook del knappe: Figur 28 - Opsætning af del knap 5.4.3.2 Gem quiz tilstand For at det kunne lade sig gøre at gemme quizzens tilstand, uden at være nødt til at reloade siden, krævede det brug af AJAX. Det var nødvendigt at lave et AJAX kald, hver gang brugeren markerede et svar. 49 Figur 29 - AJAX kald På den måde kunne jeg sende disse variabler over på server siden. Og når AJAX kaldet så blev lavet, ville den også automatisk udføre den funktion jeg har angivet under ”action”. Det er en PHP funktion, som automatisk gemmer quizzens tilstand i databasen, ved hjælp af de variabler som er sendt over. 5.4.4 Retrospective At der kunne tilføjes endnu et vellykket sprint må ses som meget positivt. Igen oplevede jeg, at det med at gå efter at gøre en task/story færdig den dag den påbegyndes var en meget god måde at arbejde på. Dog har jeg også måtte sande, som jeg frygtede, at det ikke er altid det er muligt at gøre dem færdige samme dag som de påbegyndes, hvis de f.eks. er sværere end først antaget. Men heldigvis er det også det gode ved at arbejde agilt; at man til enhver tid kan ændre i backloggen. Men da det går så godt som det gør nu, vil jeg ikke foretage store ændringer på mine arbejdsmetoder. En anden ting jeg synes fungerer godt, er løbende at holde kontakten med Cleverweb. Jeg har haft mange fornuftige samtaler over Facebook med den ene af ejerne og han har løbende kommet med inputs til nye features. Selvom de ikke har haft tiden til reviews, har det alligevel fungeret godt på denne måde, da jeg føler det har været godt for mit arbejde at få idéer fra firmaet også. 50 5.5 SPRINT 4 5.5.1 Planlægning Efter planen skulle dette være sidste sprint. Inden jeg påbegyndte dette sprint havde jeg en samtale med Cleverweb. Vi snakkede omkring det jeg havde lavet med at brugerens state blev gemt. Cleverwebs ejer mente, at der ville være en potentiel chance for serveroverbelastning, hvis det hele tiden blev gjort på den måde som jeg havde lavet. Jeg kom så med et forslag: Jeg ville give brugeren muligheden for at markere i backend om quizzen skulle bruges til en konkurrence. Hvis ja, så ville jeg bruge den måde som jeg allerede havde lavet. Hvis nej, så ville quizzen i stedet anvende cookies til at gemme de forskellige states, så databasekald ikke længere ville være nødvendigt til at gemme quizzens state. Grunden til jeg mente metoden med databasekald var bedst når det var en konkurrence, er at cookies nemt kan slettes og at brugeren så nemt ville kunne snyde. Det ville være katastrofalt, hvis folk kunne snyde sig til præmien, som admin evt. udlovede. Derfor blev den story igen hevet ind i dette sprint, så den kunne gøres færdig. Og eftersom vi var i gang med at snakke om hvordan man forhindrede brugere i at snyde, snakkede vi også om hvad vi skulle gøre hvis brugere ikke var logget ind og ville være med i en konkurrence. Cleverwebs ejer foreslog her at jeg kunne gøre sådan man så skulle indtaste sin email i et felt, inden man kunne begynde quizzen. Hvis man så gemte e-mailen, kunne man tjekke op på om vedkommende allerede havde deltaget i konkurrencen. Cleverweb havde også fra starten af ønsket at det skulle være muligt at samle tilmeldinger til nyhedsbreve via quizzen. For at dette kunne være muligt skulle mit plugin kunne integrere med nyhedsbrevsservice. Jeg tror dog ikke på at jeg kan nå at integrere med en masse forskellige så i dette sprint har jeg valgt MailChimp, efter anbefaling fra Cleverweb, da de selv bruger den service. Så ligesom jeg gjorde da jeg skulle integrere med Facebook, skal jeg ind og bruge MailChimps API. Siden jeg havde lavet sådan admin kunne se statistik besluttede jeg at admin også skulle have mulighed for at give de andre brugere lov til at se statistik i front end. Men selvfølgelig kunne der være tilfælde hvor han gerne ville holde den hemmelig, så derfor besluttede jeg, at det 51 skulle være noget han bestemte. Jeg besluttede også at gøre sådan admin kunne bestemme om brugeren måtte se rigtige svar efter at have taget quizzen. Da dette var mit sidste sprint, ville jeg også gerne oversætte pluginnets interface til engelsk, med henblik på at ikke-dansk talende brugere kunne bruge det. Hvis jeg gjorde det, ville folk i udlandet også kunne hente det og bruge det. Min sidste backlog så sådan her ud: Figur 30 - Sprint 4 backlog 5.5.2 Udførelse Da den story med at man kan fortsætte hvor man slap, hvis siden reloadede, også var med i forrige sprint gav det god mening at starte med at få den gjort helt færdig. Jeg blev ikke færdig med den samme dag som den blev påbegyndt, da cookies var rimelig nyt for mig, men heldigvis fik jeg lavet nok til at jeg kunne gøre den færdig ret hurtigt dagen efter. Det voldte mig lidt besvær at få den til at gemme de spørgsmål, som der var blevet svaret på, i cookies. Efter det var overstået sprang jeg ud i at prøve at få nyhedsbrevintegration tilsluttet. Her gik jeg ind på MailChimps API guide for at prøve og finde hjælp. Jeg brugte meget af dagen på at lave research. Men sidst på dagen fandt jeg dog ud af at man ikke kunne teste MailChimp på localhost. Derfor besluttede jeg mig for ikke at gå videre med det, da jeg ikke mente det kunne betale sig, hvis man ikke kunne sætte det op på lokalt, da jeg så ikke ville kunne få testet om det virkede. Så jeg smed i stedet den story tilbage i product backlog. Det lykkedes at få lavet sådan man kunne se de rigtige svar efter quizzens afslutning. Dog voldte det lidt problemer at skulle sørge for at den funktion virkede i begge quizopsætninger (altså både med alle spørgsmål på én side, og med et spørgsmål af gangen). 52 Det lykkedes også at få implementeret e-mail tjek, til konkurrencer, hvor en bruger ikke er logget ind. Figur 31 - E-mail tjek Da pluginnet skulle oversættes brugte jeg Poedit, som er en oversættelseseditor.32 For at kunne bruge den måtte jeg dog ind og ændre alle de steder hvor der var ting der skulle oversættes i koden. Det krævede nemlig at man brugte en bestemt funktion de steder, for at editoren kunne genkende de forskellige linjer som skulle oversættes, så der gik lidt tid med det. Men det lykkedes at få oversat pluginnet til engelsk. 32 http://poedit.net/ 53 Figur 32 - Oversat plugin Burndown for sidste sprint endte med at se sådan ud: 54 Burndown - Sprint 4 30 25 Point 20 15 Estimeret Aktuelt 10 5 0 0 1 2 3 4 5 Dag Figur 33 - Sprint 4 burndown Som det kan ses var jeg lidt bagefter det meste af tiden, men endte med at lave alle stories færdige udover den med nyhedsbrevintegration. 5.5.3 5.5.3.1 Kodeeksempler Anvende cookies Figur 34 - Implementering af cookies 55 Ved at lave et array om til JSON, kan jeg gemme arrayet, som en String i en cookie. Når den så skal læse cookien kan jeg transformere den tilbage til et array igen, så jeg dermed kan afkrydse de svar som brugeren har valgt, og på samme måde kan jeg også sætte tidsmåleren på den tid, som brugeren indtil videre har brugt. 5.5.4 Retrospective Selvom jeg er skuffet over jeg ikke fik lavet nyhedsbrevstilmelding, synes jeg det her sprint gik meget godt. Alle andre stories blev lavet med stor succes, og jeg synes det var en god måde at slutte af på. Men jeg burde nok have lavet et spike på det med nyhedsbrevstilmelding, så jeg ikke havde spildt en hel sprintdag på det. Hvis jeg havde gjort det, og dermed fundet ud af at det ikke kunne laves på localhost, kunne jeg have udvalgt en anden story som havde været mere realistisk at gøre færdig. Det var ikke så heldigt at spilde en hel dag med en story der endte med at blive droppet. Men udover det synes jeg ikke der var mange ting der gik galt under dette sprint. 5.6 TEST Efter sidste sprint, havde jeg aftalt med ejeren af Cleverweb, at jeg kunne få folk i hans netværksgruppe til at teste mit plugin og komme med feedback. Derfor lavede jeg nogle testopgaver, og så var aftalen at de skulle filme skærmen og snakke højt imens, ligesom en tænke-højt test. Desværre var der kun én fra netværksgruppen der nåede at teste mit plugin, inden denne rapport skulle afleveres. Jeg håber selvfølgelig, at de andre folk når det senere, således at jeg kan få nyttig feedback, til at forbedre pluginnet løbende. Men nogle af de ting jeg fik fra den person der nåede at teste det var: Visse knapper i backend er ikke placeret sådan det virker logisk hvordan de bruges Hjælpetekst til indstillinger i backend skal beskrives meget kortere 56 Quizzen bør stadig registrere den tid brugeren er om at tage quizzen selvom man ikke har den indstilling slået til. Indstillingen burde i stedet tilbyde at skjule tidsmåleren i front end. 5.7 VURDERING AF PROCESSEN Efter at have været igennem fire sprints, kan jeg nu konkludere at jeg valgte rigtigt hvad angår valg af metode. Det har fungeret rigtig godt, med at lave sprints, hver uge og jeg føler at det agile har passet perfekt til mig. Der hvor det især gjorde mig gavn, var at jeg kunne lave ændringer uden problemer. Det betød en hel del eftersom der jævnligt kom nye idéer til funktionaliteten, og hvis jeg havde arbejdet plandreven, havde det været besværligt at skubbe ændringerne ind i planen. De gange hvor jeg er stødt på problemer i forhold til udviklingen har det agile også været meget godt at bruge, da jeg så uden problemer har kunne ændre i planerne for de forskellige sprints. Men som forventet blev XPs praktikker ikke fulgt i lige så høj grad, da jeg var alene. Men dog synes jeg heller ikke der på noget tidspunkt har været lige så stort et behov for dem, som der har været for Scrum. Nogle af praktikkerne, såsom simpelt design, fastlagt antal timer og kort tid mellem releases, har dog hjulpet en del på mit arbejde. Det var også forventet, at jeg nok ville komme til at indrette arbejdsmetoderne meget efter mit eget behov, da jeg trods alt var alene om projektet. Som jeg også forventede, hjalp det også meget på min motivation at presse mig selv til at have ny funktionalitet klar uge efter uge. Uden en decideret plan tror jeg slet ikke at jeg havde nået lige så meget som jeg endte med, så jeg synes bestemt det har været en god måde at arbejde på. 6 KONKLUSION Efter 9 ugers projektarbejde er resultatet nu blevet et Quiz plugin med en masse funktionalitet. Målet var at lave et plugin med en masse forskellige features, samt at få svaret på mine spørgsmål i min problemformulering. 57 Jeg synes bestemt at det jeg har nået at lave er acceptabelt, når man tænker på at jeg har været på egen hånd i projektet. Selvfølgelig kan der stadig implementeres mange flere ting til det, men at jeg har noget der er klar til at folk kan hente det til deres WordPress side, er bestemt positivt. Jeg føler også, at jeg fik svar på de fleste spørgsmål i min problemformulering. Det eneste jeg måske ikke rigtig fik svar på i løbet af projektet er om det er muligt at tjene penge på det, men det er nok noget der skal komme an på en prøve. Lige nu tror jeg ikke på at det er godt nok til at der kan tjenes penge på det, men hvis der i fremtiden lægges meget arbejde i det, så kan det måske komme på tale til den tid. Til dels fik jeg heller ikke svar på hvordan man sætter nyhedsbrevtilmelding op, da jeg opgav det, men jeg synes dog at jeg fik fornemmelsen af hvordan det fungerede, så hvis jeg fik muligheden for at bruge en live side, kunne jeg måske få det til at virke. At jeg fik svar på mit hovedspørgsmål var dog det vigtigste, og jeg er meget tilfreds med, at det er lykkedes at implementere et quiz plugin i WordPress, og dermed få svar på det overordnede spørgsmål. Måden jeg arbejdede på fungerede også fint, selvom det til tider var hårdt at være alene, men jeg synes dog også det har gjort mig gavn at prøve og være på egen hånd, og jeg kan tage en masse positive ting med fra det. 6.1 VIDEREUDVIKLING Hvis der skal videreudvikles på projektet er der en del ting som kan overvejes. Jeg fik ikke lavet muligheden for at tilmelde sig nyhedsbreve, så den feature ville være noget jeg ville forsøge at få implementeret. En anden ting der også er blevet snakket meget om, sammen med Cleverweb, er at gøre sådan man kan belønne folk med badges efter de har taget ens quiz. Badges ses mere og mere rundt omkring på forskellige sider. Det synes at have en positiv effekt på folks motivation for at gennemføre ting, og derfor ville det måske også motivere dem til at tage quizzer og opnå flotte 58 resultater. Det kunne måske især være nyttigt i de quizzer der er baseret på almen viden, da det måske kunne vise hvor klog man er. Nu hvor jeg også allerede har gjort sådan man kan integrere med Facebook, kan det også blive relevant at integrere med andre sociale medier, såsom Twitter og Google+. Jo flere sociale medier pluginnet kan integrere med jo mere reklameværdi ville det også give Cleverweb, og hvis målet om at tjene penge på pluginnet skal have gode chancer for at blive opnået, er det ikke en dårlig idé at give folk mulighed for at dele det rundt omkring. Det kan også godt betale sig at få det oversat til flere forskellige sprog, men her skal man dog have fat i folk der taler sprogene flydende, som så kan hjælpe en med at oversætte det. Da WordPress bruges af folk fra over hele verden, skulle der være gode muligheder for at finde folk der kan hjælpe med at oversætte til mange forskellige sprog. En anden ting jeg også overvejede at lave i projektet, men som jeg desværre måtte skære fra, fordi tiden løb fra mig var muligheden for at bestemme hvor mange rigtige svar hvert spørgsmål skulle have. Der kunne måske være tilfælde, hvor det ville være relevant med mere end et korrekt svar. F.eks. til spørgsmål som ”Nævn navnene på Anders Ands tre nevøer”. I det tilfælde ville der være behov for tre rigtige svar. En anden grund til at det kan overvejes er også hvis man måske skal lave en undersøgelse, fremfor en decideret quiz. Dvs. man måske slet ikke ønsker nogen svar skal være rigtige eller forkerte, da svarene jo så ville være baseret på folks meninger og holdninger. Cleverweb ønskede som nævnt i afsnit 2.1 også at pluginnet skulle fungere på mobil. Men det ville kræve jeg bliver bedre til at bruge CSS, da det ikke er mit stærkeste område endnu. Men det ville dog uden tvivl give flere brugere, hvis det lykkedes, da mange folk bruger mobiler i dag til at gå på nettet med. 7 REFERENCER 1 Boehm-Agility-Disciplined – Homegrounds (PDF) 2 XP planlægnings og programerings praktikker (PP), 4. semester 59 3 Intro-SCRUM (pp), 4. semester 4 https://en.wikipedia.org/wiki/Content_management_system 5 http://www.forbes.com/sites/jjcolao/2012/09/05/the-internets-mother-tongue/ 6 http://codex.wordpress.org/Installing_WordPress 7 http://codex.wordpress.org/Themes 8 http://codex.wordpress.org/Plugins 9 http://codex.wordpress.org/Roles_and_Capabilities 10 http://codex.wordpress.org/Database_Description 11 https://en.wikipedia.org/wiki/PHP 12 https://en.wikipedia.org/wiki/JavaScript 13 https://en.wikipedia.org/wiki/JQuery 14 http://www.jscripters.com/jquery-disadvantages-and-advantages/ 15 https://en.wikipedia.org/wiki/Ajax_(programming) 16 https://gds.blog.gov.uk/2013/10/21/how-many-people-are-missing-out-on-javascript-enhancement/ 17 http://www.w3schools.com/js/js_cookies.asp 18 http://www.w3schools.com/html/html5_webstorage.asp 19 http://www.sublimetext.com/2 20 https://subversion.apache.org/ 21 https://www.dropbox.com/home 22 https://www.apachefriends.org/index.html 23 https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller 24 https://tommcfarlin.com/wordpress-and-mvc/ 25 http://codex.wordpress.org/Plugin_API 60 26 http://codex.wordpress.org/Plugin_API/Action_Reference 27 http://codex.wordpress.org/Plugin_API/Filter_Reference 28 https://en.wikipedia.org/wiki/Event-driven_architecture 29 https://make.wordpress.org/core/handbook/coding-standards/ 30 http://stackoverflow.com/questions/3785029/jquery-countdown-timer 31 http://www.w3schools.com/jsref/met_win_clearinterval.asp 32 http://poedit.net/ 8 BILAG Alle bilag er vedhæftet som ekstra materiale på Wise Flow. Følgende er vedhæftet: - quiz-plugin.zip (indeholder alt koden) Product backlog.xlsx Brugertest.docx Sprint 1 backlog.xlsx Sprint 2 backlog.xlsx Sprint 3 backlog.xlsx Sprint 4 backlog.xlsx Burndown – Sprint 1.xlsx Burndown – Sprint 2.xlsx Burndown – Sprint 3.xlsx Burndown – Sprint 4.xlsx 61
© Copyright 2024