Systemutvecklingsmetodik
Innehållsförteckning
Kravanalys, -specifikation och -hantering
Kravanalys
Alla utvecklingsprocesser utgår från en analys och beskrivning av det system som skall utvecklas. En briställig kravanalys kan leda till dålig slutresultat. Inledande kraven formuleras ofta av personer som saknar tillräckligt tekniskt kunnande, och/eller en tillräckligt god uppfattning om vad som egentligen behövs. Kravbeskrivningar kan göras på olika nivåer, för olika målgrupper. De enskilda kraven kan vara av olika typ. Varje krav måste vara spårbar.
Identifikation av krav
Identifiera de olika intressenterna / stakeholders och identifiera krav sett från olika synvinklar / viewpoints. Intervjuer med kunden och övriga intressenter, fördefinierade frågor, improviserade diskussioner. Ethnography: Observation av användarna i deras dagliga arbete. Analys av olika scenarier för ett visst krav. Vad händer i normalfallet, vad händer när nogot går fel. Kan dokumenteras som text och/eller diagram.
Viewpoints
Olika intressenter har olika perspektiv på systemet. Interactor viewpoints: Direkta användare av systemet. Indirect viewpoints: Intressenter som inte använder systemet personligen men vars intressen påverkar systemets krav. Domain viewpoints: Karaktäristika och begränsningar som upptår som en följd av omgivningen systemet befinner sig i.
Krav ur kundperspektiv
Kunden har normala krav, förväntade krav och sensationella krav. Man utalar bara normala. Om det uppfylls normala krav är det bra och om man uppfyller sensationella krav är det väldigt bra. Om man inte uppgyller normala eller förväntade är det dåligt.
Kravhantering (requirements management)
För stora system förändras kraven ständigt. I praktiken omöjligt att specificera ett system hel och hållet. När slutanvändaren/beställaren får nya versioner av systemet kommer nya behov att upptäckas (Change requests).
Riktighetsanalys -> Om det är giltig problem -> Följdanalys -> Möjligt att göra? -> Implementera förändingen. Annars man gör inte en change request.
Olika typer av krav
Funktionella krav beskriver, vilka tjänster ett system skall tillhandahålla? Hur systemet skall fungera i olika situationer? Hur det skall reagera på olika indata? Vilken utdata som skall produceras?
Icke-funktionella krav är begränsningar, constraints, som måste tas i beaktande då systemet konstrueras. Berör ofta systemet i sin helhet. Icke-funktionella krav kan delas upp i olika kategorier: Produktkrav (Product requirements): pålitlighet, användarvänlighet, prestanda, resursbehov, flexibilitet. Organisationskrav (Organizational requirements): Typ av utvecklingsprocess, leveranskrav, standarder.
Exempel på funktionella krav
- Systemet skall kunna hantera 1000 användare samtidigt.
- Systemet skall kunna hantera 1000 transaktioner per sekund.
- Spelaren skall kunna styra sin karaktär med hjälp av tangentbordet.
Exempel på icke-funktionella krav
- Systemet skall vara lätt att använda.
- Systemet skall vara säkert.
- Systemet skall vara snabbt.
Exempel pålitlighet(reliability):
- Hårdvarans pålitlighet: Vad är sannolikeheten att en hårdvarukomponent får sönder?
- Mjukvarans pålitlighet: Var är sannolikheten att en mjukvarukompnent producerar ett felaktigt resultat?
- Anvädarens pålitlighet: Vad är sannolikheten för att användaren av systemet gör ett misstag?
Mätbarhet av icke-funktonella egenskaper
Icke-funktonella krav kan vara svåra att kontrollera och definera exakt. Pålitlighet (reliability), prestanda, användarsvänlighet kan mätas, åtminstone efter att systemet är färdigställt. Mean time between failures, Availability percentage, Frames per second, Enkäter för användare, tidsåtgång för utbilding. Begrepp om “safety” och “security” svårare att mäta, omöjligt att granska varje kryphål.
Diffust krav:
“The system should be easy to use by medical staff and should be organized in such a way that user errors are minimized”
Mätbar krav:
“Medical staff should be able to use all the system functions after four hours of training. After this training, the average number of errors made by experienced users shall not exceed two per hour of system use.”
Mätbarhet av icke-funktinella krav
- Speed: Processed transactions/second, User/event present time, Screen refresh time
- Size: Mbytes, Number of ROM chips, Number of disk platters
- Ease of use: Training time, Number of help frames
- Reliability: Mean time to failure, Probability of unavailability, Rate of failure occurence, Availability
- Robustness: Time to restart after failure, Percentage of events causing failure, Probility of data corruption on failure
- Portability: Percentage of target dependent statements, Number of target systems
FURPS+
En annan variant av kravkategorisering:
- Functionality: Vad skall systemet göra?
- Usability: Hur skall systemet användas?
- Reliability: Hur pålitligt skall systemet vara?
- Performance: Hur snabbt skall systemet vara?
- Supportability: Hur skall systemet underhållas?
-
- : Constraints on design, implementation, environment, etc.
Hög abstraktionsnivå: Användarkrav / user stories
Kortattade beskrivningar. Beskriver vad systemet skall göra, eller vem som skall använda systemet och hur (=user stories). Bör undvika att gå in på tekniska detaljer. Kan använda ett standardiserat format eller vara fritt formulerade. Kan ha en priotitering, t.ex. must-have, should-have, nice-to-have.
Låg abstraktionsnivå: Systemkrav / use cases
Mera detaljerade och exakta beskrivningar av systemets funktionalitet. Delar upp högnivåkrav i mindre delar. Kan beskriva på olika sätt. Fria formuleringar. Användning av dokumentmallar, templates. Använding av grafiska notationer. Användarfallsdiagram kan ses som innehållsförteckning över systemkrav.
Användadarkrav vs systemkrav
- Användarkrav: Vad skall systemet göra?
-
- Client managers
-
- System end-users
-
- Client engineers
-
- Contractor managers
-
- System architects
- Systemkrav: Hur skall systemet göra det?
-
- System end-users
-
- Client engineers
-
- System architects
-
- Software developers
Exempel på användarkrav
- Användaren skall kunna logga in i systemet.
-
- Priotitet: Must-have
-
- Motivering: Användaren skall kunna logga in i systemet för att kunna använda systemet.
-
- Beroenden: Användaren skall kunna skapa en ny användare.
- Användaren skall kunna skapa en ny användare.
-
- Priotitet: Must-have
-
- Motivering: Användaren skall kunna skapa en ny användare för att kunna logga in i systemet.
-
- Beroenden: Användaren skall kunna logga in i systemet.
- Användaren skall kunna skapa en ny resension.
-
- Priotitet: Should-have
-
- Motivering: Användaren skall kunna skapa en ny recension för att kunna recensera en artikel.
-
- Beroenden: Användaren skall kunna logga in i systemet.
Exempel på systemkrav
- Systemet skall ha en inloggningssida.
-
- Sammanfattning: Systemet skall ha en sida för att logga in.
-
- Precondition: Användaren skall ha en användare.
-
- Beskrivning: Användaren skall kunna logga in i systemet.
-
- Undantagssituationer: Användaren skall inte kunna logga in om användaren inte finns.
-
- Postcondition: Användaren skall vara inloggad.
-
- Ytterligare information: Användaren skall kunna logga in med användarnamn och lösenord.
- Systemet skall ha en sida för att skapa en ny användare.
-
- Sammanfattning: Systemet skall ha en sida för att skapa en ny användare.
-
- Precondition: Användaren skall inte ha en användare.
-
- Beskrivning: Användaren skall kunna skapa en ny användare.
-
- Undantagssituationer: Användaren skall inte kunna skapa en ny användare om användaren redan finns.
-
- Postcondition: Användaren skall ha en användare.
-
- Ytterligare information: Användaren skall kunna skapa en ny användare med användarnamn och lösenord.
- Systemet skall ha en sida för att skapa en ny recension.
-
- Sammanfattning: Systemet skall ha en sida för att skapa en ny recension.
-
- Precondition: Användaren skall vara inloggad.
-
- Beskrivning: Användaren skall kunna skapa en ny recension.
-
- Undantagssituationer: Användaren skall inte kunna skapa en ny recension om användaren inte är inloggad.
-
- Postcondition: Användaren skall ha skapat en ny recension.
-
- Ytterligare information: Användaren skall kunna skapa en ny recension med en rubrik och en text.
Objektorientering
Klasser och objekt
I en procedurell design är byggstenarna funktioner och variabler ab olika datatyper. I en objektorienterad design är byggstenar klasser och objekt. En klass är en datatyp som kan innehålla både data och funktioner. Ett objekt är en variabel vars datatyp är en klass. Ett objekt är en instans av en klass. Objekt är föremål som har vissa egenskaper (properties) och beteende (behaviour).
Klasser
En klass är en mall (template) för objekt av en viss typ. Alla instanser av samma klass har samma beteenden. Alla instanser av samma klass har samma egenskaper, men objekten kan ha olika värden på dessa egenskaper.
Objekts tillstånd
Egenskapernas värden bestämmer objektets tillstånd: en radio kan vara påslagen/avstängd, vara inställd på en viss kanal, ha en viss volyminställning. Egenskaper kalls även attribut, medlemsvaraiabler eller fält. Ett beteende kan påverka egenskapernas värde och därigenom objektets tillstånd: En radio kan slås på/stängs av, kanalen kan ändras, volymen kan justeras. Beteende kalls också operationer, medlemsfunktioner eller metoder.
Varför klasser och objekt?
Data och den funktionalitet som behövs för att manipulera data kan samlas i en och samma klass (lägre “coupling”, högre “cohesion”). Datainkapsling - ett objekt kan “skydda” sina egenskaper och endast låta andra objekt läsa eller modifiera dem under ordnade formet. Arv och polymorfism ökar möjligheten att återanvända och skriv effektiv kod.
Från struct till klass
Hur sjiljer sig en struct (i C) från en klass (Javascript eller Java)? En struct innehåller endast data(=egenskaper), ingen funktionalitet(=beteenden). En klass ingåller både data och funktioner som utnyttjar datan.
// Java code for a Race class
class Race {
double distance; // Ignoring data encapsulation, ‘package private’ access
int duration;
// Constructor, creates a Race object
Race(double distance, int duration) {
// ‘this’ is a pointer/reference to the current object
this.duration = duration;
this.distance = distance;
}
double getSpeed() {
return this.distance/this.duration*3600;
}
};
// Create and use an object
Race marathonWR = new Race(42.195, 7269);
double speed = marathonWR.getSpeed();
Samverkande klasser och objekt
En klass kan ha objekt som attribut. En operation i en klass kan ta emot eller returnera objekt. Kan använda (bland annat) associationer för att visa beroenden mellan klasser i ett klassdiagram, och länkar för att visa motsvande beroenden mellan objekt.
Arbetssätt, utvecklingsprocesser och arbetsmetoder
Processer för mjukvaruutveckling
Software development process: En samling sammanlänkade aktiviteter var slutresultat är en mjukvaruprodukt. Kravanlys, design, implementation, validering ingår i alla processer men deras inbördes förhållanden varierar. En processmodell är en abstrakt representation av en process. En verklig process är en anpassning av en modell.
Iteration vid mjukvaruutveckling
I en iterativ process återkommer samma projektfas flera gånger. I en icke-iterativ process utförs varje projektfas (kravanalys, desing, implementation, testing osv) endas en gång I praktiken är alla processer iterativ. Fel uppdagas och måste korrigeras. Uppdragsgivaren vill göra ändringar i kravspecifikationerna. Men finns olika sätta att hantera iterationerna.
Vattenfallsmodellen
Specifikation, design, implementation och testing följer efter varandra i väl avgränsade projektfaser.
Dokumentationsorienterad: en fas avslutas i refel med att ett eller flera dokument godkänns. I teorin börjar nästa fas när den föregående fasen är avslutad. I praktiken ändå överlappningar. Kostsamt och bescärligt om brister i kravanalys eller design upptäcks sent i utvecklinsprocessen (Oplanerade iterationer).
Inkrementell utveckling
Utveckla systemet stegvis, i inkrement. Varje inkrement / version innehåller en del av den funktionalitet som behövs i den färdiga produkten.
Hur proiritera?
Målsättning: Kunden / användaren kan utvärdera produkten redan efter den första iterationen.
Kravanalys -> Uppdeling av krav i inkrement -> Arkitekturdesign -> Utveckla följande inkrement -> Testa inkrement -> Integrera inkrementet -> Systemtest -> Sista inkrement? (Nej, tillbaks till utveckla följande inkrement) : (Ja, levereras).
Komponentbaserade utveckling
Återanvändning, software reuse. Återanvändning i stor skala ställer speciella krav på utvecklingsprocessen.
Kravanalys -> >nalys av komponenenter -> Modifikation av krav -> Design med återanvändning -> Utveckling och integration -> System test -> Leverans.
Agila metoder
Traditionella utvecklingsmetoder har upptått under utvecklingen av stora, komplexa system. För mindre projekt kan den inbyggda byråkratin i dessa processer bli oproportionerligt stor. Stora och tröga processer gör det svårt att snabbt anpassa sig till förändrade krav. Som ett alternativ har agial (“Lättrörliga”) metoder utvecklats och i praktiken blivit dominerande inom de flesta typer av mjukvaruutveckling.
Kundcentrerade - kunden deltar i utvecklingsarbetet genom att ge feedback och prioritera krav. Utnyttjar iterativa metoder - mjukvaran utvecklas i inkrement. “People not process” - gruppmedlemmarna skall inte bindas till et visst arbetssätt. Kommunikationen mellan gruppmedlemmar viktig. Kontinuerlig förbättring och kommunikation. “Embrace change” - Acceptera att dina planer kommer att förändras. “Maintain simplicty” - Undvik komplexitet.
Extreme Programming (XP)
Test-driven development - skriv test först, koden sedan. Ett inkrement accepteras om alla gamla test, och de nya som skrevs just för detta inkrement är ok. Pair programming - En dator, minst två programmerare. Refactoring - Kontinuerlig förbättring av existerande kod. Kontinuerlig integration, mycket små inkrement. Kravspecifikation genom User Stories som bryts ner till mindre tasks. “Designing for change is wasted effort”.
SCRUM
Fokuserar på projektplanering. Produktens krav är uppställda i en product backlog. Görs av projektets Product Owner - ofta kunden/uppdragsivaren. Arbetet delas upp i sprints. I början av varje sprint överförs de viktigaste produktkraven till en sprint backlog. Under sprinten utvecklas dessa krav av ett SCRUM team. Korta dagliga “stand-up” möten. Sprint demo och sprint retrospective efter en sprint. Ingen traditionell projektledare; en SCRUM master sköter byråkratin, kundkontakter och “underröker hinder” (removes impediments).
http://commons.wikimedia.org/wiki/File:Scrum_process.svg
Kanban
Ursprung i tillverkningsindustrin: lean manufacturing (Toyota). Inga fasta tidsramar, sprints (kontinuerligt flöde). Fokus på flow efficiency - kontinuerlig förbättring. Inga fasta roller. Kanban boards för att visualisera flödet. Work-In-Process limits.
Kravanalys och agila metoder
XP: User stories -> tasks SCRUM: Project backlog -> sprint backlog -> task Kanban: Epics -> User stories Agiala metoder definerar i sig inte hur krav dokumenteras. “Just imple enoug, but not too simple”. Dokumentation är ett krav i sig.
https://agilemodeling.com/essays/agileDocumentationBestPractices.htm
Exempel på kravanalys inom en gail process
- User story: As a SOME ROLE, I want to DO SOMETHING, So that i CAN GET SOME BENEFIT.
- USer acceptance test: GIVEN THAT condition 1 and condition 2… WHEN I DO step 1, and step 2…, THEN I EXPECT result 1, and result 2…
- Workflow (wireframe):“Screen A -> Screen B -> Screen C”
Agila metoder och hållbarhet
“Social hållbar arbetsätt” den åttonde principen i den agila manifestet: “Agile processes promote sustainable development. The sponsors, developers, and users should be able to maintain a constant pace indefinitely.”
Upprätthålla ett agil arbetssätt: “Sustainable agility” och “Sustainable agile transformation”.
https://www.infoq.com/articles/agile-manifesto-sustainability/
Diagram
UML-verktyg (Unified Modeling Language)
Användarfallsdiagram
Kravspecifikation och systemdesign i textform kan göras exakt och uttömmande, men kan bli komplex och svårförståelig. Diagram utnyttjar symboler och abstraktioner för att beskriva krav och funktionalitet.
Användarfallsdiagram / Use case diagrams
Kan ses som en innehållsförteckning för en kravspecifikation. Visar de operationer som en yttre användare (actor) kan utföra. Primär användare: Den huvudsakliga användaren. Sekundära användare: Andra Användare som deverkar till att utföra kravet. Primär och sekundär användare kan indikeras med pilar.
Yttre användare kan vara människor eller andra system. En fysisk användare kan gestalta olika actors (användaren har olika roller). Användarfall kan ha inbördes relationer, include, extend, inherit.
Relationer mellan användarfall
A utökar/extends B: I vissa fall kommer funktionaliteten i A att utföras som en del av B. Används för att visa alternativ programflöden, undantagssituationer, etc.
A inkluderar/includes B: B kommer alltid att utföras då A utförs. Används främst då funktionaliteten i B återanvänds i flera olika användarfall.
“If in doubt, leave it out”
Oklara relationer
Klassdiagram
Man kan utnyttja klassdiagram för att illustrera en högnivådesign. Låt komponenterna/delsystemen motsvara klasser. Visa olika komponenter som kommunicerar med varandra genom associationer. Visa komponenterna funktionalitet som operationer. Visa vilken data komponenterna innehåller genom attribut.
Grafisk representation av klasser
Klassdiagram används för att visa olika klasser och dess inbörde förhållanden. Objektdiagram kan används för att visa objekt.
Sambandet mellan klassdiagram och sekvensdiagram
Ett sekvensdiagram visar interaktionen mellan objekten i ett system. Varje objekt är en instans av en klass.
Visar komponenter som ingår i ett system och hur dessa samverkar.
Sekvensdiagram
Visar komponenter som ingår i ett system och hur dessa samverkar. Ett krav/användarfall kan innehålla flera alternativa händelseförlopp/scenarion, normalfallet och undantagsfall / felsituationer. Ett sekvensdiagram beskriver i regel händelseförloppet för ett scenario. Ett sekvensdiagram visar interaktionen mellan “objekt”. Vi kan här tolka ett objekt som antingen en komponent eller en användare. En användare kan visas som en actor.
Komponenterna skickar meddelande till varandra. Streckade pilar är returvärden. Hur visa “returvärden” till en mänsklig användare? Genom en pil från komponenten till användaren. Eller genom ett meddelande till UI-komponenten. Visa felmeddelandek Visa resultat, Uppdatera kärm osv. De lodrätta vita strecken visar när ett objekt/en funktion är aktiv
Happy case
DNS lookup fails
Page not found
Tillståndsmaskin (state machines)
Beskriver hur ett system reagerar på olika händelser. Antar att systemet alltid befinner sig i ett visst tillsånd (state), och att en viss händelse (event) kan få den att ändra tillsånd. Tar inte ställning till systemets inre struktur. Bra sätt att resonera kring funktionaliteten, “Vad händer om denna händelse inträffar då systemet befinner sig i detta tillstånd?”.
Actions och guards
En kund matar in ett mynt och väljer därefter den önskade varan. Automaten har två tillstånd: “Idle” - kunden har inte matat in pengar. “Money inserted” - kunden har matat in pengar. Obs; Idle-tillståndet regerar inte på händelsen “Product selected”.
Internal actions
Entry: Någon som utförs då tillståndet aktiveras. Do: Något som utförs aktivt medan vi är inne i tillsåndet. Exit: Någon som utförs innan vi går över till ett annat tillstånd.
Händelser som hanteras inne i ett tillstånd utan att byta tillstånd. Aktiverar alltås inte entry- eller exit-aktiviteter.
Choise state
Start state
Arkitekturdesign
“Make thins as simple as possible, but no simpler” Cohesion: Ett mått på hur specialiserad en komponent är på en viss uppgift. Coupling: Ett mått på i vilken utsträckning en komponent är beroende av andra moduler. Hög cohesion och låg coupling innebär att endast ett fåtal komponenter behöver ändras om funktionaliteten förändras.
Vad innebär arkitekturdesign? “Högnivådesign” Indeling i delsystem (subsystems) Definiera kommunikationen mellan delsystem, Lokala delsystem? Distribuerade delsystem? System av system?
Klient och server
- Server: Erbjuder en tjänst
- Klient: Använder en tjänst
- Klienten aktiv: Kontaktar servern
- Servern passiv: Väntar på att klienten tar kontakt
Distribuerade system
Minimal klient-serverarkitektur: två fysiska nivåer. Men den logiska designen har i regel minst tre nivåer: Användargränssnitt (presentation, view), Applikationslogik (controller, business logic), Datahantering (data management, data access, model).
Thin-client & fat-client
- Thin-client: Allt arbete utförs på servern.
- Fat-client: Allt arbete utförs på klienten.
Layers / lager
Varje nivå använder tjänster (=en API, Application Programming Interface) från den underliggande nivån, och erbjuder tjänster (=en annan API) till den ovanliggande nivån (Mellanliggande nivåer är både klienter och servrar). En strikt uppdelining i lager ofta svår att genomföra i praktiken, tjänster i under lager kan behövas av många ovanliggande lager (Typisk kompromiss).
https://appinventiv.com/blog/mobile-app-architecture/
APIs för webbapplikationer
RESTful web services. Representational State Transfer, “Statless” Frågor: URLs (Uniform Resource Locator) Svar: Typsikt JSON eller XML.
GraphQL. Frågor: “Query strings” Svar: JSON
XML
<?xml version="1.0" encoding="ISO-8859-1"?>
<quoutes>
<stock>
<ticker>AAPL</ticker>
<buy>191.73</buy>
<sell>192.23</sell>
</stock>
<stock>
<ticker>GOOG</ticker>
<buy>154.84</buy>
<sell>154.90</sell>
</stock>
</quoutes>
JSON
{"quotes":
[
{ "ticker": "APPL",
"buy": 191.73,
"sell": 192.23
},
{ "ticker": "GOOG",
"buy": 154.84,
"sell": 154.90
}
]
}
GraphQL query
{
quotes(filter: {buy: {between: { min: 100, max: 200} } })
{
ticker
buy
sell
}
}
Microservices
“Loosely coupled services”, “Polyglot technologies”, “Lightweight protocols”. Monolithic architecture vs Microservice architecture.
Molntjänster
- IaaS: Infrastructure as a Service
- PaaS: Platform as a Service
- SaaS: Software as a Service
Implementationshjälpmedel
Coding conventions / standards
Regler och standarder för hur kod skall skrivas. Lättare att underhålla, lättare för andra att förstå (högre kodkvalitet). Olika ursprung som gnu, google, CERT
http://www.gnu.org/prep/standards/
https://google.github.io/styleguide/
https://wiki.sei.cmu.edu/confluence/display/c/SEI+CERT+C+Coding+Standard
Kodanalys
“Statisk kodanalys” - analys som inte kör programmet. Kan generera en lång lista med varningar där en del kanske kan ignoreras, men du måste kunna motivera varför.
Emulatorer och simulatorer CASE-verktyg (Computer Aided Software Engineering)
Inte alltid praktiskt möjligt att utveckla program i samma hårdvarumiljö som det skall användas i. Kan emulera eller simulera den riktiga miljön på vanlig PC. Mjukvaruutvecklingen behöver inte vänta tills nyutvecklad hårdvara finns tillgänglig. Standargårdvara är billig. Kan ge bättre möjligheter att debugga programmet.
Emulering vs simulering
En emulator efterliknar både mjuk och hårdvara. Samma binärfil kan köras antingen på den äkta hårdvaran (native environment) eller i en emulator. Exempel: Emulator för Android. En simulator efterliknar endast mjukvaran. Källkoden måste kompileras till ex x86-maskinkod för att kunna köras i simulatorn. Exempel: Simulator för IOS.