Aftonbladet & Schibsted på väg

Omvärldsbevakning och direktrapportering från fältet

Inlägg av Erik Fried

Systemutvecklare

Få ut mesta möjliga av dina BDD-artefakter

av Erik Fried

(Behaviour Driven Development är förlänging av Test Driven Development. Det viktigaste man mest justerat är att språket är rätt. Dels ska testerna formuleras på ett naturligt språk som är begripligt för alla stakeholders, även icke-programmerare. Dessutom försöker man inom BDD undvika att prata om testerna som ”tester” eftersom det inte är testerna i sig dom är det viktiga, utan beteende, hur systemet beter sig. Alltså behaviour driven i stället för test driven.)

David Evans pratade under en av de sista presentationerna om hur man får ut så mycket som möjligt av sina BDD artefakter.
Artefakter är helt enkelt de ”tester” man har som skapat. Anledningen till att han krånglar till det och inte kallar dem för tester är att de är mer än bara tester:

  • Innan utvecklingen börjar har artefakten ett värde som specifikation,
  • under utvecklingen fungerar den som test och
  • efter att en feature är färdigutvecklad fungerar artefakten som dokumentation
Att alla dessa värden av ett ”test” finns var inget nytt för mig, men jag hade faktiskt inte riktigt tänkt på den temporala aspekten tidigare, att funktionen varierar över tiden.
Presentationen innehöll en hel del matnyttiga tips på hur man gör sina artefakter så bra som möjligt, så att de faktiskt funkar i alla tre rollerna. (Detta inlägg kommer halta en del eftersom jag inte kommer åt exemplen som han visade, men…) Även vanliga misstag, anti-patterns, illustrerades.
Det finns tre krafter som påverkar hur detaljerat de ska skrivas
  • tydliga och kortfattade (för att vara bra spec)
  • kompletta (för att vara bra test)
  • Självförklarande (for att vara bra dokumentation)
Och tre krafter som påverkar vilket omfång de ska ha:
  • Specifika – De ska vara tydliga med just vad som är annorlunda
  • Integrerade – Invävda i sitt sammanhang
  • Underhållbara – Ska inte behöva ändras för ofta
Features
Anatomin för BDD-artefakter ser typiskt ut som att man först på en ganska hög nivå beskriver en feature. Detta är ganska exakt en user story, och brukar ofta skrivas på formen:
Som en <stakeholder>
vill jag <funktion>
för att <affärsnytta>
En bättre form (som jag tror att vi brukar använda på aftonbladet) är:
För att uppnå <affärsnytta>
som <stakeholder>
vill jag <funktion>
Dett är bättre dels för att det sätter det viktigast först: nyttan med funktionen. Det är även bra för man fokuserar på problemet innan man börjar diskutera lösningen. (Och här kommer det alltså igen, samma sak som jag tidigare hört både när man pratat UX och API-design tidigare på konferensen: Förstå problemet först, innan man diskuterar hur det ska lösas!)
Tips här:
  • Slarva inte med de beskrivande delarna av artefakterna – man gör bdd för människor, inte för maskiner
  • ”För att” steget ska typiskt innehålla att man ökar det relativa värdet av något (eller minskar om det är något som är dåligt). T ex kan syftet vara att minska antalet användare som avslutar en tjänst. Då kan det vara lättare att se alternativa lösning som verkar för samma mål, men som man inte tänkt på först. Den tänkta lösningen kanske vore bäst, men orimlig pga av tidsbrist el ekonomi, men den alternativa kan vara bättre än ingenting.
  • Håll isär vad, varför och hur. Hur ska typiskt inte ens synas i detta ”lager” av testerna, utan delegerar ner till ett mer tekniskt automatiseringslager.
Några ”smells” som brukar dyka upp i feature beskrivningar är att
  • ”systemet” dyker upp som stakeholder.
  • produktägaren dyker upp som stakeholder. inte lika illa kanske, men normal är det ju en användare som ska dra nytta av en funktion
  • Beskrivningen innehåller en halvfärdig lösning
  • Beskrivningen är för specifik
Scenarios
Varje feature beskrivs mer i detalj med hjälp av scenarier. Dessa brukar skrivas på formen:
Givet <tillstånd innan>
När <något som sker>
Så ska <resultat>
Tipstet här är att börja med ”happy-path”. Testare kan med sin speciella testar-gen snabbt komma på massvis med specialfall och krångliga situationer som bör testas. Börja inte med dessa, eftersom det snabbt blir väldigt mycket brus av detta.
Hur ser då en bra scenariobeskrivning ut?

Fokuserad: Vad är annorlunda? Vad är skillanden mot andra scenarier? Fokuserar det på precis den skillnad som ska lyftas? Skriv ”then”-delen (”Så ska”) först – resultattet viktigast  Ha ett nyckelord i testnamnet

Balanserad: Akta sig för fomuleringar som ”Så ska alla utskrifter bli korrekta”. Se upp för givna som inte påverkar resultatet (så att). Scenariet ska vara som ett timglas -”när” är midjan, enbart ett ”när” statemnet.  Behåll en och samma abstraktionsnivå i alla delar av testet.

Avgränsad: Om scenarier säger ”över 50” så är värdet 100 dåligt som test, använd 51. Tänk exempel och motexempel.

Kategorier Öredev2011

av Erik Fried

En inspirerande keynote av Jeff Atwood, en av grundarna till den fantastiska StackOverflow.com, fick mig att tänka kring gamification. Stackoverflow använder gamification i stor utsträckning. Tanken är att användandet av siten är som att spela ett slags spel och spelar man spelet bra får man utmärkelser. I fallet SO är det helt enkelt så att om man på olika sätt bidrar positivt  (svarar på frågor, uppmärksammar moderatorer på opassande kommentarer etc., så får man utmärkelser, ”badges”, som återspeglar karaktären av ens beteende. T ex kan någon som är väldigt bra på att hålla efter opassande kommentarer få en badge ”ranger”.

Det tjusiga med detta är att det blir roligare för användare att använda tjänsten, användare blir mer motiverade att använda tjänsten på ett ”positivt” sätt och användare blir mer lojala till tjänsten. Om man framgångsrikt har byggt upp en status, har fått åtråvärda badges, så uppstår ett motstånd till att sluta använda tjänsten.

I mina ögon är detta en klassisk win-win. Bra både för den som använder och den som driver tjänsten. Vi driver tjänster där vissa är klockkerna att införa gamification på. Let´s do it.

Kategorier Öredev2011
Taggar gamification

Om UX. Och API-design. Som också är UX

av Erik Fried

Det grymma med att vara på en bred utvecklarkonferens som Øredev är ju att det är lätt att gå lite utanför den vanliga fåran, där man brukar vara.

Jag har gått på några UX presentationer idag som varit rätt bra. Om man ska vara riktigt generös med tolkningen av användare så var jag på en igår också på temat ”API the hidden UI”. Tanken är att den som kommer använda ditt API också är någon form av användare, en stor skillnad är dock att ett GUI kan ändras efter att det börjat användas, ett API kan däremot inte ändras utan att saker verkligen går sönder för användare. I princip kan man säga (ok, lite hårddraget) att man bara har en chans att göra API:t rätt. När det publicerats är det användarna som äger det. Inte själva implementationen, men du kan inte ändra hur som helst längre.

Flera av lärdomarna där har jag hört upprepas idag på mer traditionella UX presentationer t ex:

  • När man får förfrågningar om nya funktioner får man det oftast i form av ett halvfärdigt lösningsförslag. Försök att fokusera på det underliggande problemet istället. En princip som kan användas är att det inte ska bli bättre bara för en användare utan för många. Beställaren ska kunna motivera varför, för vilka den löser vilket problem.
  • Använd konventioner som är utbredda. Analogt med att användare spenderar mest tid på andra webbplatser än din egen, så spenderar API-användare mest tid med andra API:er än ditt. Ett exempel är att en relation mellan brukar benämnas parent-child. Om man i sitt API kallar det för father kommer det bli förvirrande.

Jeff Patton presenterade två klassiska ”failure modes” när man utvecklar och jobbar (mindre bra) med UX:

  1. Man antar att ”om jag gillar det så kommer användarna också göra det”
  2. Man frågar användare direkt vad de vill ha och ger användare skulden om det inte blir bra.

”Don’t capture requirements – build empathy”

När man får in krav: fråga vem det hjälper och vilka problem det löser? Nå roten till problemet.  User stores hjälper till att fokusera rätt

UX har lager:

  • Aesthetics
  • Usability
  • Utility

Bygg underifrån (Utility -> Usability). Produkter utan utility dör. Man måste adressera ett verkligt behov.

Jeff menar att det finns fyra vikiga faser under designen, som det krävs disciplin för att inte hoppa över:

  1. Förstå problemet. Kräver empati och genuin förståelse för användares situattion kräver oftast ”skuggning”, att man iakttar användare i deras verkliga miljö
  2. Identifiera lösningar. Tänk brett och brainstorma.
  3. Förfina och validera lösningen iterativt.
  4. Slutligen: Skapa plan för implementationen.
Kategorier Öredev2011
Taggar API, UX

Time to REST!

av Erik Fried

Under onsdagen var jag på ett par bra dragningar om REST (REpresentational State Transfer) som är det sätt som ”alla” bygger sina API:er på idag. Eller åtminstone påstår att man bygger sina API:er på. Nåväl jag ska inte orera om missuppfattningar om REST.

Vad jag dock kan konstatera är att ett centralt begrepp, som jag knappast sett ”in the wild” är HATEOAS (Hypermedia As The Engine Of Application State). Jim Webber förklarar dock föredömligt pedagogiskt vad det handlar om. Utgående från det självklara i hur vi som människor genom vår browser navigerar genom ett checkout-flöde på typ amazon. När vi börjar vår utcheckning gör vi det genom att följa en hyperlänk. Vi vet i det läget inte vart vi senare kommer navigera, men vi får hjälp från applikationen genom att vi förses med länkar genom t ex anchor-taggar eller form targets som för oss människor (förhoppningsvis) har en uppenbar semantik. Typ vi ser våra varor och när vi klickar på knappen ”betala” förväntar vi oss att komma till en sida där vi… betalar. Inget konstigt – HATEOAS. Samma tankesätt kan generaliseras till att även omfatta maskin-till-maskin kommunikation, där dock länkarnas semantiska innebörd måste formaliseras.

En annan sak som Jim Webber uppenbarligen brinner för är att omfamna HTTP som det applikationsprotokoll det faktiskt är. Mer specifikt ett applikationsprotokoll inom domänen att skyffla runt dokument på internet.

Det vi gör när vi då navigerar mellan dessa resurser som pekas ut av länkar är att vi skickar och tar emot dokument. Allt som verkligen händer med våra domänobjekt är sidoeffekter av att dokumenten skyfflas runt. Det behöver INTE råda en ett-till-ett relation mellan resurser och domänobjekt!

Ian Robinson pratar senare om Test-Driven Rest. Inte helt förvånande använder han i mycket samma analogier som Jim Webber (de har skrivit boken Rest in Practice tillsammans).

Ian har dock en kort lista på saker som kan vara bra att testa isolerat när man testar sitt REST API:

  • Att HTTP interaktionen går som den ska. Att man får rätt responskoder och headers etc.
  • Att interaktionen med underliggande domänrepresentationer sker som den ska.
  • Att rätt responser ges på rätt format.
  • Och att hypermedia dyker upp som det ska, ledtrådar till vad som kan göras härnäst.
En sak att se upp med är att man lätt kan hamna i att man har en mass URI:er eller fragment av URI:er spridda på massa ställen i sin kod -> Svårt att genomföra ändringar av URI mönster.
Kategorier Öredev2011
Sida 1 av 1

Information

Denna blogg är inte längre aktiv. För en lista på aktiva bloggar, gå till bloggar.aftonbladet.se.

Sök

Arkiv

Kategorier

  • Tjänstgörande redaktörer: Love Isakson Svensén, Alex Rodriguez och Fred Balke
  • Chefredaktör, vd och ansvarig utgivare: Lotta Folcker
  • Stf ansvarig utgivare: Martin Schori
  • Redaktionschef: Karin Schmidt
  • Besöksadress: Västra Järnvägsgatan 21, Stockholm
  • Org.nr: 556100-1123
  • Momsregistreringsnr: SE 556100-112301
  • Kontakt: förnamn.efternamn@aftonbladet.se
  • Aftonbladet Plus Kundcenter: tipsa@aftonbladet.se
  • Telefon växel: 08 725 20 00
  • FÖLJ OSS

© Aftonbladet Hierta AB