“Krycka” eller “stötta med kryckor” — innebär att skapa en tillfällig lösning på ett problem som stänger en bugg eller lägger till funktionalitet, men inte åtgärdar grundorsaken och inte följer projektets arkitekturstandarder. Kryckor är oundvikliga i all utveckling: deadlines, ofullständig förståelse av systemet och externa begränsningar tvingar fram kompromissbeslut. Enligt Refactoring Guru är den viktigaste skillnaden mellan en pragmatisk krycka och teknisk skuld — i medvetenheten om beslutet och förekomsten av en plan för att eliminera den. Korrekt användning av tillfälliga lösningar kräver disciplin och dokumentation.
Huvudpunkter
Krycka (crutch) — en mjukvarulösning som fungerar, men är gjord “i hast”: den stänger ett specifikt problem, men eliminerar inte orsaken, följer inte projektets arkitektur och kan gå sönder vid de minsta förändringar i miljön. Metaforen är träffande — som en riktig krycka hjälper sådan kod att “gå”, men botar inte “benet”.
Utvecklare “stöttar med kryckor” buggar, versionsinkompatibiliteter, plattformsegenskaper och brådskande kundkrav. En typisk krycka — krycka-villkor: om iOS 15, lägg till ett mellanrum; om Huawei — dölj knappen. Sådana kontroller förökas och förvandlar koden till en “lagerkaka” av plattforms- och versionsförgreningar.
Kryckor kan vara av olika omfattning: från en rad med krycka-villkor till en hel mellanmodul som “rättar” ett biblioteks beteende. Det är viktigt att förstå att en krycka inte alltid är ond: i rätta händer är det ett verktyg som gör det möjligt att släppa produkten i tid. Problemet börjar när kryckan förblir i koden för alltid.
Huvudorsaken till uppkomsten av kryckor är konflikten mellan den ideala lösningen och projektets verkliga begränsningar. Utvecklaren vet hur man gör rätt, men tid, pengar eller tekniska begränsningar tillåter inte detta. Resultatet blir en kompromisslösning som “bara fungerar”.
Låt oss titta på fyra huvudorsaker till varför utvecklare medvetet tar till kryckor. Att förstå dessa orsaker hjälper till att se kryckor inte som ett misstag, utan som ett pragmatiskt verktyg som kräver hantering.
Den vanligaste orsaken. Släppet är imorgon, buggen reproduceras bara på en specifik modell, arkitekturfixningen tar två veckor. Krycka-villkor tar en timme och stänger problemet. Efter släppet lovar teamet att komma tillbaka och skriva om korrekt. “Inget är mer permanent än en tillfällig lösning” — precis om sådana kryckor.
Bibliotek A kräver Android 12, men din applikation stöder Android 10. Lösningen — skriv ett mellanlager som kontrollerar OS-versionen och väljer exekveringsväg. Detta är en krycka, eftersom mellanlagret måste skrivas om när biblioteket uppdateras. Men alternativet — att avstå från biblioteket eller stöd för gamla enheter — kan vara värre.
// Krycka för API 29-kompatibilitet
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
useModernApi()
} else {
useLegacyFallback()
}
Ett bibliotek som projektet är beroende av innehåller en bugg, men dess uppdatering kan ta veckor (PR, kodgranskning, publicering krävs). Istället för att vänta skriver teamet en wrapper som lappar bibliotekets beteende i farten. Efter att den korrigerade versionen av biblioteket släppts tas wrappern bort. Om den inte tas bort — är det redan ett arkitekturproblem.
En ny utvecklare i ett legacy-projekt förstår inte varför koden fungerar precis så. Istället för att ta reda på det lägger han till ett nytt villkor ovanpå det befintliga. Detta är den farligaste typen av krycka, eftersom författaren inte är medveten om att det är en krycka. Det enda botemedlet — kodgranskning och parprogrammering för nya teammedlemmar.
Inte varje krycka är ond. I verklig utveckling är absolut kodrenhet ouppnåelig och ofta inte ändamålsenlig. Den pragmatiska metoden erkänner att tillfälliga lösningar är en del av processen, men kräver medvetenhet, dokumentation och planering av borttagning. En krycka är berättigad när den löser en affärsuppgift snabbare än en ren arkitekturlösning.
Kriterier för en berättigad krycka: den stänger ett specifikt problem, har en ägare (vem som ansvarar för dess borttagning) och det finns en refaktoreringsplan. Om minst ett av tre villkor inte uppfylls — förvandlas kryckan till teknisk skuld. Verktyg som TODO-kommentarer med ticket i spåraren — det minimala sättet att dokumentera.
En kritisk bugg i releasegrenen som måste stängas innan morgondagens driftsättning. Den rena lösningen kräver arkitekturrefaktorering och tar två veckor. Krycka — lägg till en nil-kontroll och skicka fixen som hotfix. Villkor för berättigande: en ticket för refaktorering har skapats i spåraren, en ansvarig person har utsetts, kryckan har markerats med en kommentar. Om två veckor återvänder teamet till uppgiften.
// TODO: IT-1234 — ta bort denna krycka efter refaktorering av AuthService
guard let userId = session.user?.id else {
return Result.failure(.notAuthenticated)
}
Gränsen mellan en medveten krycka och ett arkitekturproblem (teknisk skuld) går genom två parametrar: medvetenhet om beslutet och förekomsten av en borttagningsplan. En krycka är alltid en tillfällig lösning med känd livslängd. Teknisk skuld — konsekvensen av många kryckor som lämnats utan uppmärksamhet.
| Parameter | Medveten krycka | Teknisk skuld |
|---|---|---|
| Medvetenhet | Teamet vet att det är en tillfällig lösning | Ingen minns varför koden är sådan |
| Dokumentation | Finns TODO, ticket i spåraren | Inga kommentarer, länkar, beskrivning |
| Borttagningsplan | Avsatt sprint för refaktorering | “Någon gång skriver vi om” |
| Påverkan | Lokal, hindrar inte ny funktionalitet | Blockerar förändringar, saktar ner utveckling |
Situationen förvärras när antalet kryckor överstiger kritisk massa. Varje ny krycka ökar systemets “bräcklighet”: en förändring på ett ställe förstör något annat. Som ett resultat saktar utvecklingen ner, buggar förökas och en ny utvecklare kan inte förstå koden utan författarens hjälp. I detta ögonblick upphör kryckor att vara tillfälliga lösningar och blir ett arkitekturproblem.
Om det i koden finns fem nästlade kontroller för OS-version, enhetstillverkare och förekomst av ett specifikt bibliotek — är detta inte en krycka, det är ett arkitekturproblem. Om tillägget av en fix orsakar tre regressioner i angränsande moduler — har kryckorna upphört att vara lokala. Om kodgranskning regelbundet avvisas på grund av “ännu en krycka” — är det dags att planera refaktorering.
Refaktorering av kryckor — processen att ersätta tillfälliga lösningar med arkitekturellt korrekta. Detta kräver tid, därför behövs en prioriteringsstrategi: inte alla kryckor behöver tas bort omedelbart. En bra strategi — utvärdera varje krycka efter två parametrar: förändringsfrekvens i det kodområdet och påverkan på användare.
Hög prioritet — kryckor i ofta ändrade moduler (affärslogik, allmän UI) som saktar ner utveckling och orsakar regressioner. Medel prioritet — kryckor i sällan ändrade moduler, men med potentiell påverkan på användare (betalningshantering, auktorisering). Låg prioritet — kryckor i legacy-kod som fungerar stabilt och inte är planerad för modifiering.
Steg 1: inventering — hitta alla TODO och FIXME relaterade till kryckor. Steg 2: bedömning — avgör vilka som fortfarande är relevanta. Steg 3: planering — tilldela refaktorering av kryckor i en sprint, börja med hög prioritet. Steg 4: ersättning — implementera den rena lösningen, ta bort kryckan och dess TODO-kommentar. Steg 5: verifiering — säkerställ att testerna går och att det inte finns några regressioner.
# Hitta alla TODO-kryckor i projektet
grep -r "TODO\|FIXME\|HACK\|XXX" --include="*.kt" --include="*.swift" .
Det bästa sättet att bekämpa kryckor är att inte skapa dem i onödan. Innan du skriver en krycka, ställ dig själv tre frågor: kan en ren lösning göras inom rimlig tid? Finns det ett alternativ som inte är en krycka? Kommer teamet att ha tid att komma tillbaka och skriva om detta? Om minst en fråga besvaras med “nej” — tänk igen innan du “stöttar” koden.
Vanliga frågor
Krycka — skriva en tillfällig lösning som stänger problemet, men inte eliminerar orsaken. Koden fungerar, men motsvarar inte projektets arkitektur och kan gå sönder vid förändringar.
Krycka — en medveten tillfällig lösning med en borttagningsplan. Teknisk skuld — konsekvensen av många glömda kryckor. Kryckan är lokal, skulden är systemisk och blockerar utveckling.
När deadline är kritisk, den rena lösningen kräver tid och kryckan är dokumenterad med en TODO-kommentar och en ticket i spåraren. Villkor: kryckan har en borttagningsplan inom överskådlig framtid.
Lägg till TODO eller FIXME med ticketnumret och en kort beskrivning av den korrekta lösningen. Exempel: // TODO: IT-567 — skriv om med Factory pattern. Utan ticket kommer kryckan att glömmas.
Gör en inventering av alla TODO, bedöm prioritet, börja med ofta ändrade moduler. Ersätt kryckan med en ren lösning, ta bort kommentaren och kontrollera med tester.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också