Softwarestructuren

Inhoud

Betrouwbare software schrijf je niet per ongeluk. In deze cursus leer je hoe je code zo structureert dat ze begrijpelijk, aanpasbaar en correct blijft, ook als een project groeit. Elk probleem vraagt om een andere aanpak, en een goede softwareontwikkelaar weet welke techniek wanneer het meest geschikt is. Daarom verkennen we vijf technieken die elk vanuit een andere invalshoek kijken naar hetzelfde vraagstuk: hoe ontwerp en structureer je software die doet wat ze moet doen, en dat ook blijft doen?

We beginnen met hoe je een codebase organiseert. Bij object georiënteerd programmeren bundel je gegevens en gedrag in objecten met een duidelijke interface, zodat onderdelen van je systeem onafhankelijk van elkaar kunnen veranderen. Concurrent programmeren laat je een systeem opsplitsen in taken die gelijktijdig lopen, maar vraagt daarbij om zorgvuldige afspraken over communicatie en gedeelde bronnen, want zonder die discipline ontstaan fouten die lastig te reproduceren en te herstellen zijn.

Vervolgens kijken we naar hoe je correctheid en voorspelbaarheid inbouwt in je code. Functioneel programmeren dwingt je zijeffecten te beheersen via pure functies en onveranderlijke datastructuren, waardoor je over elk onderdeel van je programma afzonderlijk kunt redeneren. Reactief programmeren bouwt daarop voort en biedt een gestructureerde manier om toestand en interactie te beheren, zonder de voorspelbaarheid van je codebase te verliezen. Logisch programmeren ten slotte laat je berekeningen uitdrukken als relaties tussen feiten en regels, wat bijzonder krachtig is voor vraagstukken waarbij je niet de oplossingsmethode wilt vastleggen, maar simpelweg de voorwaarden waaraan een correcte uitkomst moet voldoen.

Domeinen

Deze cursus sluit aan bij kerndomeinen Informatie (C), Programmeren (D) en Decompositie (E1) en bij het keuzedomein Programmeerparadigma’s (J). Daarnaast heeft raakvlakken met onder meer Computerarchitectuur (K).

Doelen

  1. Uitleggen hoe object georiënteerd programmeren, concurrent programmeren, functioneel programmeren, reactief programmeren en logisch programmeren elk op een andere manier de structuur van een softwareproject bepalen.
  2. Beschrijven hoe kernconcepten bijdragen aan een codebase die begrijpelijk, aanpasbaar en correct blijft.
  3. Programma’s structureren op een manier die past bij de bijbehorende ontwerpprincipes.
  4. Gegevensrepresentatie bewust toepassen.
  5. Het uitvoeringsmodel van elke techniek mentaal kunnen nabootsen en op basis daarvan het gedrag en de correctheid van een programma beredeneren.
  6. Technieken uit verschillende paradigma’s combineren in één ontwerp, waarbij verantwoordelijkheden helder gescheiden zijn.
  7. Bestaande code analyseren op structuur en onderhoudbaarheid, benoemen welke ontwerpkeuzes zijn gemaakt, en identificeren waar de structuur tekortschiet.
  8. Bij een gegeven ontwerpvraagstuk een gefundeerde keuze maken voor één of meer technieken, en daarbij afwegen wat de consequenties zijn voor de structuur, leesbaarheid en aanpasbaarheid van de codebase.
  9. Ontwerpkeuzes motiveren en documenteren op een manier die begrijpelijk is voor een andere ontwikkelaar.
  10. Beoordelen in hoeverre een softwareontwerp bestand is tegen groei en verandering, en concrete structuurverbeteringen voorstellen op basis van de behandelde technieken.
  11. Reflecteren op de spanning tussen verschillende ontwerpprincipes en beredeneren welke afweging in een gegeven context de voorkeur verdient.

Voorkennis

Ervaring met de basiselementen uit programmeertalen is gewenst. Het gaat om begrippen als keuze, herhaling, recursie, functie en procedure, zoals behandeld bij de cursus Programmeermodellen van Inf4All, of een vergelijkbare cursus imperatief programmeren. Kennis van HTML en CSS komt van pas maar is niet noodzakelijk.

Materialen

  • Online lesmateriaal op digitale leeromgeving

Werkwijze

De cursus is taakgestuurd opgezet. Er is een tweewekelijkse cyclus van oriëntatie (hoor/werkcollege), zelfstudie (lees- en leertaken) en nabespreking (responsiecollege).

Toetsing

Toetsing vindt plaats door twee praktijkopdrachten en wordt afgesloten met een schriftelijk tentamen, alle drie beoordeeld met een cijfer. Praktijkopdrachten worden gepresenteerd aan de docent en de medestudenten. Het eindcijfer wordt bepaald door het gemiddelde van drie deelcijfers.

Docent

Tim Steenvoorden is sinds 2021 werkzaam als universitair docent aan de Open Universiteit. Daar verzorgt hij vakken over Functioneel programmeren, Concepten van programmeertalen, Besturingssystemen en Computerarchitectuur. Zijn onderzoeksinteresses liggen op het gebied van het ontwerpen en implementeren van programmeertalen. Verder houdt hij zich bezich met de didactiek van informatica-onderwijs, is hij bestuurslid bij Vakvereniging i&i, en is hij coördinator van Inf4All.

Logo in4all_sidebar