„Krukken” of „ondersteunen met krukken” — betekent het creëren van een tijdelijke oplossing voor een probleem dat de bug oplost of functionaliteit toevoegt, maar de oorzaak niet wegneemt en niet voldoet aan de architectuurstandaarden van het project. Krukken zijn onvermijdelijk in elke ontwikkeling: deadlines, onvolledig begrip van het systeem en externe beperkingen dwingen tot compromissen. Volgens Refactoring Guru ligt het belangrijkste verschil tussen een pragmatische kruk en technische schuld in het bewustzijn van de beslissing en het bestaan van een plan om deze te verwijderen. Correct gebruik van tijdelijke oplossingen vereist discipline en documentatie.
Belangrijkste punten
Kruk (crutch) — een softwareoplossing die werkt, maar „snel in elkaar gezet” is: het lost een specifiek probleem op, maar verwijdert de oorzaak niet, volgt de architectuur van het project niet en kan kapotgaan bij de kleinste veranderingen in de omgeving. De metafoor is treffend — zoals een echte kruk helpt dergelijke code om te „lopen”, maar geneest het „been” niet.
Ontwikkelaars „ondersteunen met krukken” bugs, versie-incompatibiliteiten, platformkenmerken en dringende klantvereisten. Een typische kruk — een kruk-conditie: als iOS 15, voeg een spatie toe; als Huawei — verberg de knop. Dergelijke controles vermenigvuldigen zich en veranderen de code in een „laagjescake” van platform- en versievertakkingen.
Krukken kunnen verschillende schalen hebben: van één regel met een kruk-conditie tot een hele tussenmodule die het gedrag van een bibliotheek „repaireert”. Het is belangrijk te begrijpen dat een kruk niet altijd slecht is: in de juiste handen is het een hulpmiddel om het product op tijd uit te brengen. Het probleem begint wanneer de kruk voor altijd in de code blijft.
De belangrijkste oorzaak van het ontstaan van krukken is het conflict tussen de ideale oplossing en de werkelijke beperkingen van het project. De ontwikkelaar weet hoe het correct moet, maar tijd, geld of technische beperkingen staan dit niet toe. Het resultaat is een compromisoplossing die „gewoon werkt”.
Laten we vier belangrijke oorzaken bekijken waarom ontwikkelaars bewust hun toevlucht nemen tot krukken. Inzicht in deze oorzaken helpt om krukken niet als een fout te zien, maar als een pragmatisch hulpmiddel dat beheer vereist.
De meest voorkomende oorzaak. De release is morgen, de bug reproduceert alleen op een specifiek model, architectonisch herstel duurt twee weken. Een kruk-conditie duurt een uur en lost het probleem op. Na de release belooft het team terug te komen en het correct te herschrijven. „Niets is permanenter dan een tijdelijke oplossing" — dat gaat precies over zulke krukken.
Bibliotheek A vereist Android 12, maar uw applicatie ondersteunt Android 10. De oplossing — een tussenlaag schrijven die de OS-versie controleert en het uitvoeringspad kiest. Dit is een kruk, omdat bij het updaten van de bibliotheek de tussenlaag herschreven moet worden. Maar het alternatief — afzien van de bibliotheek of ondersteuning van oude apparaten — kan erger zijn.
// Kruk voor API 29-compatibiliteit
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
useModernApi()
} else {
useLegacyFallback()
}
Een bibliotheek waarvan het project afhankelijk is bevat een bug, maar het updaten ervan kan weken duren (er is een PR, code review, publicatie nodig). In plaats van te wachten schrijft het team een wrapper die het gedrag van de bibliotheek ter plekke patcht. Na het uitkomen van de gecorrigeerde versie van de bibliotheek wordt de wrapper verwijderd. Als deze niet wordt verwijderd — is dat al een architectuurprobleem.
Een nieuwe ontwikkelaar in een legacy-project begrijpt niet waarom de code precies zo werkt. In plaats van het uit te zoeken, voegt hij een nieuwe voorwaarde bovenop de bestaande. Dit is het gevaarlijkste type kruk, omdat de auteur niet beseft dat het een kruk is. De enige remedie — code review en pair programming voor nieuwe teamleden.
Niet elke kruk is slecht. In echte ontwikkeling is absolute codezuiverheid onbereikbaar en vaak ongepast. De pragmatische aanpak erkent dat tijdelijke oplossingen deel uitmaken van het proces, maar vereist bewustzijn, documentatie en planning van verwijdering. Een kruk is gerechtvaardigd wanneer het een zakelijke taak sneller oplost dan een schone architectuuroplossing.
Criteria voor een gerechtvaardigde kruk: het lost een specifiek probleem op, heeft een eigenaar (wie verantwoordelijk is voor verwijdering) en er is een refactorplan. Als ten minste één van de drie voorwaarden niet is voldaan — verandert de kruk in technische schuld. Hulpmiddelen zoals TODO-commentaren met een ticket in de tracker — de minimale manier van documentatie.
Een kritieke bug in de releasetak die vóór de implementatie van morgen moet worden opgelost. De schone oplossing vereist architectuurrefactoring en duurt twee weken. Kruk — voeg een nil-controle toe en stuur de fix als hotfix. Voorwaarden voor rechtvaardiging: in de tracker is een ticket voor refactoring aangemaakt, een verantwoordelijke is aangewezen, de kruk is gemarkeerd met een commentaar. Over twee weken keert het team terug naar de taak.
// TODO: IT-1234 — verwijder deze kruk na refactoring van AuthService
guard let userId = session.user?.id else {
return Result.failure(.notAuthenticated)
}
De grens tussen bewuste kruk en een architectuurprobleem (technische schuld) loopt langs twee parameters: bewustzijn van de beslissing en het bestaan van een verwijderplan. Een kruk is altijd een tijdelijke oplossing met een bekende levensduur. Technische schuld — het gevolg van vele onbeheerde krukken.
| Parameter | Bewuste kruk | Technische schuld |
|---|---|---|
| Bewustzijn | Het team weet dat dit een tijdelijke oplossing is | Niemand herinnert zich waarom de code zo is |
| Documentatie | Er is TODO, ticket in tracker | Geen commentaren, links, beschrijving |
| Verwijderplan | Sprint toegewezen voor refactoring | „Ooit herschrijven we” |
| Impact | Lokaal, belemmert nieuwe functionaliteit niet | Blokkeert wijzigingen, vertraagt ontwikkeling |
De situatie verslechtert wanneer het aantal krukken de kritieke massa overschrijdt. Elke nieuwe kruk verhoogt de „breekbaarheid” van het systeem: een verandering op de ene plaats breekt iets anders. Het gevolg is dat de ontwikkeling vertraagt, bugs zich vermenigvuldigen en een nieuwe ontwikkelaar de code niet kan begrijpen zonder hulp van de auteur. Op dat moment houden krukken op tijdelijke oplossingen te zijn en worden ze een architectuurprobleem.
Als er in de code vijf geneste controles zijn voor de OS-versie, apparaatfabrikant en aanwezigheid van een specifieke bibliotheek — is dit geen kruk, maar een architectuurprobleem. Als het toevoegen van één fix drie regressies veroorzaakt in aangrenzende modules — zijn krukken niet lokaal meer. Als code review regelmatig wordt afgewezen vanwege „nog een kruk” — is het tijd om refactoring te plannen.
Refactoren van krukken — het proces van het vervangen van tijdelijke oplossingen door architectonisch correcte. Dit kost tijd, dus is een prioriteringsstrategie nodig: niet alle krukken hoeven onmiddellijk te worden verwijderd. Een goede strategie — elke kruk beoordelen op twee parameters: frequentie van wijzigingen in dat codegebied en impact op gebruikers.
Hoge prioriteit — krukken in vaak gewijzigde modules (bedrijfslogica, algemene UI) die ontwikkeling vertragen en regressies veroorzaken. Middelmatige prioriteit — krukken in zelden gewijzigde modules, maar met potentiële impact op gebruikers (betalingsverwerking, autorisatie). Lage prioriteit — krukken in legacy-code die stabiel werkt en niet gepland is voor wijziging.
Stap 1: inventarisatie — vind alle TODO's en FIXME's gerelateerd aan krukken. Stap 2: beoordeling — bepaal welke nog relevant zijn. Stap 3: planning — wijs refactoring van krukken toe aan een sprint, beginnend met hoge prioriteit. Stap 4: vervanging — implementeer de schone oplossing, verwijder de kruk en het TODO-commentaar. Stap 5: verificatie — zorg dat tests slagen en er geen regressies zijn.
# Vind alle TODO-krukken in het project
grep -r "TODO\|FIXME\|HACK\|XXX" --include="*.kt" --include="*.swift" .
De beste manier om krukken te bestrijden is ze niet onnodig te creëren. Voordat je een kruk schrijft, stel jezelf drie vragen: kan er een schone oplossing worden gemaakt in redelijke tijd? Is er een alternatief dat geen kruk is? Zal het team tijd hebben om terug te komen en dit te herschrijven? Als ten minste één vraag met „nee” wordt beantwoord — denk dan nog eens na voordat je de code „ondersteunt”.
Veelgestelde vragen
Krukken — een tijdelijke oplossing schrijven die het probleem oplost, maar de oorzaak niet wegneemt. De code werkt, maar voldoet niet aan de projectarchitectuur en kan kapotgaan bij wijzigingen.
Kruk — een bewuste tijdelijke oplossing met een verwijderplan. Technische schuld — het gevolg van vele vergeten krukken. Een kruk is lokaal, schuld is systemisch en blokkeert ontwikkeling.
Wanneer de deadline kritiek is, de schone oplossing tijd kost en de kruk gedocumenteerd is met een TODO-commentaar en een ticket in de tracker. Voorwaarde: de kruk heeft een verwijderplan in de nabije toekomst.
Voeg TODO of FIXME toe met het ticketnummer en een korte beschrijving van de juiste oplossing. Voorbeeld: // TODO: IT-567 — herschrijf met Factory pattern. Zonder ticket wordt de kruk vergeten.
Voer een inventarisatie uit van alle TODO's, beoordeel de prioriteit, begin met vaak gewijzigde modules. Vervang de kruk door een schone oplossing, verwijder het commentaar en controleer met tests.
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