Working software is the primary measure of progress.

— The Agile Manifesto

Software Craftsmanship är ett uttryck för att beskriva det som utgör skicklighet i arbetet som utvecklare. Att skriva kod som är produktionsmässig kräver att man upprätthåller ett antal goda vanor.

God kod fungerar korrekt, är läsbar och är underhållsvänlig. När den inte är det, kallar vi det ”legacy code” och då finns det tekniker för att hantera det.

Den här kursen innehåller det som en riktig utvecklare ska kunna.

Målgrupp: Kursen riktar sig till dem som vill skriva mjukvara på ett professionellt sätt och utföra ett gott hantverk. Nivån kan anpassas efter gruppens senioritet genom fördjupningar.

Upplägg: Varje modul innehåller en övning, som kan handla om att deltagaren programmerar en liten snutt kod eller gör en kort övning från materialet. Resultaten redovisas för gruppen. Övningarna kan göras individuellt eller i par, och deltagarna förutsätts ha egna datorer.

Programmeringsspråk: Exempelkod kan ges i Python, Java eller C#. Instruktören kan läsa och resonera kring merparten av språken på marknaden.

Tidsåtgång: Modulernas tidsåtgång är en riktlinje: ibland uppkommer behov av mycket hjälp i de praktiska momenten, ibland uppstår diskussioner som är givande för kursen, och ibland kan gruppen spontant välja att fördjupa sig. 

Max antal deltagare: 10 (p g a behov av hjälp samt redovisningsmomenten)

Innehållet i en företagsintern kurs anpassas efter ert behov.

Moduler

Professionell mjukvaruutveckling (1h, obligatorisk)

Läromål: Deltagaren vet vad som särskiljer professionell utveckling från kod som skrivs på fritiden

Kort introduktion till software craftsmanship varpå vi går igenom vad som karaktäriserar professionell mjukvaruutveckling genom att koppla det agila metoder, kognitiv psykologi och gruppdynamik.

Principer för versionshantering (1h, obligatorisk)

Läromål: Deltagaren kan fatta ett informerat beslut kring hur ett team ska arbeta med sitt versionshanteringssystem.

Genomgång av branchningsstrategier, trunk only development och branching by abstraction, samt konsekvenserna därav. Ämnet inbjuder till diskussioner.

Clean Code (2h, obligatorisk)

Läromål: Deltagaren kan de flesta riktlinjerna för att skriva läsbar kod

Genomgång av namngivning av variabler och funktioner, scoping och kommentering baserat på boken “Clean Code“ samt liknande böcker.

Enhetstestning (2,5h, obligatorisk)

Läromål: Deltagaren vet vad ett enhetstest är och inte är samt hur det är strukturerat och namngivet

Enhetstestning utgör grunden i professionell mjukvaruutveckling. Det är därför viktigt att alla utvecklare behärskar dem väl. Momentet innefattar också grundläggande testtekniker. 

Continuous integration (3h, valbar)

Läromål: Deltagaren har byggt sin alldeles egna CI-pipeline

Praktiskt moment där deltagarna bygger en CI-pipeline för Jenkins efter teorigenomgången.

Designmönster (2h, valbar)

Läromål: Deltagaren kan de vanligaste 

De vanliga designmönstren utgör fortfarande en grund i såväl det dagliga arbetet som många ramverk. Vi går igenom de 8-10 vanligaste, exempelvis Composite, Builder, Decorator, Singleton, Adapter m fl. Momentet kan enkelt anpassas till avancerade grupper genom att vi går in på det finstilta.

Praktisk agil arkitektur (1,5h, valbar)

Läromål: Deltagaren har bekantat sig arkitekturramverk, vyer, samt olika strategier för att utföra och dokumentera arkitekturarbete löpande

Många grupper kämpar med att dokumentera sin arkitektur och att naturligt få in detta i sitt dagliga arbete. Vi går igenom ett enkelt arkitekturramverk, vy-konceptet, samt strategier för att bedriva arkitekturarbete i ett agilt team. 

Testdriven utveckling (2h, valbar)

Läromål: Deltagaren har använt testdriven utveckling för att driva fram enklare funktionalitet samt förstår mekaniken bakom testdriven utveckling. 

Testdriven utveckling är en designteknik där testkod skrivs innan produktionskoden. Detta gör koden testbar per automatik, och lämpar sig bättre eller sämre i olika sammanhang. Både Chicago-skolan och London-skolan behandlas, och momentet kan lätt anpassas till mer avancerade deltagare genom att övningen görs i London-anda (mockist).

Ports and Adapters/Hexagonal arkitektur (1,5h, valbar)

Läromål: Deltagaren förstår nyttan av ports and adapters och har implementerat en enkel variant.

Arkitekturen ports and adapters kan användas i många system och gör att de får en testbar kärna med tydlig domänmodell. Externa beroenden kan lätt isoleras till periferin. I detta avsnitt vidrör vi domändriven design (DDD).

Att hantera och bryta beroenden (1,5h, obligatorisk om kursen är 2 dagar)

Läromål: Deltagaren kan ett antal sätt att hantera/bryta beroenden samt har fördjupat sig i minst ett av dem.

Att hantera och identifiera beroenden mellan komponenter är fundamentalt för att skapa en testbar arkitektur. Att bryta beroenden är en kritisk aktivitet när man arbetar med gamla system. Vi går igenom koncept som direct/indirect input/output, olika typer av injections, samt factory method override.

Objektorientering: En kort deep dive (1-2h, valbar) 

Läromål: Deltagaren kan använda arv, delegering och inkapsling på ett korrekt sätt

Många av dagens språk är objektorienterade eller tillhandahåller konstruktioner för objektorientering. Det är ett stort gap mellan att skriva kod i en klass och att utnyttja möjligheterna i en objektorienterad design fullt ut. Vi går igenom de vanligaste felen samt bekantar oss med strikt typade modeller, som passar väl in i ports and adapters-arkitekturen, gör testningen enklare, samt förskjuter kod till värdeobjekt.