% Ohjelmistotuotanto % Matti Luukkainen ja ohjaajat Antti, Pooki, Riku, Sini, Taneli % syksy 2024
Luento 4
8.11.2024
- Kurssipalaute
- Kurssilla lopussa kerättävän palautteen lisäksi ns. jatkuva palaute https://norppa.helsinki.fi
-
Luennot
- huomenna klo 12-14 B123
- ensi viikosta alkaen ma ja ti 12-14 B123
-
Pajaa salissa BK107
- ma 14-16
- to 13-15
- pe 12-14 (huomenna poikkeuksellisesti klo 14-16)
-
Käynnistyvät 11.11 alkavalla viikolla
-
Ilmoittautumisen deadline su 10.11. klo 23.59
-
Aloitustilaisuudet
- ti 14-16
- ke 14-16
- ke 16-18
- to 10-12
- to 14-16
-
Seuraavat viikot: sprinttien katselmus ja suunnittelu samassa aikaikkunassa
-
Loppudemot
- ke 11.12. klo 12-14 B123
- to 12.12. klo 12-14 CK112
-
User story
- description
- conversations
- acceptance criteria
. . .
-
Hyvä user story: INVEST
. . .
-
Estimointi
- Miksi? Kuka? Miten?
. . .
- Product Backlog
- Kuka vastuussa?
- Miten saadaan projektin alussa muodostettua?
- Mike Cohn lanseerasi lyhenteen DEEP kuvaamaan hyvän backlogin ominaisuuksia
- Detailed appropriatly
- Estimated
- Emergent
- Prioritized
- Estimated, Prioritized
. . .
- Detailed appropriately eli sopivan detaljoitu
- ylempänä tarkkoja
- alempana suurpiirteisempiä
- Emergent kuvaa backlogin muuttuvaa luonnetta:
- uusia storyja tulee
- vanhoja poistetaan, uudelleenpriorisoidaan ja uudelleenestimoidaan, muokataan ja pilkotaan
. . .
- Muuttuvan luonteen takia backlogia tulee hoitaa projektin edetessä (engl. backlog refinement/grooming)
- Pääasiallinen vastuu on product ownerilla
- Backlogin hoitamiseen osallistuu koko kehitystiimi
- Scrum suosittelee että noin 10% sprintin työajasta käytetään backlog refinementiin
- Hyvä story on siis INVEST (independent, negotiable, valuable, estimable, small, testable)
- DEEP taas taas sanoo, että backlogin pitää olla sopivan detaljoitu
. . .
- INVEST päteekin vain backlogin korkeamman prioriteetin storyihin
- Joskus sanotaan että story on ready, kun se on valmiina toteutettavaksi (hyvin tunnettu ja INVEST)
. . .
- Alemman prioriteetin storyt voivat olla epiikkejä (epic)
- scope ei tiedossa, ei mielekästä estimoida
- Estimoinnin yksi tarkoitus on mahdollistaa koko projektin viemän aikamäärän summittainen arviointi
. . .
- Estimoinnin yksikkönä on abstrakti käsite story point, miten sen avulla voidaan arvioida projektin kestoa?
. . .
-
Kehitystiimin velositeetti (engl velocity) tarjoaa osittaisen ratkaisun tähän
-
Velositeetilla tarkoitetaan tiimin keskimäärin yhdessä sprintissä toteuttamien story pointtien määrää
. . .
- Jos velositeetti selvillä ja toteutettavaksi tarkoitetut storyt estimoitu, projektin keston arvio on helppo laskea
(storyjen estimaattien summa) / velositeetti * sprintin pituus
- Projektin alkaessa velositeetti ei ole selvillä, ellei kyseessä ole jo yhdessä työskennellyt tiimi
. . .
- Velositeetti vaihtelee alussa melko paljon
- Estimointi aluksi vaikeampaa varsinkin jos sovellusalue ja käytetyt teknologiat eivät ole täysin tuttuja
. . .
- Velositeetti ja siihen perustuva projektin keston arvio alkaakin tarkentumaan pikkuhiljaa
- Ketterissä menetelmissä on oleellista kuvata mahdollisimman realistisesti projektin etenemistä
. . .
- Velositeettiin lasketaan mukaan ainoastaan definition of donen mukaisesti toteutetut storyt
- "lähes valmiiksi" tehtyä työtä ei katsota ollenkaan tehdyksi
- Projektin etenemistä kuvataan joskus release burndown -kaavion avulla
. . .
- Projektin etenemistä kuvataan yleensä release burndown -kaavion avulla
- Projektin etenemistä kuvataan yleensä release burndown -kaavion avulla
- Projektin etenemistä kuvataan yleensä release burndown -kaavion avulla
- Projektin etenemistä kuvataan yleensä release burndown -kaavion avulla
- Projektin etenemistä kuvataan yleensä release burndown -kaavion avulla
- Projektin etenemistä kuvataan yleensä release burndown -kaavion avulla
- Storyjen viemän työmäärän arvioimiseen kaksi motivaatiota
- auttaa asiakasta priorisoinnissa
- mahdollistaa koko projektin tai kokonaisuuden viemän ajan ja kustannuksen arvioinnin
. . .
- Story point -pohjainen suhteellinen estimointi on saavuttanut vankan aseman
- Scrum guide mainitsee että backlogin vaatimukset estimoituja
- Samoin kuten monet parhaat käytänteet kuten DEEP
. . .
- #NoEstimates-liike ruvennut kyseenalaistamaan story point -perustaista estimointitapaa
- pitää siitä saavutettuja hyötyjä liian vähäisinä verrattuna käytettyyn aikaan ja vaivaan
. . .
- Yksinkertainen vaihtoehto: arvioidaan velositeetti laskemalla kussakin sprintissä valmistuneiden storyjen lukumäärä
. . .
- Toimii jos storyt riittävän tasakokoisia?
- Kertauksena alkuviikolta: Scrum määrittelee pidettäväksi ennen jokaista sprinttiä suunnittelupalaverin
. . .
- Palaverin ensimmäinen tavoite on selvittää mitä sprintin aikana tehdään
- Lähtökohtana DEEP product backlog
. . .
- Product owner esittelee backlogin kärjessä olevat vaatimukset
- Tiimin on tarkoitus olla riittävällä tasolla selvillä mitä vaatimuksilla tarkoitetaan
. . .
- Tiimi valitsee niin monta storyä kuin se arvioi kykenevänsä sprintin aikana toteuttamaan definition of donen laadulla
- Suunnittelun yhteydessä määritellään sprintin tavoite (goal)
- Lyhyt, yhden tai kahden lauseen kuvausta siitä, mitä tiimi on aikeissa sprintin aikana tehdä
. . .
- K. Schwaber, ensimmäisen sprintin tavoite: demonstrate a key piece of user functionality on the selected technology
. . .
- Verkkokaupan sprinttien tavoitteita voisivat olla:
- Ostoskorin perustoiminnallisuus: tuotteiden lisäys ja poisto
- Ostosten maksaminen ja toimitustavan valinta
. . .
- Lyhyt kuvaus parempi niille sidosryhmäläisille, joita ei kiinnosta seurata tapahtumia yksittäisten storyjen tarkkuudella
- Sprintin tavoitteen asettamisen lisäksi tulee valita backlogista sprintin aikana toteutettavat storyt
- Kehitystiimi päättää kuinka monta storya sprinttiin otetaan
. . .
- Jos velositeetti on selvillä, on valinta periaatteessa helppo
- Jos velositettia ei tiedossa, käytetään harkintaa
- Product owner voi vaikuttaa sprinttiin mukaan otettaviin storyihin tekemällä uudelleenpriorisointia
- Entä jos myös D halutaan sprinttiin?
- Uudelleenpriorisoidaan
. . .
- Entä jos myös C halutaan mukaan?
- Pienennetään A:n kuvaamaa toiminnallisuutta
. . .
- Entä jos A ei saa pienentyä
- Jaetaan A kahteen osaan
- Tärkeämpi osa toiminnallisuutta eli A1 mahtuu mukaan sprinttiin, vähemmän tärkeät osat eli A2 jää myöhempiin sprintteihin
-
Haastava aihe, palataan siihen tänään jos aikaa jää
-
Kurssinmateriaalissa jonkin verran ohjeistusta asiaan
-
Pääperiaate: jakamisessa syntyvien storyjen edelleen noudatettava INVEST-kriteerejä
- Sprintin suunnittelun yhteydessä sprinttiin valituille user storyille tehdään karkean tason suunnittelu
. . .
- Mietitään mitä teknisen tason tehtäviä (task) on toteutettava, jotta user story saadaan valmiiksi
. . .
- Suunnitellaan komponentteja ja rajapintoja karkealla tasolla
. . .
- Huomioidaan uusien storyjen aiheuttamat muutokset olemassa olevaan osaan sovelluksesta
- Esimerkiksi tuotteen lisääminen ostoskoriin, voitaisiin jakaa seuraaviin teknisiin taskeihin:
- sessio, joka muistaa asiakkaan tila
- oliot ja tietorakenteet ostoskorin ja ostoksen esittämiseen
- laajennus tietokantaskeemaan
- html-näkymää päivitettävä tarvittavilla painikkeilla
- kontrolleri painikkeiden käsittelyyn
- yksikkötestit kontrollerille ja ostoskorin logiikalle
- hyväksymätestien automatisointi
. . .
- Kaikkia storyyn liittyviä taskeja ei sprintin suunnittelun aikana löydetä
- Uusia taskeja generoidaan tarvittaessa sprintin edetessä
- Sprint backlog koostuu sprintiin valituista storyista ja niihin liittyvistä tehtävistä eli taskeista
. . .
- Sprint backlog usein organisoitu taskboardiksi
- Taskit niiden valmistumisastetta kuvaavassa sarakkeessa
- Sprintissä arvioidaan päivittäin kunkin taskin jäljellä olevaksi arvioitua työmäärää
- Usein tapana tehdä arviot tunteina
. . .
- A Scrum book 2019 ei suosittele taskien tasolla tehtävää työmääräarviointia
- Kehottaa seuraamaan sprinttien aikana ainoastaan sitä kuinka monen story pointin verran storyja saatu valmiiksi
. . .
- On mahdollista, että tiimi saa sprintissä valmiiksi lähes kaikki taskit, saamatta valmiiksi yhtäkään storya
- Burn down voi näyttää pitkään melko hyvältä, mutta asiakkaan saama arvo on lopulta nolla
. . .
- Yksinkertainen tapa sprintin etenemisen seurantaan
- laske, tai katsoa taskboardilta, mikä on jo valmiiden ja vielä valmistumattomien sprinttiin kuuluvien taskien lukumäärä
- Yhtä aikaa työn alla olevien taskien suuri määrä voi koitua ongelmaksi
- Riski sille, että sprintin päätyttyä paljon osittain valmiita storyja kasvaa
. . .
- Ratkaisu: work in progress eli WIP -rajoitteet
- WIP-rajoitusten idea on peräisin Kanban-menetelmästä, joka on eräs keskeisimmistä Lean-ajattelun työkaluista
- Lean-ajattelu on peräisin jo kymmeniä vuosia vanhasta Toyota Production Systemistä
. . .
- Lean-ajattelun taustalla on idea hukan eli asiakkaalle arvoa tuottamattomien asioiden eliminoimisessa
. . .
- Toiminnallisuudet tuovat arvoa vasta käytössä, sitä ennen ne sitovat turhaan kustannuksia ja tuovat riskejä
. . .
- Hukkaa muun muassa: osittain tehty työ, välivarastointi ja turha odottaminen
- WIP-rajoitteita voidaan soveltaa Scrumin yhteydessä monella tavalla
. . .
- Aika tavallista on rajoittaa eri työvaiheessa, esim. toteutuksen olevien taskien määrää
. . .
- tai yksittäisellä sovelluskehittäjän kerrallaan työn alla olevien töiden määrää
. . .
- Järkevintä lienee rajoittaa sprintin aikana yhtäaikaa työn alla olevien storyjen määrää mahdollisimman pieneksi
. . .
- WIP-rajoitteita säädetään usein retrospektiivien yhteydessä jos kehitystyössä havaitaan ongelmia
-
Haastava aihe aloittelijalle ja joskus myös kokeneille ohjelmistokehittäjille
-
Pääperiaate: jakamisessa syntyvien storyjen edelleen noudatettava INVEST-kriteerejä
-
Richard Lawrencen ohjeita
As a user, I can search for flights with flexible dates.
. . .
kannattaa jakaa siten että jokainen näistä ehdoista eritellään omaksi storykseen
- ... as "between dates x and y"
- ... as "a weekend in December"
- ... as "± n days of dates x and y"
As a user, I can search for flights between two destinations
. . .
voidaan jakaa seuraavasti
- ... when only direct flights used
- ... specifying a max number of stops
- ... including nearby airports
- ... using flexible dates
As a user, I can pay for my flight with VISA, MasterCard, Diners Club, or American Expres.
. . .
voitaisiin jakaa kahtia, missä ensimmäisessä storyssa vasta hoidettaisiin yksi luottokorttityyppi, ja seuraava story yleistäisi toiminnan kaikkiin kortteihin:
- ... I can pay with VISA
- ... I can pay with all four credit card types (VISA, MC, DC, AMEX) (given one card type already implemented)
As a user, I can search for flights between two destinations
. . .
jakaantuukin helposti kahteen esim. seuraavasti
- ... using simple date input
- ... with a fancy calendar UI
As a user, I can search for flights between two destinations
. . .
jakaantuu kahtia seuraavasti:
- ... slow—just get it done, show a "searching" animation
- ... in under 5 seconds
As a user, I can manage my account
. . .
jakaantuu moneen osaan
- ... I can sign up for an account
- ... I can edit my account settings
- ... I can cancel my account
Jos tiimi ei ole toteuttanut koskaan luottokorttimaksuun liittyvää toiminnallisuutta, user storysta
As a user, I can pay by credit card
kannattaa eriyttää aikarajattu eksperimentti joka suoritetaan aiemmassa sprintissä.
Tämän jälkeen toivon mukaan varsinaisen toiminnallisuuden toteuttava story osataan estimoida paremmin:
- Investigate credit card processing
- Implement credit card processing