Effektivt prosjektarbeid

Gjesteforelesning INF219

Patrick Monslaup

Fagleder og systemutvikler

 

patrick.monslaup@knowit.no

Hvilken problemer hindrer oftest godt samarbeid i større prosjekt?

Agenda

  • Teknisk gjeld
  • Versjonskontroll i git
  • Parprogrammering
  • Agile teknikker / scrum
  • Hva kjennetegner gode team?

Spørsmål?

Unmute & spørr eller skriv i chat

Teknisk gjeld

Technical debt is a concept in software development that reflect the implied cost of additional rework caused by choosing an easy solution now instead of using a better approach that would take longer.

- wikipedia

Debt is paid back with interest

When you take a shortcut or make a mistake
you use your credit card

You're constantly paying interest on your technical debt, and the debt creates more debt

Teknisk gjeld fører fort til en veldig kjip hverdag

Bruk tid på å..

  • Gjøre koden oversiktlig
  • Lage gode variabel/funksjonsnavn
  • Skrive gode kommentarer
  • Bryte opp koden til små isolerte moduler med 1 ansvarsområde

Teknisk gjeld eksempel

import requests
from urllib import urlencode

def find_definition(word):
    q = 'define ' + word
    url = 'http://api.duckduckgo.com/?'
    url += urlencode({'q': q, 'format': 'json'})
    response = requests.get(url)     # I/O
    data = response.json()           # I/O
    definition = data[u'Definition']
    if definition == u'':
        raise ValueError('that is not a word')
    return definition

Funksjon som gjør for mye, så den er vanskelig å lese eller teste

def find_definition(word):
    q = 'define ' + word
    url = 'http://api.duckduckgo.com/?'
    url += urlencode({'q': q, 'format': 'json'})
    data = call_json_api(url)
    definition = data[u'Definition']
    if definition == u'':
        raise ValueError('that is not a word')
    return definition

def call_json_api(url):
    response = requests.get(url)     # I/O
    data = response.json()           # I/O
    return data

Nettverkskall i egen funksjon

Litt bedre, men du kan ikke enkelt teste find_definition enkelt siden den alltid vil gjøre prossesering av url, nettverkskall, og databehandling.

def find_definition(word):
    url = build_url(word)
    data = requests.get(url).json()  # I/O
    return pluck_definition(data)

def build_url(word):
    q = 'define ' + word
    url = 'http://api.duckduckgo.com/?'
    url += urlencode({'q': q, 'format': 'json'})
    return url

def pluck_definition(data):
    definition = data[u'Definition']
    if definition == u'':
        raise ValueError('that is not a word')
    return definition

Databehandling i pure functions

En pure function gir alltid samme resultat gitt samme parameter.

Det er mye lettere å lese koden nå, og vi kan teste pluck_definition og build_url!

Versjonskontroll

Demo

github.com/pmo022/PR-demo

Bruk code reviews

  • Oppdage feil tidlig
  • Få felles forståelse av koden
  • Lære av hverandre

 

Dere kan ha ekstra regler for code review som at tester må skrives eller at diagrammer må lages (dersom det er aktuelt for prosjektet)

Parprogrammering

Hva?

En person sier hva som skal skrives, den andre skriver.

Bytt jevnlig på rollen.

Styrker

Oppdager feil tidlig, lærer av hverandre og øker kodekvalitet.

Dere blir også bedre på kommunikasjon

Svakheter

Må jobbe samtidig

Det kan være vanskelig å kommunisere

Verktøy for digital parprogrammering

Videochat/skjermdeling som f.eks. zoom

 

Programmer for å kode sammen som vscode live share 

https://code.visualstudio.com/blogs/2017/11/15/live-share.

 

Se flere på https://www.makeitinua.com/posts/13-best-tools-for-remote-pair-programming-in-2020

Scrum(ish)

...og andre agile rammeverk

Scrum er omfattende

Det er mange møter og mye prosess. For små team er dette ofte mer arbeid enn det er verdt

Hva

Metodologi for å gjøre utviklingsprosjekter på en fornuftig måte.

Utvikling er vanskelig, så du prøver å gjøre det i små bolker sprints som du justerer underveis ved refinements.

 

Teamet har daily standups for å koordinere, og gjennomgår sprinten som helhet i sprint review.

 

For å justere måten de jobber på har teamet et retrospective hvor de diskuterer ha som er bra, dårlig osv.

.. veldig mange møter

Hva er viktigst?

Scrum møter

  • Planning
  • Daily standup
  • Refinement
  • Review 
  • Retrospective

Refinement

"Hva må vi gjøre for å komme i mål?"

Opprett spesifikke saker i trello/jira basert på hva dere skal lage. Disse bør være så små som mulig slik at det er lett å kome i gang.

Bør alltid gjøres før sprint planning, og ellers med jevne mellomrom etter hvert som dere forstår mer om prosjektet dere holder på med.

Sprint planning

"Hva skal vi jobbe med de neste x ukene?"

Hvis dere ikke har oversikt over saker som må gjøres bør dere først gjennomføre et refinement.

  1. Lag sprintmål
  2. Estimer saker
  3. Estimer tid dere har til å jobbe
  4. Legg saker relatert til sprintmålene inn i sprinten

 

Forutsetter at dere klarer å estimere.
Jeg anbefaler å ignorere steg 2 & 3, ting tar tiden det tar.
Lag fokuserte mål og jobb sammen om de målene

Daily standup

"Hvem gjør hva, og er noen hindret?"

Raskt møte, ikke mer enn 5-10 minutter. Svar på..

  1. Hva du har gjort*
  2. Hva skal du gjøre?
  3. Har du noen hindringer?

 

*Hva du har gjort er irrelevant med mindre det fjerner hindringer for andre - dropp det.

Om noe alltid har tenkt å jobbe med det samme er det ofte et tegn på at saken er for stor, prøv å hjelp.

Review

Presenter arbeidet til "kunden", og få feedback.

Om dere ikke har en gruppeleder som ser over prosjektet er ikke dette relevant. Viktig slik at dere får bekreftet at det dere lager er det kunden ønsket.

Retrospective

Teamet spør seg selv og deler..

  • Hva er bra?
  • Hva er dårlig?
  • Noe vi bør starte med?
  • Noe vi bør stoppe med?

 

Målet er at teamet som helhet skal jobbe bedre sammen. Det er lov å kritisere men vær grei

 

Demotid

Retrospective

Retrospective

Teknikker for effektivt prosjektarbeid

Øk forståelse og læring ved å parprogrammere eller gjennomføre code reviews (hvis dere kan git godt nok).

 

Planlegg og koordiner bedre ved å holde refinement, planning, eller daily.

 

Juster hvordan dere jobber med retrospective.

Hva sier forskning om de beste teamene?

Det er faktisk ikke teamene med flest flinke folk.

Team med høy grad av psykologisk trygget, bred kompetanse og godt nettverk gjør det best!

The best way to boost performance is to create an environment where everyone can contribute and reach their potential

Suksess-formelen

Teamene som presterer best er autonome team
med høy psykologisk trygghet.

Teambuilding og teknikker som retrospective er gode utgangspunkt for å bygge gode team som trives og presterer bedre.

  • La alle i teamet komme med bidrag.
  • Be om og gi ærlige tilbakemeldinger.
  • Aksepter at du og andre gjør feil, og lær av det. 

Spørsmål?

Unmute & spørr eller skriv i chat

Efficient teamwork

By Patrick Lid Monslaup

Efficient teamwork

Gjesteforelesning i INF219 om teknikker for effektiv utvikling i team

  • 387