Skip to content

Commit a9d2b5c

Browse files
committed
Blog: technische schuld
1 parent 968cbd6 commit a9d2b5c

5 files changed

Lines changed: 81 additions & 8 deletions

File tree

AUTHORS.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ Dit project is mogelijk gemaakt door de volgende bijdragers:
1313
## Bijdragers
1414

1515
- **Sicco van Sas ~ Open State Foundation** - Fullstack Developer
16+
- **Frank Niessink ~ ICTU** - Kwaliteitsmanager
1617

1718
## Speciale Dank
1819

19-
- **Communityleden** - Voor hun waardevolle feedback en bijdragen.
20+
- **Communityleden** - Voor hun waardevolle feedback en bijdragen.

blog/authors.yml

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,14 +46,24 @@ martin-van-der-plas:
4646
linkedin: martinvanderplas
4747
github: mrtn78
4848

49+
frank-niessink:
50+
name: Frank Niessink
51+
title: Kwaliteitsmanager - ICTU
52+
image_url: https://avatars.githubusercontent.com/u/3530545
53+
page: true
54+
socials:
55+
linkedin: fniessink
56+
github: fniessink
57+
mastodon: https://fosstodon.org/@Fniessink
58+
4959
frank-terpstra:
5060
name: Frank Terpstra
5161
title: Implementatie ondersteuner - developer.overheid.nl
5262
image_url: https://developer.overheid.nl/img/team/frank-terpstra.jpg
5363
page: true
5464
socials:
5565
linkedin: frank-terpstra-1bb5096
56-
github: fterpstra
66+
github: fterpstra
5767

5868
jaap-hein-wester:
5969
name: Jaap-Hein Wester
@@ -108,4 +118,4 @@ forum-standaardisatie:
108118
socials:
109119
github: forumstandaardisatie
110120
mastodon: https://social.overheid.nl/@forumstandaardisatie
111-
linkedin: https://www.linkedin.com/company/forum-standaardisatie/
121+
linkedin: https://www.linkedin.com/company/forum-standaardisatie/
53 KB
Loading
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
---
2+
draft: true
3+
authors: [frank-niessink]
4+
tags: [development, technische-schuld]
5+
---
6+
# Technische schuld - onvermijdelijk maar niet onbeheersbaar
7+
8+
Je kijkt naar je broncode en denkt: als ik had geweten wat ik nu weet, had ik het anders aangepakt. Een typisch voorbeeld van technische schuld. Wat is het, hoe kun je het voorkomen (niet dus) en hoe pak je het aan?
9+
10+
<!-- truncate -->
11+
12+
## Een financiële metafoor
13+
14+
De term technische schuld werd gemunt door Ward Cunningham om aan zijn baas [uit te leggen](https://wiki.c2.com/?WardExplainsDebtMetaphor) waarom de software waaraan hij werkt moest worden aangepast . Het doel van de aanpassingen was de software zodanig te herschrijven dat het zou lijken alsof alles wat Cunningham tijdens de ontwikkeling had geleerd al aan het begin bekend was. Omdat het ging om financiële software, gebruikte Cunningham een financiële analogie in het gesprek met zijn baas: de schuldmetafoor. Hij legde uit dat als de software niet zou worden aangepast aan wat op dat moment de juiste manier was om over het domein na te denken, het team voortdurend misverstanden zou hebben. En daardoor langzamer zou werken; alsof er rente over een lening moest worden betaald.
15+
16+
Cunningham wilde trouwens niet suggereren dat het idee is dat je slechte code schrijft en dit dan later herstelt. Het idee is dat je een imperfect begrip hebt van het op te lossen probleem en daar desondanks zo goed mogelijk software voor maakt. Zodanig dat het makkelijk is deze later aan te passen aan wat je hebt geleerd over het probleem.
17+
18+
## Breed toepasbaar
19+
20+
Wat ik interessant vind aan de technische schuld metafoor is dat deze zo breed toepasbaar is. Elke verandering in je project kan een nieuwe bron van technische schuld zijn:
21+
22+
- Een nieuwe functionele eis van je opdrachtgever: als je had geweten dat de gebruikers willen kunnen tijdreizen had je het datamodel anders vormgegeven.
23+
- Een nieuwe niet-functionele eis van je opdrachtgever: als je had geweten dat je software niet alleen Nederlands maar ook andere talen in de user interface moet ondersteunen, had je de strings in je user interface direct vertaalbaar gemaakt.
24+
- Een nieuwe randvoorwaarde: als je had geweten dat de aansluitvoorwaarden voor eHerkenning zouden worden veranderd, had je die direct meegenomen in je koppelvlak.
25+
26+
Maar ook zonder veranderingen in je eigen project kan er nieuwe technische schuld ontstaan. Veranderingen in de omgeving leiden ook tot technische schuld:
27+
28+
- Een nieuwe versie van een gebruikte bibliotheek: als deze versie aan het begin van je project beschikbaar was geweest had je die direct gebruikt en had je nu je code niet aan de nieuwe API hoeven aan te passen.
29+
- Een nieuw ontdekte beveiligingskwetsbaarheid in één van de bibliotheken die je gebruikt. Als je van de kwetsbaarheid had geweten had je maatregelen in je code genomen, een andere bibliotheek gebruikt of de benodigde code zelf ontwikkeld.
30+
31+
Trouwens, niet alleen in de broncode van de software zelf kan technische schuld aanwezig zijn. Ook je ontwikkelomgeving kan technische schuld oplopen. Denk aan oude versie van linters, trage unit tests, of ongebruikte jobs in Jenkins.
32+
33+
## Onvermijdbaar
34+
35+
Mijn ervaring is dat technische schuld onvermijdelijk is. Je hoeft maar met je ogen te knipperen of er is een nieuwe versie van één van de bibliotheken die je software gebruikt. De vraag is dus zozeer niet hoe je technische schuld kunt voorkomen, maar hoe je er mee omgaat als het vroeg of laat optreedt. Want niets doen is geen optie als je software nog een tijdje mee moet.
36+
37+
## Aanpakken
38+
39+
Omdat technische schuld op veel verschillende manieren kan ontstaan en veel verschillende verschijningsvormen kent, hebben we bij mijn werkgever, [ICTU](https://www.ictu.nl), niet één manier om met technische schuld om te gaan. Er zijn verschillende aanpakken:
40+
41+
- Veel van onze projecten reserveren in ieder geval tijd om aan technische schuld te werken. Veelal hanteren we 10% van de velocity als vuistregel.
42+
- Updates van gebruikte bibliotheken laten we vaak uitvoeren door tools als Dependabot of Renovatebot. Deze tools zien dat er een nieuwe versie beschikbaar is, maken een pull request en starten de geautomatiseerde build en geautomatiseerde tests. Als alle tests slagen en een review van de wijzigingen geen issues oplevert kan de pull request gemerged worden. Randvoorwaarde is wel dat de testsuite een hoge testdekking heeft.
43+
- Nieuwe kwetsbaarheden in gebruikte bibliotheken die door tools als de OWASP Dependency Check worden gerapporteerd leiden tot een risicoanalyse door de ontwikkelaars: wat is het risico? Is onze software überhaupt kwetsbaar? Kan de bibliotheek worden bijgewerkt? Zo ja, hoe snel moet dat gebeuren? Afhankelijk van de antwoorden op deze vragen repareert het team direct, zet het een taak op de backlog of accepteert het risico.
44+
- Wijzigingen aan de software die makkelijker zouden gaan als de software eerst wordt voorbereid nemen we normaal gesproken mee in de story. Als de refactoring erg groot is, doen we dat in een aparte (sub)taak om het reviewen te vergemakkelijken.
45+
- Is de technische schuld groot dan wordt dit een apart subproject binnen het project. Eén van onze langlopende projecten is een paar jaar geleden overgestapt van Subversion naar Git als versiebeheersysteem. Voor een dergelijke grote activiteit plannen we apart tijd en menskracht in, buiten de reguliere backlog om.
46+
- Is de technische schuld te groot om realistisch gezien op te lossen dan kan er gekozen worden om een systeem te herbouwen. Omdat herbouw altijd meer tijd kost dan je denkt, besluiten we hiertoe niet graag.
47+
48+
Bij elkaar zorgen bovenstaande aanpakken dat technische schuld niet onbeheersbaar groeit en de software onderhoudbaar blijft.
49+
50+
## Blijven volgen
51+
52+
Vaak kun of wil je technische schuld niet direct oplossen. In ons kwaliteitssysteem [Quality-time](https://developer.overheid.nl/kennisbank/infra/tools/quality-time) legt de kwaliteitsmanager vast dat er technische schuld is en hoe we hebben afgesproken daarmee om te gaan. Inclusief één of meer linkjes naar de bijbehorende issues in Jira. Dat ziet er bijvoorbeeld dan zo uit:
53+
54+
!["Technische schuld registreren in Quality-time"](./img/technische-schuld-in-quality-time.png)
55+
56+
Hier zie je dat de gebruikte versie van Axe-core in de pijplijn van het project achterloopt. Er is een issue gemaakt in Jira om de versie bij te werken. Dit issue is nog niet opgepakt (status “Open”). De kwaliteitsmanager heeft in de tussentijd het achtergelopen geaccepteerd als technische schuld tot 31 juli 2025.
57+
58+
## Hoe doe jij dat?
59+
60+
Ik ben benieuwd hoe je in jouw projecten omgaat met technische schuld! Welke tools en processen gebruik je? Is er een rol als kwaliteitsmanager die het specifiek in de gaten houdt? Hoe leg je de gemaakte afspraken vast en hoe bewaak je die? Hoe overtuig je je product owner technische schuld de juiste prioriteit te geven? Laat het me weten op [Mastadon](https://fosstodon.org/@Fniessink) of beter nog: [schrijf ook een blog](https://developer.overheid.nl/contributing/gastblog-schrijven).

tags.yml

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ fsc:
103103
description: Federated Service Connectivity
104104
label: FSC
105105
gdpr:
106-
description: 'General Data Protection Regulation (GDPR) '
106+
description: "General Data Protection Regulation (GDPR) "
107107
label: GDPR
108108
gegevensuitwisseling:
109109
label: Gegevensuitwisseling
@@ -138,7 +138,7 @@ json-schema:
138138
jwt:
139139
label: JSON Web Tokens (JWT of JWT's)
140140
kiesraad:
141-
description: 'De Kiesraad: de nationale Kiesraad.'
141+
description: "De Kiesraad: de nationale Kiesraad."
142142
label: Kiesraad
143143
kubernetes:
144144
label: Kubernetes
@@ -190,7 +190,7 @@ ospo:
190190
description: Open Source Program Office
191191
label: OSPO
192192
owasp:
193-
description: 'OWASP: Open Web Application Security Project'
193+
description: "OWASP: Open Web Application Security Project"
194194
label: OWASP
195195
owl:
196196
label: OWL
@@ -240,13 +240,16 @@ shacl:
240240
skos:
241241
description: Simple Knowledge Organization System
242242
label: SKOS
243+
technische-schuld:
244+
description: Een metafoor voor de situatie waarin eerder gemaakte keuzes de software in de toekomst moeilijker te wijzigen maken
245+
label: Technische schuld
243246
tool:
244247
description: Tool
245248
label: Tool
246249
tutorial:
247250
label: Tutorial
248251
ux:
249-
description: 'UX: User experience'
252+
description: "UX: User experience"
250253
label: UX
251254
validator:
252255
label: Validator
@@ -264,4 +267,3 @@ websub:
264267
label: Websub
265268
yaml:
266269
label: YAML
267-

0 commit comments

Comments
 (0)