Kostyl (Eng. workaround, kludge, hotfix) — is een tijdelijke of suboptimale oplossing voor een probleem in code die werkt, maar de principes van schone architectuur, leesbaarheid of prestaties schendt. Kostyls zijn onvermijdelijk in echte ontwikkeling: deadlines, versie-incompatibiliteit, legacy-code en ongedocumenteerd gedrag van frameworks dwingen ontwikkelaars tot compromissen. Volgens Martin Fowler (2025) is het belangrijkste verschil tussen een gerechtvaardigde kostyl en technische schuld de aanwezigheid van een plan voor verwijdering en expliciete markering in de code.
Belangrijkste
Kostyl — is de slangterm voor een software-oplossing die functioneel correct is maar technisch suboptimaal. Zulke code werkt, doorstaat tests en komt zelfs in productie, maar het lezen ervan roept de wens op om alles opnieuw te schrijven. In Engelstalige omgevingen worden de termen workaround, kludge (kluge), hack of quick-and-dirty fix gebruikt.
De term komt van een alledaagse metafoor: als een stoelpoot breekt, kun je hem vastbinden met tape — de stoel staat weer, maar de oplossing is tijdelijk en lelijk. In programmeren is het hetzelfde: een bug wordt gefixt met hardcode, een timeout-kostyl of een omweg via een ongedocumenteerde API. Code compileert, de applicatie crasht niet, maar de oplossing is niet kwalitatief te noemen.
Belangrijk verschil: bug — wanneer code niet werkt, kostyl — wanneer code werkt maar slecht is ontworpen. Een kostyl is altijd een bewuste keuze van de ontwikkelaar: „Ik weet dat het lelijk is, maar nu lost het het probleem op”.
Volgens een schatting van Stripe (2024) besteden ontwikkelaars gemiddeld 17 uur per week aan technische schuld en kostyls — bijna de helft van hun werktijd. Dit is een direct productiviteitsverlies voor het team.
De eerste en belangrijkste oorzaak — deadline. Wanneer er nog een dag is tot de release en een kritieke bug nog niet is opgelost, kiest het team voor een snelle oplossing in plaats van de juiste. Hardcoded waarden, uitschakelen van controles, toevoegen van sleep() — klassieke voorbeelden van deadline-kostyls. Een ervaren ontwikkelaar markeert zulke plekken altijd met TODO of FIXME.
De tweede oorzaak — API-incompatibiliteit. Een externe bibliotheek of framework gedraagt zich anders dan beschreven in de documentatie. Het framework exporteert de benodigde klasse niet, de methode is gemarkeerd als deprecated en er is geen alternatief. De ontwikkelaar wordt gedwongen om reflectie, interne API of een omweg te gebruiken. In Java kan dit toegang via setAccessible(true) zijn, in Swift — @objc en performSelector.
De derde oorzaak — legacy-code. Een ontwikkelaar erft een project dat 5–10 jaar geleden is geschreven op een verouderde framework-versie. Er is geen tijd en budget om de hele module te herschrijven, dus nieuwe functionaliteit wordt via kostyls aan de oude code „geplakt”. Gaandeweg worden er zoveel lagen dat de module verandert in een „big ball of mud”.
De vierde oorzaak — gebrek aan tests. Refactoring zonder tests is gevaarlijk: een architectuurwijziging kan werkende functionaliteit breken. Wanneer er geen tests zijn, voegt de ontwikkelaar liever een kostyl bovenop werkende code toe dan stabiliteit te riskeren. Volgens Google Testing Blog (2024) gebruiken teams zonder tests 3 keer vaker workaround-oplossingen.
Classificatie van kostyls helpt het team te begrijpen met welk type technische schuld het te maken heeft en de juiste verwijderingsstrategie te kiezen. Laten we de belangrijkste soorten bekijken.
Hardcode — het meest voorkomende type. In plaats van configuratie, resource of parameter wordt een vaste waarde in de code gebruikt. Voorbeeld: een hardcoded server-URL, een timeout van 5 seconden, lettergrootte 16pt. Hardcode maakt code niet-schaalbaar en vereist hercompilatie bij elke wijziging.
Copy-paste — duplicatie van een codefragment met kleine wijzigingen in plaats van het extraheren van gemeenschappelijke logica. Klassiek symptoom: in het project zijn er 3 vergelijkbare methoden die verschillen in één regel. Copy-paste versnelt het schrijven van code op het moment van de taak, maar vertraagt het onderhoud in de toekomst met 10 keer — een correctie moet op 3 plaatsen worden aangebracht in plaats van één.
Lege try-catch — een catch-blok dat niets doet of alleen de fout logt zonder afhandeling. Zo’n kostyl „onderdrukt” de uitzondering, maar lost de oorzaak niet op. De applicatie blijft werken, maar gegevens kunnen beschadigd raken en de gebruiker krijgt geen feedback.
Sleep in code — Thread.sleep(500) of DispatchQueue.main.asyncAfter om te wachten wanneer er een gebeurtenis of callback zou moeten zijn. Zulke code is onbetrouwbaar: op een langzaam apparaat kan 500 ms onvoldoende zijn, op een snel apparaat is de pauze overbodig. Gebruik CountDownLatch, Semaphore of async/await met correcte timings.
Compatibiliteitsvlaggen — if-else-cascades die de OS-versie, het apparaatmodel of de aanwezigheid van een functie controleren. Wanneer er meer dan 3–4 vlaggen zijn, verandert code in spaghetti. Oplossing — Strategy pattern of Feature Flags via configuratie.
Veel ontwikkelaars verwarren kostyl met technische schuld. Het verschil zit in schaal en bewustzijn. Kostyl — is een lokale, concrete oplossing (één methode, één klasse). Technische schuld — is een systemisch probleem dat de architectuur van een module of de hele applicatie beïnvloedt.
De metafoor van Ward Cunningham (bedenker van de term Technical Debt): technische schuld is als het afsluiten van een lening bij de bank. Je neemt nu geld op om sneller een huis te bouwen, maar betaalt later rente. Kostyl — is als het slaan van een spijker met een hamer in plaats van een schroevendraaier: het werk wordt gedaan, maar minder efficiënt.
Één kostyl creëert geen technische schuld. Maar 50 kostyls in één module = architectuurschuld. Daarom teamregel: elke kostyl wordt vastgelegd in code review of task tracker, en het team beoordeelt regelmatig (een keer per sprint) opgehoopte workaround-oplossingen.
Volgens Spotify Engineering (2023) verkorten teams die kostyls in code bijhouden (via een speciale TODO-label of custom annotation) de refactoringtijd met 30% — omdat ze geen uren verspillen aan het zoeken naar probleemplekken.
Eerste stap — inventarisatie. Zoek in de codebase naar trefwoorden: TODO, FIXME, HACK, WORKAROUND, KLUDGE. Moderne IDE’s markeren ze met een aparte kleur. GitHub toont TODO ook in de Pull Request-interface. Maak een lijst van alle kostyls met prioriteit.
Tweede stap — prioritering. Niet alle kostyls hoeven onmiddellijk te worden opgelost. Prioriteit = wijzigingsfrequentie in bestand × kritikaliteit. Als een bestand 2 keer per jaar verandert, kan de kostyl wachten. Als een module in elke sprint wordt gewijzigd — moet de kostyl als eerste worden opgelost.
Derde stap — refactoring met tests. Refactor nooit een kostyl zonder tests. Schrijf eerst een test die het huidige gedrag (met de kostyl) controleert, refactor vervolgens en controleer daarna of de test slaagt. Zonder dit kan refactoring van een kostyl de functionaliteit breken waarvoor hij is geschreven.
// Voor: hardcoded URL workaround
fun getApiUrl(): String {
return "https://api.example.com/v2"
}
// Na: configuratie via BuildConfig
fun getApiUrl(): String {
return BuildConfig.API_BASE_URL
}
Vierde stap — automatisering.. Configureer een linter die bepaalde kostylpatronen verbiedt. Bijvoorbeeld, Detekt voor Kotlin kan de afwezigheid van Thread.sleep() in productiecode controleren, ESLint — console.log in het project verbieden. Dit voorkomt nieuwe kostyls van hetzelfde type.
Ondanks de negatieve connotatie van de term kan een kostyl een gerechtvaardigde oplossing zijn. Hoofdvoorwaarde: de kostyl is tijdelijk, expliciet gemarkeerd en heeft een vervangingsplan. In de productiecode van elk groot project bestaan honderden gerechtvaardigde kostyls.
Situatie 1: hotfix in productie. Een kritieke bug treedt op bij alle gebruikers. Het team heeft binnen een uur een fix nodig. Juiste aanpak: los de bug op welke manier dan ook, implementeer de hotfix. De volgende dag schrijven we de juiste oplossing en sluiten de taak. Een hotfix is een gerechtvaardigde kostyl als hij niet langer dan 48 uur leeft.
Situatie 2: wachten op een nieuwe versie van een bibliotheek. Het framework bevat een bug die in master is opgelost, maar de release komt over 2 weken. In plaats van complexe omwegcode te schrijven, voegt het team een workaround toe met de notitie „REMOVE after library 3.2”. Wanneer 3.2 uitkomt, wordt de workaround verwijderd.
Situatie 3: lancering van een startup of MVP. In de MVP-fase is snelheid belangrijker dan architectuur. Kostyls in het begin zijn normaal. Het probleem ontstaat wanneer de startup niet in een product verandert en de kostyls blijven. Aanbeveling: wijs na de financieringsronde een sprint toe voor het aflossen van kritieke technische schuld.
Hoofdprincipe: „Legacy is andermans code zonder tests” (Michael Feathers). Als een kostyl door een test wordt gedekt en expliciet is gedocumenteerd — is hij beheersbaar. Als hij 2 jaar zonder commentaar in een vergeten module hangt — is het geen kostyl meer, maar een architectuurprobleem.
Veelgestelde vragen
Bug — code werkt niet zoals verwacht. Kostyl — code werkt, maar is suboptimaal geschreven. Een kostyl is altijd een bewuste beslissing van de ontwikkelaar, een bug is meestal een onbewuste fout.
Gebruik // TODO: refactor — ... of een custom @Workaround-annotatie met velden: reden, datum, verantwoordelijke, verwijderdeadline. Vermijd kale // HACK zonder uitleg.
Als de module niet verandert en de kostyl stabiel is — niet nodig. Refactoring zonder reden verhoogt het risico op regressie. Los alleen kostyls op die het toevoegen van nieuwe functionaliteit belemmeren.
Vergelijk de tijd: „Nu verliezen we 4 uur aan handmatig testen door deze kostyls. Refactoring duurt 8 uur en verkort de tijd tot 30 minuten. Rendement — 2 sprints”. Spreek de taal van snelheid en geld, niet van schone architectuur.
Zoek naar TODO, FIXME, HACK, WORKAROUND via grep in het project. Analyseer methoden langer dan 100 regels en klassen met meer dan 5 afhankelijkheden. Gebruik linters met custom regels voor automatische detectie.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook